Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Min's dev-log

[Spring] 스프링 2-layred 아키텍처 본문

Framework/Spring

[Spring] 스프링 2-layred 아키텍처

minyy 2023. 7. 12. 21:40

 

스프링 2-layred 아키텍처 방식 동작순서

 

====== .do 요청전에 서버킨후의 동작 ======

 

0. 처음에 서버를 키면 서블릿 컨테이너/톰캣이 구동되고

=> 이때 web.xml을 보고 서블릿 컨테이너 구동된다.

web.xml은 서블릿 관련 설정이기 때문에 DS 서블릿, 필터, 리스너 관련 설정이 들어간다.

 

<context-param>
<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>

web.xml에 설정해둔 위의 코드를 보고

 

1. 리스너가 제일 먼저 동작하면서 applicationContext.xml을 호출하고

=> 이때 xml 실행된다.

=> 스프링 컨테이너 동작(root 컨테이너,부모 컨테이너)

: 컨테이너가 동작하면서 설정한 정보들을 다 스캔한다. 그래서 컨테이너가 동작하려면 xml파일이 필요하다.

<context:component-scan base-package="com.spring.biz" /> 범위에 따라 스캔하면서

비즈니스 레이어, DAO/DAO2-jdbc템플릿, AOP등의 객체 생성(pojo 객체) / 의존주입 등을 기억한다.

 

* pojo / not pojo"서블릿 유무"로 가려지기 때문에 같은 클래스여도 코드에따라 다름

서블릿 있으면 not pojo 그 밖에도 다른 클래스가 꼭 필수적으로 필요하면 not pojo

 

 

====== 켜진 서버에서 사용자가 .do요청한 후의 동작 ======

 

2. 이후에 .do요청이 온다.

 

<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

.do가 되면 web.xml에 설정해둔 위의 코드를 보고 DispatcherServlet객체가 생성된다.

이때 홀로 생성이 안 된다. 특성상 DS-servlet.xml이 필요하다.

=> 이때 스프링컨테이너(자식 컨테이너)가 동작한다.

<context:component-scan base-package="com.spring.controller"/> 의 범위에 따라 스캔하면서

HM, C, VR관련 설정 및 컨트롤러 관련 객체생성(pojo 객체) / 의존주입 등을 기억한다.

 

 

* xml 설정일 때 : HM, C, VR <bean> 작성 필요

 

-->> @설정이 되면 안써도되는데 이때 VR은 써도되고 안써도됨 내가 머리말꼬리말에 뭐 달아줄때만 설정해주면됨

HM -> @RequestMapping / C -> @Controller / VR 설정하고싶을때만 설정하면됨

 

* @ 설정일 때 : <context:component-scan base-package="com.spring.controller" /> DS-servlet.xml의 스캔범위 작성

 

 

3. 생성된 DispatcherServletHandlerMapping이나 @RequestMapping을 통해

사용자의 요청이 어떤 요청인지에 따라 알맞는 Controller 객체(메모리에 생성된)를 동작시킨다.

이후 Command 객체를 통하여 요청을 처리하고 나온 String값을 ViewResolver가 알맞은 페이지를 브라우저에 보여준다.

 

 

 


Command 객체란?

Controller는 매개변수로 전달된 DAO 객체(커멘드 객체)를 사용한다.

Command 객체를 통해 무언가를 해볼 수 있는데 dao를 활용하여 사용자의 요청을 처리하더라~

>> dao만 활용하는게 아니라 Controller  객체에 따라 맞는 인자들을 활용해

사용자의 요청을 처리한다.(VR이 응답을 뷰에게 전달)

 

@Controller

implements로 인터페이스 Controller를 구현하면서 사용하던 것을 @Controller를 사용하면서 객체생성 및 컨트롤러라는 것을 알려준다. 이때 implements를 지우면서 메서드 강제성이 사라진다.( in / output 마음대로 설정 가능)

보다 POJO에 가깝게 경량으로 구현할 수 있다. => 그래서 Command 객체를 사용할 수 있게 된다.

 

인자, 아웃풋, 이름을 마음대로 바꿀 수 있기때문에 Command 객체 사용한다.

메서드 아웃풋이 String이고 보내야할 데이터가 있을때는 ModelAndView에서의 Model을 인자(Command 객체)로 받아서

new해주고 데이터 값을 set해주고 ModelAndView에서 View return에 바로 적어서 반환한다.

그럼 이때 return할때 데이터도 같이 알아서 보내진다.

 

Comments