SpringBoot+Jpa 7

양방향 연관관계 무한루프

양방향 연관관계에 있을때 엔티티를 @ResponseBody 그대로 내보냈을때 상황이다. 예를들어 Order엔티티는 이렇게 있다고 하자 @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List orderItems = new ArrayList(); @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDat..

SpringBoot+Jpa 2022.11.28

casecade(영속성 전이)

@Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List orderItems = new ArrayList(); Order를 save해주면 Order가 persist될때 영속성전이 CascadeType.ALL을 해주면 컬렉션에 들어와있는 OrderItem도 강제로..

SpringBoot+Jpa 2022.11.25

OSIV

OSIV란 Open Session In View jpa가 영속성 컨텍스트를 동작하기 위해서는 데이터베이스와 1:1로 쓰고 있어야한다. 그래서 jpa와 db는 아주 밀접한 관련이있는데 또 데이터베이스 트랜잭션이 시작할때 영속성 컨텍스트가 db connection을 가져온다. 그럼 커넥션을 언제 반납을 해야할까? 여기서 커넥션을 반납하는 시점을 바꾸는게 open-in-view 의 true와 false이다. open-in-view 가 true인 상태이면(기본이 true이다.) @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { final Long id = member..

SpringBoot+Jpa 2022.10.29

1대 N fetch join 위험성

public List findAllWithItem() { return em.createQuery( "select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery oi" + " join fetch o.orderItems oi" + " join fetch oi.item i", Order.class) .setFirstResult(1) .setMaxResults(100) .getResultList(); } join fetch의 장점은 전에 설명했듯이 여러 join 관계에 있을때 쿼리를 여러번 호출하지 않고 한번에 모두 호출해서 최적화를 시킨다고 했었다. (Lazy로 설정된것보다 우선순위를 갖는다.) 그리고 1 대 N이 껴..

SpringBoot+Jpa 2022.10.27

EntityManager의 @Autowired

전 블로그 글에서 @Repository public class MemberRepository { @PersistenceContext private EntityManager em; @PersistenceContext를 넣어주면 EntityManager를 사용할 준비가 끝난다고 했었는데 EntityManager에 @Autowired를 사용해줘도 인젝션이 된다고 한다. org.springframework.boot:spring-boot-starter-data-jpa 당연히 data jpa를 주입받았을 경우에만. 그래서 변경된 코드는 @Repository @RequiredArgsConstructor public class MemberRepository { @Autowired private final EntityM..

SpringBoot+Jpa 2022.10.23

@PersistenceContext

이번에는 그냥 jpa가 아닌 spring boot를 써서 jpa를 사용한다. gradle에 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 이것만 넣어주면 jpa를 스프링부트에서 사용하기 위한 라이브러들을 다 가져와 주기 때문에 엄청 편리하게 사용할 수 있다. 오늘 사용한건 @PersistenceContext 이 어노테이션이다. 사용법은 @Repository public class MemberRepository { @PersistenceContext private EntityManager em; } repository에서 사용하고 EntityManager 위에 @PersistenceContext 이 어노테이션만 넣어주면 그냥 ..

SpringBoot+Jpa 2022.10.22