SEB_BE_43 / 23.02.13 회고

rse·2023년 2월 13일
0

코드스테이츠_BE_43

목록 보기
33/65

내가 짠 코드 중 항상 수작업으로 작성해야 되는 부분이 있는지 확인하기. 어떻게 하면 개선&수정 할 지 고민.

오늘

  • Spring MVC
  • Controller

Spring MVC

MVC란 서블릿(Servlet) API를 기반으로 클라이언트 요청을 처리하는 모듈이다.
웹 프레임워크의 한 종류.

서블릿?
클라이언트의 요청을 처리하도록 특정 규약에 맞추어서 Java 코드로 작성하는 클래스 파일이다.
그리고 우리가 spring boot를 실행시킬 때 아파치 톰캣이 콘솔창에 뜨는 것을 볼 수 있는데 그것 역시 서블릿 컨테이너 중 하나다.
서블릿 컨테이너는 서블릿들이 웹 애플리케이션으로 실행이 될 수 있게 해 준다.

M (Model)

웹 애플리케이션이 클라이언트의 요청을 전달 받으면 요청 사항을 처리하기 위한 작업을 한다.
즉 클라이언트에게 응답(Response) 으로 돌려주는 작업의 처리 결과 데이터.

클라이언트의 요청 사항을 구체적으로 처리하는 영역을 서비스 계층(Service Layer) 이라고 하고, 요청 사항을 처리하기 위해 Java 코드로 구현한 것을 비즈니스 로직(Business Logic) 이라고 한다!

V (View)

앞에서 설명한 Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션의 화면에 보여지는 리소스(Resource)를 제공하는 역할을 한다.

Spring MVC에는 다양한 View 기술이 포함되어 있는데 View의 형태는 아래와 같이 나눌 수 있다.

  • HTML 페이지의 출력
  • PDF, Excel 등의 문서 형태로 출력
  • XML, JSON 등 특정 형식의 포맷으로의 변환

C (Controller)

클라이언트 측의 요청을 직접적으로 전달 받는 엔드포인트(Endpoint)로써 Model과 View의 중간에서 상호 작용을 해주는 역할을 한다.

Spring MVC 동작 방식 및 구성요소다.

클라이언트가 웹에 요청을 보내면 다음과 같은 순서로 진행된다.

DispatcherServlet 가 요청을 받고, 요청을 처리 할 Controller 를 찾기 위해 검색을 HandlerMapping 인터페이스 에게 맡김 
HandlerMapping 인터페이스 가 Controller를 찾아서 DispatcherServlet에게 정보를 줌
Controller Handler 메서드를 찾기 위해  HandlerAdpater에게 Handler 메서드 호출을 위임
HandlerAdpater가 해당 Controller의 Handler 메서드를 호출
Controller의 Handler 메서드를 비즈니스 로직 처리 후  Model 데이터를 HandlerAdpater에게 전달.
HandlerAdpater가 Model 데이터와 View정보  DispatcherServlet에게 전달
DispatcherServlet 이 View를 찾기 위해  ViewResolver에게 전달
ViewResolver가 View를 찾아서 리턴.
DispatcherServlet은 ViewResolver로부터 전달 받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청
View는 응답 데이터를 생성해서 다시 DispatcherServlet에게 전달
DispatcherServlet은 View로부터 전달 받은 응답 데이터를 최종적으로 클라이언트에게 전달

그러니까 DispatcherServlet는 명령만 하는 존재인 것이다. 본인은 아무것도 하지 않고 명령만 내려서 결과물만 전달하는 그런 존재.

이렇게 DispatcherServlet처럼 맨 앞에 배치되어 다른 구성요소들과 상호작용(명령) 하면서 클라이언트의 요청을 처리하는 것을 Front Controller Pattern 이라고 한다.

Controller


출처 : 코드스테이츠

아까 위에서 설명했듯이 API 계층은 클라이언트의 요청을 직접적으로 전달 받는 계층이다.

Spring Boot 기반의 애플리케이션에서 주로 사용되는 Java 패키지 구조는 기능 기반 패키지 구조(package-by-feature)와 계층 기반 패키지 구조(package-by-layer)가 있다.

우리는 기능 기반 패키지로 만들겠다.

@RestController

애너테이션을 붙여주면 해당 클래스가 REST API의 리소스(자원)을 처리하기 위한 API 엔드포인트로 동작한다고 알려주는 것.

@RequestMapping

클라이언트 요청과 요청을 처리하는 Handler Method(핸들러 메서드) 를 매핑해준다.

@SpringBootApplication

Spring Boot 애플리케이션으로 동작하기 위한 엔트리포인트

Handler Method

위에 코드까지 작성 했을 때 Postman 에 요청을 보내면 404에러가 뜬다.
그 이유는 클라이언트의 요청을 처리 할 핸들러 메서드가 아직 없어서 이다.

@RequestMapping 부분 produces = MediaType은 어떤 타입으로 클라이언트에게 전송 할지를 설정함.

@PostMapping

클라이언트의 요청 데이터를 서버에 생성할 때 사용하는 애너테이션.
그렇기에 클라이언트 쪽에서 요청 전송 시 HTTP 타입을 맞춰줘야함.

위 그림의 주소는 다름. 그냥 POST 참고용.

@RequestParam

핸들러 메서드 파라미터 종류 중 하나.
주로 클라이언트 쪽에서 전송하는 요청 데이터를 쿼리 파라미터(Query Parmeter 또는 Query String), 폼 데이터(form-data), x-www-form-urlencoded 형식으로 전송하면 이를 서버 쪽에서 전달 받을 때 사용하는 애너테이션

쿼리 파라미터 = 이런식으로 ?를 기준으로 붙는 key/value 쌍의 데이터.

폼 데이터는 위 같은 형식.

추가중.

profile
기록을 합시다

0개의 댓글