[Kotlin] Quick Sort(퀵 정렬) 알고리즘
·
Algorithm
이번 포스팅은 정렬 알고리즘 중 빠르다고 알려진 Quick Sort(퀵 정렬) 에 대해 3가지 주제를 중심으로 알아보려 합니다.퀵 정렬의 기본 원리퀵 정렬의 시간 복잡도피벗 선택 방법의 차이퀵 정렬의 기본 원리Quick Sort(퀵 정렬)은 분할 정복(Divide and Conquer) 알고리즘을 기반으로하는 알고리즘입니다. 퀵 정렬의 기본 동작을 알아보겠습니다.피벗 선택: 배열에서 요소 하나를 선택해서 피벗으로 정합니다.분할: 정한 피벗을 기준으로 배열을 두 부분으로 나눕니다.이때 피벗보다 작은 요소는 피벗의 왼쪽으로, 피벗보다 큰 요소는 피벗의 오른쪽으로 위치합니다.재귀적 정렬: 분할된 두 부분에 대해 재귀적으로 퀵 정렬을 수행합니다.퀵 정렬의 시간 복잡도퀵 정렬의 시간 복잡도는 피벗을 어떻게 선택하..
[Java] opencsv 로 CSV 읽고 저장하기
·
Java
개요이 글에서는 Java와 OpenCSV 라이브러리를 사용하여 간단한 웹 크롤러를 구현하고, 수집한 데이터를 CSV 파일로 저장하거나 CSV 파일에서 읽어오는 방법을 다룹니다.OpenCSV 의존성 추가먼저, 프로젝트에 OpenCSV 라이브러리를 추가합니다. build.gradle 파일에 다음 의존성을 추가하세요.implementation 'com.opencsv:opencsv:5.9'Java POJO 구현다음은 CSV 파일의 데이터를 매핑할 Java POJO 클래스입니다.import com.opencsv.bean.CsvBindByName; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTim..
[Svelte] 채팅 시스템 - 새로운 채팅이 생겼을 때 스크롤을 맨 아래로 내리는 방법
·
Svelte
채팅 시스템을 만드는 프로젝트를 만들다가새로운 채팅이 생겼을 때 해당 채팅으로 스크롤을 내리는 기능이 필요했습니다.이렇게요! 구현 방법: beforeUpdate() & afterUpdate()전체 코드를 먼저 보겠습니다....{#each chatLogs as chat, idx} {/each}... 저는 채팅 메시지를 저장할 배열(chatLogs)을 만들었습니다. 그리고 채팅 메시지 한 건마다 'data-chat-id' 라는 값을 부여해줬습니다. (이 부분은 나중에 백엔드와 연결되면 메시지의 id 가 되겠죠?)왜냐면 data-chat-id 값을 찾아서 해당 태그로 스크롤 이동을 해야하기 때문이죠. 마지막으로 새로운 채팅이 배열에 추가될 때 마다 beforeUpdate() 와 afterUpdate()..
[Querydsl] MySQL 공간 데이터(Point)의 반경 검색 (ST_CONTAINS)
·
Querydsl
이번 포스팅에선 숙소 예약 프로젝트를 진행하며 Querydsl로 공간 데이터를 조건으로하는 표현식(Expression)에 대해 알아보겠습니다.기본 환경 및 의존성기본 환경과 의존성은 다음과 같습니다.- Java 17- Spring Boot 3.3.0- DB: MySQL 8.0- ORM: querydsl 5.1.0- 공간 데이터 의존성: hibernate-spatial 6.5.2Entity@Entitypublic class Stay { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "STAY_ID") private Long id; @Column(name = "POINT", columnDefinitio..
[Spring Batch] ItemWriter 가 List<T> 를 전달받으려면? (Spring Batch 5)
·
Spring
스프링 배치를 사용하다보면 ItemWriter 에 List 같은 Collection 을 전달할 때가 있습니다.저는 테스트를 위해 숙소 예약건 생성을 배치로 처리하는 과정에서 필요했었는데요, 이 과정에서 만난 문제와 해결 방법을 기록하기 위해 글을 작성했습니다.마주친 문제 : ItemWriter 는 이미 Chunk 으로 받는다설명은 Spring Batch 5 에서 구현체 JdbcBatchItemWriter 기준으로 설명합니다.해당 구현체의 `writer()` 메서드는 아래와 같습니다.구현체 JdbcBatchItemWriter 의 write() 메서드 살펴보기public void write(final Chunk chunk) throws Exception { if (!chunk.isEmpty())..
[Spring] Response DTO 직렬화 문제
·
Spring
문제Lombok을 사용하는 프로젝트에서 발생한 문제.Presentation 레이어에 응답하는 Response DTO에 @Getter를 붙이지 않았더니 JSON으로 반환되지 않는다.@NoArgsConstructorpublic class ResponseDTO { private Sting data;} 원인이는 JSON 으로 직렬화해주는 라이브러리에서 객체에 필드에 접근하기 위해 Getter 메서드들을 사용하지만, Getter가 없으면 해당 필드에 접근할 방법이 없게되고 직렬화 과정에서 제외된다.해결 방법해결 방법은 클래스 레벨에 @Getter 를 추가해주거나, 필드에 직접 @JsonProperty 를 사용해서 Getter가 없는 필드도 직렬화할 수 있도록 한다.방법1.@Getter@NoArgsConstr..
[Java] Optional에서 map과 flatMap의 차이점 쉽고 빠르게 이해하기
·
Java
map과 flatMap의 차이점Optional의 map과 flatMap의 주요 차이점은 함수의 반환 타입이 다르다는 것이다.map : Optional로 감싸진 타입(T)이 비어있지 않으면 .map()을 적용하고, 결과를 Optinal로 감싸서 반환한다. 만약 처음부터 Optional이 비어있었다면 빈 Optional을 반환한다.flatMap : map과 비슷하다. 하지만 .flatMap()을 적용한 결과를 Optional로 감싸지 않고 반환한다는 점만 다르다. 즉, 중첩된 Optional을 평면화 해주는 역할을 한다.예제 코드public class Car { // Car의 필드에 name은 차 이름이 있을수도 없을수도 있기에 Optional 로 감싸져 있다. private Optional na..
[JPA] cascade = CascadeType.REMOVE, orphanRemoval = true 두 옵션을 명시적으로 사용하는 이유
·
JPA
JPA에서 @OneToMany같은 연관관계 매핑에 사용하는 애너테이션을 사용할 때 cacade 옵션과 orphanRemoval 옵션을 볼 수 있다.이 옵션에 대해서는 간단하게 요약하면 아래와 같다.CascadeType 그리고 orphanRemovalcascade = CascadeType.REMOVE이 옵션은 부모 엔티티의 라이프 사이클 변경이 자식 엔티티로 전파되도록 지정하는 옵션이다.부모 엔티티가 삭제될 때 자식 엔티티들도 같이 삭제된다.orphanRemove = true이 옵션은 부모 엔티티의 컬렉션에서 제거된 자식 엔티티들을 자동으로 삭제하도록 지정하는 옵션이다.만약 부모 엔티티의 컬렉션에서 자식 엔티티가 제거되면, 영속성 컨텍스트에서도 해당 자식 엔티티에 대해 삭제 작업이 즉시 수행된다.두 옵션에..