[TIL-Springboot] 코드로배우는 스프링 부트 - 연관관계

이용준·2023년 5월 31일
0

TIL

목록 보기
19/21

N:1 (다대일 관계) 처리하기

이번 장에서는 JPA에서 가장 중요한 연관관계를 학습합니다.
예제에서는 회원(Member), 게시글(Board), 댓글(Reply) 엔티티 클래스를 생성하고 처리합니다.
이 과정에서 JPA에서 사용하는 N:1 연관관계를 실습하고 이를 통해 화면의 댓글 수, 게시글 작성자를 표시하는 등의 작업을 어떻게 처리해야 하는지 설명합니다.

SpringMVC와 관련해서는 JSON 데이터 송∙수신할 수 있는 @RestController를 적극 활용해 Ajax를 이용하는 방식을 학습합니다.


학습 내용

  1. 연관관계 분석 및 @ManyToOne 이용한 연관관계 설정 방법
  2. 연관관계 없는 상황에서 'left (outer) join' 처리 방법
  3. 즉시(Eager) 로딩과 지연(Lazy) 로딩의 차이와 효율적 처리 방법

PK 고려 요소

  • 테이블 간의 관계는 특정한 PK가 다른 곳에서 몇 번 FK로 사용되었는지가 중요.
  • 데이터 베이스 관계 해석시 PK 우선 해석하면 혼란 요소 경감
    • ex1) 한 명의 회원은 여러 개의 게시글을 작성할 수 있다.(PK에서 해석)
    • ex2) 하나의 게시글은 한 명의 작성자만 표시할 수 있다.

로딩 방식

  1. @ManyToOne의 경우 FK의 엔티티 가져올 때 PK의 엔티티도 같이 가져온다.(Eager)
  • Eager : 즉시 로딩

    • (장점) 연관 관계의 모든 엔티티 가져온다.
    • (단점) 연관관계 복잡할수록 조인으로 인한 성능 저하
  • Lazy : 지연 로딩

    • (장점) : 조인을 하지 않으므로 하나의 테이블 이용하는 경우 빠른 처리 가능
    • (단점) : 다른 테이블 로딩 필요할 경우 이미 데이터 베이스 연결이 끝남으로 별도의 처리 필요(@Transactional)

      @Transactional, 기본적으로 필요할 때 데이터베이스와 재연결

  • 지연 로딩을 기본으로하고, 상황에 맞게 필요한 방법 찾기

  1. 연관관계에서는 @ToString() 주의할 것
  • @ToString은 해당 클래스의 모든 멤버 변수 출력된다.
  • 순환 참조 오류가 생길 수 있으므로 연관관계 있는 엔티티 클래스의 경우 exclude 속성 사용할 것

JPQL과 left join

  • 연관관계 맺는 경우 left join으로 쿼리 작성
    • 연관관계 없는 경우 left join 'on' 추가
  • 연관관계 맺는 경우
@Query("select b, w from Board b left join b.writer w where b.bno =: bno")
Object getBoardWithWriter(@Param("bno") Long bno);
  • 연관관계 없는 경우(on)
@Query("select b, r from Board b left join Reply r on r.board = b where b.bno =: bno)
List<Object[]> getBoardWithReply(@Param("bno") Long bno);

DTO

  • 구성 기준은 화면에 전달하는 데이터이거나, 화면에서 전달되는 데이터를 기준으로 한다.
  • DTO는 엔티티 클래스의 구성과 일치하지 않는 경우가 많음
  • 주인 테이블 DTO는 종속된 테이블에 대한 참조 구성하지 않고 작성
    • 종속된 테이블 참조 대신 해당 테이블의 엔티티 참조
profile
뚝딱뚝딱

0개의 댓글