< 복습 겸 스프링 설명 >
클라이언트(브라우저, 사용자, View)에서 loginPage.do GET 요청을 하면
FrontController에서 요청을 처리 ➡ 유일한 서블릿
비동기처리하는 애들도 서블릿인데요? ➡ 이제 POJO가 될거야~ == 경량화
Ioc, AOP를 지원하는 "경량의" 프레임워크가 된다
Frontcontroller
1. 클라이언트로부터 넘어온 요청을 추출
즉, command를 생성
2. command에 따라 분기처리 ➡ 팩토리 패턴을 통해 싱글톤을 유지
ActionFactory(Map)
3. 팩토리에서 요청에 맞는 Controller를 반환
4. Controller가 일 함
5. output으로 ActionForward가 생성됨
어디로 갈지/어떻게 갈지
ActionForward는 객체, 무거움 그래서 스프링에서는 기본적으로 forward 방식으로 고정, '어디로 갈지'만 반환
Controller의 output으로 String이 생성됨 == 경량화
6. 반환된 결과를 클라이언트에게 보여줌
< 스프링이 왜 경량의 프로그램이에요 ❓ >
서블릿이 프론트컨트롤러 하나이고,
컨트롤러 수행 결과의 반환값이 String이기 때문에 가볍다
< 위에서 배운거 한 번 실습해보기 >
[ DispatcherServlet ]

이름이 달라졌지만 FrontController이다

web.xml에서 하던 설정을 해준다
.xml은 설정 파일인데
얘가 있다는 건 어딘가에 얘를 보고 있는 컨테이너가 존재한다는 거다
이 설정 파일은 어노테이션으로 대체가 가능했다
package com.example.controller;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("*.do")
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private HandlerMapping hm;
private ViewResolver vr;
public DispatcherServlet() {
super();
}
public void init() {
hm = new HandlerMapping();
vr = new ViewResolver();
vr.setPrefix("./");
vr.setSuffix(".jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uri = request.getRequestURI();
String command = uri.substring(uri.lastIndexOf("/"));
System.out.println(command);
Controller ctrl = hm.getController(command);
String viewName = ctrl.execute(request, response);
String view = viewName;
if(!view.contains(".do")) {
view = vr.getView(viewName); // VR가 처리함
}
response.sendRedirect(view);
}
}
@WebServlet("*.do") 가 있기 때문에 web.xml이 필요가 없다
doAction을 추가해주겠다

[ Controller.java ]

예전에 Action.java이었는데 지금은 Controller
package com.example.controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
// 역할 : 무언가를 실행
// 사용자의 요청 정보들을 받아서 어떤 페이지로 가야 하는지
public interface Controller {
String execute(HttpServletRequest request, HttpServletResponse response);
}
여기가 String을 반환하고 있는 부분임!!
[ LoginController.java ]

member 관련 기능이므로 하나 더 파기
package com.example.controller.member;
import com.example.controller.Controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class LoginController implements Controller {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) {
if(true) {
return "main.do";
}
return "loginPage.do";
}
}
( 연습하는 것이므로 코드가 단순한 것 참고 )
[ HandlerMapping.java ]
package com.example.controller;
import java.util.HashMap;
import java.util.Map;
import com.example.controller.member.LoginController;
public class HandlerMapping {
private Map<String, Controller> mappings;
public HandlerMapping() {
mappings = new HashMap<String, Controller>();
mappings.put("/login.do", new LoginController());
}
public Controller getController(String command) {
return mappings.get(command);
}
}
[ ViewResolver.java ]
package com.example.controller;
public class ViewResolver {
private String prefix;
private String suffix;
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public String getView(String viewName) {
return prefix + viewName + suffix;
}
}
의존성 주입 하는 방법
1. 생성자 주입
2. setter 주입
3. @Autowired 주입
4. init-Method

spring 핵심구조 4가지
'🍃 Spring' 카테고리의 다른 글
| Spring MVC 핵심 정리: HandlerMapping · ModelAndView · ViewResolver (0) | 2026.01.16 |
|---|---|
| Spring Boot 404 에러 해결: @GetMapping를 붙여보자 (0) | 2026.01.16 |
| 스프링 컨테이너의 구조 (0) | 2026.01.15 |
| @Component 계열 어노테이션 [ @Component | @Repository | @Service | @Controller ] (0) | 2026.01.14 |
| .xml 대신 @ (어노테이션) 사용해보자! (0) | 2026.01.14 |