• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

OneToMany에서 @JoinColumn(nullable = false, updatable = false)에 대하여

23.08.24 19:43 작성 23.08.24 19:44 수정 조회수 416

0

안녕하세요 궁금한 것이 있습니다.

JPA에서 @OneToMany를 통한 단방향 연관관계에서 문제로 지적되는 것이 Many쪽의 FK를 update. 하기 위한 추가적인 쿼리 문제인데요. (물론 이것만이 @OneToMany 단방향의 문제는 아닙니다만)

이 문제는 @JoinColumn(nullable = false, updatable = false)이라는 설정을 통해 해결할 수 있는 것으로 알고 있습니다.

이러면 One을 먼저 insert한 후, Many를 insert할 때 One의 PK를 바탕으로 추가적인 업데이트 쿼리 없이 바로 insert를 해주는걸로 알고 있습니다.

근데 "대체 JPA는 왜 이렇게 설계한걸까?" 라는 의문이 듭니다.

물론 앞서 말씀드린 방법은 FK가 not nullable이여야하고, FK가 변경되면 안된다는 제약 조건이 들어가야하기 때문에, 모든 상황에서 공통적으로 적용되는 방법은 아닙니다만, 차라리 이런 설정을 default로 하는게 이해하기 더 쉬운 방법아닌가? 라는 생각이 들어서요.

FK가 nullable하고, 또 변경될 수 있는 상황은 상대적으로 적은데다가, insert한 컬럼에 FK를 추가해주기 위해 update 쿼리가 나가게 되는 로직은 성능적으로도(드라마틱하진 않지만) 좋지 않고, hibernate를 처음 사용하는 사람은 "대체 왜 이렇게 쿼리가 나가지?"라는 식으로 이해하기 어렵다고 판단이 들거든요.

사실 이게 프로그래밍 하는데 중요한 지식은 아니지만.. 그냥 순전히 호기심으로 궁금합니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.26

안녕하세요, 인프런 AI 인턴이에요.

@JoinColumn(nullable = false, updatable = false) 설정은 JPA에서 엔티티 간의 관계를 매핑할 때 사용되는 어노테이션입니다. 이 설정은 OneToMany 관계에서 Many쪽 엔티티의 FK 값을 update 하지 않고, 바로 insert를 할 수 있게 해주는 역할을 합니다.

JPA가 이런 설계를 한 이유는 여러 가지가 있을 수 있지만, 가장 일반적인 이유는 성능과 일관성을 고려한 것입니다.

먼저, nullable=false 설정은 FK가 NULL이 될 수 없다는 제약 조건을 설정하는 것입니다. 이 설정은 FK 값이 반드시 존재해야 한다는 것을 명시하는 것으로, 데이터 일관성을 보장하는데 도움을 줍니다. 예를 들어, Many 엔티티의 FK 값이 외래 키(FK)로 사용되는 One 엔티티의 Primary Key(PK) 값을 참조해야하는 경우에는 애초에 NULL값을 허용하지 않는 것이 일관성을 유지하는데 좀 더 안전한 방법일 수 있습니다.

그리고, updatable=false 설정은 FK 값을 변경할 수 없다는 제약 조건을 설정하는 것입니다. 이 설정은 Many 엔티티의 FK 값이 One 엔티티의 PK 값을 참조하면서 변경될 수 있는 상황을 방지하기 위한 것입니다. 예를 들어, Many 엔티티의 FK 값이 Nullable이고 변경될 수 있는 상황에서 insert 시 update 쿼리가 발생한다면, 동시에 여러 사용자가 작업하는 경우 일관성 문제가 발생할 수 있습니다. 따라서 updatable=false 설정으로 이러한 상황을 방지하도록 설계되었을 것입니다.

마지막으로, 이러한 설정을 default로 하는 것이 이해하기 쉽다는 점에 대해서는 JPA 프로바이더인 Hibernate는 이런 설정을 어떻게 하는 것이 좋을지에 대한 가이드라인을 제공하지만, 세밀한 세팅은 개발자의 선택에 맞게 유연하게 할 수 있도록 하기 위한 목적도 있습니다.

따라서, @JoinColumn(nullable = false, updatable = false) 설정은 JPA의 관계 매핑을 유연하게 할 수 있는 옵션이며, 개발자가 데이터 일관성과 성능을 고려하여 적절한 설정을 선택할 수 있습니다.

더 궁금한 것이 있으면 언제든지 물어보세요. 좋은 하루 되세요!