작성
·
222
0
안녕하세요.
이번 강의에서 코틀린 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를 이용한 핸들링을 해주고 있습니다 ㅎㅎ
제 답변이 도움이 되었으면 좋겠습니다~!!!
언제든지 궁금한 점 있으시면 편하게 질문 남겨주세요~!! 행복하고 풍성한 한가위 되시기 바랍니다!!! 감사합니다~!! 😊🙏