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

웹 서버, 웹 애플리케이션 서버

 

✔ 서블릿 (Servlet)

 

→ 의미 있는 비즈니스 로직을 제외한 모든 기능을 지원해준다!

→ TCP/IP연결, HTTP 요청 파싱, 응답 ...

 

@WebServlet(name = "helloServlet", url = "/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, 
    				HttpServletResponse response) {
        //애플리케이션 로직
    }
}

http://localhost:8080/hello 의 URL이 호출되면 서블릿 코드(service)가 실행

→ 개발자는 HttpServletRequest 객체에서 Http 요청정보를 꺼내서 사용

→ 개발자는 HttpServletResponse 객체에서 Http 응답 정보를 저장

 

✔ 서블릿 컨테이너

 

= 서블릿을 지원하는 WAS

→ 서블릿 객체를 생성 + 호출 + 초기화 + 종료 + 생명주기 관리

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

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

 

싱글톤 (Singleton) ❓

고객의 요청이 올 때마다 계속 객체 생성을 하면 비효율적이므로 (고객마다 요청이 다름)
최초 로딩 시점에 서블릿 객체를 미리 만들고 계속 재활용
공유 변수 사용 주의

 

✔ 동시 요청 - 멀티쓰레드

 

쓰레드  

 

→ 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드!

→ 쓰레드가 서블릿을 호출해준다!

 

요청마다 쓰레드를 생성한다면 ❓

 

- 동시 요청 처리 가능 → 리소스가 허용할 때까지 처리 가능

- 하나의 쓰레드가 지연되어도, 나머지 쓰레드는 정상 동작

 

하지만 ❗❗

 

우리 눈에는 쓰레드가 하나가 다 처리하는 것처럼 보이지만.. 여러개의 쓰레드가 매우 빠르게 전환되면서 요청을 처리해주는 것!

→ 그러므로 요청마다 쓰레드를 생성하면 컨텍스트 스위칭 비용이 발생.

쓰레드 생성에 제한이 없기 때문에 고객 요청이 너무 많이 오면 cpu나 메모리의 한계로 서버가 죽을 수 있다! 

 

쓰레드 풀을 쓰자! 🏖 

 

 

쓰레드 풀 안에 미리 쓰레드를 여러개 만들어서 보관 (생성 가능한 쓰레드의 최대치를 관리)

→ 요청이 들어오면 쓰레드풀에서 꺼내서 가져다 쓰자!

→ 사용을 하고 나면 쓰레드를 죽이는 것이 아니라 반납

 

만약 쓰레드 풀 안의 쓰레드가 다 실행 중이라면..?

→ 쓰레드 대기 또는 거절 가능

 

실무 팁

 

WAS의 주요 튜닝 포인트는 최대 쓰레드 수

 

낮게 설정하면?

→ 동시 요청이 많을 때 클라이언트는 응답지연을 겪음 (but 서버 리소스는 적게 사용 중...)

 

높게 설정하면?

→ 동시 요청이 많을 때 서버 리소스 임계점 초과로 서버 다운

→ ex) 쓰레드를 만개로 설정할래! → 만개의 요청을 한 번에 받아들임 → 서버 다운

 

그럼 적정 숫자를 어떻게 찾나요?

→ 애플리케이션 로직의 복잡도, CPU, 메모리 등에 따라 모두 다름.. 최적의 해는 바로 알 수 없다!

→ 성능 테스트를 하는 게 답ㅎ

 

핵심

 

어차피 멀티 쓰레드는 WAS가 처리하므로 개발자가 멀티쓰레드 관련 코드는 신경쓰지 않아도 됨!

→ 하지만 어쨌든 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용하자

 

 

✔ HTML, HTTP API, CSR, SSR

 

백엔드 개발자가 서비스를 제공할 때 고민해야 할 포인트 3가지

 

1. 정적 리소스 어떻게 제공할 거야?

2. 동적으로 제공되는 Html 페이지 어떻게 제공할 거야?

3. HTTP API 어떻게 제공할 거야?

 

 

1 ) 정적 리소스

 

: 고정된 HTML 파일, CSS 등을 제공

웹브라우저에서 /hello.html을 요청하면 서버에서 폴더에 있는 이미 생성된 리소스를 단지 제공할 뿐

 

 

2 ) HTML

 

 

: WAS가 DB에서 주문 정보를 조회한 후에 (JSP, 타임리프를 이용해) 동적으로 HTML을 생성하여 웹브라우저에 내려줌

 

 

3 ) HTTP API

 

 

: HTML이 아니라 데이터를 전달 → DB에서 주문정보를 조회한 후에 JSON 형태의 정보를 웹브라우저에 내려줌

: 다양한 시스템에서 호출될 때 사용함 (앱, 웹, 서버 to 서버)

 

SSR - 서버 사이드 렌더링

: 서버에서 최종 HTML을 생성해서 클라이언트에 전달

→ 서버에서 렌더링하고 웹브라우저는 단순히 생성된 HTML을 보여주기만 함

 

CSR - 클라이언트 사이드 렌더링

: 자바스크립트를 사용해 웹 브라우저에서 동적으로 HTML을 생성

→ 웹 환경을 앱 처럼 필요한 부분만 변경할 수 있음

 

 

그렇다면 어디까지 알아야하나요...? 🤔

 

1. 백엔드 개발자는 서버 사이드 렌더링 기술 학습이 필수! → 타임리프를 공부하자

2. 백엔드 개발자는 서버, DB, 인프라 등의 수많은 백엔드 기술을 공부하되 웹 프론트엔드 기술 학습은 옵션 (리액트가 점유율이 높다)

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글