해결된 질문
작성
·
1.2K
0
안녕하세요 최근 JPA 강의를 들으며 프로젝트에 반영하는 재미가 한둘이 아닙니다. 좋은 명강의에 감사드립니다.
연관관계가 존재하는 엔티티 등록에 관련하여 질문이 하나 있습니다.
상황 :
- ORDER_ITEM 을 insert하려는 상황.
- ORDER_ID, ITEM_ID 값은 갖고 있는 상황.
Order order = OrderService.fetchById(orderId); // order id로 Order Entity 가져오기
Item item = ItemService.fetchById(itemId); // item id로 item Entity 가져오기
oderItem.addOrder(order) // Order Entity 연관관계 등록
.addItem(item) // Item Entity 연관관계 등록
save(orderItem); // Entity 등록
위와 같이 OrderItem을 등록하면 쿼리가 총 3개가 날아가게 됩니다.
1. orderId를 통한 Order 조회 쿼리
2. itemId를 통한 Item 조회 쿼리
3. orderItem 삽입 쿼리
의문점
- FK로 등록되는 값인 orderId와 itemId는 이미 갖고 있는 상황입니다.
- 네이티브 쿼리를 사용한다면 Insert문 한번만 실행해도 충분히 가능합니다. (어차피 실 등록되는 data는 orderId와 itemId 뿐일 테니까요)
- 이미 등록될 FK 값들은 갖고 있는 상황에서 굳이 Select문을 추가로 날릴 필요가 있을까란 의문점이 생깁니다.
- 만약 차후 Table에 연관관계가 5개라면, 10개라면,,, 한번의 Insert문에 쿼리가 n+1이 수행되는 격입니다
그래서 id만 갖고 있는 빈 Entity를 생성하는 방안으로 변경하였습니다.
// id만 갖고있는 빈 Entity 생성
Order order = Order.builder()
.id(orderId)
.build();
Item item = Item.builder()
.id(itemId)
.build();
oderItem.addOrder(order) // Order Entity 연관관계 등록
.addItem(item) // Item Entity 연관관계 등록
save(orderItem); // Entity 등록
위와 같이 구현하면 insert문이 한번만 수행됩니다. 1번에서의 단점이 해소되었다 생각합니다.
의문점
- 매우 위험한 코드라는 생각이 듭니다.
- 만일 다른 개발자가 외부에서 orderItem.getOrder() 를 통해 확인했더니 객체가 있어, order.getStatus(), order.getOrderDate()....... Order Entity를 사용하는 로직을 추가했습니다. 그렇게 된다면 실행 시, nullpointerexception이 발생하겠지요. (Order Entity 안에는 사실 pk만 들어있는 빈 Entity니까요)
- 또한 JPA가 추구하는 방향성에 어긋난다는 느낌도 지울 수가 없습니다.( 객체 지향 설계를 지원하는 JPA지만 위는 오히려 일종의 야매(?)를 통해 관계형 데이터베이스의 냄새가 물씬 풍깁니다. )
이를 해결할 수 있도록 jpa가 제공하는 기능이 있을까요? 혹은 대처방안이 있을까요? 없다면 위의 두가지 케이스 중에서 현업에서는 혹은 영한님께서 생각하시기에는 어떤 방법을 추천하는지 의견을 여쭙고 싶습니다.
긴 글을 읽어주셔서 감사합니다.
답변 1
0
안녕하세요. 김참이님 좋은 질문입니다.
이럴 때 프록시를 사용하면 좋습니다^^
다음 질문을 참고해주세요.
https://www.inflearn.com/questions/204850
감사합니다.