전체 게시물
-
[JPA] Oracle SEQUENCE 전략 PK 공유 문제legacy/JPA 2023. 9. 8. 21:04
Oracle DB를 사용할 때 PK를 SEQUENCE 전략을 사용한다면 JPA에서 주의해야 할 점이 있다. 각각의 테이블에 사용할 SEQUENCE를 지정해주지 않으면 모든 테이블이 PK를 공유하는 문제가 발생한다. 시퀀스를 공유하는 테이블 Member 엔티티 PK를 보면 SEQUENCE 전략을 사용하고 있다. @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleTy..
-
[Spring] 트랜잭션 전파, Propagation.REQUIRES_NEWlegacy/Spring 2023. 9. 6. 14:03
앞서 여기서 외부 트랜잭션과 내부 트랜잭션에 대해 설명하였다. 트랜잭션 참여에 대해서 설명을 하였는데, 이번에는 트랜잭션 참여가 아닌 새로운 트랜잭션 생성에 대해서 알아보자. 트랜잭션 참여 @Transactional을 사용할 때 옵션으로 propagation = Propagation.REQUIRED를 사용한다. @Transactional(propagation = Propagation.REQUIRED) public class MemberRepository { // 생략 } 새로운 트랜잭션 생성 @Transactional을 사용할 때 옵션으로 propagation = Propagation.REQUIRES_NEW를 사용한다. @Transactional(propagation = Propagation.REQUIR..
-
[Spring] @Transactional과 UnexpectedRollbackExceptionlegacy/Spring 2023. 9. 6. 13:34
트랜잭션 전파를 공부하면 내부 트랜잭션과 외부 트랜잭션을 공부하게 되는데, 이때 내부 트랜잭션에서 롤백이 호출되었을 때 외부 트랜잭션에서 이를 처리하는 2가지 경우가 존재한다. 외부 트랜잭션 트랜잭션이 시작된 곳을 외부 트랜잭션이라고 한다. 외부 트랜잭션이 최종적으로 커밋 또는 롤백을 처리한다. 내부 트랜잭션 외부 트랜잭션에 참여하는 트랜잭션을 내부 트랜잭션이라고 한다. 내부 트랜잭션에서 발생한 커밋 또는 롤백은 실제로 호출되지 않는다. 커넥션은 단 한 번만 커밋 또는 롤백이 가능하기 때문에, 내부 트랜잭션에서 커밋 또는 롤백을 호출하면 외부 트랜잭션까지 트랜잭션이 사용되지 않고 중간에 종료되는 문제가 발생한다. 예외 1 - RuntimeException MemberService에서 MemberRepos..
-
[Spring] @PostConstruct와 @Transactionallegacy/Spring 2023. 9. 5. 01:47
@PostConstruct와 @Transactional이 동시에 사용되었을 때 트랜잭션이 적용되지 않는다. 그 이유는 두 애너테이션이 호출되는 시점이 다르기 때문이다. 스프링 생명 주기 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 콜백 -> 스프링 컨테이너 종료 @PostConstruct 호출 시점 스프링 빈이 생성 되고 의존 관계가 주입된 후에 호출된다. @Transactional 호출 시점 초기화 콜백 이후 컨테이너가 초기화된 후에 호출된다. 코드 Hello 클래스가 빈으로 등록되어 있고, initV1() 메서드에 @PostConstruct 애너테이션이 사용되고 있다. @SpringBootTest @Slf4j public class InitT..
-
[Spring] @Transactional 적용 범위legacy/Spring 2023. 9. 4. 23:00
클래스에 @Transactional을 붙이면 모든 메서드에 트랜잭션이 적용된다. 특정 메서드에 @Transactional을 붙이면 해당 메서드에만 트랜잭션이 적용된다. 그런데 의문이 들었다. @Transactional이 붙지 않은 메서드를 호출할 때, 해당 클래스는 AOP 프록시가 적용되어 있는지에 대해 궁금했다. 결론부터 말하자면 AOP 프록시가 적용된 상태에서 메서드를 호출하게 된다. 물론 @Transactional이 붙지 않았기 때문에 해당 메서드는 트랜잭션이 적용되지 않는다. 트랜잭션 AOP 적용 CallService 클래스를 보면 internal 메서드에 @Transactional이 붙었다. 따라서 해당 클래스는 AOP 프록시가 적용된다. AOP 프록시가 적용된다는 의미는 프록시 객체가 트랜잭션..
-
[JPA] DB IDENTITY 전략일 때, 영속성 컨텍스트legacy/JPA 2023. 9. 4. 11:06
JPA의 경우에 EntityManager를 통해 persist를 하면 해당 객체는 영속 상태가 된다. DB에 저장된 상태가 아닌 1차 캐시에 ID-Entity 형태로 JPA에 의해 관리가 된다. 또한 Member 엔티티를 DB에 저장하기 위한 Insert 쿼리문이 DB로 날라가지 않고 쓰기 지연 저장소에 보관된다. 아래는 Member 엔티티를 persist 하였을 때, 1차 캐시에 저장되어 JPA에 의해 관리 중인 상태이다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.g..