작성
·
343
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에 사용하더라도 문제가 없었습니다!
답변이 되었으면 좋겠네요~!! 저녁 잘 보내시고 행복한 주말 되세요!! ㅎㅎㅎㅎㅎ 감사합니다!