jpa7 [Spring Data JPA] Java의 record 객체를 @EmbeddedId로 사용할 때 Could not set value of type 문제가 발생하는 경우 목차들어가기 전에자바로 프로젝트를 진행하다 보면 불변 객체를 쉽게 만들고 equals와 hashcode를 바로 만들어주면서 일반 클래스와 구분하기가 좋다는 점에서 값 객체 클래스를 만들 때는 레코드 클래스를 애용하고 있습니다. 그러다보니 엔티티 클래스에서 복합 기본키를 갖게 될 때 record 객체를 @EmbeddedId로 사용하려고 했는데 레포지토리에 엔티티를 저장하는 과정에서 오류가 발생해서 관련 내용을 정리해보려고 합니다. 레코드 클래스에 대한 내용은 이전에 어느정도 정리를 해놨습니다. [Java] Java 14부터 추가된 Record 타입과 Kotlin의 Data Class 비교목차 들어가기 전에 자바 14부터 코틀린의 Data 클래스와 유사한 Record라는 클래스가 추가되어 자바 16에서 정식.. 2024. 8. 2. [Spring Boot] AOP를 이용해서 DB에 API 로그를 남겨보자 목차 들어가기 전에 현재 운영중인 서비스는 API 로그를 파일로 기록하고 있다. 그런데 서버가 이중화되어 있고 그 외에도 몇가지 불편한 점이 있어서 DB에 로깅을 해보면 어떨까 하는 생각이 들었다. 서버가 이중화되어 있다보니 특정 로그를 확인하려면 양쪽 서버 모두 확인해야 한다. → 사실상 가장 불편했던 점 특정 요청건에 대한 로그를 찾아보기 어렵다. 요청 일자가 모호할 경우에 여러 파일을 열어서 확인해야하는 경우 등 일자별, 시간대별 요청 건수 확인이 어렵다. 특정 요청이 처리되고 있는 도중에 다른 요청이 들어오면 로그에 혼선이 생겨서 어떤 요청에 대한 응답인지 파악하기 어려워진다. 이런 이유들로 인해 파일 대신 DB에 API로그를 남겨보려고 했는데 어차피 모든 API의 중복 로직이니까 AOP를 사용해.. 2024. 2. 6. [JPA] 트랜잭션의 전파와 UnexpectedRollbackException 이슈 목차 들어가기 전에 지금까지 스프링부트 프로젝트에 JPA를 사용하면서 트랜잭션이 필요한 메소드에 기계적으로 @Transactional 어노테이션을 붙여서 사용하다가 처음 보는 예외를 맞닥뜨렸다. 트랜잭션에 rollback-only가 마킹되어 자동으로 롤백되었다고 한다. 이게 도대체 무슨 말인가 싶어서 관련 내용을 찾아보고 정리해본다. 문제 상황 DB에 API 호출 이력을 남기기 위해 컨트롤러에 @Transactional(dontRollbackOn = [Exception::class])을 달아주고 트랜잭션이 필요한 서비스 계층의 메소드들에 @Transactional을 달아준 상황이었다. 대충 아래와 같은 느낌이라고 보면 될 것 같다.(실제 코드가 아닌 상황 재현을 위한 코드) @Transactional(d.. 2024. 1. 29. [JPA] Service 계층에서 DataIntegrityViolationException을 처리하기 목차 문제의 배경 JPA 예제를 작성하면서 회원 등록 기능을 구현할 때 전화번호를 유일한 값으로 지정하고 싶었다. 그래서 DB 상에서 전화번호를 유일키로 지정하고 이미 등록된 전화번호를 등록하려고 하면 IllegalArgumentException을 발생시켜서 요청값이 잘못되었다는 것을 알려주려고 했다. 이를 위해 무결성 제약조건을 위배하면 발생하는 DataIntegrityViolationException을 try-catch로 잡아내서 새로운 IllegalArgumentException를 발생시키려고 했는데 try-catch에서 DataIntegrityViolationException을 잡아내지 못하는 상황이었다. 문제 상황의 코드 MemberService.kt @Service class MemberSer.. 2023. 4. 25. [Kotlin/JPA] 코틀린과 JPA를 함께 사용할 때 추가적으로 설정해야 하는 것들과 Data class 목차 개요 JPA는 자바 진영에서 DB와 연동하기 위해 사용하는 기술 중 하나이다. 자바와 100% 호환되는 코틀린의 특성상 JPA 역시 사용할 수 있긴 하지만 기본적으로 자바에 맞춰진 기술이다 보니 코틀린과 JPA를 함께 사용할 때 문제없이 사용하기 위해선 추가적으로 설정해야 할 것들이 있다는 것을 알게 되었다. 이 글에서는 코틀린과 JPA를 함께 사용할 때 추가적으로 설정해야 하는 것들과 그 외의 주의사항에 대해 정리한다. JPA의 구현체는 가장 많이 사용되는 하이버네이트를 따른다. JPA의 Entity가 갖는 요구사항 우선 왜 이러한 설정을 사용해야 하는지, 또 왜 이런 사항을 주의해야 하는지를 이해하기 위해선 JPA의 엔티티가 갖는 요구사항을 알 필요가 있었다. 하이버네이트 사용자 가이드에서 이야.. 2023. 3. 29. [JPA] 양방향 연관 관계에서 연관 관계의 주인 설정과 주의 사항 목차 개요 JPA에서는 두 엔티티 사이의 연관 관계를 정의할 때 기본적으로 단방향으로 정의한다. 이로 인해 DB 테이블에서 외래키를 기준으로 하여 조인하는 것으로 두 테이블 간의 연관된 데이터를 조회할 수 있는 것과 달리 JPA에서 단방향 연관 관계가 정의된 상태에서는 한 쪽 엔티티 객체는 연관 관계인 엔티티 객체를 조회할 수 있으나, 반대쪽 엔티티 객체는 어떤 엔티티 객체와 연관 관계를 갖는지 알 수 없다. 이로 인해 JPA에서는 필요에 따라 양방향 연관 관계를 정의하게 되는데, 이 과정에서 주의해야할 중요한 점이 있어서 어느정도 정리해보려고 한다. JPA의 양방향 연관 관계 앞서 이야기한 바와 같이 필요에 따라선 연관된 두 엔티티 사이에서 서로 연관된 엔티티 객체를 조회해야 할 수 있다. 예를 들면 .. 2023. 3. 22. [JPA] hibernate의 ddl-auto 속성의 종류와 주의해야할 점 목차 개요 JPA의 구현체 중 하나인 하이버네이트는 다양한 기능을 제공하는데 그 중 엔티티만 등록해놓으면 DDL(Data Definition Language)을 자동으로 작성하여 테이블을 생성하거나 수정해주는 ddl-auto라는 설정이 있다. JPA에 대해 아는 것이 거의 없던 처음에는 DDL을 자동으로 작성해주는 아주 편리한 기능이라고만 생각했는데, JPA를 배워가면서 마냥 편리한 기능이 아니라 잘못 다루면 돌이킬 수 없는 결과를 가져오는 아주 위험한(?) 기능이라는 것을 느끼게 되었다. 이 포스트에서는 JPA 하이버네이트에서 제공하는 ddl-auto의 종류와 기능, 그리고 주의 사항에 대해서 정리하려고 한다. ddl-auto 속성의 종류 ddl-auto에는 아래와 같이 5가지 종류의 속성이 있다. c.. 2023. 3. 14. 이전 1 다음