본문 바로가기

전체보기/Spring

(8)
[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] 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를 상속하고 있는 것..
[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를 기준으로, 왼편에는 날짜, 오른편에는 시간을 표기하..
[Spring Boot] Custom Constraint / Validation 파헤치기 이번 글에서는 Spring Boot에서 validation이 동작하는 원리를 간단하게 살펴보고 직접 validator를 정의하는 방법을 정리해보겠습니다. 참고로, validation에 대한 설명을 따로 하지는 않기 때문에 validation이 무엇인지 궁금하신 분들은 다음 글을 참고해 주시면 될 것 같습니다. ( Validation 어디까지 해봤니? : TOAST Meetup ) 또한, 예제들은 다음과 같은 환경에서 작성되었습니다. Spring Boot 2.3.3 hibernate validator 6.1.5.Final ('spring-boot-starter-validation' dependency에 포함되어 있습니다.) JUnit 5 우선 validation을 수행하기 위해 간단한 핸들러 메소드와 DT..
[Spring Boot]HikariCP 모니터링 - InstanceAlreadyExistsException 해결 지난 글에서는 MBean을 이용해 HikariCP의 상태를 모니터링하는 방법에 대해 다뤄봤습니다. ( [Spring Boot]HikariCP 모니터링 ) 하지만 회사에서 서비스 중인 프로젝트에 적용하려고 하니 다음과 같은 문제가 발생하였습니다. 내용을 살펴보니 MXBean이 이미 등록되었다고 합니다. 본격적으로 원인을 알아보기 전에 코드를 살펴보겠습니다. Configuration //DatasourceConfig.java @Bean public HikariPoolMXBean poolProxy() throws MalformedObjectNameException { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName..
[Spring Boot]HikariCP 모니터링 이번글에서는 JMX MBean을 이용한 HikariCP의 모니터링 방법을 정리해보겠습니다. MBean(Managed Bean)이란, 디바이스, 어플리케이션 혹은 리소스의 상태를 모니터링 할 수 있는 Java Object입니다. HikariCP에서 제공하는 MBean을 통해서 우리는 다음과 같은 정보를 알 수 있습니다. Idle connections의 수 Active connections(현재 사용하고 있는)의 수 모든 connection의 수 connection을 기다리고 있는 thread의 수 Configuration MBean을 사용하기 위해선 application.properties에 다음과 같이 pool의 이름과 register-mbeans값을 설정해야합니다. spring.datasource.hi..