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

Coinvest님의 프로필 이미지
Coinvest

작성한 질문수

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

김영한 선생님 JPA INSERT 관련 질문이있습니다!

작성

·

2K

0

현재 회사에서 SPRING DATA JPA로 프로젝트를 진행중입니다.

INSERT 를 할 때 궁금한점이 있어서 간단 예제를 작성해서 질문드겠습니다.

밑에는 간단한 예제로 작성한 엔티티입니다. (회원과 댓글 테이블)

댓글 테이블

회원 테이블

그리고 최종적으로 INSERT 를 하는 메소드입니다.

김영한 님께서 알려주신 방법으로는 연관관계에서 부모테이블이 되는 MEMBER에 값을 할당한 후 영속성 컨텍스트에 SAVE 하고

후에 영속성 컨텍스트 1차캐시에서 PK값이 최종적으로 할당된 후 다시 가져온 rs1 엔티티 객체를 자식테이블인 comment 의

Member 필드에 값을 할당한 후 comment 엔티티도 최종적으로 save 를 하면 자동적으로 FK값을 만들어 주신다고 하셨어요.

말씀대로 실제로 성공적으로 INSERT가 됩니다.

허나 궁금한 것이 하나있습니다..

----------------------------------------------------------------------------

예제에서는 간단한 테이블 구조이니 저런식으로 할수있곘지만 회사에서는 꽤나 DB테이블 구조가 복잡하게 되어있어서

연관관계 설정에서도 일일히 FK필드를 모두 만들어 주어서 쓰고있습니다.

예를들어 실제 INSERT 할 때도 위의 예시처럼 Member 필드를 만들어서 값을 할당해주는 것이 아니라 밑의 예시이미지 처럼 FK필드에 바로 값을 할당해주는 식으로 하고 있어요.

예시 이미지입니다.   

Member 엔티티는 바뀐것이 없지만 Comment 엔티티에 memberIdx 라는 Member 테이블을 참조하는 FK필드가

추가된 것을 알수있습니다.

그리고 INSERT할 때에도 MEMBER 엔티티를 save 후에 영속성 컨텍스트 1차캐시에서 꺼내온 Member 엔티티객체(rs1)

을 바로 Comment 엔티티의 Member 필드에 넣지않고 아까 생성하였던 memberIdx 라는 FK 필드에 주입해서 넣었어요.

현재 회사에서 만든 DB구조가 상당히 복잡하게 짜여져있어 엔티티에서 FK필드를 만들어주지않으면 후에 헷갈릴것 같아서

지금 현재 저런식으로 INSERT를 하고있는데요.. 저런식으로 개발하여도 상관없을까요?

답변 4

1

Coinvest님의 프로필 이미지
Coinvest
질문자

감사합니다^^

1

김영한님의 프로필 이미지
김영한
지식공유자

Coinvest님

결국 둘중에 하나를 선택하는 하는 것을 권장합니다.

외래키 값을 사용하거나, 객체 연관관계를 사용하거나요.

그리고 연관관계가 없어도 둘을 조인해서 사용할 수 있습니다. 대신에 엔티티로 함께 조회하는 fetch join 같은 기능이 동작하지 않습니다.

하나의 애플리케이션 안에서도 어떤 부분은 연관관계를 사용하고, 어떤 부분은 외래키 값을 직접 사용하도록 나누어서 설계하셔도 됩니다. 대신에 이렇게 하나안에서 둘을 같이 혼합하는 방식은 잘못 사용하면 여러가지 부작용이 있을 수 있기 때문에 권장하지 않습니다.

감사합니다.

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Coinvest님

반대로 질문을 드려보면, member_idx 처럼 FK 값을 따로 관리하는데, 꼭 객체 연관관계를 맺어야 할까요?

단순하게 Comment에서 member의 연관관계를 제거하는 것은 어떠신지요?

어떤 고민때문에 연관관계를 꼭 가지고 가려고 하시는지 궁금해서 문의드려요.

0

Coinvest님의 프로필 이미지
Coinvest
질문자

아하! 외래키를 따로 관리한다면 객체 연관관계를 따로 주지않아도 된다는 말씀이신가요?? 후에 쿼리dsl로 둘을 조인해서 가져오려면 연관관계 설정이 되어있어야한다고 이야기를 들어서요 ㅜ。 외래키를 따로 관리한다면 아예 관계설정을 맺을 필요가 없는것인가요? 제일 궁금했던 것입니다..

Coinvest님의 프로필 이미지
Coinvest

작성한 질문수

질문하기