김영한님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 수업을 듣고 혼자 수업 내용을 복습을 하는데 기존에 내가 이해했었던 부분과 충돌이 되는 듯한 부분을 발견했다.
@OneToMany(mappedBy = "order", cascade = cascadeType.ALL)
private List<OrderItem> ...
뭐지 이거..? 하는 생각이 순간 들었다. 그 이유는 다음과 같다.
첫 번째, 연관관계를 매핑하는 애노테이션에 mappedBy 속성이 들어가게 되면 해당 필드는 데이터를 조회하는 기능만을 갖게 된다. 즉, 해당 필드는 반대편 연관관계 주인을 비추는 거울의 역할만을 담당하게 되는 것인데 이로서 이 필드는 데이터를 데이터베이스 내에 삽입하거나 수정하는 기능을 상실하게 된다.
두 번째, 반대로 cascade 옵션은 애노테이션이 적용된 필드가 자신이 바라보고 있는 객체를 조작할 수 있도록 만들어 주는 옵션이다. cascade 옵션이 특정 필드에 적용되면 옵션이 적용된 필드의 객체가 변경될 때, 관련된 연관관계를 모두 데이터베이스에 반영하게 된다. (그래서 cascade를 영속성 '전이'라고 한다.)
한 옵션은 쓰기가 불가능하고 읽기만 가능한 옵션이고, 다른 한 옵션은 다른 객체의 변화를 데이터베이스에 반영할 수 있는 옵션인데.. 그 옵션이 한 곳에서 쓰이다니... 뭐지 이거 도대체?
해결
혹시 내가 놓친 개념이 있나 싶어서 책을 다시 보고, 그래도 해결이 되지 않아 같은 고민을 하는 사람이 있을지 모른다는 생각에 구글 검색을 해봤다. 그리고 다행히도 나와 같은 이유로 김영한님께 질문을 올린 한 게시글을 발견할 수 있었다.
아래는 이 질문에 대한 김영한님의 답변.
출처 : https://www.inflearn.com/questions/15855
mappedBy와 cascade는 충분히 헷갈릴 수 있는 부분인 것 같다. 그런데 김영한님의 답변을 보고, 또 이 글을 쓰면서 생각을 정리하다 보니 비슷하기는 하지만 분명히 다른 관점의 개념이라는 생각도 든다.
으음.... 지금은 이해한 것 같은 느낌이 들지만 내일이 되면 까먹을 수도 있으니, 일단 블로그에 박제.
'메모 & 삽질기록보관소' 카테고리의 다른 글
[jqeury] ajax에서의 parse error | 스프링과 자바스크립트의 부조화 (0) | 2022.03.13 |
---|---|
[메모] 배포 관련 리눅스 명령어 (0) | 2022.01.19 |
[EC2 - 서버 배포] TemplateInputException (2) | 2022.01.19 |
JPA와 서브쿼리 (JPA 서브쿼리의 한계) (2) | 2022.01.12 |
MOOC를 통한 프로그래밍 공부 커리큘럼 가이드 (0) | 2021.09.28 |