스프링 부트의 동작 방식
- 일반적인 웹 요청이 들어왔을 때의 스프링 부트의 동작 구조
(1) 클라이언트 → 서블릿 컨테이너 → DispatcherServlet
(2) DispatcherServlet → HandlerMapping → 해당 컨트롤러 찾기
(3) DispatcherServlet → HandlerAdapter → 컨트롤러 실행
(4) 컨트롤러 → 결과 반환
(5) DispatcherServlet → ViewResolver → 뷰 이름 → 뷰 파일 위치 찾기
(6) 뷰 렌더링 → 사용자에게 HTML/JSON 응답
스프링 부트의 동작 구조를 예제 코드로 보자
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("name", "Spring!");
return "greeting"; // View 이름 (→ greeting.html)
}
}
<!-- greeting.html (resources/templates/) -->
<!DOCTYPE html>
<html>
<body>
<h1>Hello, [[${name}]]</h1>
</body>
</html>
1. 요청
- 클라이언트의 요청
GET /hello
2. DispatcherServelt이 요청을 받음
- Spring Boot는 내장 톰캣(WAS)이 HTTP 요청을 받고 그 요청을DispatcherServlet 에게 넘긴다.
클라이언트 → 서블릿 컨테이너 → DispatcherServlet
3. HandlerMapping이 해당 요청을 어떤 컨트롤러가 처리할지 찾는다.
- /hello 요청은 HelloController.hello()가 처리해야 한다고 판단
@GetMapping("/hello")
4. HandlerAdapter가 해당 컨트롤러를 실행
- 실행 결과
- 뷰 이름 “greeting” 반환
- 모델에 anme = “Spring!” 추가됨
public String hello(Model model) {
model.addAttribute("name", "Spring!");
return "greeting";
}
5. ViewResolver가 뷰 경로를 결정
- Spring boot에서는 기본적으로 Thymeleaf를 ViewResolver로 사용하며. templates/ 디렉토리에서 해당 .html 파일을 찾는다.
"greeting" → resources/templates/greeting.html
6. View 렌더링 후 응답 반환
- greeting.html이 렌더링 되고 ${name} → “Spring!”으로 치환됨.
- 클라이언트 브라우저로 응답
결과
<h1>Hello, Spring!</h1>
다시 전체 정리
1 | 클라이언트가 /hello 요청 |
2 | DispatcherServlet이 요청 받음 |
3 | HandlerMapping이 어떤 컨트롤러인지 찾음 |
4 | HandlerAdapter가 HelloController.hello() 실행 |
5 | 뷰 이름 "greeting" 리턴됨 |
6 | ViewResolver가 greeting.html 경로 찾음 |
7 | 뷰 렌더링 → HTML 응답 반환 |
지금까지는 서버 사이드 렌더링으로 했는데 JSON API 응답으로 한다면 어떻게 될까? 라는 궁금즘이 생겼다 즉, View가 없는 것임 이걸로 예제를 한 번 해보자
- ResponseEntity 사용
- 이 경우는 뷰 이름이 아니라, 객체 자체를 반환
@RestController
public class ApiController {
@GetMapping("/api/hello")
public ResponseEntity<Map<String, String>> hello() {
Map<String, String> body = new HashMap<>();
body.put("message", "Hello from JSON");
return ResponseEntity.ok(body); // JSON 형태로 응답
}
}
JSON API 정리
(1) 클라이언트 요청 (GET /api/hello)
(2) 톰캣이 DispatcherServlet에게 전달
(3) HandlerMapping이 컨트롤러 찾아냄
(4) HandlerAdapter가 컨트롤러 실행
(5) 컨트롤러에서 객체 또는 ResponseEntity 반환
(6) ViewResolver는 건너뜀
(7) HttpMessageConverter가 JSON으로 변환
(8) JSON 응답 전송
위에서 나온 개념들을 좀 더 공부해보자
서블릿(Servlet)
- 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술
- 일반적으로 서블릿은 서블릿 컨테이너(Servlet Container)에서 관리
- 서블릿 컨테이너는 서블릿 인스턴스(Servlet Instance)를 생성하고 관리하는 역할을 수행하는 주체로서 톰캣은 WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 대표적인 컨테이너
서블릿 컨테이너 특징은 다음과 같다.
- 서블릿 객체를 생성, 초기화, 호출 종료하는 생명주기를 관리
- 서블릿 객체는 싱글턴 패턴으로 관리
- 멀티 스레딩을 지원
DispatcherServelt
스프링에서는 DispatcherServelt이 서블릿의 역할을 수행
- 일반적으로 스프링은 톰캣을 임베드(embed)해 사용한다. 그렇기 때문에 서블릿 컨테이너와 DispatcherServelet은 자동 설정된 web.xml의 설정값을 공유한다.
핸들러 매핑
- 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선정하는 인터페이스
'Spring Boot > 서버 간 통신, 스프링 부트 동작 방식' 카테고리의 다른 글
[Spring boot] 서버 간 통신 (2) | 2025.07.21 |
---|