일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- DesignPattern
- exception
- hibernate
- 빌드툴
- lambda
- AutoConfiguration
- 링커
- 토비의스프링3.1
- 메이븐
- Immutable
- ApplicationContext
- 자바
- IOC
- JPA
- Spring
- gradle
- 토비의스프링
- String
- Kotlin for Java Developers
- ORM
- 컴퓨터시스템
- 링킹
- 프록시
- java
- beanfactory
- springwebmvc
- DispatcherServlet
- springboot
- FunctionalInterfaces
- 클린코드
- Today
- Total
엔지니어로 가는 길
Spring Data Jpa의 DomainClassConverter가 해주는 일 본문
Converter
Converter란 객체를 다른 객체로 변환해주는 일을 한다. 예를 들어, Spring boot에서 문자열을 과일이라는 객체로, 과일이라는 객체를 문자열로 변환하고 싶다면 다음과 같은 Converter를 빈으로 등록해주어야 한다.
DomainClassConverter
DomainClassConverter도 Converter인데 이름에서 알 수 있듯 도메인 객체를 다른 객체로, 또는 다른 객체를 도메인 객체로 변환해주는 일을 한다. Spring data jpa를 사용하면 DomainClassConverter가 자동으로 등록된다. Spring MVC 컨트롤러에서 매우 유용하게 사용할 수 있다.
위의 예시를 보면 showuserFrom 핸들러는 @PathVariable을 통해 url에 있는 문자열을 받는데 이를 String이 아니라 User 타입으로 받고 있다. 실행해보면 repository에 있는 해당 id의 User 정보가 핸들러에 잘 전달된다. 바로 Spring data jpa에 의해 자동으로 등록된 DomainClassConverter가 url에 있는 문자열을 토대로 repository에서 해당하는 도메인을 가져와 User 객체로 변환해주었기 때문이다.
이런 궁금증이 들었다. 도메인의 id 타입이 String이 아니라 Long인 경우에도 잘 동작했는데 이 경우는 어떻게 동작한 것일까? 도메인의 id 타입이 Long이라면 @PathVariable에서 시작했을 때 String -> Long -> 도메인 클래스 이렇게 두 번 변환이 일어나야 하지 않을까? DomainClassconverter의 코드를 보면 내부에 static class로 ToIdConverter와 ToEntityConverter가 있다. ToEntityConverter를 살펴보자.
ToEntityConverter의 matches라는 메소드이다. A에서 도메인 repository가 존재하는지 검사하고 있다. DomainClassConverter가 하는 일이 id를 가지고 repository에서 도메인 정보를 찾아 도메인 객체로 변환해주는 것이기 때문에 repository가 없으면 동작할 수 없다.
또한 B에서 sourceType과 rawIdType을 비교하며 비교가 불가능할 경우 ConversionService를 통하여 변환이 가능한지까지 검사하고 있다. 여기가 바로 도메인의 id가 String이 아닌 경우 @PathVariable을 통해 얻은 문자열을 내부적으로 도메인의 id로 변환한 뒤에 도메인 id를 도메인 객체로 변환하고 있음을 암시하는 부분이 아닐까? 이로 미루어보아 도메인 id가 String이 아닌 경우 String -> 도메인 id -> 도메인 이렇게 두 번의 변환이 일어나는 것 같다. 도메인 id가 사용자 정의 클래스라고 할지라도 ConversionService에서 이를 변환할 수 있는 Converter 또는 Formatter가 등록되어 있는 경우 잘 동작할 것이다.
참고: docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.web.basic.domain-class-converter
'프로그래밍 > Spring' 카테고리의 다른 글
@InitBinder와 WebDataBinder의 쓰임 (0) | 2021.04.11 |
---|---|
Spring 빈을 생성하는 또 다른 방법 FactoryBean (0) | 2021.02.09 |
Spring에서 axios post으로 보낸 요청 매개변수를 못받는 문제 (2) | 2020.11.13 |
Formatter 없이도 변환이 되는 경우 (0) | 2020.09.19 |
@WebMvcTest 테스트에서 Formatter가 동작하지 않는 이유 (0) | 2020.09.17 |