🍃 Spring

복습 겸 스프링 구조 이해해보기

보배 진 2026. 1. 16. 10:33

< 복습 겸 스프링 설명 >

클라이언트(브라우저, 사용자, 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가지