Spring 숙련 2주차 (3)

신성훈·2024년 5월 29일

TIL

목록 보기
27/162
post-thumbnail

오늘의 학습 키워드

  • 1대 N 관계
  • N 대 M 관계
  • 지연 로딩

1대 N 관계

  • @OneToMany
    -1 대 N 관계를 맺어주는 역할

  • 단방향 관계

    @OneToMany
    @JoinColumn(name = "N테이블에 컬럼")
    private List<> List = new ArrayList<>();

    -N 관계의 테이블이 외래 키를 가질 수 있기 때문에 외래 키는 N 관계인 users 테이블에 외래 키 컬럼을 만들어 추가하지만 외래 키의 주인인 1 Entity를 통해 관리
    -외래 키를 1 Entity가 직접 가질 수 있다면 INSERT 발생 시 한번에 처리할 수 있지만 실제 DB에서 외래 키를 N 테이블이가지고 있기 때문에 추가적인 UPDATE가 발생된다는 단점이 존재한다.

  • 양방향 관계
    -1 대 N 관계에서는 일반적으로 양방향 관계가 존재하지 않는다.

N 대 M 관계

  • @ManyToMany
    -N 대 M 관계를 맺어주는 역할
    -N : M 관계를 풀어내기 위해 중간 테이블(orders)을 생성하여 사용

  • 단방향 관계

    @ManyToMany
    @JoinTable(name = "테이블명", // 중간 테이블 생성
    joinColumns = @JoinColumn(name = "컬럼"), // 현재 위치인 Entity 에서 중간 테이블로 조인할 컬럼 설정
    inverseJoinColumns = @JoinColumn(name = "컬럼")) // 반대 위치인 Entity 에서 중간 테이블로 조인할 컬럼 설정
    private List<> List = new ArrayList<>();

    -생성되는 중간 테이블을 컨트롤하기 어렵기 때문에 추후에 중간 테이블의 변경이 발생할 경우 문제가 발생할 가능성이 있다.

  • 양방향 관계
    -N

    @ManyToMany
    @JoinTable(name = "테이블명", // 중간 테이블 생성
    joinColumns = @JoinColumn(name = "컬럼"), // 현재 위치인 Entity 에서 중간 테이블로 조인할 컬럼 설정
    inverseJoinColumns = @JoinColumn(name = "컬럼")) // 반대 위치인 Entity 에서 중간 테이블로 조인할 컬럼 설정
    private List<> List = new ArrayList<>();

    -M

    @ManyToMany(mappedBy = "상대 Entity의 필드명")
    private List<> List = new ArrayList<>();

    -반대 방향인 M Entity에 @ManyToMany 로 N Entity를 연결하고 mappedBy 옵션을 설정하여 외래 키의 주인을 설정하면 양방향 관계 맺음이 가능하다.

    -중간 테이블
    ->중간 테이블 직접 생성하여 관리하면 변경 발생 시 컨트롤하기 쉽기 때문에 확장성에 좋다.

    @Entity
    @Table(name = "테이블명")
    	public class 테이블명 {
    		@Id
    		@GeneratedValue(strategy = GenerationType.IDENTITY)
    		private Long id;
    
    		@ManyToOne
    		@JoinColumn(name = "컬럼")
    		private 해당 클래스;
    
    		@ManyToOne
    		@JoinColumn(name = "컬럼")
    		private 해당 클래스;
    }

지연 로딩

  • JPA는 연관관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있다.
    -가져오는 방법을 정하게되는데 JPA에서는 Fetch Type이라 한다.
    -Fetch Type의 종류에는 2가지가 있는데 하나는 LAZY , 다른 하나는 EAGER 이다.
    -LAZY지연 로딩 으로 필요한 시점에 정보를 가져온다.
    -EAGER즉시 로딩 으로 이름의 뜻처럼 조회할 때 연관된 모든 Entity의 정보를 즉시 가져온다.

  • 기본적으로 @OneToMany은 Fetch Type의 default 값이 LAZY 로 지정되어있고 반대로 @ManyToOneEAGER 로 되어있다.

  • 다른 연관관계 애너테이션들도 default 값이 있는데 이를 구분하는 방법이 있다.
    -애너테이션 이름에서 뒤쪽에 Many가 붙어있으면 설정된 해당 필드가 Java 컬렉션 타입이다.
    -> 해당 Entity의 정보가 여러 개 들어있을 수 있다는 것을 의미
    -> 따라서 효율적으로 정보를 조회하기 위해 지연 로딩 이 default로 설정되어 있다.

-반대로 이름 뒤쪽이 One일 경우 해당 Entity 정보가 한 개만 들어오기 때문에 즉시 정보를 가져와도 무리가 없어 즉시 로딩 이 default로 설정되어 있다.

  • 영속성 컨텐스트와 지연로딩
    -영속성 컨텍스트의 기능
    • 1차 캐시
    • 쓰기 지연 저장소
    • 변경 감지
    -지연 로딩도 마찬가지로 영속성 컨텍스트의 기능 중 하나다.
    -지연 로딩된 Entity의 정보를 조회하려고 할 때는 반드시 영속성 컨텍스트가 존재
    ->‘트랜잭션이 적용되어있어야 한다’라는 의미와 동일
profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글