본문 바로가기
Spring/개념지식 및 에러사항

[Spring] Spring 프레임워크의 구조

by 태옹 2021. 4. 19.

웹 프로그래밍을 구축하기 위한 설계 모델

  • model1과 model2

Model1

  • 모듈화시키지 않고 하나의 파일로 처리
    • html코드 안에 java코드와 들이 함께 있는 것
    • 개발 속도가 빠름
    • 유지보수 어려움



Model2

  • 각각의 기능을 모듈화 시키는 것
    • 유지보수 수월함
  • 클라이언트가 서버에 reqeust -> Controller가 request를 받아서 어떤 Service를 받을지 결정 -> DAO라는 객체를 만들어서 MODEL이라는 객체를 이용해서 DB와 통신 -> 통신해서 얻어온 값을 Controller에 반환 -> View라는 객체를 만들어서 (jsp) response
  • MVC패턴을 기본으로 함
    • m/v/c를 철저하게 분류해서 작업할 수 있음
    • 스프링에서는 model2방식을 사용



스프링 MVC 프레임워크 설계 구조

  1. 브라우저(클라이언트)의 요청
  2. DispatcherServlet이 요청을 받음
    • DispatcherServlet : http프로토콜 생성
  3. DispatcherServlet이 HandlerMapping에 전달 , HandlerMapping가 DispatcherServlet에게 Controller 반환
    • HandlerMapping : 다수의 Controller 중 요청에 맞는 Controller(클래스)를 선택해줌
  4. DispatcherServlet이 HandlerAdapter에 요청 , HandlerAdapter가 model,view 데이터를 결과로 반환
    • HandlerAdapter : Controller(클래스)가 가지고 있는 다수의 메소드 중 적합한 메소드 를 찾아줌
  5. DispatcherServlet이 ViewResolver에게 view에 적합한 jsp문서를 찾아달라고 요청
  6. ViewResolver가 적합한 View 반환, View클라이언트에게 jsp로 응답, http프로토콜 끊어짐



스프링 프로젝트 작업 과정

1. web.xml에서 DispatcherServlet을 등록

  • 클라이언트로부터 들어오는 모든 요청을 처리해주므로 관문 역할
    <servlet>
          <servlet-name>appServlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          ...
          <load-on-startup>1</load-on-startup>
      </servlet>
  • <load-on-startup>1</load-on-startup> : 사용자의 모든 요청을 받기 위해서 서블릿 맵핑 경로는 '/'로 설정


2. web.xml에서 servlet-context.xml(스프링 설정 파일)을 등록

  • DispatcherServlet을 정의한 servlet태그 내부에 init-param으로 작성
    <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
         </init-param>

초기 파라미터로 스프링 설정 파일을 지정한 경우 / 지정하지 않은 경우

  • 초기 파라미터로 스프링 설정파일(servlet-context.xml)을 지정해준 경우에는 해당 xml을 이용하여 스프링 컨테이너를 생성
  • 초기 파라미터로 스프링 설정파일을 지정하지 않은 경우 서블릿 별칭을 이용해서 스프링 컨테이너를 자동으로 생성
  • 일반적인 방법은 초기 파라미터값을 지정


3. 1,2번 작업을 마치면 스프링 컨테이너가 생성됨

  • 이 때, HandlerMapping / HandlerAdapter / ViewResolver는 자동으로 생성이 됨
  • 개발자는 Controller와 View만 만들어주면 됨


4. Controller 생성 과정

(1) servlet-context.xml에 <annotation-driven /> 태그 작성

(2) 실제로 컨트롤러로 사용할 객체는 일반적인 클래스를 정의한 후 @Controller를 붙여줌

  • <annotation-driven /> : 스프링 컨테이너를 사용하기 위한 클래스들이 빈 객체로 존재하게 됨


5. RequestMapping

  • 사용할 Controller 클래스의 내부 메소드 중 어떤 것을 사용할 것인지 mapping

  • @Controller # 컨트롤러로 등록 public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); # get방식의 '/'가 request되면 해당 메소드로 maaping @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); ... return "home"; } }

6. Controller객체 - Model타입의 파라미터

  • 개발자는 Model객체에 데이터를 담아서 DispatcherServlet에 전달할 수 있음
  • DispatcherServlet에 전달된 Model데이터는 View에서 가공되어 클라이언트한테 응답처리됨
    public String home(Locale locale, Model model) {  # Controller가 반환한 Model데이터
          ....
          model.addAttribute("serverTime", formattedDate );



7. 응답을 위한 View 객체

(1) servlet-context.xml에 ViewResolver 등록하기

     <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <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>

(2) prefix + Controller가 리턴한 값 + suffix = jsp파일명

<beans:property name="prefix" value="/WEB-INF/views/" />+return "home"; + <beans:property name="suffix" value=".jsp" />

= /WEB-INF/views/home.jsp



전체적인 웹프로그래밍 구조



스프링 프로젝트 구조

  • java파일 : java파일들이 위치한다. 주로 패키지로 묶어서 관리한다. 웹 애플리케이션에서 사용되는 Controller, Service, DAO객체들이 위치한다.
  • webapp : 웹과 관련된 파일들(스프링 설정파일, JSP파일, HTML파일 등..)이 위치한다.
  • resources : JSP파일을 제외한 HTML, CSS, JS파일 등이 위치한다.
  • spring폴더 : 스프링 컨테이너를 생성하기 위한 스프링 설정 파일이 위치한다.
  • views폴더 : View로 사용될 JSP파일이 위치한다.
  • pom.xml파일 : 메인 레파지토리에서 프로젝트에 필요한 라이브러리를 내려받기 위한 maven설정 파일

 

'Spring > 개념지식 및 에러사항' 카테고리의 다른 글

[Spring] JPA 기초  (0) 2021.07.12
RestController 생성하기  (0) 2021.07.05
Log4j import에러  (0) 2021.07.02
JUnit import 안되는 경우  (0) 2021.07.02
[Spring] 공부내용 기록  (0) 2021.03.13

댓글