본문 바로가기

JPA Basic8

지연 로딩 & 조회 @JsonIgnore 스프링 부트 활용 강의 중, @JsonIgnore 에 관한 내용이 존재한다. @JsonIgnore 는 무한 루프 조인을 막기 위해서 쓰는 어노테이션인데, 예를 들면 다음과 같다. (위의 예에서 @JsonIgnore 는 무시) Order 를 조회하는 경우, XtoOne 관계로 이어진 Member 와 Delivery 가 문제가 된다. Order 에서 Member 를 조회하면 위와 같은 Member 에서 조회를 하게 되는데 이 때, List orders 가 조회되게 된다. 그렇게 되면 또 다시 Order 테이블로 들어가서 조회를 하다가 다시 Member 를 조회하고 이게 무한 루프로 조회하며 장애를 일으킨다. 이렇듯 양방향 연관관계가 걸린 경우, 한쪽은 반드시 @JsonIgnore 처리를.. 2022. 3. 23.
변경 감지(Dirty Checking) & 병합(Merge) JPA 에는 따로 Update 에 관한 쿼리문이 존재하지 않고 ( @Query로 만드려면 만들겠지만 ) Update 를 변경 감지와 병합 두 방법을 통해서 실행하게 된다. 변경 감지(Dirty Checking) 과 병합(merge) 에 대해서 알기 전에 영속 컨텍스트와 준영속 엔티티 두 개념에 대해서 알아야 한다. 영속성 컨텍스트란 ? JPA 에 존재하는 엔티티 매니저를 통해 쿼리문을 날리면 자동으로 해당 엔티티는 영속성 컨텍스트에 들어가서 트랜잭션이 끝나는 시점까지 따로 관리하게 된다. 앞선 JPA 포스팅에서 다룬적이 있는데, Member member = new Member(); 로 객체만 생성한 경우 비영속 상태 memberService.save(member) 처럼 DB에 쿼리를 날린 경우 영속 상태.. 2022. 3. 21.
JPA Basic - 6 프록시 타입 체크 시 , 같은 객체를 조회해도 em.find 와 em.Reference(Proxy) 객체 값이 차이가 있기 때문에 값은 같더라도 다르다고 나오게 된다. -> instanceof 로 비교. 하지만 하나의 트랜잭션 안에서는 find 와 Reference 비교를 하게 되면 == 으로 비교해도 똑같다. -> proxy 가 아닌 실제 엔티티 반환 영속성 컨텍스트를 꺼버리면(em.close , em.detach) -> exception 이 터지게 된다. 초기화 여부는 EntityManagerFactory 를 통해서 조회. ※ 프록시는 실제로 사용하는 경우는 많지 않지만 즉시 로딩과 지연 로딩을 이해하기 위해서 필요한 과정. 즉시 로딩 & 지연 로딩 지연 로딩 @ManyToOne(fetch = Fet.. 2021. 12. 30.
JPA Basic - 5 관계별 연관관계 매핑 다대일 (N:1) : 가장 기본적인 관계 , 가장 많이 , 주로 사용하는 관계. 단방향 매핑으로 설계하고 필요시에 양방향 매핑한다. 연관관계의 주인은 언제나 N. 일대다 (1:N) : 일대다로 매핑하는 것보다 다대일로 매핑. (사용 X) 일대일 (1:1) : 어느 테이블에나 외래 키를 넣을 수 있다. 외래 키에 DB 유니크 제약조건이 추가. 다대다 (N:N) : 실무에서 사용 ( X ) , 연결 테이블을 생성해서 다대다 -> 다대일 , 일대다 관계로 변경 편리해 보이지만 실무에서 사용 X , 연결 테이블이 연결만 하고 끝나지 않고 주문시간 , 수량 같은 데이터가 들어옴 -> 연결테이블용 엔티티를 새로 추가. @ManyToMany 를 @ManyToOne & @OneToMany 로 변경.. 2021. 12. 29.
JPA Basic - 4 연관관계 매핑 객체와 테이블 연관관계의 차이를 이해하고 , 객체의 참조와 테이블의 외래키를 매핑하는 것에 대해 알아본다. @Entity public class Members { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Teams teams; @Entity public class Teams { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; 다음과 같은 .. 2021. 12. 28.
JPA Basic - 3 객체와 테이블 매핑 @Entity : JPA 가 관리하는 클래스를 뜻한다. 주의할 점으로는 1. 기본 생성자 필수(파라미터 없는 public 또는 protected 생성자) 2. final, enum , interface , inner 클래스 사용 불가 3. 저장할 필드에 fianl 사용 불가 @Table : 엔티티와 매핑할 테이블을 지정한다. 데이터베이스 스키마 자동 생성 @Entity 가 붙어있으면 알아서 테이블을 Create 해서 생성해준다. persistence.xml 파일의 hibernate 설정을 다음과 같이 바꿔줄 수도 있다. 필드와 컬럼 매핑 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package hellojpa; im.. 2021. 11. 18.