** 자기 공부용 및 암기용으로 포스팅하는 글 입니다.
** 정확한 정보는 보장 할 수 없으니, 참고용으로만 봐주시면 감사하겠습니다.
** 제 개인적인 생각 및 자기 암시목적으로 작성되기에 이점 양해 부탁드립니다.
들어가기에 앞서..
Spring MVC는 Spring Framework를 통하여 웹 프로그래밍을 진행 할 때, 필수로 알아야 하는 항목 중 하나이다.
이번 포스팅에는 해당 Spring MVC에 관한 내용을 정리해 보도록 하겠다.
★ 알아볼 내용
1. Spring MVC 정의
2. 서블릿(Servlet) 정의
3. Model, View, Controller
4. Spring MVC 동작 방식 및 구성 요소
내용 설명
1. Spring MVC 정의
Spiring의 모듈 중에서는 웹 계층을 담당하는 몇 가지의 모듈이 있다.
특히 이번 KDT 수업에서 많이 사용할 모듈은 서블릿(Servlet) API를 기반으로 클라이언트의 요청을 처리하는 모듈이 있다.
이를 spring-webmvc 라고 불린다.
이를 개발자들 사이에서는 줄여서 말하여 Spring MVC라고 불리우며, 웹 프레임워크의 한 종류이기에
Spring MVC 프레임워크라고도 불린다.
즉 간단하게만 정리를 하자면은
Spring MBC는 클라이언트 요청을 편리하게 처리해주는 프레임 워크이다.
2. 서블릿(Servlet)의 정의
서블릿(Servlet)은 클라이언트의 요청을 처리하도록 특정 규약에서 맞추어서 JAVA코드로 작성하는 클래스 파일입니다.
그리고 아파치 톰캣은 이러한 서블릿들이 웹 애플리케이션으로 실행이 되도록 해주는 서블릿 컨테이너중 하나다.
학습을 하거나 KDT 프로젝트를 진행하면서 직접적으로는 사용하지 않을 것이다.
Spring MVC내부에서 서블릿 기반으로 웹 애플리케이션이 동작하기 때문이다.
3. Model, View, Controller
Spring MVC에서 각각 M은 Model, V는 View, C는 Controller를 의미한다.
각각의 것들이 어떠한 역할을 하고 있으며, 어떤방식을 동작 및 사용이 되는 지 알아보자.
- Model
Spring MVC에서 말하는 Model은 작업의 결과물을 의미하며
웹 애플리케이션이 클라이언트 요청을 전달 및 처리작업을 하여 클라이언트에게 다시 결과 데이터를 돌려주는 작업의 처리 결과 데이터를 Model이라고 한다.
또한 클라이언트 요청 사항을 처리하는 영역은 서비스 계층이며, 실체로 요청 사항을 처리하기 위해 Java 코드로 구현한 것은 비즈니스 로직이라고 한다. 우리는 차후에 서비스 계층을 로직을 직접 구성하고 비즈니스 로직처리를 할 예정이니 알고 넘어가도록 하자.
-View
View는 앞에서 설명한 Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션의 화면에 보이는 리소스를 제공해주는 역할을 한다.
단순하게 정리하자면 View 화면에 리소스를 띄워서 클라이언트에게 제공으로 정리가 된다.
Spring Mvc에는 다양한 View 기술이 포함되어 있다. 형태에 따라 나뉘어 진다.
- HTML 페이지의 출력
- HTML페이지를 직접 렌더링 해서 클라이언트 측에 전송하는 방식.
- 프론트엔드와 벡엔드가 통합된 구조
- Spring MVC에서 지원하는 HTML 출력 기술에는 Thymeleaf, FreeMarker, JSP + JSTL, Tiles등이 있다.
- PDF, Excel 등의 문서 형태 출력
- Model 데이터를 가공하여 문서화 시킨 후 클라이언트에게 전송하는 방식
- 문저 내 데이터가 동적으로 변경해야하는 경우 사용
- XML, JSON등 특정 형식의 포멧으로의 변환
- Model 데이터를 특정 프로토콜 형태로 변환 후 해당 데이터를 클라이언트 측에 전송하는 방식
- 특정 형식의 데이터만 전송 후 프론트엔드 측에서 이 데이터를 기반으로 HTML페이지를 만드는 방식
- Gson 라이브러리를 통해 객체를 JSON 포맷 형태로 변환&출력할 수 있다.
public class JsonExample {
public static void main(String[] args) {
Coffee coffee = new Coffee("아메리카노", "Americano", 3000);
Gson gson = new Gson();
String jsonString = gson.toJson(coffee);
System.out.println(jsonString);
}
}
결과 값
코드 실행 결과
=============================================================
{"korName":"아메리카노","engName":"Americano","price":3000}
- Controller
클라이언트 측의 요청을 적접적으로 전달받는 엔드포인트(EndPoint)로써 Model과 View의 중간에서 상호작용을 해주는 역할
예제는 아래와 같다.
@RestController
@RequestMapping(path = "/v1/coffee")
public class CoffeeController {
private final CoffeeService coffeeService;
CoffeeController(CoffeeService coffeeService) {
this.coffeeService = coffeeService;
}
@GetMapping("/{coffee-id}") // (1)
public Coffee getCoffee(@PathVariable("coffee-id") long coffeeId) {
return coffeeService.findCoffee(coffeeId); // (2)
}
}
위 소스의 동작 흐름
1. @GetMapping 애노테이션을 통해 클라이언트 측의 Get 요청에 대해 수신.
2. CoffeeService 클래스의 FindCoffee() 메서드를 호출햇허 비즈니스 로직을 처리.
3. 비즈니스 로직이 처리된 후 Return 받는 Coffee가 Model 데이터이다.
4. 내부적으로 Spring의 View가 해당 Model 데이터를 전달 받아 Json 포맷으로 변경한 후 클라이언트에게 전
4. Spring MVC의 동작 방식 및 구성 요소
Spring MVC 의 요청과 응답 흐므레 대하여 내부적인 동작 방식을 일일히 외울 필요까지는 없어도 Spring MVC 구성 요소간의 관계이해는 필요하다.
이를 통하여 실무에서 문제 발생하였을 떄, 어디서 부터 해결해야 하는지 추적 및 방법을 찾기에 수월해 진다.
Spring MVC의 동작 흐름 및 구성은 아래 사진을 보면 알 수 있다.
위 그림을 따라 순차적으로 흐름을 따라가서 정리를 해보도록 하자.
1. 먼저 클라이언트가 요청을 전송하면 DispatcherServlet 클래스에 요청을 전달.
2. DispatcherServlet은 클라이언트의 요청을 처리할 Controller에 대한 검색을 HandlerMapping Interface에게 요청
3. HandlerMapping은 클라이언트 요청과 맻핑되는 핸들러 객체를 DispatcherServlet에게 응답(리턴)해줌.
4. 요청을 처리할 Controller 클래스를 응답 받은 DispatcherServlet은 HandlerAdpater에게 실제로 클라이언트 요청을 처리할 Handler 메서드를 호출권을 위임.
5. HandlerAdapter는 전달 받은 Controller 정보를 기반으로 Handler 메서드를 호출.
6. Controller의 Handler 메서드는 비즈니스 로직을 처리 완료 후 리턴 받은 Model 데이터를 다시 HandlerAdapter에게 전달
7. HandlerAdapter는 전달받은 Model데이터와 View 정보를 다시 DispatcherServlet에게 전달
8. DispatcherServlet은 전달 받은 View 정보를 ViewResolver에게 전달해서 View rjatordmf dycjd
9. ViewResolver는 전달받은 View 정보에 대항하는 View를 찾아 다시 리턴.
10. DispatcherServlet은 ViewResolver로 부터 리턴받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 View에게 요청
11. View는 응답 데이터를 생성하여 다시 DispatcherServlet에게 전달
12. DispatcherServlet은 Viedw로 부터 전달받은 응답 데이터를 최종적으로 클라이언트에게 전달.
데이터 처리와 요청의 중간 지점에 있는 DispatcherServlet는 어떤 역할을 할까
클라이언트로부터 요청을 전달받으면 HandlerMapping, HandlerAdapter, ViewResolver, View등 대부분의 Spring MV구성 요소들과 상호작용을 하며 많은 일을 하는 것 처럼 보인다.
실제로 어떠한 동작을 하고 있는지에 대해서 살펴보게 되면 요청에 대한 처리들을 다른 구성요소들에게 위임을 하고 있는 작업을 하고 있다는 것을 알 수 있다.
DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용을 하면서 클라이언트요청을 처리하는 방식이며 이 패턴을 Front Controller Pattern이라고 한다.
동작 방식과 구성 요소들을 잘 이해하도록 하자.
'Programming Framework > Spring 지식 및 공부' 카테고리의 다른 글
[Spring] Spring JPA - 영속성 컨텍스트 ( Persistence Context ) (0) | 2024.07.11 |
---|---|
[Spring] Spring JPA - 기본개념 (0) | 2024.07.09 |
[Spring] 자주 사용하는 어노테이션(Annotation) 정리 (0) | 2024.07.06 |
[Spring] 아키텍처 ( Architecture ) (0) | 2024.07.04 |
[Spring] AOP & PSA (0) | 2024.07.03 |