inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

연관관계 Entity Insert시 질문

해결된 질문

1345

비모

작성한 질문수 1

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가 제공하는 기능이 있을까요? 혹은 대처방안이 있을까요? 없다면 위의 두가지 케이스 중에서 현업에서는 혹은 영한님께서 생각하시기에는 어떤 방법을 추천하는지 의견을 여쭙고 싶습니다.

 긴 글을 읽어주셔서 감사합니다. 

jpa java JPA

답변 1

0

김영한

안녕하세요. 김참이님 좋은 질문입니다.

이럴 때 프록시를 사용하면 좋습니다^^

다음 질문을 참고해주세요.

https://www.inflearn.com/questions/204850

감사합니다.

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

55

2

inheritance startegy 선택시 고려사항

0

36

1

Entity 동등성 비교

0

38

1

실무 조언 관련 질문입니다.

0

64

1

H2데이터베이스 파일 생성

0

76

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

66

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

62

1

JPQL 메소드와 락

0

62

1

Delivery @OneToOne

0

70

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

104

2

UnsupportedOperationException 발생

0

97

3

H2 Database 연결이 안됩니다.

0

101

2

연관관계 매핑 질문드립니다.

0

93

2

h2데이터베이스 실행오류

0

114

2

persistence.xml

0

119

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

87

1

영속성 컨텍스트

0

74

1

JPA 프록시

0

105

1

Native Query와 MyBatis

0

81

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

97

1

임베디드 타입 예시 코드 관련 질문

0

125

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

100

3

인텔리제이 패키지 커서 단축키 질문

0

112

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

151

1