인프런 커뮤니티 질문&답변

비모님의 프로필 이미지
비모

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

연관관계 Entity Insert시 질문

해결된 질문

작성

·

1.2K

0

 안녕하세요 최근 JPA 강의를 들으며 프로젝트에 반영하는 재미가 한둘이 아닙니다. 좋은 명강의에 감사드립니다.

 연관관계가 존재하는 엔티티 등록에 관련하여 질문이 하나 있습니다.

 상황 : 

 -  ORDER_ITEM 을 insert하려는 상황. 

 -  ORDER_ID, ITEM_ID 값은 갖고 있는 상황.

1.

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이 수행되는 격입니다

2.

그래서 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

감사합니다.

비모님의 프로필 이미지
비모

작성한 질문수

질문하기