Everything has an expiration date
[inflearn] 20240110 [스프링-프레임워크] - 13강 필기 본문
[inflearn] 20240110 [스프링-프레임워크] - 13강 필기
Jelly-fish 2024. 1. 11. 01:5213강 - 웹 프로그래밍 설계 모델
스프링 MVC 프레임워크 기반의 웹 프로그래밍 구조에 대해서 학습한다.
13-1 웹 프로그래밍을 구축하기 위한 설계 모델
13-2 스프링 MVC 플레임워크 설계 구조
13-3 DispatcherServlet 설정
13-4 Controller 객체 - @Controller
13-5 Controller 객체 - @RequestMapping
13-6 Controller 객체 - Model 타입의 파라미터
13-7 View 객체
13-8 전체적인 웹 프로그래밍 구조
13-1 웹 프로그래밍을 구축하기 위한 설계 모델
- `Service` : 사용자로부터 받은 리퀘스트를 보여주는 화면·기능
- `DAO (Data Access Object)` : 데이터 베이스 연결 액션 처리
ⓐ Model1 방식
서비스, 기능, DAO, View, 결과를 보여주는 View 와 같이
모든 것을 모듈화 시키지 않고, 하나의 파일로 처리하는 방식.
(HTML + Java)
→ HTML 코드 내부에 Java 코드를 삽입할 수 있어서 개발 속도는 굉장히 빠르지만,
여러 언어들을 하나의 파일에 모두 구현하기 때문에 유지보수를 할 때 큰 어려움이 발생한다.
(Model, View 가 결합된 형태이기 때문에)
클라이언트 (사용자)
→ 브라우저를 통해 웹 사이트를 연다.
↓ (클라이언트 요청)
WAS(웹 어플리케이션 서버)
→ [JSP ↔ Service & DAO]
↓ (클라이언트 요청 수행)
데이터베이스 접근
↓ 요청 처리
response
→ 클라이언트에게 보여지는 View 페이지에 결과 반환
ⓑ Model2 방식 (MVC : Model View Controller)
모델 1 방식의 단점을 보완하기 위한 방식.
클라이언트가 WAS 웹 어플리케이션 서버에 요청(request)하는 것은 똑같으나,
이 요청을 Controller 가 받는 것이다.
클라이언트의 요청을 받아서, 어떤 서비스를 동작 시킬지 Controller 가 결정한다.
이를, 모듈화라고 한다.
(*모듈화 : 공장 등에서 부분(유닛)별로 나눠 조각조각 낸 뒤 현장에서 재조립하는 방식)
서비스 이외에도, DAO (Data Access Object) 모듈을 만들어서
데이터 베이스 통신을 처리하는 기능을 따로 분리시키고,
통신에서 얻어온 값을 가져와서 클라이언트에게 응답(`response`)해 주기 위해
View 객체를 통해 보여준다. 이때, 주로 View 객체는 JSP 파일 형태로 제작한다.
13-2 스프링 MVC 플레임워크 설계 구조
- `HandlerMapping` : 클라이언트의 요청에 맞는 가장 적합한 Controller 를 찾아주는 객체
- `HandlerAdapter` : 클라이언트의 요청에 맞는 Controller 내부의 가장 적합한 Method를 찾아주는 객체
- `ViewResolver` : 컨트롤러의 업무 처리가 끝난 후, 클라이언트에게 보여질 View 페이지를 찾아주는 객체
[전체적인 처리 흐름 - 스프링 MVC 프레임워크 구조]
① 클라이언트 요청
↓
DispatcherServlet
↓ 요청(request) 전달
② `HandlerMapping`
(많은 Controller들 중에서 가장 적합한 Controller 선택)
↓
DispatcherServlet
↓
③ `HandlerAdapter`
(HandlerMapping 에서 선택한 적합한 Controller 내부의
다양한 메소드들 중 가장 적합한 Method 를 찾아준다.)
↓ (Model데이터 · View 정보를 가져온다.)
DispatcherServlet
↓
④ `ViewResolver`
(Controller 로부터 전달된 View 정보에 해당하는
가장 적합한 View 페이지(jsp문서)를 찾아준다.)
↓
DispatcherServlet
↓
⑤ View 페이지에 응답 생성
(View : HTML 코드를 통해 구현한 View)
13-3 DispatcherServlet 설정
[web.xml]
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- `<servlet-class>...DispatcherServlet</servlet-class>` : Dispatcher Servlet 등록
- `<init-param> ... ` : 스프링 컨테이너 파일 설정을 위한 부분. 서블릿 컨테이너가, `<param-value>` 에 해당하는 경로의 파일명에 맞게 스프링 컨테이너(IoC)를 생성해 준다.
※ `<init-param>` 태그 내부의 `<param-name>` `<param-value>` 를 통해
스프링 컨테이너에 대한 초기 파라미터를 설정해 주지 않을 경우
자동으로 `SpringFrameWork` 에서 특정한 이름을 이용하여
스프링 컨테이너 파일에 대한 설정을 한다. → `appServlet-context.xml`
Spring 컨테이너가 만들어지고 나면,
`HandlerMapping`, `HandlerAdapter` 객체는 스프링 컨테이너 내부에
자동으로 생성이 된다.
13-4 Controller 객체 - @Controller
`DispatcherServlet` ← ` HandlerMapping` || `HandlerAdapter` → `Controller`
[servlet-context.xml]
<annotation-driven />
위의 태그를 작성하게 되면, 스프링 컨테이너를 만들고 사용하기 위한 여러가지 클래스가
빈(Bean) 객체로 스프링 설정 파일에 존재하게 된다.
[Controller 객체로 사용할 클래스 정의]
@Controller
public class HomeController
{
....
}
컨트롤러를 제작하고 싶다면, 일반적인 클래스를 생성한 후에
클래스 상단에 `@Controller` 어노테이션을 붙여주면 된다.
이 어노테이션을 붙여주는 순간, 컨트롤러로서 기능·동작하게 된다.
※ 주의할 사항은, `@Controller` 어노테이션을 사용하기 위해서는
반드시 스프링 설정 파일 `servlet-context.xml`에
`<annotation-driven />` 태그를 넣어 주어야 한다는 것이다.
13-5 Controller 객체 - @RequestMapping
`DispatcherServlet` → `HandlerAdapter` → `Controller`
클라이언트 접근 url
`http://localhost:8090/ch08/success`
↓
사용자의 요청에 적합한 컨트롤러 객체의 메소드 호출
@RequestMapping("/seccess")
public String success(Model model)
{
return "success";
}
DispatcherServlet이 찾아낸 사용자의 요청에 적합한 클래스의 내부에는
많은 메소드가 존재할 수 있다.
여기서, `HandlerAdapter`에 의해 요청에 맞게 동작해야할 메소드 위에
`@RequestMapping("/요청 값")` 을 작성해 주면
괄호 안의 url이 클라이언트의 요청 값과 일치할 경우, 그 메소드를 동작시킬 수 있다.
13-6 Controller 객체 - Model 타입의 파라미터
`DispatcherServlet` ← `HandlerAdapter` → `Controller`
Controller 뒤에는 Service, DAO 등 다른 객체들이 많이 존재할 수 있다.
Controller 의 작업(업무 처리)이 모두 끝난 후에, DispatcherServlet에 그 결과에 해당하는
`Model & View`를 전달해 주어야 한다.
DispatcherServlet 에게 Model&View 객체 전달하기
→ 컨트롤러의 매개변수를 통해 전달한다.
@RequestMapping("/seccess")
public String success(Model model)
{
// 사용자의 요청에 적합한 Controller 클래스 내부의
// 메소드 매개변수로
// Model 객체를 DispatcherServlet 에게 전달한다.
....
}
Model 객체에 데이터를 담은 후 DispatcherServlet 에게 전달하고 싶다면
`model.setAttribute("객체명", 객체);` 를 이용한다.
model.setAttribute("tempData", "model has data!!");
- 개발자는 Model 객체에 데이터를 담아서 DispatcherServlet 에 전달할 수 있다.
- `DispatcherServlet` 에 전달된 Model 데이터는 View 에서 가공되어 클라이언트에게 응답(response) 처리된다.
13-7 View 객체
`DispatcherServlet` ← `ViewResolver` → `View`
HomeController.java (Controller)
@RequestMapping("/seccess")
public String success(Model model)
{
return "success";
}
servlet-context.xml (DispatcherServlet)
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
→ JSP 파일명 : `/WEB-INF/views/success.jsp`
Controller의 작업이 모두 끝났으므로, 사용자에게 응답(response)을 해 주어야 한다.
이를 위해 ViewResolver라는 객체에게 사용자로부터 보여질 View를 찾도록 해야 하는데,
이때 사용하는 것이 `InternalResourceViewResolver`이다.
★★★★★★
① `name="prefix"` 에 해당하는 빈(Bean)객체의 value `"/WEB-INF/views/"` 가 앞에 붙게 되고,
② Controller 의 `return "success"` 가 중앙에 위치하게 되며
③ `name="suffix"` 에 해당하는 빈(Bean)객체의 value `".jsp"` 가 맨 뒤에 붙게 된다.
즉, ` /WEB-INF/views/success.jsp` 에 해당하는 경로·파일명의 View 파일을
`ViewResolver` 가 찾아와 주는 것이다.
13-8 전체적인 웹 프로그래밍 구조
'[Inflearn] > 자바 스프링 프레임워크(renew ver.)' 카테고리의 다른 글
[inflearn] 20240113 [스프링-프레임워크] - 18강 필기 (2) | 2024.01.14 |
---|---|
[inflearn] 20240113 [스프링-프레임워크] - 17강 필기 (2) | 2024.01.13 |
[inflearn] 20240108 [스프링-프레임워크] - 12-2강 필기 (0) | 2024.01.10 |
[inflearn] 20240108 [스프링-프레임워크] - 12-1강 필기 (0) | 2024.01.08 |
[inflearn] 20240106 [스프링-프레임워크] - 11강 필기 (1) | 2024.01.08 |