본문 바로가기

Spring|Spring-boot117

Spring Formatter Converter를 등록하려고 보면 사용하는 interface를 보면 FormatterRegistry 타입을 통해 등록한다. Converter는 사실 입력과 출력 타입에 제한이 없다. Converter 로 구현한다면 모든 타입을 받고 원하는 타입으로 캐스팅하여 처리할 수 있기 때문이다. 일반적인 웹 애플리케이션은 문자를 다른 타입으로 변환하는 기능이 정말 많다. 예시를 들자면 가격, 월급, 수량을 확인하면 천의 자리마다 , 로 구분되어 찍힌다. 또는 날짜를 문자로 그 반대로 문자를 날짜로 변경하는 경우가 상당히 많고 Locale현지화 정보 또한 정말 많이 사용한다. 이렇게 객체를 특정한 포맷에 맞추어 문자로 출력하거나 그 반대로 문자를 객체로 입력하는 기능에 특화된 것이 바로 Formatter이다. 스프.. 2022. 1. 10.
Spring Converter HTTP 요청 파라미터는 모두 문자로 처리된다. 따라서 요청 파라미터를 다른 타입으로 변환해서 사용하고 싶으면 다른 타입으로 변환하는 과정이 필요하다. 그런데 스프링에서는 (@RequestParam Interger data)와 같이 요청 파라미터를 Interger로 받을 수 있다. 그래서 별도의 타입 변환 과정 없이 사용할 수 있다. 이 맥락에서 꼭 알아야하는 지식은 HTTP 메시지의 파라미터는 모두 문자라는 점이다. 우리가 사용하는 @ModelAttribute, @PathVariable에서도 마찬가지이다. /users/{userId} @PathVariable("data") Integer data ---------------- @ModelAttribute UserData data class UserDat.. 2022. 1. 10.
Spring MessageCodesResolver MessageCodesResolver 검증 오류 코드로 메시지 코드들을 생성한다. DefaultMessageCodesResolver의 기본 메시지 생성 규칙 객체 오류 객체 오류의 경우 다음 순서로 2가지 생성 1. code + "." + object name 2. code 예) 오류 코드: required, object name: item 1. required.item 2. required 필드 오류 필드 오류의 경우 다음 순서로 4가지 메시지 코드 생성 1. code + "." + object name + "." + field 2. code + "." + field 3. code + "." + field type 4. code 예) 오류 코드: typeMismatch, object name "user.. 2022. 1. 8.
Spring Web Validation (2) BindingResult 이전 편에서 HashMap을 통하여 Error를 들고 날랐다면 스프링에서는 그를 대체할 BindingResult라는 클래스가 존재합니다. @PostMapping("/add") public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { } Controller에서 BindingResult를 사용하여 기존 Error를 담도록 별도 배열을 생성할 필요가 없습니다. 대신 BindingResult bindingResult 파라미터의 위치는 @ModelAttribute 다음에 위치해야 합니다. bindingResu.. 2022. 1. 8.
Spring Web Validation (1) 사용자의 요청에 응답하는 서버는 사용자의 메시지가 목적에 맞게 잘 전달되었는지 확인하는 절차가 필요하다. 이러한 검증은 수시로 변경될 수 있고, 사용자의 편의성을 위해 클라리언트 검증과 서버 검증, 데이터베이스 검증... 등으로 나누어질 수 있다. 타입 검증 필드 검증 특정 필드의 범위를 넘어서는 검증 실제 보낸 요청이 프로그램 언어에 맞는 타입으로 변환될 수 있는지 확인하는 타입 검증 부분과, 필드의 값이 의도한 필드 값의 형식에 맞는지 검증하며, 특정 필드의 값의 범위를 제한하여 처리하는 검증이 도 있고 이 데이터가 데이터베이스에 저장될 때 데이터베이스에 저장할 수 있는지 여부조차도 검증한다. 클라이언트에서 자바스크립트를 통해 검증을 완벽하게 구현하면 서버에서 검증이 필요 없다고 생각하는 사람을 실제.. 2022. 1. 8.
Spring 메시지, 국제화 최근 진행한 프로젝트가 전 세계에서 접속하는 상황이다. 우선적으로 한국어는 물론이고 영어로 번역을 해야 하는 상황이 있어, 현지분들이 접속 시 기존 화면의 단어를 데이터베이스에서 현지 언어로 번역하여 제공하는 것으로 알고 있다. 그래서 퇴근 후 메시지, 국제화하는 방법에 대해 공부하다가 관련 내용을 정리하려고 한다. 메시지 신규 기능이나 유지보수를 진행하다 보면 규정이 변경되거나, 기존 용어의 어감 등으로 화면상에 공통적으로 들어있는 문구를 변경하는 경우가 상당히 많다. 여러 화면에 있는 모든 단어를 모두 찾아서 변경하는 것은 매우 불편한 작업이고 시간도 오래 걸린다. 이러한 다양한 메시지를 한 곳에서 관리되도록 하는 기능을 메시지 기능이라고 한다. 예를 들면 message.properties라는 메시지.. 2022. 1. 6.
Spring MVC HTTP Header 처리와 Arguments, Return 웹 요청을 처리할 때 HTTP Header에 대한 정보가 필요한 경우 Servlet을 통해 Header를 받는 방법은 알고 있지만 Spring MVC가 편리한 방법을 제공해주기 때문에 오늘은 Header정보를 편하게 받는 방법을 알아보자. Spring MVC도 서블릿을 활용하기 때문에 WAS가 생성해서 넘겨주는 HttpServletRequest와 HttpServletResponse를 활용할 수 있다. @RequestMapping("/headers-servlet") public String servletHeaders(HttpServletRequest request, HttpServletResponse response){ String header1 = request.getHeader("host"); log... 2021. 12. 29.
뷰 리졸버 핸들러는 return을 다양하게 할 수 있다. void를 가진 HttpRequestHandler구현체들이 있는 반면, ModelAndView를 반환하는 핸들러, View객체를 반환하는 핸들러 등등 을 반환하지만 이는 모두 어댑터에 의하여 ModelAndView 객체를 FrontController인 DispatcherServlet에게 반환된다. 가장 많이 쓰이는 것은 return에 jsp이름을 반환하는 경우인데, 전체 경로가 아닌 논리적인 경로를 반환한다. 스프링 MVC는 ViewResolver 역시 인터페이스로 구현되여있어 다양한 ViewResolver를 사용할 수 있다. @Component("/springmvc/old-controller") public class OldController impleme.. 2021. 12. 25.
핸들러 매핑과 핸들러 어댑터 개발 공부를 할 때 과거에 어떻게 개발했는지를 아는 것은 상당한 메리트가 존재하는 것 같다. 과거에서 발생한 문제를 개선한 코드가 현재 반영되어 있기 때문에 어떠한 문제를 어떻게 해결했는지에 대해서 알 수 있으며, 현재를 이해할 수 있는 좋은 거름이 되기 때문이다. 또 레거시 프로젝트를 맡게 되었을 때 코드를 보며 빠른 이해가 가능할 뿐만 아니라 그 코드를 어떻게 개선해야 할지도 알 수 있기 때문이다. 스프링 MVC 구조를 보면 FrontController 패턴과 handler를 찾는 과정, handler를 처리할 수 있는 Adapter를 찾는 과정과 찾은 Adpater로 사용자가 정의한 비즈니스 로직을 실행하는 handle() 메서드와 메서드의 결과로 ModelAndView를 반환하여 ViewResol.. 2021. 12. 25.
싱글톤과 함께 사용하는 프로토타입 문제점 스프링 컨테이너가 관리하는 모든 빈은 기본 값으로 싱글톤 스코프를 가지고 관리된다. 그 와 별개로 클라이언트의 요청마다 스프링 컨테이너가 빈 생성, 의존관계 주입, 초기화 메서드까지 실행까지만 책임지는 빈이 존재하는데 이때 해당 빈은 프로토 타입 스코프를 갖는다고 말한다. 우선 스프링이 지원하는 다양한 스코프의 종류를 알아보자. 싱글톤 : 스프링의 기본 스코프 방식으로, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 긴 라이프사이클을 가지는 빈 스코프이다. 프로토타입 : 스프링 컨테이너는 빈의 생성과 의존관계 주입까지만 책임진다. request : Spring Web에서 사용되는 스코프로 웹 요청이 들어오고 나갈 때까지만 유지되는 스코프이다. session : 웹 세션이 생성되고 종료될 때까지 유지되는.. 2021. 12. 18.