본문 바로가기
스프링 로드맵/스프링 MVC 1편

[인프런 스프링 MVC 1편] 웹 애플리케이션 이해

by kancho24 2022. 4. 19.
모든 웹 애플리케이션은 HTTP를 기반으로 동작한다.
우리는 MVC 프레임워크를 직접 코드로 개발해 볼 것이다.

 

웹 서버와 웹 애플리케이션?

웹 서버는 HTTP 기반으로 동작하며, 정적 리소스를 제공한다.

웹 애플리케이션 서버 (WAS)도 HTTP 기반으로 동작하며, 웹 서버 기능 + 정적 리소스를 제공한다.

또한, 프로그램 코드를 실행해 애플리케이션 로직을 수행하며, 동적 HTML을 실행할 수 있다는 것이 특징이다.

 

예전 웹 시스템 구성 - WAS, DB

WAS, DB 만으로도 시스템 구성이 가능하다. 하지만, 애플리케이션 로직(WAS)가 정적 리소스 때문에, 수행이 어려울 수 있다.

또한, WAS 장애시 오류 화면도 송출이 불가능하다는 특징이 있다. 이 때문에, 일반적인 웹 시스템 구성은 다른 구조를 띈다.

 

일반적인 웹 시스템 구성 - WEB, WAS, DB

정적 리소스는 웹 서버가 처리한다. 웹 서버는 애플리케이션 로직같이 동적인 처리가 필요하면, WAS에 위임한다.

정적 리소스만 제공하는 웹 서버는 잘 죽지 않는다. 그에반해 애플리케이션 로직이 동작하는 WAS 서버는 잘 죽는다.

 

HTML From 데이터를 POST로 전송-저장한다고 할 때, 서버에서 처리해야하는 업무는 다음과 같다.
1. 서버 TCP/IP 연결 대기, 소켓 연결
2. HTTP 요청 메시지를 파싱해서 읽기
3. POST방식, /save URL 인지
4. Content- type 확인
5. HTTP 메시지 바디 내용 파싱
6. 저장 프로세스 실행
7. 비즈니스 로직 실행 (데이터 베이스에 저장 요청)
8. HTTP 응답 메시지 생성 시작
9. TCP/IP에 응답 전달, 소켓 종료

 

위 로직에서, 7번 비즈니스 로직을 제외하고 나머지 역할을 지원하는 것을 '서블릿'이라 한다.

 

서블릿?

urlPattern의 URL이 호출되면, 서블릿 코드가 실행된다.

이때, HTTP 요청 정보를 편리하게 사용할 수 있는 HTTPServeletRequest와,

HTTP 응답 정보를 편리하게 제공할 수 있는 HTTPServeletResponse를 제공한다. 

 

1. 웹브라우저에서 localhost:8080/hello 를 요청한다
2. WAS에서 HTTP 요청 메세지를 기반으로, request와 response 객체가 각각 생성된다.
3. 이는 서블릿 컨테이너에서 helloServelet 객체를 호출한다.
4. 이것이 종료되고, 다시 WAS에 일전 response 객체 정보로HTTP 응답을 생성한다. 
5. 이것이 웹 브라우저에 송출된다.

 

서블릿 컨테이너?

톰캣처럼 서블릿을 지원하는 WAS를, 서블릿 컨테이너라 한다. 

서블릿 객체는 싱글톤으로 관리된다

동시 요청을 위한 멀티 스레드 처리도 지원한다

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

(즉, 서블릿컨테이너는 WAS가 생성될때 만들어지고, 종료될때 사라진다. 생명주기가 알아서 관리된다.)

 

스레드?

애플리케이션 코드를 하나한 순차적으로 실행하는 것은 '스레드'이다

스레드가 없다면, 자바 애플리케이션 실행이 불가능하며, 동시 처리가 필요하면 스레드를 추가로 생성한다

 

다중요청이 들어왔을 때, 만약 스레드를 하나만 사용한다면?
요청1이 들어와 하나의 스레드가 servlet을 호출해, 사용하고 있었는데 처리가 지연되고 있다.
이러한 상황에 요청2가 들어오면, 요청1, 요청2 둘다 죽어버린다.

이를 해결하려면, 요청이 올때마다 신규 스레드를 생성하면된다

요청이 올때마다, 신규 스레드를 생성하면 되나?

이렇게하면 동시 요청을 처리할 수 있다. 또한, 하나의 스레드가 지연되어도 나머지는 정상작동한다.

다만, 스레드는 컨텍스트 스위칭 비용이 발생하며, 고객 요청이 올때마다 생성하면 응답 속도가 늦어질 수 있다.

 

이를 해결하려면, 내부에 스레드 풀을 만들면된다

필요한 스레드를 스레드 풀에 보관하고 관리하는 구조이다. 사용을 종료하면, 스레드 풀에 해당 스레드를 반납하는 구조로

대여/반납 형태이다. 최대 스레드가 모두 사용중이라면? 기다리는 요청은 거절하거나, 특정 숫자만큼만 대기하도록 설정할 수 있다.

스레드 풀의 장점?
1. 스레드가 미리 생성되어 있으므로, 스레드를 생성하고 종료하는 비용이 절약되고, 응답시간이 빠르다
2. 생성 가능한 스레드의 최대치가 있으므로, 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다

 

정적 리소스

고정된 HTML 파일, CSS, JS, 이미지, 영상 등을 제공

 

HTML 페이지

동적으로 필요한 HTML 파일을 생성해서 전달

 

HTTP API

HTML이 아니라 데이터를 전달하는 것 (주로 JSON 형식 사용)

주로, 데이터만 주고받거나 / UI 화면만 필요하거나 / 서버 to 서버끼리 정보 연동(ex 주문-> 결제)하는 상황에서만 사용

백엔드 개발자가 고민해야할 것은 결국 '세 가지'이다.
정적 리소스는 어떻게 제공할것인지? HTML 페이지는 어떻게 제공할건지? HTTP API는 어떻게 제공할건지?

 

최신 기술 1) 서버 사이드 렌더링 (SSR)

서버에서 최종 HTML을 생성해서 클라이언트에 전달하는 것으로, 주로 정적인 화면에 사용한다.

관련기술로는 JSP, 타임리프가 있고, 백엔드 개발자가 주로 사용한다.

 

최신 기술 2) 클라이언트 사이드 렌더링

HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성해서 적용하는 것으로, 주로 동적인 화면에 사용한다.

웹 환경을 마치 앱처러 필요한 부분만 변경할 수 있다 ex) 구글지도, gamil, 구글 캘린더

관련기술로는 React, Vue.js가 있으며, 프론트엔드 개발자 기술이다.