• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

val id : Long

22.11.02 23:59 작성 조회수 245

1

안녕하세요 강사님~~ 자주 질문드리네요 ㅎㅎ 많이 배워가겠습니다.

 

@Id
@GeneratedValue(strategy = IDENTITY)
val id : Long? = null

val 은 읽기 전용 프로퍼티라서 id값이 할당되지 않을거라 생각했는데 혹시 어떻게 id값이 저장되는건지 알 수 있을까요?

리플렉션을 통해 주입된다고 하는데 맞는지 궁금합니다.


그리고 val id : Long ? = null 이 아닌 val id : Long =0 으로 설정해주는 경우도 종종 있다고하는데 어떤 경우가 더 나은지 궁금합니다!

답변 1

답변을 작성해보세요.

0

안녕하세요 진욱님!!! 아이고~ 질문을 많이 달아주시면 그만큼 열심히 들어주시는건데 저도 너무 좋죠~! 😊

하나씩 답변 드려보겠습니다!!

 

[val 프로퍼티에 값이 들어가는 이유]

넵넵!! 예상해주신것처럼 리플렉션이 맞습니다! 리플렉션을 사용하면 불변 여부, private 여부와 무관하게 런타임시 객체에 값을 집어 넣을 수가 있어요!!

기본적으로 Hibernate은 Entity 필드에 접근할 때 리플렉션을 사용하기에 val 으로 처리된 프로퍼티여도 데이터가 들어가게 됩니다!! (관련한 어노테이션으로는 @Access 가 있어요!!)

 

[id의 nullable 여부]

아하~~ 매우 매우 좋은 질문이신데요~~ 우선 Long? 으로 할 때의 장점은 null 을 통해 아직 저장되지 않은 데이터를 확실하게 표현할 수 있다는 점이 있어요! 0과 null은 다르게 생각할 수 있으니까요~

또한 Hibernate은 (저도 이유는 정확히 모르겠지만...) https://docs.jboss.org/hibernate/orm/5.6/userguide/html_single/Hibernate_User_Guide.html#entity-pojo-identifier 다음과 같이 nullable type을 권장하고 있습니다!

Kotlin에서는 Long? 으로 id를 설정하게 되면 한 번 save되고 난 객체의 id에 대해서도 계속 적절한 null 처리를 해줘야 하다보니 (safe call, 널아님단언 등) 그 부분이 아쉽게 됩니다!

 

Long 으로 할 때는 반대입니다!! 어차피 id = 0 통해 아직 저장되지 않은 데이터를 null 보다 덜 확실하지만 구별할 수 있고요! (보통 id는 0일 수 없으니까요!) 번거롭게 null 처리를 하지 않아도 됩니다.

하지만, Hibernate의 추천을 따르지 못했다는 찜찜함이 있지요...!

 

제 개인적인 경험으로는 Long 타입을 id에 사용하더라도 문제가 없었습니다!

 

답변이 되었으면 좋겠네요~!! 저녁 잘 보내시고 행복한 주말 되세요!! ㅎㅎㅎㅎㅎ 감사합니다!