🌟Spring Framework
스프링 제공 기능
- 객체 관리(IOC)
- 👉 MVC(DI) - 느슨한 결합력과 인터페이스
- 트랜잭션 처리(AOP)
- 인증과 권한(Servlet Filter)
JSP MVC
- Controller(Java code) : 요청을 받은 뒤, 요청을 처리하는 객체.
- View(HTML code) : 출력할 페이지를 생성.
- Model : 데이터를 처리할 때 사용되는 객체.
model1
/4%EC%9D%BC%EC%B0%A8(3h)%20-%20%EC%9B%B9MVC/images/model1.png)
- 기존의 JSP로만 구현한 웹 애플리케이션.
- JSP 페이지 상에 비지니스 로직을 처리하는 코드와 웹 브라우저에 결과를 출력하기 위한 코드가 섞이게 된다.
- 웹브라우저에서 요청한 작업을 자바빈즈나 서비스 클래스를 사용하여 처리한다.
- Controller와 View가 물리적으로 분리되어 있지 않다.
- 구조가 단순하여 개발 속도가 빠르다.
model2
/4%EC%9D%BC%EC%B0%A8(3h)%20-%20%EC%9B%B9MVC/images/model2.png)
- 클라이언트 요청 처리와 응답 처리 및 비지니스 로직 처리 부분을 분리하여 모듈화한 구조.
- model1과 달리 Model, View, Controller가 물리적으로 구분되어 코드가 작성되어 있다.
- 웹 브라우저의 요청에 알맞게 서블릿에서 비지니스 로직을 처리한 뒤 그 결과가 보여줄 JSP 페이지로 포워딩하고 이를 통해서 요청 흐름을 받은 JSP 페이지는 결과 화면을 웹 브라우저로 전송함.
- 위처럼 분리하여 코드하게 되면 코드를 체계적인 구조로 작성이 가능하고, 유지보수도 용이하다.
요청 처리 흐름
- 웹 브라우저가 웹 서버에 웹 애플리케이션 실행 요청 시, 웹 서버는 요청을 처리할 수 있는 controller를 찾아서 요청을 전달함.
- controller는 model 자바 객체(DAO)의 메서드를 호출함.
- 데이터를 가공하여 값 객체를 생성하거나 JDBC를 사용하여 데이터베이스와의 인터렉션을 통해 값 객체를 생성함.
- 작업 결과를 controller에 반환.
- controller는 model로부터 받은 결과 값을 view에 전달함.
- 전달 시, Dispatcher를 이용하여 forwarding하여 결과를 전달함.
- JSP는 전달받은 값을 참조해서 출력할 결과를 만들어 웹 서버에 전달하고, 웹 브라우저는 웹서버로부터 결과 값을 받아 화면에 출력함.
Spring MVC
MVC model2 방식의 변화 : Dispatcher를 집중화 하기 전의 모델

- 기본 model2의 모델.
- controller와 view를 구분한 모델.
- 이 때, Dispatcher를 이용하여 forwarding하였다.
MVC model2 방식의 변화 : Dispatcher를 집중화 한 후의 모델


- controller의 순수한 기능(Plain Old Java Object,POJO)을 분리하여 구현.
- 이는 Dispatcher 기능과 순수 controller의 기능을 분리함으로서 결합력을 낮춰준다.
- Dispatcher 기능은 view로 forwarding 해주는 역할로 여러개 생성하지 않고 하나만 생성한다.
- Dispatcher의 기능은 사용자 요청이 오면 url과 매핑되는 controller에게 요청을 전달한 다음, controller에서 반환한 값을 view로 전달하는 역할을 한다.
- Spring에서 MVC를 지원하기 위해 DispatcherServlet을 사용한다.
실습환경 준비
-
spring project download
Spring.io → projects → spring tools 4 → Spring Tools 4 for Eclipse → 버전에 해당하는 project download
-
Java EE perspective 추가
eclipse marketplaces → eclipse enterprise java and web developer tools 3.30
-
Maven repository에서 lib 추가
- tomcat api
- spring-webmvc
Dispatcher-servlet

- DispatcherServlet을 사용하기 위해서는 web.xml 파일 내에 서블릿으로 등록해줘야 한다.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
- 요청된 모든 URL을 DispatcherServlet에서 URL에 맞는 Controller를 매핑해주기 위해서
*-servlet.xml 파일을 생성하여 mapping 정보를 입력해줘야 한다.
- * 에는 서블릿 명을 넣어준다.
- webapp/WEB-INF/*-servlet.xml 파일 생성하기.

- xml 파일에 beans 관련 설정 코드 추가

-
spring.io/spring-framework/docs/ → spring-webmvc 라이브러리 와 동일한 버전의 문서에 들어가서 <beans ...> </beans> 설정을 복사 및 붙여넣기.
-
id 값으로 URL 값을 입력한 뒤 해당 URL 요청 시, class 값으로 지정된 Controller를 실행할 수 있도록 <bean>으로 등록해준다.
dispatcher servlet을 등록한 web.xml의 url mapping 지정
-
url-pattern이 /* 인 경우 : 요청 시 url은 매핑해주지만, 출력을 위한 포워딩 시 ModelAndView 객체에 view로 설정한 'index.jsp' 리소스는 찾을 수 없게 되어 404(NOT FOUND) 에러가 발생함.
-
url-pattern이 / 인 경우 : DispatcherServlet에서 찾지 못한 경우, 해당 리소스를 찾아서 포워딩할 수 있도록 해준다.
View 페이지를 위한 위치
- view 페이지는 controller를 거쳐서 사용자에게 출력되도록 해야 한다.
- 즉, 외부에서 view(jsp 파일)를 직접 접근하지 못할 위치에 숨겨야 한다.
- WEB-INF에 views 라는 폴더를 생성하여 안에 view 파일들을 숨긴다.
- WEB-INF 파일 내부에 숨긴 view 파일들은 외부에서 접근이 불가능하지만 내부 controller에서는 접근이 가능하다. 즉, 서버 내부에서만 접근이 가능하다.
URL 경로
-
/WEB-INF/views/ ... : 절대 경로를 의미.(root에서 WEB-INF를 찾는다.)
-
WEB-INF/views/... : 상대 경로를 의미.(url 기준 위치에서 WEB-INF를 찾는다.)
-
※ 참고 : eclipse는 webapp 폴더 내 파일을 실행 시 해당 파일명을 브라우저 경로에 써주어 요청한다.
- ex) webapp/index -> 실행 -> localhost:8080/index url로 요청 -> 서버측에서 해당 요청 url에 매핑되는 controller 실행.
글 재미있게 봤습니다.