본문 바로가기

전체 글

(24)
[MySql] Multiple-column Unique index 사용하기 intro 최근 회사에서 multiple-column unique index 사용할 일이 있었는데, 그 과정에서 알게된 사실들을 간단하게 정리해보려고 합니다. 우선 unique index를 사용이 필요한 상황을 간단하게 예시로 설명해보겠습니다. 아래와 같이 사용자의 정보를 정의한 테이블 있다고 가정해보겠습니다. name address 철수 서울 영희 경기도 영수 NULL 저희 서비스의 설계에서는 이름과 주소(address)의 조합이 unique할 필요가 있었고 동시에 주소 자체는 NULL과 중복을 허용할 필요가 있었습니다. 예를 들어, 위의 테이블에서 (철수, 경기도) 데이터는 철수가 겹치기 때문에 데이터가 적재되어서는 안되지만, (철희, 서울)은 이름/이름과 주소의 조합이 모두 unique하기 때문에 ..
[JPA] join fetch 사용시 추가 쿼리가 발생하는 이슈 이번 글에서는, join fetch를 사용하면서 추가 쿼리가 발생하는 이슈를 경험한 것과 이에 대한 원인 분석 그리고 해결 방법을 설명해볼까 합니다. 문제점 먼저, 이슈를 재현하기 위한 간단한 예제 코드를 가지고 왔습니다. @Entity public class Team { @Id private Integer teamId; @Column private String name; @OneToMany(mappedBy = "team") private List members; } @Entity public class Member implements Serializable { @Id private Integer id; @Column private String name; @Id @ManyToOne @JoinColumn(..
상속과 @Data의 warning, 그리고 @EqualsAndHashCode 이번 글에서는 상속 구조에서 @Data를 사용할 때, 발생되는 warning과 그 원인, 그리고 해당 내용과 @EqualsAndHashCode가 어떤 연관이 있는지 정리해보겠습니다. 우리는 상속 구조에서 @Data를 사용하면 IDE(적어도 Intellij는) 아래와 같은 warning을 보내주는 것을 알 수 있습니다. 메세지를 읽어보면, equals/hashCode 메소드가 부모 클래스의 equals/hashCode 메소드를 호출하지 않는다고 합니다. 실제로 그런지, 빌드된 코드와 간단한 테스트 코드를 살펴보겠습니다. 우선 예제에서는 아래와 같은 간단한 상속 클래스를 사용하였습니다. @Data public class Parent { private String familyName; } @Data publi..
[JPA] Entity mapping 이슈 문제점 이번 글에서는 JPA를 사용하면서 겪었던 Entity mapping 이슈 관련된 내용을 정리해볼까 합니다. 저는 회사에서 결제 시스템을 담당하고 있는데, 저희 결제 시스템의 DB Schema는 대략적으로 다음과 같습니다. (설명을 위해 간소화시켰으며 실제 schema와는 차이가 있습니다.) 간략하게 설명을 드리면, 하나의 결제건(purchase)에는 여러 상품이 포함될 수 있으며 결제된 상품(product)에는 상품의 id와 결제의 id(order_id)의 조합을 primary key로 사용하고 있습니다. 그리고 각각의 Entity는 다음과 같이 정의되어 있습니다. Purchase.java @Data @Entity public class Purchase { @Id private BigInteger..
[JPA] JpaRepository vs CrudRepository(1) - Paging과 Sorting / QueryExampleExecutor 최근 JPA관련 글들을 보던 중, JpaRepository를 사용하는 예제를 보게되었습니다. 저는 지금까지 CrudRepository만을 사용하고 있었기 때문에, JpaRepository와 CrudRepository는 무엇이 다른지 궁금해졌고 이번 글에서는 그 과정에서 알게된 내용들을 정리해보려 합니다. 이번 글의 예제들은 다음과 같은 환경에서 작성되었습니다. spring-boot-starter-data-jpa:2.6.0 MySQL 8.0 우선 JpaRepository, CrudRepository를 포함한 class diagram를 살펴보면, JpaRepository는 CrudRepository에 PaingAndSortingRepository, QueryByExampleExecutor를 상속하고 있는 것..
[MySQL]Index 파헤치기 - multi-column index range scan(수정) 이번 글에서는 multi-column index를 사용하여 range scan이 동작하는 방식에 대해 정리해보겠습니다. 이번 글에서는 다음과 같은 환경에서 작성되었습니다. MySQL v8.0.22 InnoDB v8.0.22 Multi-Column indexes 사용시에 range scan 우선 설명을 위해 다음과 같은 테이블을 정의하였습니다. CREATE TABLE `example`.`user` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NOT NULL, `age` INT NOT NULL, `birthday` DATE NOT NULL, PRIMARY KEY (`id`), KEY `idx_user_birthday_name_age` (`birthd..
[Spring Boot] DateTime 다뤄보기(3) - Database에 저장하기 이번 글에서는 DateTime 데이터를 Database에 저장하는 과정에 대해 다뤄보겠습니다. 예제 코드는 다음 환경에서 실행하였습니다. spring boot starter data jpa:2.4.5 MySQL 8.0.22 가장 먼저 DB 설정과 DB Schema를 살펴보겠습니다. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/example?serverTimezone=UTC&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=mysqlpassword 위의 설정..
[Spring Boot] DateTime 다뤄보기 이번 글에서는 DateTime 관련 데이터를 다루면서 학습한 내용들을 정리해보려고 합니다. Intro ISO 8601 & RFC 3339 본격적으로 코드를 다루기에 앞서, 날짜, 시간 데이터를 표기하는 국제 표준에 대해 먼저 간략하게 알아보겠습니다. ISO 8601 ISO(International Organization for Standardization)은 이름에서 알 수 있듯이 국제 표준을 다루는 기관입니다. 그리고 각 표준은 "ISO 넘버링" 으로 표기가되는데, ISO 8601은 날짜와 시간 데이터 교환을 다루는 국제 표준을 뜻합니다. 날짜 + 시간을 표현하는 기본적인 형식은 다음과 같습니다. YYYY-MM-DDThh:mm:ss.sssZ 문자 T를 기준으로, 왼편에는 날짜, 오른편에는 시간을 표기하..