Spring

[ 2-Layered 아키텍처 ] MVC2로 교체하기

주니홍 2022. 9. 27. 11:13

 

Spring MVC를 기반으로 프로젝트 순서

 

1. xxx.do 요청


2. 서블릿컨테이너 구동됨 ( web.xml )
DispatcherServlet을 생성
>> 참조할 DS-servlet.xml 을 로드(메모리에 적재)해서 생성


3. 스프링컨테이너가 구동됨 ( DispatcherServlet-servlet.xml )
Controller 객체들 생성
C 객체들이 Command 객체로 DAO 객체를 사용함
>> DAO2를 사용하고 싶었으나 잘안됨 => @Autowired가 미리 되어있어야함

 

 

MVC2 기반으로 프로젝트 수정

☆ C의 모든 메서드는 DAO 객체를 직접 이용하고있음!

 

☆ Spring에서는 DAO 객체를 직접 이용하지않고,
"비즈니스 컴포넌트(ServiceImpl)"를 이용해서 DAO 객체를 다룰수있게끔 구성해야한다!

반드시 "비즈니스 컴포넌트"를 사용해야하는 이유?  (면접 질문으로도 자주나옴)


1) DAO 클래스 교체 등의 유지보수 용이
비즈니스 컴포넌트의 입장에서는 자신을 이용하는 클라이언트가 Controller 이다
클라이언트인 C는 ServiceImpl를 멤버변수로 사용하면

ServiceImpl가 변경되어도 C 자체는 변화가 X
== 낮은 결합도

2) AOP 적용 용이
횡단관심(어드바이스)이 동작하려면 (포인트컷)ServiceImpl 클래스의 비즈니스메서드가 실행되어야 함

 

결론) C 클래스비즈니스 컴포넌트를 멤버변수로 사용해야하며

그 객체에게 의존성주입(DI)해야함

 

비즈니스 컴포넌트를 멤버변수로 이용하려면?
Controller보다 ServiceImpl가 먼저 생성되어있어야함
C에 SI가 의존성주입될 예정이기때문
SI(비즈니스 컴포넌트)는 스프링 컨테이너가 생성해줘야하는 객체
SI를 생성하는 스프링컨테이너를 C를 생성하는 스프링컨테이너보다 먼저 구동시켜야한다!

 

기존의 구조에서 스프링컨테이너가 1개 더 필요하고, 이 스컨은 기존의 스컨보다 먼저 구동되어야함!

먼저 구동되는 스프링컨테이너를  " Root 컨테이너 " 라고 한다

 


 

2-Layered 아키텍처

기존의 구조 + 스프링 컨테이너 x1 형식을 띄는 것

 

기존의 Presentation Layer( = MVC Layer )보다 "먼저 구동"되는 Business Layer를 추가

>> ContextLoarderListener 등록

1) 기존의 스프링컨테이너보다 "먼저 구동" 되어야하기 때문에 web.xml에 등록

2) Listener는 서블릿이기 때문에 web.xml에 등록

 

이전 DispatcherServlet 처럼 WEB-INF 참조할 xml이 존재하지 않음으로 오류발생

 

applicationContext.xml은 자바관련 파일이기 때문에

WEB-INF 에서 관리하지 않음

 

설정을 추가하여 기존에 만들었던 applicationContext를 사용

applicationConext = Root 컨테이너

 

Cotroller의 어노테이션을 관리하던 스프링컨테이너와는 달리

 

DAO와 AOP를 관리하는 Root컨테이너를 이용하여

DAO와 AOP에 필요한 어노테이션을 추가하고

DAO2 버전업과 AOP를 이용한 로그를 이용할 수 있게 된다.

 


[ 정리 ]
1. 서버 (톰캣) 시작


2. web.xml 파일 로딩 = 서블릿 컨테이너 구동


3. 서컨은 web.xml에 등록된 ContextLoaderListener 객체를 가장먼저 생성
>> pre-loading (뭔지 알아보기)


4. CLL 객체는 src/main/resources에 applicationContext.xml을 로딩하여 스컨을 구동
>> 먼저 실행되는 스프링컨테이너 == Root 컨테이너


5. ServiceImpl, DAO 객체들을 메모리에 생성


6. xxx.do 요청


7. 서블릿컨테이너 구동됨
DispatcherServlet을 생성
>> 참조할 DS-servlet.xml 을 로드(메모리에 적재)해서 생성
현재의 계층(layer)을 " 프레젠테이션 레이어 "라고 한다


8. 스프링컨테이너가 구동됨
Controller 객체들 생성
C 객체들이 Command 객체로 ServiceImpl 객체를 사용함

ServiceImpl 에서 DAO 로직을 실행시켜줌