스프링 부트 -3

김정현·2024년 7월 25일
0

Spring

목록 보기
14/14

참고) 암묵적 플러시

연관 관계 매핑

  1. 일대일(1:1) : @OneToOne
    회원1 - 프로필1

  2. 일대다(1:N) : @OneToMany
    Member - BoardData(주인)
    -연관관계 주인 설정 - 관계의 주인의 외래키쪽
    -mappedBy

  • lombok의 toString() 함께 사용시 순환 참조 문제 발생 가능성

-toString()을 구성할 때 getter 메서드를 사용해서 구성하기 때문

BoardData -> toString() -> getMember() -> toString() 
-> List<BoardData\> items -> toString() -> getMember() -> toString() 무한반복

*해결 방법
:toString을 멤버 변수를 직접 출력하는 것으로 직접 정의

  • @ToString.Exclude -> ToString 포함 배제(O)
  • @ToString.Include -> ToString 포함
  1. 다대일(N:1) : @ManyToOne ✨
    BoardData - Member
  1. 다대다(N:M) : @ManyToMany
    -중간 테이블 하나 생성
    -BoardData - HashTag

게시글1 태그1 태그4
게시글2 태그1 태그2
게시글3 태그3 태그4

태그1 - 게시글1, 게시글2

두 테이블 사이에 중간 테이블 생성
각 테이블의 기본키를 가짐.

@JoinColumn : 조인되는 컬럼의 이름을 변경할 때

게시글 - 회원
(BOARD_DATA - MEMBER)


-many쪽에 one을 적음 (외래키 적용됨)

Many쪽

  • 외래키를 가지고 있다.
  • 자식 테이블
  • 연관관계의 주인

One쪽

  • 부모 테이블

지연로딩

  1. FetchType.EAGER : 즉시 로딩 - 처음부터 join
  2. FetchType.LAZY : 지연 로딩, 처음에는 현재 엔티티만 조회, 다른 매핑된 엔티티는 사용할때만 2차 쿼리 실행
    -@Transactional 애노테이션과 함께 많이 사용

-글로벌 전략으로 지연로딩, 필요할때만 즉시 로딩 전략 사용
Fetch 조인 -> 필요한 엔티티만 즉시 로딩 전략을 사용

1) JPQL 직접 정의 : @Query 애노테이션

2) @EntityGraph애노테이션 : 쿼리 메서드 사용시 정의 가능

3) QueryDsl의 fetchJoin() 메서드 사용
JPAQueryFactory
-생성자 매개변수 EntityManager
JPAQuery

참고)
@BatchSize(size=10)

적용 전
SELECT ... FROM BoardData
SELECT ... FROM Member WHERE seq = 1L
SELECT ... FROM Member WHERE seq = 2L
SELECT ... FROM Member WHERE seq = 3L
SELECT ... FROM Member WHERE seq = 1L

적용 후
SELECT ... FROM BoardData
SELECT ... FROM MEMBER WHERE seq IN (1L, 2L, 3L)

영속성 전이 - @OneToMany

  • 부모 엔티티의 영속성 변화 상태를 자식 엔티티에 전달

1. CASCADE 종류

1) PERSIST
2) MERGE
3) REMOVE
4) REFRESH
5) DETACH
6) ALL

2. 고아 객체 제거하기

  • @OneToMany 애노테이션에 orphanRemoval=true 옵션을 추가

remove -> flush 참조 끊겨서 삭제

 @Test
    void test2() {
        Member member = memberRepository.findById(1L).orElse(null);
        List<BoardData> items = member.getItems();
        items.remove(0);
        items.remove(1);

        memberRepository.flush();
    }

참고)
@Lazy
-> 사용 시점에 객체 생성

0개의 댓글