Hyemi Lee

Hyemi Lee

주니어 개발자의 삽질과 기록

Spring, 2-Layered 아키텍쳐 스타일

Service

  • Controller는 DAO객체를 직접 이용해서는 안되며, 반드시 비즈니스 컴포넌트를 이용하여 사용자의 요청을 처리해야 한다.
  • DAO객체를 직접 사용하면 문제가 발생한다

변경 전

게시판프로그램수행흐름

변경 후

  • Business Layer가 추가되었고 Controller는 DAO를 직접 이용하지 않는다 게시판프로그램수행흐름2

(1) DAO 클래스 교체하기

  • 이유 1. DAO클래스를 다른 클래스로 쉽게 교체하기 위해서이다
  • 비즈니스 컴포넌트가 변경되거나 새로운 요소가 추가될 때마다 이를 사용하는 Controller의 소스를 매번 수정한다면 유지보수는 어려울 수밖에 없다

(2) AOP 설정하기

  • 이전에 설정한 AOP의 포인트컷은 Service구현 클래스의 메소드에 설정했다
  • 따라서 Controller메소드에서 Service클래스의 인터페이스를 통해 비즈니스 객체의 메소드를 호출하여, AOP로 설정한 어드바이스들이 동작하게한다.

(3) 비즈니스 컴포넌트 의존성 주입하기

  • Controller 객체들이 생성되기 전에 비즈니스 컴포넌트 객체를 생성해야 (@Autowired BoardService)의존성 주입이 가능하다
  • 의존성 주입을 해야 Controller는 직접 DAO를 이용하지 않고 BoardService클래스의 메소드를 이용하게된다
  • 따라서 Controller 객체들이 생성되기 전에 applicationContext.xml 파일을 읽어 비즈니스 컴포넌트들을 메모리에 생성해야한다

web.xml

: ContextLoaderListener는 클라이언트의 요청이 없어도 컨테이너가 구동될때 Pre-Loading 되는 객체이다

  • ContextLoaderListener는 applicationContext.xml을 읽는다
  • applicationContext.xml의 context:component-scan 태그에 의해서 @Component, @Autowired 가 붙은 클래스, 변수의 객체를 생성한다
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
 <listener-class>
 org.springframework.web.context.ContextLoaderListener
 </listener-class>
</listener>

스프링 구동순서와 관계

스프링 구동순서

1. 서블릿 컨테이너 구동

web.xml 파일을 로딩하여 서블릿 컨테이너가 구동된다

2. ContextLoaderListener 객체 생성

  • 서블릿 컨테이너는 web.xml 파일에 등록된 ContextLoaderListener객체를생성 (pre loading)한다.
  • 이때 ContextLoaderListener 객체는 src/main/resources 소스 폴더에 있는 applicationContext.xml 파일을 로딩하여 스프링 컨테이너를 구동한다 (이를 Root 컨테이너라고한다)
  • 이때 Service구현 클래스나 DAO객체들이 메모리에 생성된다

3. 사용자 요청

  • 사용자의 액션에 의해 "*.do" 요청이 서버에 전달되면 서블릿 컨테이너는 DispatcherServlet 객체를 생성하고
  • /WEB-INF/config 콜더에 있는 presentation-layer.xml(controller,viewResolver 정보) 파일을 로딩하여 두번째 스프링 컨테이너를 구동한다.

  • 이 두번째 스프링 컨테이너가 Controller 객체를 메모리에 생성한다

Reference

  • 스프링 퀵 스타트-채규태 지음

Tags:

Categories:

Updated:

Share on

Twitter Facebook LinkedIn

You may also enjoy

Redis Stream

2021年04月28日

Stream Stream은 로그 데이터를 처리하게위해 5.0에서 새로 도입된 데이터 타입입니다. 대량의 데이터가 연속적으로 발생할때 처리하기 위해 등장했습니다. 기존 데이터를 수정하지 않고 오직 추가로 발생합니다. 이런 종류의 데이터를 stream or log데이터...

Study, Object, chapter2&3 presentation

2021年04月20日

chapter03. 역할, 책임, 협력 객체지향 설계란, 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 창조하는 활동이다.

Spring, chatting 프로그램 만들기, Reactive란?

2020年06月16日

Reactive 막힘없이 흘러다니는 data(event)를 통해 사용자에게 자연스러운 응답을 주고 규모 탄력적으로 리소스를 사용하며 실패에 있어서 유연하게 대처한다 모든 지점에서 블럭 되지 않게 하자 oop와 같은 패러다임 모든 것을 비동기적인 data의 strea...