주문 Entity 주문 Entity가 가지고 있는 필드는 다음과 같습니다. 연관관계에 있는 Entity를 집중해 봅시다. 주문 Entity는 회원(Member), 주문 상픔(OrderItem), 배송 정보(Delivery) Entity와 연관관계에 있습니다. @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType...
DB에서 특정 엔티티를 조회하면 연관관계에 있는 엔티티 또한 같이 조회됩니다. 연관관계에 있는 엔티티도 조회하기 위해서는 DB에 join과 함께 쿼리문이 나가게 됩니다. 특정 상황에서는 굳이 연관관계에 있는 엔티티가 필요로 없는 상황이 있을 수도 있습니다. 이때 연관관계에 있는 엔티티까지 DB에서 조회하는 것은 효율적이지 않습니다. JPA는 이런 문제를 해결하기 위해 엔티티가 실제 사용될 때까지 DB에서 조회를 지연시키는 방법을 제공합니다. 이를 지연로딩이라고 합니다. 기존 조회 - 연관관계에 있는 엔티티까지 조회 EntityManager의 find() 메서드를 사용하여 엔티티를 조회합니다. clear()로 인해 영속성 컨텍스트가 초기화되었으므로 DB로부터 엔티티를 조회해서 1차 캐시에 저장합니다. 출력..
클래스에 @Transactional을 붙이면 모든 메서드에 트랜잭션이 적용된다. 특정 메서드에 @Transactional을 붙이면 해당 메서드에만 트랜잭션이 적용된다. 그런데 의문이 들었다. @Transactional이 붙지 않은 메서드를 호출할 때, 해당 클래스는 AOP 프록시가 적용되어 있는지에 대해 궁금했다. 결론부터 말하자면 AOP 프록시가 적용된 상태에서 메서드를 호출하게 된다. 물론 @Transactional이 붙지 않았기 때문에 해당 메서드는 트랜잭션이 적용되지 않는다. 트랜잭션 AOP 적용 CallService 클래스를 보면 internal 메서드에 @Transactional이 붙었다. 따라서 해당 클래스는 AOP 프록시가 적용된다. AOP 프록시가 적용된다는 의미는 프록시 객체가 트랜잭션..