느리더라도 꾸준히

회고록(30) - SpringMVC,Controller,DTO 본문

(CodeStates)Daily memoir

회고록(30) - SpringMVC,Controller,DTO

테디규 2022. 12. 18. 23:18

블로그글

1. 데일리 일기

요 근래동안 참 생각이 많았다. 컨텐츠는 잘 읽고 있는건지, 알고리즘은 어떻게 더 해야할지, 노션에 정리는 잘 하고 있는건지등 간단하게 답변을 할 수가 없으니 스트레스가 되고 있는듯하다.

유튜브에 5초룰이란 영상을 보았는데, 현재의 내 상황에서는 제일 좋은 전략이라는 생각이 들었다. 요약하자면 뇌는 본능적으로 복잡하고 어려운 문제를 피하고 싶어한다. 그러므로 의식적으로 동기부여를 하는 것은 인간의 본능에 반대되는 행위를 하고 있는것이다. 그러므로 우리는 질 수 밖에 없다.

그러므로 우리는 동기부여를 의식이 아닌 행동을 해야한다. 생각을 하면 할수록 결국 돌고 돌아 본능이 시키는 쪽(쉽고 편한 것들)을 하게 될 확률이 높아진다. 그러므로 5초를 세고 당장 떠오르는 아이디어로 일단 행동 해보는 것이 중요하다는 아이디어 였다.

게으른 나에겐 참 좋은 동기부여 매커니즘이고, 도움이 좀 되는 것 같다. 당분간은 해당 룰을 지키며 살아가도록!

2. 오늘 배운 내용.

SpringMVC

Spring MVC란?

SpringMVC란 Spring의 여러가지 모듈중에서 Web 요청에 대해서 Model, View, Controller 역할을 하는 클래스들을 이용하여 적절한 응답으로 처리하는 웹 프레임워크를 의미한다. 해당 웹 프레임 워크는 서블릿 API를 기반으로 작성되어 있다.

Model? View? Controller?

  • Model : 웹 요청의 처리 결과로 만들어진 데이터를 Model이라는 객체로 저장한다.
  • View : Model 데이터를 이용하여 Web 브라우저에 필요한 리소스를 제공하는 역할을 한다.
    • View는 Model데이터를 이용하여 HTML, Json, xml 등으로 변환 후, 리소스를 제공한다.
  • Controller : 클라이언트가 요청으로 제공한 데이터들의 엔드포인트로써, Model 과 View 사이에서 상호작용하는 역할을 해준다. (웹 요청 데이터 → Model , Model → View)

서블릿

웹 요청을 처리해주는 Java로 작성한 클래스파일이다. 해당 서블릿을 관리하는 컨테인를 서블릿 컨테이너라고 부르며, 스프링MVC 또한 해당 서블릿을 이용하여 웹 애플리케이션을 동작 시키고 있다.

SpringMVC의 동작 방식과 구성 요소

  1. 웹 브라우저에서 요청한다
  2. DispatcherServlet이 HandlerMapping에서 해당 요청을 처리해 줄수 있는 Handler 정보를 가져온다.
  3. DispatcherServlet은 Handler 정보를 이용해 해당 Handler를 다룰 수 있는 HandlerAdapter를 찾는다.
  4. 사용가능한 HandlerAdapter에서 Handler의 메서드를 호출한다.
    • 이 동작을 DistpatcherServlet이 HandlerAdapter에게 위임했다라고 표현한다.
  5. 메서드 호출의 결과로 View의 논리주소와 알맞게 변환된 Model을 받는다.
  6. [SSR]일 경우 ViewResolver에 View논리주소를 이용하여 View객체를 받아온다.
  7. View 객체와 Model 데이터를 이용하여 View 화면을 생성한다.

CSR일 경우 (5)에서 받은 Model 데이터를 알맞은 데이터 형식으로 변환하여 프론트엔드 클라이언트에게 보낸다.

Controller

Controller 의 구성요소

  1. 리소스들 : Coffee, 회원, 주문등과 같은 애플리케이션에 필요한 자원들
  2. @Controller : [클래스단위]해당 클래스가 컨트롤러로 동작하도록 알린다.
    • @RestController로 사용하면 더 RestAPI에 맞는 기능을 사용 할 수 있다.
  3. @RequestMapping :[클래스단위] 요청 URI와 핸들러메서드를 매핑해주는 역할을한다.
    • 클래스 단위로 입력시 해당 클래스 내의 메서드들의 기본 요청 URL을 설정해준다.
  4. 핸들러 메서드를 만들어주는 애노테이션[메서드 단위]
    • @GetMapping, @PostMapping, @PatchMapping, @DeleteMapping 등 요청 메시지의 Http 메서드에 알맞게 매핑 할수 있다.
    • 각 메서드의 CRUD 구현에 맞게 API를 제공하므로, 해당 API에 알맞게 요청메시지를 보내야한다.
  5. 핸들러 메서드속 파라미터 애노테이션
    • @RequestParam : 요청 메시지가 Form 데이터 형식이거나 쿼리파라미터의 형식일때 해당 파라미터에 해당하는 데이터를 가져와준다.
    • @PathVariable : 요청 URI의 리소스에 해당하는 변수값을 파라미터로 받아온다.
    • @RequestHeader : 요청메시지의 원하는 header를 가져올 수 있다. header는 메시지들의 메타데이터 역할을 한다.
    • HttpServletRequest : 서블릿 객체를 이용하여 요청메세지의 header 또는 바디정보를 가져올 수 있다.
    • HttpEntity : 요청메시지의 헤더와 바디정보를 가져올 수 있다. 서블릿 객체보다 좀 더 고급진? API이다.
    • HttpServletResponse : 응답 메시지에 대한 정보를 담은 서블릿 객체이다. 응답메시지에 원하는 헤더나 바디를 추가할 수 있다.
  6. ResponseEntitiy :응답 바디에 매핑하여 간편한 방식으로 응답 데이터를 만들어 준다.
    • Map형식이나 객체를 넣어서 Json 형식으로 변환시키거나 문자열을 text형식으로 넣어주는 등 메서드에서 ResponseEntitiy 타입으로 반환하면 적절한 응답 메세지의 바디로 출력되는 모습을 볼 수 있다.
    • 원하는 응답메세지의 HttpStatus 코드가 출력되도록 넣어줄 수 있다.(OK, Created …)
    • HttpHeadersResponseEntitiy 의 생성자 매개변수에 넣어 응답메세지에 Header를 추가해줄 수도 있다.
  7. @ResponseBody : [메서드 단위] 핸들러 메서드에 입력시 반환 타입을 응답 메시지의 바디에 매핑시켜 적절한 데이터형식으로 넣어준다.

Rest Client

이전까지는 클라이언트와 서버 단 두개의 관계만 신경써왔지만, 사실 이 관계는 상대적인 관계이다. 데이터를 요청하는쪽은 언제나 클라이언트가 될 수 있고 데이터를 받는 쪽은 언제나 서버가 될 수 있다.

이때 요청하는 쪽을 Rest Client라고 부른다.

RestTemplate

한 서버가 외부 다른 서버에 Rest 요청을 할 경우, 이 서버는 Rest Client가 된다. 그리고 Java는 서버가 RestClient일때 알맞은 요청과 응답을 받을 수 있도록 RestTemplate 클래스를 이용할수 있습니다.

RestTemplate는 http 요청 기능의 Http Client를 구현해 놓은 라이브러리를 매개변수로 하여 유연하게 사용 될 수 있습니다.

예를들자면 내 애플리케이션이 외부의 카카오톡 서버에 요청을 해서 해당 고객의 정보를 받아오거나, 결제 인증 서버에 요청을 하여 결제가 무사히 완료된 사실을 반응으로 받는 등의 기능을 사용할수 있게됩니다.

DTO

DTO란?

Data Transfer Object로 계층간 데이터 교환을 하기 위해 사용하는 객체이다.(특히 Json을 교환하는데 사용한다._

DTO를 사용하는 이유

  1. 코드의 간결성
    • 우리가 응답메세지로 보내주어야하는 형식들을 직접입력하는 것이 아닌 JAVA의 DTO로 처리하면 핸들러 메서드 코드를 간결하게 작성 할 수 있다.
  2. 데이터 유효성 검증의 단순화
    • 데이터 유효성 로직을 Controller가 아닌 DTO 클래스에 작성하여 Contoller와 유효성 검증을 분리 시킬 수 있다.

단 컨트롤러의 핸들러메서드마다 모두 DTO를 만들어주어야 한다는 단점이 존재한다.

직렬화 , 역직렬화

Java 객체(DTO)를 Json으로 바꾸는 과정을 직렬화 라고 부르고, Json파일을 Java객체로 바꾸는 것을 역직렬화라고 부른다.

DTO를 통한 유효성 검증

DTO 클래스에 적힌 멤버변수에 Jakarta Bean Validation 표준 스펙이 내장하고 있는 애너테이션을 사용하면 유효성 검증을 할 수 있습니다.

정리후 모르겠는 내용

응답 바디를 생성할때의 HttpMessageConverter는 어느 시점에 동작하는지 모르겠다.

Comments