Spring/스프링 MVC 기본

#1 스프링 웹 애플리케이션 이해

히포파타마스 2021. 6. 23. 13:49

스프링 웹 애플리케이션 이해

 

1. 웹 시스템 구성

■웹 서버(Web Server)

 

· HTTP 기반으로 동작

 

· 정적 리소스 제공

ex) 정적 HTML, CSS, JS, 이미지, 영상 등

 

■ 웹 애플리케이션 서버(WAS - Web Application Server)

 

웹 애플리케이션 서버는 웹 서버의 기능에 더해서, 애플리케이션 로직을 처리할 수 있다.

ex) 동적 HTML, HTTP API

 

WAS가 웹 서버의 기능을 하지만 WAS만으로 서버를 운영하기에는 WAS가 너무 많은 기능을 담당하게 된다.

 

따라서 실제 웹 시스템은 웹 서버와 WAS를 동시에 운영해 역할을 분배한다.

 

 

[웹 시스템 구성]

웹 서버와 WAS로 역할을 분담함으로써 효율적인 리소스 관리가 가능하다.

 - 정적 리소스가 많으면 웹 서버 증설

 - 애플리케이션 리소스가 많이 사용되면 WAS 증설

 

또한 WAS에서 오류가 날 경우 웹 서버 측에서 오류 화면 출력이 가능하기 때문에 운용되는 서버의 상태를 확인 및 상호보완할 수 있다.

 

 

2. 서블릿

WAS에서 HTTP요청을 받아서 애플리케이션 로직을 실행시키고 HTTP 응답을 생성하는데에는 많은 작업이 필요하다.

 

 

[서버 처리 업무]

위의 예제에서 HTTP 요청에 대해 서버에서 처리해야 하는 업무 중 의미있는 것은 오직 애플리케이션 로직을 구현하고 실행하는 부분이다.

 

다른 나머지 작업은 모든 HTTP 요청에 공통되며 단순 반복된는 작업이다.

 

이러한 단순 반복작업을 해결하고 비지니스 로직을 구현하는것에 집중하기 위해 나온것이 서블릿이다.

 

 

[서블릿 예제]

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response){
    }
}

서블릿은 urlPatterns의 URL이 호출되면 서블릿 코드(service)가 실행된다.

 

HttpServlet을 상속받아 Override한 service는 HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest와 HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse를 매개변수로 사용한다.

 

개발자는 HTTP에 관련된 다른 작업들을 전혀 신경쓰지 않고 HttpServletRequest와 HttpServletResponse를 사용해 편하게 로직 코드를 작성할 수 있다.

 

 

[서블릿 사용 흐름]

HTTP 요청시 WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다.

 

개발자는 Request 객체에서 HTTP 요청 정보를 사용하고 Response 객체에 HTTP 응답 정보를 입력한다.

 

WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성한다.

 

■ 서블릿 컨테이너

 

서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.

 

· 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.

· 서블릿 객체는 싱글톤으로 관리한다.

· 동시 요청을 위한 멀티 쓰레드 처리를 지원한다.

 

 

3. 멀티 쓰레드

애플리케이션 코드를 순차적으로 실행하는 주체를 쓰레드라고 한다.

ex) main이라는 이름의 쓰레드

 

 

[다중요청 예제]

쓰레드는 한번에 하나의 코드 라인만 수행한다.

 

이 때문에 동시 처리가 필요할 때는 쓰레드를 추가로 생성해야한다.

 

그렇다고 다중 요청에 대해 요청 마다 쓰레드를 생성할 경우 다음과 같은 몇가지 문제점이 있다.

 

· 쓰레드 생성 비용이 매우 비싸다

 - 응답 속도가 늦어진다.

· 쓰레드 생성에 제한을 둘 수 없다.

 - 고객 요청에 대해 한계가 없어서, 메모리 임계점을 넘어서면 서버가 죽을 수 있다.

 

이를 해결하기 위해 쓰레드를 일정 수 미리 생성해 놓고 필요에 의해 쓰레드를 운용하는 방법을 사용한다.

 

 

[쓰레드 풀]

미리 생성한 쓰레드를 쓰레드 풀에 저장해 놓고 필요에 의해 쓰레드를 요청해 사용한다.

 

사용이 끝나면 풀에 해당 쓰레드를 반납한다.

 

쓰레드 풀은 쓰레드를 생성하고 종료하는 비용이 매우 절약되고 응답시간이 빠르다는 장점이 있다.

 

또한 다중 요청에 대해 쓰레드 풀이 보관한 쓰레드 수만큼은 안전하게 처리 될것이 보장되어있다.

 

※실무 환경에 따라 쓰레드 풀의 최대 쓰레드를 잘 조절하는것이 중요하다.

 - 최대 쓰레드가 너무 낮으면 서버 리소스는 여유롭지만 클라이언트는 금방 응답 지연

 -  최대 쓰레드가 너무 높으면 CPU, 메모리 리소스 임계점 초과로 서버 다운될 수 있음.

 

WAS는 멀티 쓰레드에 대한 대부분을 처리해준다.

 

즉, 개발자는 멀티 쓰레드 관련 코드를 신경 쓰지 않아도되고 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발하면 된다.