Spring Framework 기본동작 순서 및 구조, 구성요소
Spring Framework (스프링프레임워크) 구조
Spring Framework (스프링프레임워크)에서의 동작처리를 알아보겠습니다.
정확히는 http request를 처리하는 방식에 대한 기본적인 내용을 설명해보려고 합니다.
먼저 전체적인 흐름은 아래와 같습니다.
Spring framework(스프링 프레임워크 ) 의 각 구성요소
스프링 프레임워크의 각 구성요소에 대한 설명은 아래와 같습니다.
ServletContainer (서블릿 컨테이너)
Client (보통 크롬, 파이어폭스 등과 같은 웹브라우저)로부터 HTTP요청을 받아 서블릿 로직을 처리할 수 있는 구성요소입니다.
서블릿이란 javax.servlet 패키지에 정의된 인터페이스로, 자바 class 파일로 된 서버로직이라고 볼 수 있습니다.
ServletContainer의 대표적인 예로는 Tomcat이 있습니다.
Spring (스프링)
Spring framework (스프링 프레임워크) 영역입니다.
DispatcherServlet (디스패처 서블릿)
Spring framework (스프링 프레임워크)에서 front controller역할을 합니다.
실제 동작하기 위한 로직요청에 대해 처리할 수 있도록 해줍니다.
dispatch의 뜻을 보내다라는 뜻으로, 이곳에 요청이 오면 실제로 로직을 수행할 컴포넌트로 요청을 보내주는 역할을 하고, 반환을 받는 역할을 합니다.
HandlerMapping (핸들러 매핑)
Spring framework(스프링 프레임워크)에 작성된 여러 Controller(컨트롤러) 중에서 로직을 수해할 contoller를 확인해주는 컴포넌트입니다.
Controller (컨트롤러)
개발자가 직접 개발하는 컴포넌트로, http request를 개발자가 처리할 수 있도록 개발하는 컴포넌트입니다.
Service (서비스)
개발자가 직접 개발하는 컴포넌트로, 비지니스 로직을 수행하는 컴포넌트이니다.
DAO (Data Access Object, 디에이오)
개발자가 직접개발하는 컴포넌트로, Database에 직접적으로 접근하는 객체입니다.
보통 mybatis와 같은 persistence framework를 많이 활용합니다.
ViewResolver (뷰 리졸버)
ViewName을 기반으로 어떤 View 파일을 사용할것인지 확인해주는 컴포넌트입니다.
View (뷰)
개발자가 직접개발하는 컴포넌트로, 보통 UI화면을 의미합니다.
시퀀스 다이어그램
시퀀스 다이어그램으로 그려보면 아래와 같이 표현할 수 있습니다.
1. HTTP 요청을 client에서 보내면 servlet container에서 이를 처리하도록 합니다.
2. servlet container에서는 spring이 처리해야한다는것을 인지하고, dispatcherServlet이 처리하도록 http request정보를 전달합니다.
servlet container에서 spring이 처리해야한다는 내용은 web.xml 파일에 기입이 되어 있습니다.
3. dispatherServlet은 http request 중 url과 메서드 등을 확인하여 @RequestMapping으로 매핑되어 있는 controller를 찾습니다.
4. 앞 단계에서 찾아진 controller가 할당이 되어 로직을 처리하게 됩니다.
5. controller 처리는 service의 조합으로 처리가 됩니다.
6. service는 DAO를 호출하여 비지니스 로직을 수행하게 됩니다.
7. DAO는 DB에 직접접근하여 쿼리를 수행하게 되고, 리턴결과를 자바 객체로 받게 됩니다.
8. DAO -> Service -> Controller로 결과를 리턴받게 되고, Controller는 Viewname과 Model을 리턴합니다.
9. Viewname을 리턴받은 DispatcherServlet은 ViewResolver로 어떤 View 파일을 활용할지 Viewname을 통해 확인합니다.
10. 확인된 View파일과 Model을 이용하여 사용자에게 최종적으로 보여질 UI화면을 http response에 실어서 클라이언트에게 리턴해줍니다.
11. client에서는 http response를 받아서(텍스트형식) 결과를 파싱하는 등의 처리를 진행해서 최종적으로 사용자에게 화면을 표시해주게 됩니다.
'백엔드' 카테고리의 다른 글
[Java] Project, Package, Class, Method 네이밍 규칙 (0) | 2023.03.21 |
---|---|
스키마/ 테이블/ 컬럼 네이밍 규칙 (0) | 2023.03.21 |
[mysql] boolean과 tinyInt의 차이점 / varchar, char, text 차이점 (0) | 2023.03.02 |
[Java] JAVA 1~17버전특징 (1) | 2023.02.24 |
[SpringBoot] JAR 와 WAR의 차이 정리 (0) | 2023.02.24 |