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

차가운물님의 프로필 이미지
차가운물

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

14강. Kotlin과 JPA를 함께 사용할 때 이야기거리 3가지

방법2. custom setter 사용하기에 대해 질문

해결된 질문

작성

·

555

1

안녕하세요!

오랜만에 재수강 중인데 다시보다가 질문이 있어서 남깁니다!

 

2분41초에서 setter를 private으로 두고 싶은 경우 private set을 이용하기라고 되어 있는데요.

JPA와 함께 사용하게 된다면 저는 엔티티 클래스의 경우 gradle 설정에서 OPEN설정을 해주는데, open으로 두게 되면 private set 기능은 사용이 불가능 하더라고요.

 

이 부분에서 jpa의 프록시 기능 사용이 안 되는 것으로 알고 있는데 TRADE-OFF의 영역인지 아니면 제가 모르는 다른 설정으로 프록시 기능을 사용하면서 private set을 사용할 수 있는지 궁금합니다!.

답변 2

1

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요, 차가운물님!! 🙏 정말 좋은 질문 감사드립니다.

 

결론부터 빠르게 말씀드리면, 차가운물님께서 말씀해주신 내용이 맞습니다! 플러그인을 통해 JPA Entity에 대한 프로퍼티를 open 하게 되면, var 변수에 대해서는 setter를 하위 클래스에서 override 할 수 있어야 하기 때문에 private set을 만들 수 없게 됩니다. 😭 외부에서 setter를 막는 모든 경우를 보여드리려다 보니 JPA에서는 사용하기 어려운 private으로 설명드렸네요. 죄송합니다. 🙇

 

이에 대한 우회책으로 접근 지시어 수준을 protected로 변경할 수 있습니다. 목적 자체가 setter의 외부 사용을 막는 것이니, 해당 클래스와 프록시로 인해 생성될 하위 클래스에서만 사용할 수 있도록 protected를 사용하는 것이죠.

 

Kotlin과 JPA의 조합에 대한 호환성이 확실히 높지는 않은 것 같습니다. 답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙏

 

차가운물님의 프로필 이미지
차가운물
질문자

아하 빠른 답변 감사합니다!

새로운 프로젝트에서 엔티티 클래스 필드에 private을 적용을 시도 했는데 확실히 궁합이 좋지는 않는게 느껴지네요.

태현님이 강의에서 언급한 것처럼 엔티티 클래스에 대해서는 public하게 열어두고 setter를 사용을 지양하는 방향으로 개발하는게 좋아보입니다!

0

안녕하세요 차가운물 님, 인프런 AI 인턴이에요.

JPA와 함께 사용할 때 private set과 프록시 기능을 함께 사용하는 것은 TRADE-OFF의 영역입니다. 일반적으로 JPA의 프록시 기능은 엔티티의 필드에 직접 접근하지 않고, getter와 setter를 통해 접근하도록 설계되어 있습니다. 그래서 엔티티 클래스의 필드에 private set을 사용하면 JPA의 프록시 기능을 사용할 수 없게 됩니다.

프록시 기능을 사용하면서 private set을 사용하려면 다른 방법을 고려해야 합니다. 예를 들어, 필드를 protected로 선언하고, 그에 해당하는 protected setter를 구현하는 방식이 있을 수 있습니다. 하지만 이런 방식은 설계상 주의가 필요하며, 각각의 상황에 따라 다르게 적용될 수 있습니다.

좀 더 자세한 내용을 알고 싶다면 JPA 프록시 기능과 엔티티 클래스의 설정에 대해 더 찾아보시는 것을 추천드립니다. 감사합니다!

차가운물님의 프로필 이미지
차가운물

작성한 질문수

질문하기