Spring Archiecture

아기코딩단2·2022년 4월 11일
0

*Spring boot 의 Architecture

Spring boot는 내부적으로 Tomcat 서버를 가지고 있음 Tomcat 서버에는 web server 가 있음

FTP가 존재하는데 FTP client 에서 FTP sever로 요청을 보낸다

프로토콜의 종류에는 POP3, IMAP가 존재한다.
HTTP client = Web client
HTTP server = Web client

Tomcat server 에는 servlet container 가 존재한다. <=얘는 .class 파일을 실행해줌
static resource 는 web server에서 읽어서 리턴해줌 ex)
.html, .css, .js etc..
자바 클래스를 실행해달라고 요청하면 Web server가 servlet container 에 위임함

servelt container 에서 DispatchServlet(servlet을 구현한 클래스) 를 통해 Controller실행시켜줌

DispatchServlet(servlet을 구현한 클래스) <= Spring Web MVC 프레임워크


Servlet container 와 핵심 구성요소

Servlet container 는 JavaEE 기술 중에서 Servlet/JSP 기술로 만든 자바 객체를 생성-실행-소멸을 관리하는 서버 Servlet container 가 Servlet 으로 call을 보내는데 Servlet 에서 클라이언트 요청을 처리하고 return을 함 Servlet container 에서 Servlet 으로 가기전에 Servlet 실행 전/후에 추가 작업 수행하는 애를 필터라고함. 특정 상태에 놓일 때 작업을 수행하는 리스너가 존재한다(요청이 들어왔을 때, 세션이 생성될 때, 서버가 시작/종료 될 때 등)

서블릿(=> 클라이언트 요청 처리) 구현 방법과 구동 원리
Servlet container에서 서블릿으로 Servlet 규칙에 따라 호출하면 Servlet객체가 존재한다면 Servlet 의 service() 호출함 그러나 존재하지 않는다면 Sevlet객체를 생성 -> 생성자 호출 -> init()호출(servlet 실행에 필요한 의존객체 준비) --(이렇게 생성 후)-> service()(요청에 따라 작업 처리)호출함

Servlet interface에는 init(), service(), destroy(), getServletInfo()(<= 관리 기능 수행시 호출됨), getServletconfig()(<= Servlet실행중에 설정 정보를 조회할 때) 메서드가 존재함 => 이중에서 Servlet Lifecycle과 관련된 메서드 init(), service(), destroy()가 존재함

Servlet container에서 서버를 종료하게 되면 생성된 모든 서블릿 객체에 대해 destroy()(init)에서 준비한 자원을 해제시킨다.) 호출한다.

Servlet interface는 Servlet container 와 Servlet사이의 호출 규칙

init()를 통해 한번 생성 후 그다음 부터 service()만 호출한다. 서버를 종료하게 되면 destroy() 호출한다. 다시 서버를 실행하게 되면 init()를 통해 다시 의존 객체를 준비한다.

wtp {
facet {
facet name: 'jst.java', version: '11'
}
} => 자바 버전을 11로 맞춰줘야지 서버설정해줄 수 있음

서블릿을 구현한 HelloServlet에서 service(){-} 메서드에서 요청을 처리하는 코드가 들어있다.

extends GenericServlet <= 이 추상클래스가 다 기본으로 구현해놓고 필요한 것만 overriding 하면 됨 Servlet interface를 구현하는 것보다 편리함

HttpServlet 추상클래스가 존재하는데 service() {-}에서 get, post,head 요청을 보낼 때마다 deGet(), doPost(), doHead()를 호출함 <= HTTP프로토콜을 다루는 메서드가 추가되어있음

// 서블릿 실행 전/후에 수행할 작업이 있다면 필터에서 처리하라.
public class HelloFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
	Filter.super.init(filterConfig);
	System.out.println("HelloFileter.init() 호출!");
}

@WebFilter("/*") // 모든 요청에 대해서 필터를 적용할 것인지 지정한다.
<= 모든 요청에 대해서 Fileter를 지정하라

항상 Filter 이후에 servlet이 실행됨

@WebListener // 클라이언트의 요청이 들어오면다음 클래스를 실행하라고 서블릿 컨테이너에게 알려준다.

호출순서는 리스너부터 실행되고 요청과 응답 이벤트 순서에 대해 보여줌
Listner1.requestInitialized()호출
Filter2.doFilter() 호출!
/hello3
Hello2Filter.doFilter() 호출!
/hello3
Fileter3.doFilter() 호출!
/hello3
service()호출
Listner1.requestDestroyed()호출

서버가 시작/ 종료될 떄 딱 한번 필수적으로 작업을 하고싶을 때는 리스너 안에 코드를 작성하면됨
서버가 종료/ 시작될 때 리스너가 실행됨

Filter는 특정 URL이 실행되기 전에 doFilter를 실행하고 싶을 때 코드를 작성하는 곳임

profile
레거시 학살자

0개의 댓글