기존의 Spring MVC를 기반으로 한 프로젝트의 순서는
1) xxx.do 요청
2) 서블릿 컨테이너 구동 -> DispatcherServlet을 생성 -> DS-servlet.xml을 로드해서 생성
-> 이러한 현재 과정이 일어나는 현재의 계층(layer)을 "프레젠테이션 레이어"라고 한다.
3) 스프링 컨테이너가 구동 -> Controller 객체들 생성 -> C 객체들이 Command 객체로 DAO 객체를 사용
-> DAO2를 사용하고 싶으나 @Autowired가 되어 있지 않아 사용이 불가능
현재 Controller의 모든 메서드는 DAO 객체를 직접 이용하고 있지만 Spring에서는 DAO 객체를 직접 이용하지 않고,
반드시 "비즈니스 컴포넌트"를 이용해서 DAO 객체를 다룰 수 있게 구성해야 한다.
"비즈니스 컴포넌트"를 사용해야 하는 이유
1) DAO 클래스 교체 등의 유지보수 유리
비즈니스 컴포넌트의 입장에서는 자신을 이용하는 클라이언트가 Contoller이므로
클라이언트인 C는 S(Service)를 변수로 사용하면 S가 변경되어도 C 자체는 변화 x
=> 낮은 결합도
2) AOP 적용 용이
횡단 관심(어드바이스)이 동작하려면 S클래스의 비즈니스 메서드가 실행되어야 한다.
결론) C 클래스는 비즈니스 컴포넌트를 멤버 변수로 사용해야 하며, 그 객체에 의존성 주입(DI)을 해야 한다.
★핵심★
- 비즈니스 컴포넌트를 이용하려면?
C에 SI(ServiceImple)가 의존성 주입될 예정이기 때문에 Controller보다 ServiceImple가 먼저 생성되어있어야 한다.
SI(비즈니스 컴포넌트)는 스프링 컨테이너가 생성해줘야 하는 객체로
SI를 생성하는 스프링 컨테이너를 C를 생성하는 스프링 컨테이너보다 먼저 구동시켜야 한다.
즉, 기존의 구조에서 스프링 컨테이너가 1개 더 필요하고, 이 스컨이 기존의 스컨보다 먼저 구동되어야 한다.
기존의 구조+스컨x1 => [ 2-Layered 아키텍처 ]
기존의 Presentation Layer(MVC Layer)보다 "먼저 구동"되는 Business Layer
Business Layer가 먼저 구동되기 위해선 web.xml에 ContextLoarderListner를 등록해 주어야 한다.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
applicationContext.xml의 경우 자바 설정 파일 이어 보통 src/main/resources에 위치시키기 때문에
WEB-INF 하위에 위치하지 않아 <context-param> 설정을 추가하여 사용한다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
기존 Controller
@RequestMapping("/main.do")
public String selectAllBoard(BoardVO bVO,BoardDAO DAO,Model model) {
List<BoardVO> datas=DAO.selectAllBoard(bVO);
model.addAttribute("datas",datas);
return "main.jsp";
}
변경 후
@Autowired
private BoardService boardService; // 비즈니스 컴포넌트. DAO를 직접 이용 xxx
@RequestMapping("/main.do")
public String selectAllBoard(BoardVO bVO,Model model) {
List<BoardVO> datas=boardService.selectAllBoard(bVO);
model.addAttribute("datas",datas);
return "main.jsp";
}
매번 new 되던 DAO 객체를 사용하지 않고 비즈니스 컴포넌트인 boardService를 사용함으로써 유지보수 유리
[정리]
1. 서버(톰캣) 시작
2. web.xml 파일 로딩, 서블릿 컨테이너 구동
3. 서컨은 web.xml에 등록된 ContextLoaderListener 객체를 가장 먼저 생성
4. CLL 객체는 src/main/resources의 applicationContext.xml을 로딩하여 스컨을 구동하라 설정
-> 먼저 실행되는 스컨 == Root 컨테이너
5. ServiceImpl, DAO 객체들을 메모리에 생성
6. 이후 수행은 같음
'Spring' 카테고리의 다른 글
Spring 예외 페이지 설정 (0) | 2022.09.28 |
---|---|
Spring 이미지 업로드 (0) | 2022.09.27 |
Spring 다양한 @(어노테이션) 설정 (0) | 2022.09.23 |
Spring MVC2 .xml 설정 어노테이션으로 변경 (0) | 2022.09.22 |
Spring MVC2 DispatcherServlet.xml 설정 (0) | 2022.09.21 |