강의

멘토링

커뮤니티

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

h.님의 프로필 이미지
h.

작성한 질문수

제미니의 개발실무 - 커머스 백엔드 기본편

찜하기 - 코드 느끼기

엔티티의 pk 를 0으로 초기화하시는 이유가 있을까요??

작성

·

27

1

자바에서 클래스 필드 타입을 참조타입과 원시타입의 차이를 공부하던 중에

둘의 차이가 null 값이 필요하냐 필요하지 않냐로 배웠습니다..

그런데 엔티티 pk의 경우에는

jpa에서 새 객체와 저장된객체를 구분할 때 null 을 본다고 들었습니다.

그래서 참조형 Long을 쓰는 구나 라고 생각을 정리했어요!!

 

헌데 코틀린으로 쓰신 코드에서는 Long타입을 선언하시고 0으로 초기화해주시는 이유가 궁금합니다!

코틀린에서는 nullable하게 할순있지만 기본적으로 null이 불가능하다고 들었긴한데.. 조금 헷갈립니다!

언어적인 부분에서 jpa가 다르게 동작하는것인지 아니면 제가 좀 미숙하게 이해한건지 궁금합니다!

답변 2

0

제미니님의 프로필 이미지
제미니
지식공유자

안녕하세요 질문 감사드립니다!

저도 이제 시간이 지나서 가물가물한데요ㅎㅎ(아래 관련 유튜브 영상이 있습니다!)

spring data 내부적으로 새 객체저장 된 객체를 구분할때 null 뿐만 아니라, Number Type에 따라 0일 경우 새 객체로 처리하는 로직이 존재하고 있었던 것으로 기억합니다.

이게 그 수정 자체가.... 코틀린 호환 때문에 한거였는지는..? 저도 가물가물한데요 스프링 쪽 커밋 히스토리를 찾아봤을때 논의가 있고 결정이 된 사항으로 알고 있습니다


아무튼 프레임워크 내부적으로 해당 방식을 지원하고 있고, 여태 제가 여러번 사용해봤는데 실질적인 문제는 못 느끼고 있습니다
(아시는 분이 아마 문제 있을거라고 했는데 무슨 문제인지 정확히는 알려주시더라구요ㅎㅎ;;)

 

일단 프레임워크에서 지원하는 것과 별개로 왜 안쓰냐로 넘어가면..! 코틀린 코드에서 id 가 nullable 할 경우 계속 !! 를 붙혀주는게 보기가 싫었습니다 😅

Repository 에서 조회 시에는 무조건 id가 null이 아닌 상태인데 코드에 계속 !!이 붙어 다니는게 비효율적으로 보였습니다ㅎㅎ

그래서 프레임워크 레벨에서 지원하니 0으로 초기화해서 사용하고 있고, 저도 아직까지는 다른 문제를 찾지는 못해서 계속 유지 중입니다.

다만 정석적으로 접근한다면 null로 선언하는게 맞다는 점은 참고 부탁드립니다!


관련 유튜브 영상 링크 전달드립니다! 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. h님.

질문해 주신 내용은 Kotlin에서 JPA 엔티티의 PK(primary key)를 어떻게 처리하는지에 관한 것입니다. Java와 Kotlin의 차이점과 JPA의 동작에 대한 이해는 백엔드 개발에서 매우 중요합니다.

Kotlin과 JPA, 그리고 PK의 초기화

  1. Kotlin에서의 Nullable 처리:
    Kotlin은 기본적으로 모든 변수가 nullable하지 않은(Non-Nullable) 상태입니다. 즉, Long 타입은 null을 가질 수 없고, 이는 0으로 초기화해야 하는 이유 중 하나입니다. 하지만 사용할 수 있는 방법 중 하나는 nullable 타입을 쓰는 것입니다. 즉, Long? 형태로 선언해 null을 허용할 수 있습니다.
   var id: Long? = null
  1. JPA와 ID 초기화:
    JPA에서는 엔티티가 처음 저장될 때와 이미 저장되어 있는지를 구분하기 위해 ID 필드를 봅니다. 일반적으로 Java에서는 Long 타입을 nullable로 선언하여 초기 상태의 엔티티가 null ID를 갖도록 하여 JPA가 이를 새 엔티티로 인식하게 합니다.

  2. Kotlin에서의 상황:
    Kotlin에서 nullable 타입을 사용하지 않고 Long을 사용할 경우, 기본적으로 0으로 초기화됩니다. JPA가 이를 새 엔티티로 인식할지 여부는 엔티티 매니저의 설정에 따라 달라질 수 있지만 기본적으로 0이라 하여 반드시 새 엔티티로 인식하지는 않을 수 있으므로 조심해야 합니다. 따라서 JPA를 사용할 때는 가능한 한 nullable 타입을 사용하는 것이 일반적입니다.

결론적으로, JPA와 Kotlin을 사용할 때의 최선의 실천 방법은 nullable 타입을 사용하는 것입니다. 이는 엔티티 초기 상태를 명확히 하고, JPA의 동작을 기대대로 맞출 수 있도록 돕습니다.

해당 주제에 대한 더 깊은 이해를 위해 JPA 엔티티 키 설정에 관한 고찰를 참고하시면 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

h.님의 프로필 이미지
h.

작성한 질문수

질문하기