일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- java5기
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #aop #관점지향프로그래밍 #유지보수
- 비트 #바이트 #이진수
- 스파르타 코딩클럽 #인메모리db #h2 #연동이슈 #문제해결 #방법 #spring security #header #
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #딥러닝 #AI #서버 #자동화 #SQL #기본문법 #데이터베이스 #DBMS #Oracle #MongoDB #아키텍쳐 #DB
- 챌린저스 #bod
- 쓰레드 #쓰레드풀 #프로세스
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #OSI #ISO #AI #서버 #자동화 #SQL #기본문법 #데이터베이스 #DBMS #Oracle #MongoDB #아키텍쳐 #DB
- 스프링 #백엔드 #자바
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #ci #cd
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #AI #서버 #자동화 #SQL #기본문법 #데이터베이스
- 프로세스 #CPU #시공유 #커널
- 공간복잡도 #공간자원 #캐시메모리 #SRAM #DRAM #시간복잡도
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #AI #서버 #자동화 #SQL #기본문법 #데이터베이스 #웹개발
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #springmvc패턴 #model #view #controller
- 스파르타 코딩클럽 #내배캠 #최종프로젝트 #4개월삭제 #국비지원 #자바
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #tdd #테스트 주도개발 #테스트코드 #유닛테스트
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #딥러닝 #AI #서버 #자동화 #SQL #기본문법 #데이터베이스
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #get방식 #post방식 #http프로토콜 #클라이언트 #백엔드 #api
- 인가 #
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #대용량트래픽 #처리방법 #캐싱 #코드최적화 #db최적화 #트래픽 #로드밸런서
- spring security #jwt 토큰 #json web token #token #직렬화 #인증
- 보안 #이슈
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #AI #서버 #자동화 #SQL #KDT #기본문법 #데이터베이스 #Computer #Science #CPU #메모리
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #트랜잭션전파 #transaction
- 스파르타 코딩클럽 #내배캠 #최종프로젝트 #로그인 #인증인가 #jwt? #토큰인증 #액세스토큰 #리프레시토큰 #쿠키 #파싱 #서명키의 중요성 #security context holder
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #ci #ioc #의존성
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #최종프로젝트 #aws s3 #프로필 이미지 수정 #자동삭제
- ci/cd파이프라인
- 스파르타 코딩클럽 #내배캠 #모의면접 #예상질문 #http 메서드 종류 #메서드 #post #put #get #patch #소셜로그인 #네이버 #기능구현 #vue.js #spring boot #네이버로그인 #연동하기
- Today
- Total
요리사에서 IT개발자로
스파르타 부트캠프 Spring Master 3강 지연로딩과 즉시로딩 본문
음식테이블과 고객 테이블이 N: 1양방향 관계일 때
@Test
@DisplayName("아보카도 피자 조회")
void test1() {
Food food = foodRepository.findById(2L).orElseThrow(NullPointerException::new);
System.out.println("food.getName() = " + food.getName());
System.out.println("food.getPrice() = " + food.getPrice());
System.out.println("아보카도 피자를 주문한 회원 정보 조회");
System.out.println("food.getUser().getName() = " + food.getUser().getName());
}
아보카도 피자 의 가격을 조회하려고만 했는데
자동으로 JONIN문을 사용하여
연관관계가 설정되어있는 고객테이블 정보도 가져오고있다.
JPA는 연관관계가 설정된
Entity정보를 바로 가져올지, 필요할 때 가져올지 설정할 수 있다.
가져오는 방법은 JPA에서 Fetch Type이라한다.
Fetch Type 종류는
LAZY(지연로딩)
필요한 시점에 정보를 가져온다.
EAGER(즉시로딩)
조회할 때 연관된 모든 Entity정보를 즉시 가져온다.
@OneToMany는
Fetch Type의 default가
LAZY(지연로딩)
@ManyToOne은
Fetch Type의 default가
EAGER(즉시로딩)
애너테이션 이름 뒤쪽에 Many가 붙어있으면 설정된 해당 필드가 Java컬렉션 타입일것이다.
해당 Entity정보가 여러개 들어있을 수 있다는 것을 의미한다.
효율적으로 정보를 조회하기 위해 default가 LAZY(지연로딩)이다.
반대로 이름 뒤쪽이 One일 경우
Entity정보가 한개만 들어오기때문에
즉시 로딩(EAGER)을 해도 문제가 없어서 default로 되어있다.
@Test
@Transactional
@DisplayName("Robbie 고객 조회")
void test2() {
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
System.out.println("Robbie가 주문한 음식 이름 조회");
for (Food food : user.getFoodList()) {
System.out.println(food.getName());
}
}
Robbie 고객을 조회한 후 Robbie 고객이 주문한 음식들의 이름을 조회했는데
@OneToMany의 default가 LAZY(지연로딩) 으로 설정되어있어
user.getName()으로 고객을 조회
@OneToMany(mappedBy = "user")
private List<Food> foodList = new ArrayList<>();
for문으로 food : user.getFoodList를 사용하여
for (Food food : user.getFoodList()) {
System.out.println(food.getName());
}
고객이 주문한 음식의 정보가 필요한 시점
음식 테이블에 해당 고객Entity의 식별자 값(Id)을 사용하여
food.getName() == Robbie가
주문한 음식 내용들을 출력을한다.
영속성 컨텍스트와 지연로딩
영속성 컨텍스트의 기능
1차캐시
쓰기지연저장소
변경감지
지연로딩(LAZY)도 마찬가지로 영속성 컨텍스트 기능중의 하나이기에
영속성 컨텍스트가 존재해야한다 == 트랜잭션이 적용되어있어야한다.
한마디로 쓰기지연저장소에 해당 DB가 머무르고 있어야한다.
@Test
@Transactional
@DisplayName("Robbie 고객 조회")
void test2() {
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
System.out.println("Robbie가 주문한 음식 이름 조회");
for (Food food : user.getFoodList()) {
System.out.println(food.getName());
}
}
@Test
@DisplayName("Robbie 고객 조회 실패")
void test3() {
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
System.out.println("Robbie가 주문한 음식 이름 조회");
for (Food food : user.getFoodList()) {
System.out.println(food.getName());
}
}
조회 실패테스트 코드에
@Transaction 에너테이션이 설정되어있지않아서 실패한것
영속성 컨텍스트의 기능인
쓰기지연저장소에 호출한 Robbie 가
머물러있지않아서
getName()도 출력할 수 없다는것이다.
@Transaction의 활용
https://hs-backend.tistory.com/127
'Spring' 카테고리의 다른 글
스파르타 부트캠프 Spring Master 3강 고아Entity 삭제(orphanRemoval) (0) | 2024.05.29 |
---|---|
스파르타 부트캠프 Spring Master 3강 영속성 전이 (0) | 2024.05.29 |
스파르타 부트캠프 Spring Master 3강 Entity @ManyToMany와 중간테이블 (0) | 2024.05.28 |
스파르타 부트캠프 Spring Master 3강 Entity @OneToMany 단방향, 양방향 정리 (0) | 2024.05.28 |
스파르타 부트캠프 Spring Master 3강 Entity @ManyToOne 단방향, 양방향 정리 (0) | 2024.05.28 |