inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

12강. 도메인 계층을 Kotlin으로 변경하기 - Book.java

val id : Long

390

하하하

작성한 질문수 12

1

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

 

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

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

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


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

spring spring-boot java kotlin refactoring

답변 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