@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 |