https://github.com/ChabinHwang/24-25-study-java-mvc
GitHub - ChabinHwang/24-25-study-java-mvc: server 스프링 스터디 실습을 위한 레포입니다.
server 스프링 스터디 실습을 위한 레포입니다. Contribute to ChabinHwang/24-25-study-java-mvc development by creating an account on GitHub.
github.com
작년 스터디에서, 서블렛 등을 실제로 구현해보며 구조를 공부한 내용들을 정리해봤다.
- 스프링의 기본 흐름 이해하기:
- 클라이언트 요청 → 디스패처 서블렛
DispatcherServlet
→ 핸들러 매핑, 어댑터HandlerMapping
,Adapter
→ 핸들러 실행(Controller
/Service
).
- 실제 사용자는 단순화된 인터페이스만 신경 쓰면 됨:
- 개발자가 주로 다루는 부분은 컨트롤러 메서드(
@GetMapping
,@PostMapping
등)입니다. - 내부의 복잡한 동작은 스프링이 알아서 처리합니다.
디스패쳐 서블렛(DispatcherServlet)
DispatcherServlet은 스프링 MVC의 핵심 구성 요소로, 웹 애플리케이션에서 HTTP 요청을 처리하고 적절한 핸들러(Controller)를 호출하며, 그 결과를 클라이언트로 반환하는 역할을 합니다. 이를 프런트 컨트롤러(Front Controller) 패턴으로 구현하여 모든 요청의 입구 역할을 수행합니다.
@RestController 와 같은 어노테이션으로 핸들러 매핑에 결과 반환까지 한번에 할 수도 있습니다.
DispatcherServlet의 동작 흐름
- 클라이언트 요청: 클라이언트가 특정 URL로 요청을 보냄.
DispatcherServlet
호출: 모든 요청이DispatcherServlet
으로 전달됨.HandlerMapping
을 통해 요청 URL에 매핑된 핸들러(혹은Controller
)를 찾음.HandlerAdapter
가 실행되어 핸들러(혹은Controller
)를 처리.- 뷰 선택(
ViewResolver
): 결과를 반환하기 위해 적합한 뷰를 선택. - 응답 반환: HTTP 응답으로 클라이언트에게 결과를 전송.
서블릿의 라이프사이클 (Servlet Lifecycle)
서블릿은 컨테이너와 특정 라이프사이클 메서드를 통해 관리됩니다.
- 서블릿 객체 생성
- 클라이언트 요청 시 서블릿 클래스가 처음으로 로드됩니다.
- 컨테이너는 서블릿 클래스의 인스턴스를 생성합니다.
- 초기화 (init())
- 생성된 서블릿 객체에서 init() 메서드가 호출되어 초기화 작업을 수행합니다.
- 이 메서드는 서블릿이 최초 요청을 받을 때 한 번만 실행됩니다.
- 요청 처리 (service())
- 클라이언트의 요청이 들어오면 컨테이너는 service() 메서드를 호출합니다.
- service() 메서드는 요청의 HTTP 메서드(GET, POST 등)에 따라 doGet(), doPost()와 같은 메서드를 호출합니다.
- 소멸 (destroy())
- 서블릿이 더 이상 필요하지 않을 때 컨테이너는 destroy() 메서드를 호출하여 서블릿을 종료합니다.
- 이 메서드에서 리소스 정리 등의 작업을 수행할 수 있습니다.
핸들러 매핑, 어댑터(HandlerMapping, Adapter)
- HandlerMapping-요청 URL과 해당 요청을 처리할 Handler(Controller)를 매핑
- HandlerAdapter-매핑된 핸들러(Controller)가 실제 요청을 처리할 수 있도록 호출
핸들러 매핑으로 핸들러(Controller)를 찾고, 이를 Adapter를 사용해 실행시킴
Handler Key, Execution 을 통한 [[디스패쳐 서블렛(DispatcherServlet)]] 흐름
기본적으로, 서블렛에 어떠한 형식으로든 HandlerKey, HandlerExecution쌍이 저장되어 있어야 함.
- 여기서 말하는 HandlerExecution은, 매핑된 요청을 처리하는 실제 실행하는 로직이다.
- HandlerAdapter는, 스프링의 표준 인터페이스. 다양한 핸들러를 실행할 수 있는 환경을 제공.
- 디스패쳐 서블렛(
DispatcherServlet
)이 핸들러를 찾음. HandlerAdapter
가 핸들러를 호출.- 필요하면
HandlerExecution
처럼 별도 클래스를 사용해 실행 로직을 추상화하거나, 직접 핸들러를 호출. - 핸들러 메서드가 실행되고 결과를 반환.
Attribute(속성)
attribute는 Java의 웹 프로그래밍에서 요청(request), 세션(session), 또는 서버(context)와 같은 범위(scope)에 데이터를 저장하고 공유하기 위해 사용하는 키-값(key-value) 형태의 데이터입니다.
Attribute를 관리하는 객체들
1. HttpServletRequest
- 요청 범위(request scope)에서 데이터를 관리합니다.
- 하나의 HTTP 요청에 대해 데이터를 저장하고, 요청이 끝나면 데이터가 소멸합니다.
public void handle(HttpServletRequest request, HttpServletResponse response) {
// Attribute 설정
request.setAttribute("username", "gugu");
// Attribute 가져오기
String username = (String) request.getAttribute("username");
// Attribute 삭제
request.removeAttribute("username");
}
2. HttpSession
- 세션 범위(session scope)에서 데이터를 관리합니다.
- 동일한 클라이언트와 서버 간의 여러 요청에서 데이터를 유지합니다.
public void handle(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
// Attribute 설정
session.setAttribute("loggedInUser", "gugu");
// Attribute 가져오기
String loggedInUser = (String) session.getAttribute("loggedInUser");
// Attribute 삭제
session.removeAttribute("loggedInUser");
}
3. ServletContext
- 애플리케이션 범위(application scope)에서 데이터를 관리합니다.
- 애플리케이션 전체에서 공유되는 데이터를 저장할 때 사용합니다.Attribute를 관리하는 계층적 구조
public void handle(HttpServletRequest request, HttpServletResponse response) {
ServletContext context = request.getServletContext();
// Attribute 설정
context.setAttribute("globalSetting", "enabled");
// Attribute 가져오기
String globalSetting = (String) context.getAttribute("globalSetting");
// Attribute 삭제
context.removeAttribute("globalSetting");
}
Attribute를 관리하는 계층적 구조
HttpServletRequest
:- 개별 요청에 대해 데이터를 저장 및 전달.
- 요청이 종료되면
attribute
도 소멸.
HttpSession
:- 사용자 세션 동안 데이터를 유지.
- 동일한 사용자의 여러 요청에서 데이터를 공유.
ServletContext
:- 애플리케이션 전역 데이터 관리.
- 서버가 실행 중인 동안 지속적으로 데이터 유지.
'Backend > Spring' 카테고리의 다른 글
스프링 Security (0) | 2025.04.12 |
---|---|
[Spring] Websocket을 활용한 STOMP (0) | 2025.03.11 |
[Spring]oAuth2를 이용한 카카오 로그인 (0) | 2025.03.10 |
테스트 커버리지(구문, 조건, 결정) (1) | 2024.10.04 |
JWT를 활용한 서버 토큰 (1) | 2024.08.26 |