본문 바로가기
WEB/Back-end

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

by 최새벽 2024. 10. 15.

@ManyToOne

  • PK: 참조되는 키, 하나만 존재
  • FK: 다른 테이블에서 참조해 온 키, 다른 테이블의 식별자로 사용할 수 있음

예시

Member(PK: memberId) <- (식별 관계) - Board(PK: boardId,FK: memberId)

멤버에서 삭제하려면 게시판이서 FK도 함께 삭제해야함

 

* 비식별관계: 참조하는 것은 같으나 FK가 아님.

(멤버가 삭제되어도 오류가 발생하지 않음)

@ToString(exclude = "board")

ManyToOne을 했을 때 무한 참조를 방지하기 위해서 사용하는 것이라고 함

left (outer) join

즉시(Eager) 로딩, 지연(Lazy) 로딩

@ManyToOne(fetch = FetchType.LAZY) // 명시적으로 Lazy 로딩 지정

설정을 하지 않으면 기본값으로 Eager, 즉시 로딩으로 설정됨

이는 항상 모든 엔티티를 가져오게 되므로 여러 연관관계가 있거나 복잡한 엔티티 구조를 가지고 있을 시 성능 저하를 일으킬 수 있음. 따라서 지연 로딩을 활용함.

그러나 지연 로딩 방식을 사용할 시 아래와 같은 문제점이 발생할 수 있다

@Test
public void testRead1(){
    Optional<Board> result = boardRepository.findById(100L); // 데이터베이스에 존재하는 번호
    Board board = result.get();
    System.out.println(board);
    System.out.println(board.getWriter());
}

org.example.board.repository.BoardRepositoryTests#testRead1

test code를 실행 시킬 시. board테이블 만을 가져오게 되므로 member테이블을 로딩해야 하지만 이미 DB연결 시 board테이블만 가져온 사태이므로 나타나게 되는 문제임.

@Transactional
@Test
public void testRead1(){
    Optional<Board> result = boardRepository.findById(100L); // 데이터베이스에 존재하는 번호
    Board board = result.get();
    System.out.println(board);
    System.out.println(board.getWriter());
}

@Transactional : 기본적으로 필요할 때 다시 DB에 연결해줌

  • 연관 관계에서 @ToString() 주의하기 : 무한참조 일어날 수 있다...
  • lazy loading의 장단점

join을 안해서 빠르다

그러나 필요한 경우 sql문을 여러번 호출해야할 수 있다

'WEB > Back-end' 카테고리의 다른 글

JWT 저장  (0) 2025.01.09
@EnableWebSecurity(SpringBoot)  (0) 2024.10.15
JWT(Json Web Token)  (0) 2024.10.15
Spring Framework 및 API 개발 개요  (1) 2024.10.15
Spring Security(SpringBoot)  (0) 2024.10.15