Book 클래스 프로퍼티 질문입니다.
284
작성한 질문수 22
안녕하세요.
이번 강의에서 코틀린 Book 클래스의 프로퍼티 name과 id를 둘 다 val로 선언하였지 않습니까?
제가 알기로는 val로 선언하면 클래스 생성과 동시에 초기화되고 그 이후로는 수정이 불가능한 것으로 알고있습니다.
그런데 JPA + Java에서 엔티티 클래스에 아래처럼 선언하면 JPA 리포지토리의 save 메서드를 호출 한 이후에 id필드에 값이 자동으로 들어가잖아요?
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;그런데 코틀린 클래스에서는 id 프로퍼티 선언자체를 val로 해도 테스트가 잘 통과되는걸 봐서는 id 프로퍼티의 val, var 여부와 관계없이 리플렉션(?)을 통해 직접 필드에 접근해서 값을 넣어주기 때문인건가요?
감사합니다.
답변 1
1
안녕하세요 연여포케님~!!! 아이고~~ 너무 좋은 질문이십니다 ㅎㅎㅎㅎㅎ
결론부터 말씀드리면 예상하셨던것처럼 '리플렉션'으로 인해 필드를 넣어주기 때문에 가능한 겁니다!!
'리플렉션'을 활용하면 final 변수에 대해서도 값을 변경할 수 있게 됩니다! (관련 포스트입니다! https://unluckyjung.github.io/java/2022/02/04/java-reflection-change-final-value/)
조금 더 자세하게 말씀드리자면!
SimpleJpaRepository.java 코드의 save로직을 보시면, Entity가 save될때 영속 상태에 따라 merge 혹은 persist 가 발생합니다!
merge 혹은 persist가 발생되면 그에 따른 이벤트가 처리되는데 공통적으로
persister.setIdentifier를 호출하게 됩니다!setIdentifier 에서는 이름게 걸맞게, DB에 따라 적절한 처리를 해주고 주어진 Entity 객체에 id를 집어 넣어 줍니다!
(저도 Hibernate 구조를 잘은 모르지만) AbstractComponentTuplizer와 하위 구현체인 PojoComponentTuplizer 에서 setter를 이용한 핸들링을 해주고 있습니다 ㅎㅎ
제 답변이 도움이 되었으면 좋겠습니다~!!!
언제든지 궁금한 점 있으시면 편하게 질문 남겨주세요~!! 행복하고 풍성한 한가위 되시기 바랍니다!!! 감사합니다~!! 😊🙏
안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?
0
69
2
실행이 안되네요
0
67
2
프론트 영역 보는법
0
52
2
companion object
0
79
2
Custom 레프직토리 형식
0
60
2
Querydsl 도입
0
68
2
fetch join DISTINCT 중복제거
1
84
2
표준 예외와 커스텀 예외 사용 전략 질문
0
92
3
이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.
1
177
2
테스트를 위한 코드
1
105
2
프로젝트 실행 에러
0
152
2
PDF 문서에 오타가 있어서 알려드립니다.
1
102
1
enum질문
1
86
1
테스트 후 AfterEach 함수에서 나오는 쿼리
0
136
2
테스트 fixture
1
211
2
./gradlew test 실행시 인식할수 없다고 뜹니다.
0
141
1
test 코드 실행시 경고가 발생합니다.
0
141
1
13강 User Kotlin 변환중
2
170
3
'추가 - 코프링과 플러그인' 강의 7:46 allopen 관련 질문
2
174
1
-
0
141
2
4:28 build.gradle 수정 시 kotlin-reflect관련 implementation 추가 해야할까요?
0
313
3
junit import 불가
0
276
3
테스트 코드와 관련하여 질문이 있습니다.
1
219
1
hibernate가 select를 두번 하는 이유
0
240
1





