Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[inflearn] 20240110 [스프링-프레임워크] - 13강 필기 본문

[Inflearn]/자바 스프링 프레임워크(renew ver.)

[inflearn] 20240110 [스프링-프레임워크] - 13강 필기

Jelly-fish 2024. 1. 11. 01:52

13강 - 웹 프로그래밍 설계 모델

스프링 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 플레임워크 설계 구조

 

출처 : inflearn - 스프링-프레임워크 (renew) 강의 - 웹 프로그래밍 설계 모델

 

  • `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) 강의 - 웹 프로그래밍 설계 모델