2020_실전프로젝트1

Spring MVC framework 개념 정리

carrot62 2020. 11. 22. 21:39

Spring mvc framework의 동작 방식

핵심 요소:

DispatcherServlet, HandlerMapping, Controller, Service, DAO, VO, ViewResolver, View

DispatcherServlet은 Handler Mapping, Controller 와 ViewResolver를 모두 연결하는 역할을 한다. 모든 request들을 처리하는 중간다리 역할을 맡는다.

(1) 우선 웹 브라우저가 요청을 보내면 DispatcherServlet이 HandlerMapping에게 요청된 url을 찾아달라고 요청을 한다.

(2) HandlerMapping은 이때 필요한 컨트롤러 객체를 찾아서 DispatcherServlet에 리턴한다.

(3) DispatcherServlet은 HandlerMapping이 보낸 요청을 바탕으로, 컨트롤러에 처리 요청을 보내고, 이에 해당하는 Controller 객체는 요청에 따른 작업을 실행한다. VO(database에 정의되어 특정한 타입의 레코드를 그대로 하나의 객체로 담고 있는 부분)와 DAO(VO에 담긴 객체를 어떻게 접근할 것인지에 대한 CRUD구문들이 정의되어 있는 부분) 를 이용해 페이지에서 요청된 Model을 만든다. 뒤 결과를 ModelAndView로 변환해서 DispatcherServlet에게 리턴한다.

(4) ModelAndView 객체를 받은 DispatcherServlet은 ViewResolver를 이용해서 결과를 보여줄 View를 탐색한다. 

(5) DispatcherServlet은 ViewResolver가 리턴한 View 객체의 결과물을 최종적으로 response으로 client에 보내주게 된다.

web.xml root-context.xml servlet-context.xml

3개의 xml 파일은 모두 객체(Bean)를 정의하게 된다.

web.xml: 계층별로 나눈 xml 파일들의 설정을 위한 설정 파일이다.여러 xml 파일이 인식되도록 각 파일을 가리키는 역할을 한다.

root-context.xml: View와 관련되어 있지 않은 객체를 정의한다. Service, DAO, DB 등과 관련된 설정을 해준다.

servlet-context.xml: 요청과 관련된 객체를 정의하는 설정 파일이다. url mapping 과 관련있는 controller, 어노테이션, ViewResolver, Interceptor, MultipartResolver 등을 설정해준다. 모든 request들을 처리하는 중요한 역할을 하는 DispatcherServlet도 여기에 정의되어 있다.

기존에 MySQL에 접속한 방식과 JdbcTemplate을 사용하여 접속하는 방식의 차이점

1. spring framework을 사용했을 때 훨씬 간단/단순하게 구현이 가능하다.
특히 DAO 페이지에서 template.update(), template.queryForObject 등 JdbcTemplate에 정의 되어있는 것을 사용함으로써 crud 기능을 구현할 코드가 많이 간단해졌다는 것을 확인 할 수 있다

2. spring framework에서 jsp 페이지에서처럼 VO 객체를 안 끌여들이는 것 같다.

editform을 예로 들자면,

JSP 페이지에서는 request 객체를 이용해서 id로 파라미터를 받아오고 나서 u라는 객체를 만들어서 값을 불러올 때 사용하고 있는데,

spring에서는 

<form: >과 같은 springframework 태그를 이용하는 것 이외에 VO에서 무언가를 끌고 와서 작업하는 느낌이 없다.

페이지 소스 출처:

Dependency Injection이란?

의존성 주입은 외부에서 객체를 생성하고 전달해서 객체간의 의존성을 제거하고 결합도를 낮추는 방식이다. 이렇게 하면 모듈 간의 의존성이 낮아지기 때문에 유지보수에도 좋고, 코드 재사용도 할 수 있게 된다.

@Autowired vs @Inject

@Autowired와 @Inject는 의존성 객체 자동 주입(Automatic Dependency Injection)에 해당하는 annotation이다. 

@Autowired: 주입하려는 객체타입이 일치하는 객체를 자동으로 주입하는 역할을 해준다. Spring framework의 의존성을 정의하는 annotation이기 때문에 spring framework에 종속되어 있다.
멤버변수, setter method, 생성지와 일반 메소드에 적용 할 수 있다.

@Inject: Spring 3부터 지원되는 annotation으로 특정 프레임워크에 종속되지 않다는 특징을 가지고 있다(자바에서 지원되는 annotation이다).
이 annotation을 사용하기 위해서는 maven에 javax 라이브러리 의존성을 꼭 추가해야 한다.
멤버변수, setter method, 생성지와 일반 메소드에 적용 할 수 있다.

@inject를 사용하기 위해서는 다음 구문이 servlet-context.xml 파일에 꼭 추가되어 있어야 한다.

<context:annotation-config/>