웹서비스와 WEB WAS 개념1/2

younk·2023년 8월 8일
0

스프링부트

목록 보기
7/10

스프링부트에는 내장 톰캣이 설정되어있다. 그런데 회사 프로젝트의 pom.xml에는 embedded tomcat을 사용하지 않고 외부 tomcat을 사용하도록 설정해두었다. 왜 이렇게 설정해두었는지 궁금해진 나는, 이 기회에 톰캣에 대하여, 웹서버에 대하여 제대로 공부해보고자 한다.

웹 서버

웹서버는 Http 프로토콜을 사용하여 클라이언트와 Request, Response를 주고받는다. 사용자가 브라우저에 url을 입력하면 웹서버는 url에 맞는 웹페이지를 전송해준다. 웹서버는 정적인 요청을 처리하면서 동적인 요청들을 WAS에 요청한다.
웹서버의 종류에는 apache, NginX 등이 있다.

WAS

서블릿 컨테이너를 통해 비즈니스 로직을 처리하거나, db 조회 등의 동적인 자원을 제공한다.
또한 was는 웹서버의 기능도 수행이 가능하다.
하지만 was의 부하를 방지하기 위하여, 주로 웹서버의 기능과 was의 기능을 분리하여 사용하고있다.
WAS의 종류에는 Tomcat, JBOSS, JEUS 등이 있다.

서블릿 컨테이너

서블릿 컨테이너는 소켓으로 웹서버와 통신하며, 서블릿들이 클라이언트 요청을 처리할수있도록 관리해준다.
컨테이너는 요청이 올때마다 새로운 자바 스레드를 하나씩 생성하는데, 내부에 스레드풀이 있어 스레드를 할당하고 요청할때 꺼내 재사용하게된다. 또한 서블릿 객체는 싱글톤으로 관리되어 메모리 비효율을 막는다.

서블릿 객체

서블릿은 javax.servlet.package에 정의된 인터페이스이다. 서블릿은 lifeCycle을 위한 세가지 필수적인 메소드를 정의하는데, init(), service(), destroy()이다.

  • init() : 서블릿 생명주기 중 초기화 단계에 호출됨. javax.servlet.ServletConfig 인터페이스를 구현하는 오브젝트가 전달되며, 이를 통해 서블릿이 웹 애플리케이션에서 초기화 파라미터에 접근할수 있도록한다.

  • service() : 초기화 이후 각각의 요청들이 들어오면 호출되는 메소드. 각각의 요청들은 별도로 나누어진 스레드에서 처리된다. 웹 컨테이너는 모든 요청에 대해 서블릿의 service()메소드를 요청한다. service() 메소드는 요청의 종류를 판별하고 요청을 처리할 적절한 메소드로 전달한다.

  • destroy() : 서블릿 객체가 파괴되어야할 때 호출된다.
    해당 서블릿이 가지고 있던 자원(메모리)를 풀어준다.

서블릿 객체는 동시에 여러개의 스레드를 제공할 수 있으며, 스레드가 더이상 사용되지 않을때는 JVM에 의해 가비지 컬렉팅된다. 서블릿들은 JVM내부에서 작동하며 복잡한 http요청들을 처리하기위해 서블릿 컨테이너에 의해 생성, 실행, 파괴된다.

서블릿의 특징

1) 동적으로 작동하는 자바 웹 프로그래밍 기술이다.
2) html을 사용하여 요청에 응답한다.
3) 자바 스레드를 이용하여 동작한다.
4) HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
5) UDP에 비해 처리 속도가 느리다.
6) 서블릿은 MVC 패턴에서 controller로 이용된다.

서블릿 동작 순서


1) 클라이언트가 url을 입력하면 웹서버가 서블릿 컨테이너로 요청을 전송한다.
2) 요청을 전송받은 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성한다.
3) web.xml을 기반으로 사용자가 요청한 url이 어느 서블릿에 대한 요청인지 찾는다.
3-1) 서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드한다.
3-2) 컨테이너가 서블릿의 init()메소드를 호출하면, 서블릿이 초기화된다. (처음 로드 됐을때 한번만 호출)
4) 컨테이너가 서블릿의 service() 메소드를 호출한다.
5) service() 메소드는 요청이 get인지, post인지 구별하여 doGet(), doPost()를 수행하여 HttpServletResponse 객체에 응답을 보낸다.
6) 웹서버는 이 응답을 올바른 위치에 반환한다.

0개의 댓글