http의 요청으로 오는 모든 데이터들은 string으로 와서 일일히 변환해야 하는데 컨트롤러에서 그냥 다른 타입으로 받을 수 있었던 이유는 자체 내부에서 컨버터가 있었기 때문. 이를 이해하기 위해 직접 구현해본다.
잘 된다. 이번엔 컨버터를 직접 만들어보자.
잘 된다. 또 컨버터도 이미 여러 종류가 있고 생각할만한 것은 이미 스프링에서 미리 다 만들어놓았다고 한다.
근데 직접 만든걸 자세히 보면 스프링이 관여한 곳이 없다. 직접 컨버터 클래스 만들고 했을 뿐.. 그래서 이렇게 직접 만들어 놓은 컨버터를 컨버전 서비스(ConversionService)라는 곳에 등록해놓고 꺼내쓰기만 하면 된다.
진짜 등록하고 클래스 유형만 주면 지가 알아서 찾아서 정의한거 찾아서 쓴다. 그러니까 사용하는 사람은 (등록은 해야겠지만)내부에 뭐가 있는지 모르는 상태로 그냥 클래스 유형만 주면 지가 알아서 한다. 이렇게 메소드만 알아도 쓸 수 있게끔 인터페이스에만 의존하는걸 ISP라고 하는데 예전 5대 원칙에도 나왔었다. 실제 스프링 내에서도 잘 지키고 있으며 여기선 사용가능한지 확인하는 것과 실제 등록하는 인터페이스 2개로 나누었다. 다른 곳들도 이런식으로 해놓은 곳이 많다.
실제는 addFormatters라고 더 좋은게 있다는데 이걸로 등록해서 쓴다고 한다.
물론 얘는 원래 기본으로 있어서 없어도 잘 되었지만 내가 등록한 것이 우선순위가 되서 먼저 사용된다.
잘 된다. @ModelAttribute같은 곳에서도 알아서 됨. @RequestParam은 @RequestParam을 처리하는 ArgumentResolver인 RequestParamMethodArgumentResolver에서 ConversionService를 사용해서 타입을 변환한다. 즉 resolver가 알아서 등록되어있는 컨버터 찾아 갖다 쓴다.
저 오브젝트 그대로 타임리프에 넘겨줬을 때 괄호를 한번 {} 쓰면 string으로 변환해서 보여주고(.toString()) 두번 {{}} 쓰면 컨버터를 사용해서 변환한다.
이 경우 괄호를 한번 {} 썼는데도 이상한 객체 주소가 안나오고 string이 제대로 나온 모습이다. 괄호 한번 {}이면 string으로 변환시켜서 출력한다고 했는데 내가 만든 IpPort 클래스를 컨버터를 이용해 변형시켜서 저렇게 글자로 나오는 것. 주목해야 할 건 이걸 제출을 눌러 저 PostMapping으로 넘어갔을 때다.
보면 기존에 쌓여있던게 아니고 제출 누르는 순간 컨버터가 실행되었다. 뷰에서 컨트롤러로 올 때 String으로 오기때문에 @ModelAttribute 내에서 ipPort로 변환해서 오고, 다시 뷰로 오기 때문에 뷰인 타임리프에서 ipport를 string으로 변환시킨다.
사실 변환이란게 어떤 객체에서 string으로 가던지 string에서 객체로 가던지.. 해서 string을 거쳐가는 경우가 대부분이다. 그래서 스프링 내에서도 이미 대부분 지원하고 있음. 심지어 숫자 변환에서 쉼표 , 붙여주는것 까지 이미 다 있다. 이런 경우는 실생활 형태로 쓰이는걸로 변형된다고 해서 포맷터로 정해서 부른다. 컨버터의 특별한 버전이라고 생각하면 된다.
그냥 등록만 하고 쓰면 된다. Formatting인데도 그냥 converter를 넣어도 되는 이유는 formatter가 converter를 상속하고 있기 때문임.
실제로 WebConfig로 등록해서 사용해보자.
잘 된다. 사람이라서 찍는 쉼표 , 까지도 포맷터를 이용해 String에서 원하는 Integer로 변환된다.
대부분의 컨버터가 객체에서 String으로, String에서 객체로 바뀌는게 대부분이라 @~~Format한 뒤에 pattern으로 형식만 넣어주면 알아서 읽어서 String으로, String에서로 잘 변환한다. form data로 저 string이 그대로 갔는데 컨트롤러에서 알아서 datetime 형식으로 변환하여 받아들인것을 알 수 있다.
주의할점은 JSON으로 변경하는건 컨버터를 쓰는게 아니다. jackson 라이브러리 같은거 쓰는거다. 이 컨버전 서비스는 @RequestParam, @ModelAttribute, @PathVariable, 뷰 템플릿 등에서 사용할 수 있다.
그래서 JSON내에 있는 datetime 같은걸 변형시키려면 컨버터를 찾아보는게 아니라 jackson에서 지원하는걸 찾아봐야 한다.
'CS > 김영한 스프링 강의' 카테고리의 다른 글
스프링 DB 1편 - 데이터 접근 핵심 원리 - 섹션1. JDBC 이해 (0) | 2023.08.12 |
---|---|
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 섹션11. 파일 업로드 (0) | 2023.08.11 |
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 섹션9. API 예외 처리 (0) | 2023.08.06 |
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 섹션8. 예외 처리와 오류 페이지 (0) | 2023.08.05 |
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 섹션7. 로그인 처리2 - 필터, 인터셉터 (0) | 2023.08.05 |