https://kkobug2.tistory.com/161
스프링의 구조를 이해해 보기
📌스프링의 구조를 이해하기 전 먼저 프론트 컨트롤러 요청 처리 흐름을 복습하고자한다클라이언트(브라우저,사용자,뷰) 에서 loginPage.do로 GET 요청을 보내면해당 요청은 가장 먼저 프론트 컨트
kkobug2.tistory.com
지난번 포스팅에서 스프링의 구조를 이해했다면 이제 진짜 스프링을 사용해볼 차례다
지난번은 구조이해를 위한 모의프로젝트였고 이제 실제 사용되는 스프링 동작구조에 대해 알아보겟다
현재 웹서블릿이 없는 관계로 web.xml을 설정해야한다
웹.xml의 위치

모의프로젝트에서는 직접 만들었던 디스패쳐 서블릿을 스프링에서는 제공해준다
따라서 web.xml에 디스패쳐 서블릿을 추가해줘야한다 스프링 컨테이너가 아닌 서블릿 컨테이너에 추가하는 이유는 디스패쳐가 서블릿이기 때문이다
<servlet> //스프링에서 지원하는 디스패쳐 서블릿
<servlet-name>ds</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping> // 위의 디스패쳐서블릿과 연결
<servlet-name>ds</servlet-name> // 디스패쳐 이름
<url-pattern>*.do</url-pattern> // 디스패쳐가 할행동
</servlet-mapping>
이렇게 서블릿 설정과 서블릿 매핑을 마치면 디스패쳐 서블릿의 설정이 완료되었다 웹.xml에서 필터와 리스너의 설정도 가능하다
필터는 한글로 인코딩하는 역할이고 리스너는 샘플데이터를 생성하는 역할이다
<filter>
<filter-name>enc</filter-name>
<filter-class>org.springframework.web.filter.CharaterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>enc</filter-name>
<url-pattern>*.do</url-pattern> //.do 실행되면 인코딩 해줘
</filter-mapping>
이렇게 스프링이 가지고 있는 필터를 사용하면 개발자가 설정을 안해줘도 동작하기때문에 인코딩 서블릿파일이 사라진다
✔️디스패쳐 서블릿 컨테이너 만들기
웹.xml에 ds를 추가한 순간 ds에 의존성주입을 해야한다 따라서 스프링 컨테이너가 필요하다
.xml 설정파일에는 여러 종류가 있는데
- 서블릿컨테이너 → web.xml
- 라이브러리, 버전 관리 → pom.xml
- 스프링 컨테이너 → ds-servlet.xml
차이점은 서블릿컨테이너가 없으면 프론트 컨트롤러를 사용할수 없고
폼은 스프링 프로젝트에 생겨서 스프링컨테이너가 맞기는한데 보통 스프링 컨테이너라고 하면 ds-servlet을 말한다
즉 ds-servlet.xml을 만드는 이유는 ds에 의존성을 주입하기 위함이고 설정파일 만들때 이름을 반드시 맞춰주어야한다

설정파일을 만들었으면 스키마를 추가해야한다 스키마란 지식의 구조 또는 정보의 설계도를 의미한다
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:context="https://www.springframework.org/schema/context"
xmlns:mvc="https://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
https://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
https://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
스키마가 추가되었으면 이제 디스패쳐 서블릿을 사용하는데 필요한 빈클래스를 만들어주어야한다
먼저 핸들러 매핑을 만들어주었다 ds와 마찬가지로 스프링에서 제공하는것을 사용하였다
// 스프링에서 지원하는 핸들러매핑
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings"> // 요소 이름설정
<props>
<prop key="/login.do">login</prop>// login.do 요청이 들어오면 login 컨트롤러를 실행하도록 연결
<prop key="/logout.do">logout</prop>
</props>
</property>
</bean>
뷰 리졸버 설정하기
//스프링에서 제공하는 뷰 리졸버 사용
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
//프리픽스 = url의 앞부분담당 밸류는 파일위치
<property name="prefix" value="/WEB-INF/views/"/>
//서픽스 = url의 뒷부분을 담당
<property name="suffix" value=".jsp"/>
</bean>
현재 핸들러 매핑에 아이디가 없어도 작동되는이유는 하나밖에 없기때문에 자동으로 매핑된다
또한 뷰리졸버에는 id가 있는 이유는 ds에 사용할수있는 리졸버가 많기때문에 이름을 꼭 정해줘야한다
✔️로그인 컨트롤러 만들기
현재 문제는 위에 프롭스키에 적은 로그인 페이지를 만들어 준적이 없다 따라서 로그인 컨트롤러를 만들려고 한다
스프링에서 제공하는 컨트롤러를 가져온다
import org.springframework.web.servlet.mvc.Controller; //스프링에서 제공하는 컨트롤러
public class LoginController implements Controller
이렇게 로그인 컨트롤러에 스프링에서 제공하는 컨트롤러를 상속 받으면 오버라이딩으로
@Override
public @Nullable ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {
ModelAndView mav = new ModelAndView();//새로운 객체생성
이렇게 모델앤 뷰라는것을 만날수 있다
이 모델 앤 뷰가 하는 역할은 어디로 데려갈지 뭘 데려갈지를 정할수 있다 따라서 화면에 정보를 담아준다
반환값이 필요하므로 새로운 객체를 만들어준다
이동할 페이지와 페이지에 담을 정보를 코드로 작성한다
여기서 addObject가 기존의 리퀘스트 셋 어트리뷰트의 역할을 한다 .do 앞에 리퀘스트를 붙이면 뷰 리졸버가 요청을 실행하지 않고 디스패쳐 서블릿이 처리하게된다 request를 직접 다루지 않아 코드 경량화되었다
포워드 이동시 리다이렉트를 앞에 붙이면 페이지 완성이 안되기때문에 작은 데이터라도 붙으면 포워드로 해줘야한다
if(true) {
// 화면에 전달할 데이터(Model)를 ModelAndView에 추가
// DAO를 통해 게시글 목록을 조회한 뒤, "datas"라는 이름으로 저장
// ModelAndView가 request 역할을 대신하므로 구조가 경량화된다
mav.addObject("datas", new BoardDAO().getBoardList(null)); //경량화 포인트
// 처리 후 메인 페이지로 리다이렉트하도록 뷰 이름 설정
mav.setViewName("redirect:main.do");
}
else {
// 로그인 실패 시 로그인 화면으로 포워드
mav.setViewName("login");
}
// 컨트롤러 처리 결과(Model + View)를 담은 ModelAndView 객체 반환
return mav;
리퀘스트는 서블릿과 포조의 반반이다 서블릿 보다는 가벼운데 포조보다는 무겁다
import jakarta.servlet.http.HttpServletRequest;
그러나 mav는 스프링에서 제공하기 때문에 포조다 그래서 리퀘스트를 안쓰고 mav를 사용하면 경량화된다
✔️페이지를 웹-인프 폴더 하위에 놓는 이유
기존에 작업할때는 페이지를 웹앱의 하위에 작성했었다
이렇게 해서 생길수 있는 문제점은 외부에서 url에 페이지이름을 넣는 방식으로 해당 페이지로 직접이동이 가능했다 이는 페이지의 골격을 그대로 보여주는것이기 때문에 올바르지 않다
따라서 문제 해결을 위해 웹인프 하위에 페이지를 넣게 되면 뷰 리졸버 없이는 접근할수 없고 주소창에 url을 적어도 이동할수 없다 웹.xml이 웹-인프 안에 있는 이유기도 하다 페이지 관련 데이터를 넣을 폴더를 만들어서 관리하면 편하다
'🐢 꼬부기 LV.1 | 개념•기초 > 💧물대포(핵심개념)' 카테고리의 다른 글
| 스프링부트에서 데이터 주고 받기 (0) | 2026.01.19 |
|---|---|
| 스프링부트 맛보기 (0) | 2026.01.18 |
| 스프링의 구조를 이해해 보기 (0) | 2026.01.16 |
| 인텔리제이 특징과 프로젝트 생성하기 (0) | 2026.01.15 |
| 인텔리제이 설치하기 (0) | 2026.01.14 |