자바 스프링/부트 블로그 JPA 프로젝트

#10 연관관계에 대한 이해

2022. 5. 5. 23:35

 

연관관계 주인은 FK를 가진 오브젝트이다.

자바에선 User오브젝트 데이터베이스에선 User 테이블이 들고있는 것

Board, Reply도 마찬가지이다.

 

기존의 방식(mybatis 등)에서는 상세보기 페이지를 나타낼 때

User, Board, Reply 이 세 개를 join해서, select해서 해당 페이지에 데이터를 다 들고오게된다.

 

select * from Board
where Id = 1;

 

 

그런데 ORM을 사용하게 되면 이 Board 테이블만 select하면 된다.

설명하자면, 상세보기 페이지에서 Board만 select해서 요청하면 User정보를 같이 준다.

왜냐면 Board가 User 오브젝트를 들고 있기 때문이다.

 

현재 Board 오브젝트가 User 오브젝트는 들고 있는데 Reply 오브젝트를 들고 있지 않다.

따라서 Board.java에 Reply 정보도 작성해보자

 

private User user는 Board에 User가 한 명이라 이렇게 작성했지만

Reply의 경우 private Reply reply로 작성하면 안된다.

reply는 여러 개이기 때문이다.

따라서 이렇게 private List<Reply> reply; 로 작성해준다.

java.util의 List를 import 시키면 된다.

 

 

Reply 테이블

Id Content userId boardId
1 혼자먹냐? ㅋ 2 1
2 ㅋㅋㅋㅋ 3 1

 

Board 테이블

Id title content userId replyId createDate
1 도토리 좋아 도토리 맛있다람.. 1 1, 2 2022.05.05
           

 

Board 테이블에 replyId를 둘 경우 하나의 컬럼은 원자성을 가져야한다는 1정규화에 어긋난다.

따라서 FK는 Reply 테이블의 boardId에 있어야한다. Board 테이블에 있어서는 안된다.

 

따라서 코드를 이렇게 작성하면 된다.

그런데 fetch 전략을 왜 EAGER로 굳이 명시해서 적었을까?

 

그 이유는 @OneToMany의 기본 fetch 전략이 FetchType.LAZY 이기 때문이다.

LAZY는 지연로딩이라고 하고 EAGER는 즉시로딩이라고 한다.

만약 덧글에 펼치기 버튼이 있고, 이 펼치기 버튼을 누르기 전까지

덧글들이 바로 보여질 필요가 없다면 LAZY 전략을 사용해도 된다.

하지만 이 프로젝트의 경우 상세보기창에서 덧글들이 바로 보여져야 하니까

기본적으로 설정되어 있는 LAZY가 아닌 EAGER를 사용하기 위해 이렇게 명시한 것이다.

 

 

 

참고자료 : https://youtu.be/DtMmXQl4_hw

 

'자바 스프링 > 부트 블로그 JPA 프로젝트' 카테고리의 다른 글

#12 select 테스트 및 페이징  (0) 2022.05.06
#11 insert 테스트와 enum 사용법  (1) 2022.05.06
#9 JPA와 DB테이블 생성(User, Board, Reply)  (0) 2022.05.05
#8 스프링 부트의 yml과 jsp파일 리턴  (0) 2022.05.04
#7 lombok 설치와 사용  (0) 2022.05.04
'자바 스프링/부트 블로그 JPA 프로젝트' 카테고리의 다른 글
  • #12 select 테스트 및 페이징
  • #11 insert 테스트와 enum 사용법
  • #9 JPA와 DB테이블 생성(User, Board, Reply)
  • #8 스프링 부트의 yml과 jsp파일 리턴
daramG
daramG
dotori Java
daramG
다람쥐의 개발 블로그
daramG
전체
오늘
어제
  • 분류 전체보기 (193)
    • Java 코딩테스트 공부 (67)
      • Java 알고리즘 공부 (37)
      • Java 백준 문제풀이 (27)
      • Java 코테 나만의 팁 (3)
    • SQL Study (0)
      • Programmers SQL 문제풀이 (0)
      • SQLP 준비 (0)
    • 웹 개발 지식 정리 (0)
      • Servlet (0)
      • Java 정리 (0)
    • 자바 스프링 (45)
      • 스프링 공부 (4)
      • 스프링 게시판 프로젝트 (6)
      • 부트 블로그 JPA 프로젝트 (30)
      • react & springboot (5)
      • 스프링 오류창고 (0)
      • 리액트 + 스프링 프로젝트 (0)
      • pf (0)
      • pfError (0)
    • React (6)
      • React 정리 (3)
      • React 오류 창고 (3)
    • C++ 코딩테스트 공부 (중단) (20)
      • c++ 백준 문제풀이 (15)
      • c++ 알고리즘 공부 (5)
    • Unity (3)
      • Unity 공부 (3)
    • WebRTC (2)
      • WebRTC 강의학습 정리 (0)
      • WebRTC 프로젝트 (1)
    • 김영한님의 스프링 강의 학습 (10)
      • 스프링 강의 목차 (1)
      • 인텔리제이 & 스프링 기초 (1)
      • 스프링 핵심 원리 (8)
    • 전공 지식 정리 (40)
      • interview (0)
      • Java (0)
      • 운영체제 (4)
      • 데이터베이스 설계 (10)
      • 소프트웨어 공학 (3)
      • 유닉스 (14)
      • 디지털 논리회로 (0)
      • 인공지능 (7)
      • js (0)
      • etc (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 데이터베이스 설계
  • 스프링 공부
  • 코테 알고리즘
  • java
  • 운영체제
  • Java 코테 나만의 팁
  • Unity 공부
  • 무서운 이야기
  • C++ 알고리즘
  • 노마드코더의 zoom클론코딩
  • 부트 jpa 게시판 프로젝트
  • 스프링부트 블로그 프로젝트
  • Java 백준 문제풀이
  • 디지털 논리회로
  • 스프링부트 프로젝트
  • 스프링 프로젝트
  • 유닉스
  • 백준 c++
  • React&Spring 강의수강
  • 김영한 스프링 강의
  • java 알고리즘
  • 김영한의 스프링 핵심 원리
  • 인공지능
  • 김영한 스프링 입문

최근 댓글

최근 글

hELLO · Designed By 정상우.
daramG
#10 연관관계에 대한 이해
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.