반응형

Java Backend 개발자 되기/Spring MVC 9

ObjectMapper를 이용한 JSON 역직렬화(Deserialization) 이야기

Spring MVC에서 ObjectMapper로 json 포맷의 request body를 DTO 객체로 역직렬화 하는 방법은 크게 두 가지이다. 디폴트 생성자가 있을 경우, 이 경우는 다음과 같은 순서를 따라 역직렬화를 수행한다. 역직렬화의 시작점은 BeanDeserializer이다. BeanDeserializer.deserializeFromObject()에서 디폴트 생성자를 이용한 리플렉션 기법(Constructor.newInstance(Object[] args)으로 DTO 객체를 생성한다. FieldProperty.deserializeAndSet(...)에서 리플렉션으로 얻어온 Field에 JSON 포맷에서 얻은 값을 set한다. 여기서의 Field는 DTO 객체의 멤버 필드의 메타 정보를 포함한 객..

ContentCachingRequestWrapper 사용 예

Spring MVC 기반의 웹 애플리케이션을 개발하다보면 Interceptor나 AOP Advice 등에서 request body를 사용해야하는 경우가 종종 있을 수 있습니다. reqeust 전송 시, header에 추가되 전송되는 JWT의 claims에 포함된 memberId와 request body에 포함된 memberId가 동일한지를 검증하는 예를 들어보겠습니다. @Slf4j @Component @Aspect public class MemberVerifyAdvice extends VerifyAdvice { private final ObjectMapper objectMapper; public MemberVerifyAdvice(JwtTokenizer jwtTokenizer, ObjectMapper ob..

그림과 코드로 알아보는 Spring MVC 요청 처리 흐름

우리가 흔히 알고 있는 Spring MVC의 요청 처리 흐름 한 가운데에는 DispatcherServlet이 자리잡고 있습니다. 클라이언트로부터 들어오는 HTTP request는 Servlet Filter를 거쳐 DispatcherServlet에 전달되고, DispatcherServlet은 해당 request를 처리할 Controller를 검색하고 대상 Controller에게 request를 전달하기 위해 HandlerMapping과 HandlerAdapter 등의 컴포넌트를 이용합니다. 대부분 다 알고 있는 내용이기 때문에 자세한 설명은 필요없을 것 같습니다. 다만, 구글링을 통해 그림으로 표현한 Spring MVC의 요청 처리 흐름에 대한 자료는 많이 볼 수 있지만 코드 베이스의 자료는 생각보다 찾기..

Mac OS에서 시스템 환경 변수 등록하는 방법

Mac OS의 기본 셸 확인하기 Mac OS Catalina 이 전 버전까지는 기본 셸이 Bash shell(bash)이었으나, Catalina부터 Z shell(zsh)이 기본 셸로 변경되었습니다. 따라서 Mac OS에서 시스템 환경 변수를 등록하기 위해서는 현재 사용하고 있는 Mac OS의 기본 셸이 무엇인지부터 확인을 해야 합니다. Mac OS에서 기본 셸은 아래의 터미널 명령으로 손쉽게 확인할 수 있습니다. kevin@hwang ~ % echo $SHELL /bin/zsh or /bin/bash Z shell에서 시스템 환경 변수 등록 방법 Z shell의 경우 다음과 같은 절차를 따릅니다. 아래와 같이 vi 편집기로 .zshrc 파일을 생성 또는 오픈합니다. kevin@hwang ~ % vi ~..

HttpMessageConverter에 대한 이야기

HttpMessageConverter란? 웹 브라우저 같은 클라이언트에서 보여지는 HTML 컨텐츠가 렌더링(Rendering)되는 방식은 크게 두 가지입니다. 하나는 웹 애플리케이션 서버에서 동적으로 변하는 데이터를 포함하는 HTML을 만들어서 HTML 자체를 한번에 클라이언트 쪽으로 내려주는 방식입니다. 이 방식은 JSP나 타임리프(Thymeleaf) 같은 기술을 사용해서 HTML을 템플릿화 한 다음에 Controller의 핸들러 메서드에서 리턴하는 모델 데이터를 템플릿에 동적으로 채워 넣은 후, 최종적으로 완성된 HTML을 클라이언트 쪽으로 내려주는 방식입니다. 이 방식을 바로 서버 사이드 렌더링(Server Side Rendering)이라고 합니다. 또 하나는 클라이언트 쪽을 담당하는 Apache나..

ResponseEntity 알아보기

ResponseEntity란? ResponseEntity는 HttpEntity의 확장 클래스로써 HttpStatus 상태 코드를 추가한 전체 HTTP 응답(상태 코드, 헤더 및 본문)을 표현하는 클래스입니다. ResponseEntity를 어디에 사용할 수 있나요? ResponseEntity 클래스는 주로 @Controller 또는 @RestController 애너테이션이 붙은 Controller 클래스의 핸들러 메서드(Handler Method)에서 요청 처리에 대한 응답을 구성하는데 사용됩니다. Used in RestTemplate as well as in @Controller methods. 그리고 RestTemplate으로 외부의 API 통신에 대한 응답을 전달 받아서 처리할 경우, 역시 Respo..

Controller 핸들러 메서드의 Argument 알아보기

Controller의 핸들러 메서드는 다양한 유형의 Argument(인수)를 지원합니다. 그 중에서 REST API 애플리케이션에서 자주 사용되는 유형의 Argument를 간단히 살펴보도록 하겠습니다. Method Argument 설명 @RequestParam 쿼리 파라미터, form-data 등의 Servlet request Parameter를 바인딩 해야 할 경우 사용합니다. @RequestHeader request header를 바인딩해서 header의 key/value에 접근할 수 있습니다. @RequestBody request body를 읽어서 지정한 Java 객체로 deserialization 해줍니다. @RequestPart 'multipart/form-data' 형식의 request 데이터..

@RequestMapping 애너테이션

​@RequestMapping 애너테이션은 어디에 사용할 수 있나요? @RequestMapping 애너테이션은 클라이언트의 요청과 Controller의 핸들러 메서드를 매핑하기 위해서 사용하는 애너테이션입니다. 즉, @RequestMapping 애너테이션에 정의된 URI에 매치되는 요청을 처리할 수 있도록 해줍니다. @RequestMapping 애너테이션은 클래스 레벨에 사용할 수 있고, 메서드 레벨에 사용할 수 있습니다. 일반적으로 공통 URI는 클래스 레벨에 정의하고, 핸들러 메서드별로 달라지는 URI는 각각의 핸들러 메서드에 정의합니다. @RequestMapping 애너테이션 단축 표현 @RequestMapping 애너테이션은 HTTP Method 에 해당하는 단축 표현들을 주로 사용합니다. @Ge..

Spring MVC의 동작 방식 추가 설명

Handler 용어의 의미 핸들(Handle) 이라고 하면 일반적으로 자동차의 핸들을 제일 먼저 떠올릴 수 있는데, 자동차의 핸들은 운전자가 직접 핸들을 움직이면서 직접적으로 자동차의 주행을 처리하는 역할을 합니다. Spring MVC에서는 자동차의 핸들과 마찬가지로 클라이언트의 요청을 처리하는 처리자를 Handler라고 합니다. 그렇다면 Spring MVC에서 Handler는 누구일까요? Spring MVC에서의 요청 Handler는 바로 여러분들이 작성하는 Controller 클래스를 의미합니다. 그리고 Controller 클래스에 있는 ‘@GetMapping, @PostMapping’ 같은 애너테이션이 붙어 있는 메서드들을 핸들러 메서드라고 합니다. HandlerMapping이란 의미는 결국 사용자..

반응형