[현재까지의 내용]
1. 클라이언트의 요청 (*.do)
2. FrontController가 모든 요청을 받는다
-DispatcherServlet() -> 서블릿 컨테이너가 생성
3. 스프링 컨테이너가 생성한 Controller 객체에게 요청을 전달한다.
4. 매개변수의 Command 객체(dao)를 이용하여 요청을 전달한다.
->요청을 처리하기 위해 DAO를 직접적으로 이용하게 된다면
1) DAO클래스의 교체가 불리해진다. -> 결합도가 높고 유지보수에 불리
2) AOP 적용에 불리하다
-> 비즈니스 컴포넌트(ServliceImpl)이 필요하다.==DAO를 감싸줄 친구가 필요하다!
[비즈니스 컴포넌트(ServiceImpl)]
Controller -> ServiceImpl -> DAO
=> ServiceImpl의 입장에서 자신의 이용자는 Controller임에 유의!
코드변화가 1도 없는데, 설정변화에 따라(무엇을 DI하느냐에 따라) 연결방식에 변화가 생긴다.
== 객체지향언어의 특징(다형성)
정리:
비즈니스 컴포넌트 입장에서 자신의 클라이언트는 controller이고 controller는 멤버변수로서 serviceimpl을 아용할 것을 의미한다. 어떤 DAO를 사용하는 지에 따라 Controller를 변경 할 필요가 없어지게 된다.
[사용방법]
1. Controller에 BoardService를 의존성 주입
@Autowired
private BoardService boardService;
2. command객체에서 사용하는 dao를 지우고, boardService객체를 통해 메서드 실행
ex)
@Controller
@SessionAttributes("data")
public class BoardController {
@Autowired
private BoardService boardService;
@RequestMapping(value="/board.do")
public String getBoard(BoardVO vo,Model model) {
vo=boardService.getBoard(vo);//주어가 boardService로 바뀐다.
model.addAttribute("data", vo);
return "board.jsp";
}
}
이렇게 컨트롤러만 바꾸고 돌릴 시 500에러 발생하게 된다!
1. 사용자가 로그인요청(login.do)하였을 때
2. Controller객체들은 스프링컨테이너가 생성해줬을지 몰라도
3. @Autowired의 대상인 ServiceImpl객체들은 생성되지 않았기 때문이다.
=> Controller의 DI 대상인 비즈니스 컴포넌트(ServiceImpl)가 먼저 생성되어야 한다!!!
비즈니스 컴포넌트(ServiecImpl)을 먼저 생성해줄 스프링 컨테이너가 한개더 필요하다.!!!
그리고, 위의 스프링 컨테이너를 Controller객체들을 생성하는 스프링컨테이너 보다 먼저 동작시켜야 한다!!
★2-Layered 아키텍처
스프링 프레임워크 기반의 웹프로젝트에서 채택하는 스타일
MVC(Presentation) Layer와 Business Layer로 나눠서 컨테이너를 동작시킴
Business Layer의 컨테이너가 먼저 동작됨!
스프링 프레임워크에서 제공하는 리스너클래스를 이용한다.(ContextLoaderListener)
web.xml파일을 서블릿 컨테이너가 읽어서 동작할 때 수행시킬 계획
클라이언트 측의 요청전에 객체들을 메모리에 적재(로딩) 가능 -> pre - loading
web.xml
<context-param>
<!-- src/main/resource/applicationContext.xml 설정파일을 볼수 있도록 하는 경로설정-->
<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. 서블릿 컨테이너 구동
2. 리스너 클래스 동작 -> 2)src/main/resources/applicationContext.xml
3. 스프링 컨테이너 구동(Root 컨테이너)
ServiceImpl DAO 적재
4. login.do 요청
5. DS(FC)에 매핑된 Controller객체 호출 -> /WEB-INF/DS-servlet.xml
4. MVC(Presentation) Layer 스프링 컨테이너 구동
'Spring > Spring' 카테고리의 다른 글
day72) 파일 업로드 (0) | 2022.04.12 |
---|---|
day72) 에러페이지 처리 (0) | 2022.04.12 |
day70) [AOP] 횡단관심 - 트랜잭션 (0) | 2022.04.08 |
day69) annotation 사용하기2 - Controller관련 (0) | 2022.04.07 |
day68) Spring - Model 설계2 : JDBC Template (0) | 2022.04.07 |
댓글