Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- storage #로컬스토리지 #세션스토리지 #백그라운드 서비스
- aws #아키텍트 #과정 #vpc #인프라 구축 #public subnet #route53 #igw #연결
- 프로세스 #CPU #시공유 #커널
- aws #아키텍트 #과정 #s3 #bucket #생성 #이미지업로드
- aws #아키텍트 #과정 #vpc #인프라 구축
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #딥러닝 #AI #서버 #자동화 #SQL #기본문법 #데이터베이스
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #AI #서버 #자동화 #SQL #기본문법 #데이터베이스 #웹개발
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #AI #서버 #자동화 #SQL #KDT #기본문법 #데이터베이스 #Computer #Science #CPU #메모리
- 비트 #바이트 #이진수
- aws #아키텍트 #과정 #vpc #인프라 구축 #public subnet #igw #curl #명령어 #http
- aws #아키텍트 #과정 #vpc #인프라 구축 #php #웹페이지 #http #public #instance
- aws #아키텍트 #과정 #vpc #인프라 구축 #퍼블릭 #보안그룹 #생성 #http #ipv4
- samba #가상머신 #daemon
- haproxy #wordpree #php #linux #가상화 #가상머신 #내용정리
- sasac #aws 클라우드 #아키텍트 과정 #가상화 #vmbox #vmware #esxi #tar #selinux
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #딥러닝 #AI #서버 #자동화 #SQL #기본문법 #데이터베이스 #DBMS #Oracle #MongoDB #아키텍쳐 #DB
- aws #아키텍트 #과정 #vpc #인프라 구축 #퍼블릭 서브넷 #안에 #ec2 인스턴스 #ami #생성 #firewall
- 쓰레드 #쓰레드풀 #프로세스
- aws #아키텍트 #과정 #vpc #인프라 구축 #public subnet #internet gateway #연결
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #머신러닝 #AI #서버 #자동화 #SQL #기본문법 #데이터베이스
- tar #build #배포 #통신포트 #설정방법 #linux #apache
- 공간복잡도 #공간자원 #캐시메모리 #SRAM #DRAM #시간복잡도
- 인바운드 #아웃바운드 #방화벽설정
- ubuntu #설정변경 #vmware #vmbox #linux #명령어
- aws #아키텍트 #과정 #vpc #인프라 구축 #public subnet #private subnet
- oracle vmbox #rocky #linux9 #명령어 #암호화인증 #해시알고리즘
- virtualbox #vmware #router #nat #pat #네트워크 구성도 #aws #ubuntu #
- 스파르타코딩클럽 #부트캠프 #IT #백엔드 #OSI #ISO #AI #서버 #자동화 #SQL #기본문법 #데이터베이스 #DBMS #Oracle #MongoDB #아키텍쳐 #DB
- aws #클라우드 #퍼블릭 클라우드 #아키텍트 #과정
- mysql #linux #설정 #wordpress #웹사이트 #db 연결 #
Archives
- Today
- Total
요리사에서 IT개발자로
스파르타 부트캠프 Spring Master 3강 영속성 전이 본문
@Test
@DisplayName("Robbie 음식 주문")
void test1() {
// 고객 Robbie 가 후라이드 치킨과 양념 치킨을 주문합니다.
User user = new User();
user.setName("Robbie");
// 후라이드 치킨 주문
Food food = new Food();
food.setName("후라이드 치킨");
food.setPrice(15000);
user.addFoodList(food);
Food food2 = new Food();
food2.setName("양념 치킨");
food2.setPrice(20000);
user.addFoodList(food2);
userRepository.save(user);
foodRepository.save(food);
foodRepository.save(food2);
}
외래키 연관관계 설정 addFoodList를 고객 Entity에 추가
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user",cascade = {CascadeType.PERSIST,CascadeType.REMOVE})
private List<Food> foodList = new ArrayList<>();
public void addFoodList(Food food) {
this.foodList.add(food);
food.setUser(this); //외래키 설정
}
}
userRepository.save(user);
foodRepository.save(food);
foodRepository.save(food2);
Robbie가 음식주문을하기위해서
위처럼 모두 직접 save()메서드를 호출하여 영속화를해야하는데
JPA에서는 이를 간편하게 할 수있도록
영속성 전이(CASCASE)의 PERSIST옵션을 제공한다.
@OneToMany(mappedBy = "user",cascade = CascadeType.PERSIST )
private List<Food> foodList = new ArrayList<>();
영속성 전이란
영속 상태의 Entity에서 수행되는 작업들이
연관된 Entity까지 전파되는 상황
영속성 전이를 적용하여 해당 Entity를 저장할 때
연관된 Entity까지 자동 저장되기 위해서
저장하려고 하는 연관된 Entity에 추가한 연관관계 에너테이션에
@OneToMany(mappedBy = "user",cascade = CascadeType.PERSIST )
CASCADE의 PERSIST옵션을 설정하면된다.
@Test
@DisplayName("영속성 전이 저장")
void test2() {
// 고객 Robbie 가 후라이드 치킨과 양념 치킨을 주문합니다.
User user = new User();
user.setName("Robbie");
// 후라이드 치킨 주문
Food food = new Food();
food.setName("후라이드 치킨");
food.setPrice(15000);
user.addFoodList(food);
Food food2 = new Food();
food2.setName("양념 치킨");
food2.setPrice(20000);
user.addFoodList(food2);
userRepository.save(user);
}
CASCADE PERSIST를 적용했기에
직접 음식 Entity(food, food2)객체마다 save를 하지않아도
자동으로 저장이된다.
Robbie가 주문 APP을 탈퇴하여
주문 음식정보를 모두 삭제하려고할 때
JPA에서는 이를 간편하게 처리할 수 있는 방법
영속성 전이(CASCADE)의 REMOVE옵션을 제공한다.
@OneToMany(mappedBy = "user",cascade = {CascadeType.PERSIST,CascadeType.REMOVE} )
private List<Food> foodList = new ArrayList<>();
중괄호를 사용하여 PERSIST와 REMOVE 동시 사용이 가능하다.
@Test
@Transactional
@Rollback(value = false)
@DisplayName("영속성 전이 삭제")
void test4() {
// 고객 Robbie 를 조회합니다.
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
// Robbie 가 주문한 음식 조회
for (Food food : user.getFoodList()) {
System.out.println("food.getName() = " + food.getName());
}
// Robbie 탈퇴
userRepository.delete(user);
}
}
Robbie를 조회하고
주문한 FoodList를 가져와서
userRepository.delete(user) 를 하면
연관된 음식데이터와 고객정보가 삭제된다.
JPA영속성전이를 사용하지 않으면
@Test
@Transactional
@Rollback(value = false)
@DisplayName("Robbie 탈퇴")
void test3() {
// 고객 Robbie 를 조회합니다.
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
// Robbie 가 주문한 음식 조회
for (Food food : user.getFoodList()) {
System.out.println("food.getName() = " + food.getName());
}
// 주문한 음식 데이터 삭제
foodRepository.deleteAll(user.getFoodList());
// Robbie 탈퇴
userRepository.delete(user);
}
user.getFoodList를 삭제하고 delete (user)를 하여
FoodList도 삭제하고 User도 삭제해야한다.
https://hs-backend.tistory.com/165
반응형
'Spring' 카테고리의 다른 글
스파르타 부트캠프 SpringBoot @Validation란 (0) | 2024.05.31 |
---|---|
스파르타 부트캠프 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 |