본문 바로가기
Spring/Spring

day71) Spring-Controller 설계3 : 2-layered-아키텍쳐

by code_learner 2022. 4. 11.

[현재까지의 내용]

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 스프링 컨테이너 구동

댓글