val id : Long
390
작성한 질문수 12
안녕하세요 강사님~~ 자주 질문드리네요 ㅎㅎ 많이 배워가겠습니다.
@Id
@GeneratedValue(strategy = IDENTITY)
val id : Long? = nullval 은 읽기 전용 프로퍼티라서 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에 사용하더라도 문제가 없었습니다!
답변이 되었으면 좋겠네요~!! 저녁 잘 보내시고 행복한 주말 되세요!! ㅎㅎㅎㅎㅎ 감사합니다!
안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?
0
82
2
실행이 안되네요
0
83
2
프론트 영역 보는법
0
65
2
companion object
0
88
2
Custom 레프직토리 형식
0
71
2
Querydsl 도입
0
75
2
fetch join DISTINCT 중복제거
1
97
2
표준 예외와 커스텀 예외 사용 전략 질문
0
112
3
이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.
1
186
2
테스트를 위한 코드
1
115
2
프로젝트 실행 에러
0
161
2
PDF 문서에 오타가 있어서 알려드립니다.
1
103
1
enum질문
1
89
1
테스트 후 AfterEach 함수에서 나오는 쿼리
0
144
2
테스트 fixture
1
220
2
./gradlew test 실행시 인식할수 없다고 뜹니다.
0
148
1
test 코드 실행시 경고가 발생합니다.
0
153
1
13강 User Kotlin 변환중
2
178
3
'추가 - 코프링과 플러그인' 강의 7:46 allopen 관련 질문
2
177
1
-
0
147
2
4:28 build.gradle 수정 시 kotlin-reflect관련 implementation 추가 해야할까요?
0
320
3
junit import 불가
0
284
3
테스트 코드와 관련하여 질문이 있습니다.
1
220
1
hibernate가 select를 두번 하는 이유
0
247
1





