먼저 전체적인 흐름에 대해 알아보자면
1. 브라우저(사용자)에서 서버로 .do를 요청한다.
2. .do 요청을 받았으니 DispatcherServlet 서블릿을 생성하고 멤버변수로 DI를 필요로 한다.
--> DispatcherServlet-servlet.xml 을 참고하여 DI 해줌 --> 스프링 컨테이너가 구동됨
(여기서 스프링 컨테이너가 구동되는 객체를 '프레젠테이션 레이어'라고 한다)
3. .do 요청에 맞는 Controller 객체를 호출하여 사용한다.
--> Controller만 사용하는 것이 아니라 Controller, DAO, VO, Model, ... 등을 사용함 --> 이것들을 Command 객체라고 함
* 이것들을 사용하기 위해서는 '비즈니스 레이어'를 끼워야 한다.
--> 이유 : 유지보수에 유리해짐 !
서버에서는 DBMS 변경이 자주 발생한다. 즉, DAO 변경이 자주 발생하는데 DAO를 직접 이용하고 있으므로, 결합도가 높아서 유지보수가 불리한 상태인 것이다. 쉽게 말하면 다른 DAO로의 변경이 매우 불리한 상태이다.
(무언가 객체를 직접 이용하고 있다면, 결합도가 높아지고 유지보수가 불리해진다.)
또한, AOP 적용이 불가능한 상태이다. AOP는 'xxxService' 류에만 호출이 가능하기 때문에 호출이 불가능한 상태이다. AOP에 대한 자세한 내용은 다음 포스팅에서 진행할 예정이다.
AOP 사용의 장점
- 로그, 보안, 권한확인, ... 등을 자동 호출할 수 있다.
- 코드를 별도로 분리해서 관리할 수 있기 때문에 응집도가 높아진다. (유지보수 용이)
현재까지는 AOP를 사용하지 않고 있기에 매번 로그, 보안, 권한확인 등을 직접 처리해야 하므로 응집도가 낮아져 유지보수가 불리한 상태이다.
따라서 유지보수를 유리한 상태로 바꿔야 한다.
그래서 '비즈니스 레이어' 를 추가해보자 ! & DAO를 직접 이용하지 않고, Service를 통해서 사용해보자 !
1. 그러기 위해서는 먼저 Controller의 메소드 인자로 존재하던 DAO를 제거한다.
MemberDAO mDAO = new MemberDAO(); // 삭제
2. DAO를 대신 사용해줄 Service를 멤버변수로 추가한다.
private MemberService memberService;
이렇게 선언할 시에는 DAO를 직접 사용하는 것이 아니라 Service 인터페이스가 대신 사용하는 것이므로, 결합도가 낮아져서 유지보수가 유리해진다. (ServiceImpl 인터페이스에서 멤버변수명만 바꾸면 됨)
3. 멤버 변수로 추가한 Service가 메소드 수행 주체로서 사용되고 있기 때문에 의존관계이다. 따라서 의존주입이 필요하다.
@Autowired
private MemberService memberService;
이렇게 실행 시키면 BeanCreationException이 발생한다. MemberController를 못만들기 때문이다. MemberService를 메모리에서 찾을 수가 없기 때문에..
4. MemberService가 메모리에 없다는 건 @Service가 동작하지 않았다는 것이다. 즉, DispatcherServlet-servlet.xml에서 component-scan 을 하지 않았다는 뜻 !
5. 따라서 applicationContext.xml에서 미리 DAO, Service 류의 객체들을 생성하고, web.xml로 DispatcherServlet을 생성하고, DispatcherServlet-servlet.xml 으로 Controller를 호출할 수 있다.
(.xml을 추가한다는 것은 스프링(루트: 가장 먼저 만들어지는) 컨테이너를 추가한다는 뜻
--> 컨테이너를 추가한다는 것은 비즈니스(서비스) 레이어를 추가한다는 뜻)
6. 루트 컨테이너로써 '서버가 시작될 때' applicationContext.xml을 구동시켰으면 좋겠다! 서버 시작을 감지하기 위해서
1. 서블릿을 상속하는 리스너 사용
2. new IoC를 해야함
3. web.xml에서 등록
결론: 루트 컨테이너(applicationContext.xml, 스프링 컨테이너, 비즈니스 레이어) 가 객체들을 메모리에 new 한다.
서블릿 컨테이너(web.xml)가 DispatcherServlet을 메모리에 new 한다.
스프링 컨테이너(DispatcherServlet-servlet.xml, 프레젠테이션 레이어)가 Controller를 호출하여 요청 처리한다.
-->> 이것을 2 - Layard 아키텍처 스타일 라고 한다.
'Spring' 카테고리의 다른 글
[Spring] AOP (AfterReturning & AfterThrowing) (0) | 2023.08.14 |
---|---|
[Spring] AOP (Aspect Oriented Programming) (0) | 2023.08.11 |
[Spring] Command 객체 VIEW에서 사용하기 (0) | 2023.08.10 |
[Spring] @Component를 상속받은 어노테이션 (0) | 2023.08.10 |
[Spring] Spring MVC (0) | 2023.08.09 |