본문 바로가기
  • 개발하는 곰돌이

Development/JPA5

[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.