반응형
작성 계기
- 지난 리팩토링 프로젝트에서 Spring Boot 3로 업그레이드 하면서 JDK 17로 바꾸게 됐는데, 이에 따라 여러 Dependencies를 고치게 되었다.
- 이에 따라 다양한 이슈가 발생했었는데, 가장 기억에 남았던 이슈라 글로 정리 해 본다.
이슈 사항
- Kotlin Entity 에서 @OneToMany List<FundImage> fundImageList 형식으로 사용하는 곳에서 RuntimeExecption 발생
- MutableList로 고치니 잘 동작 =>
이대로 끝나면 발전 가능성이 없는 것이다.
무엇이 문제였을까? 공변성과 반공변성
- Effective Java와 Kotlin In Action에서 공변 / 반공변에 대해 학습했었는데 와닿지 못 했었던 내용이라 그냥 달달 외웠었다.
- 지금 이슈가 발생했던 부분은 바로 이 문제 때문인데,
- Kotlin의 List는 다음과 같이 특정 타입을 확정지을 수가 없는 와일드 카드를 품고 있다.
- 이게 왜 문제일까? 런타임 환경에서 List는 타입 소거를 하게 되는데, 타입 소거를할 때 저 out 위치에 어떤 타입이 오는지 JVM은 모르기 때문에 에러가 난다 (이는 Java의 List<? extends E>와 같다)
- 그렇다면 MutableList는 왜 오류가 안 났을까? 그렇다 바로 아래 사진처럼 와일드 카드가 아닌 특정 클래스 타입이 선언 되어있기 때문이다.
Kotlin의 공변과 반공변에 대해
- kotlin에서는 in / out 키워드를 제공해주는데, 각 키워드는 아래와 같이 동작한다.
- in의 경우 자바의 List<? extends E> => 쓰기만 가능, 읽기 불가
- out의 경우 자바의 List<? super E> => 읽기만 가능, 쓰기 불가
결론
- 확인해본 결과, 해당 이슈는 Hibernate 6.2 버전 이하에서는 잘 동작했던 것 같다. (5.6부터 차례로 확인)
반응형
LIST
'Spring Framework > JPA' 카테고리의 다른 글
JPA @DataJpaTest - 환경구성 (0) | 2023.12.12 |
---|---|
JPA findAll()은 어떻게 쿼리 결과를 객체로 파싱할까? (feat. 메서드 호출 과정) (0) | 2023.11.17 |
[Spring Boot JPA] JPA란 무엇일까? (0) | 2020.05.12 |
JPA - 환경설정(feat. 스프링 부트) (0) | 2019.08.21 |