Spring (3) Web Application

destro·2025년 4월 26일

2. Spring

목록 보기
3/17
post-thumbnail

1. Web Application

Ⅰ. Web Server

📚 HTTP 기반으로 동작, 정적 리소스(HTML, CSS, JS, 이미지 등) 제공

  • 정적 리소스 : 리소스가 이미 완성된 채로 서버에 존재하여 원본 그대로 응답하는 데이터
  • 대표적인 Web Server : NGINX, Apache

📌 Web Server 구조

Ⅱ. WAS(Web Application Server)

📚 웹 서버 기능 포함. 코드를 실행하여 Application 로직 수행 및 DB와 상호작용, 동적 컨텐츠 생성

  • 대표적인 WAS : Tomcat (Spring Boot 내장), Jetty, Undertow

📌 WAS 구조

📌 Web Server와 WAS의 차이

  • 실제로는 Web Server도 Application 로직 포함 가능
  • WAS는 Application 코드 실행에 더욱 특화
  • Java에서는 Servlet Container 기능 제공시 WAS임

Ⅲ. Web System 구성

📌 WAS만 사용하는 경우

  • WAS가 너무 많은 역할을 담당하여 서버 과부하 가능성 상승
  • 실행에 가장 중요한 Application 로직이 정적 리소스로 인해 수행 불가능
  • WAS 장애시 화면 출력 불가 (오류 페이지 응답불가)

📌 실제 웹 시스템 구성

  • 정적 리소스는 Web Server에서 처리
  • Web Server는 Application 로직이 필요한 요청만을 WAS에 전달

📌 실제 웹 시스템 구성의 장점

  1. 효율적인 리소스 관리
    • 정적 자원 많이 사용시 Web Server를 ScaleOut
    • Application 관련 자원 많이 사용시 WAS를 ScaleOut
  2. 오류 화면 제공
    • Web Server는 오류가 발생할 확률이 아주 낮음
    • WAS는 오류가 발생할 확률이 아주 높고, 장애가 자주 발생
    • WAS는 DB와 상호작용하므로 DB에 문제가 생겨도 문제 발생

2. Servlet

📚 HTTP 프로토콜 기반 요청 및 응답처리에 사용. JAVA에서는 HttpServlet 클래스를 상속받아 구현

Ⅰ. Servlet의 역할

  • HTTP POST 요청으로 HTML Form 데이터를 전송하는 상황
    ex) 회원가입 : POST + localhost:8080/api/users

  • HTTP Request Message 예시

    POST /api/users HTTP/1.1
    Host: localhost:8080
    Content-Type: application/x-www-form-urlencoded
    
    userId=아이디&pssword=비밀번호
  • HTTP Response Message 예시

    HTTP/1.1 200 OK
    Content-Type: text/html;charset=UTF-8
    Content-Length: 3423
    
    <html>
       <body>
        ...
       </body>
    </html>

📌 서버에서 처리해야 하는 작업

  1. 서버와 TCP/IP 연결
  2. HTTP Request Message 필요한 형태로 변환하여 읽기
    • HTTP Method 및 URL 분석
    • HTTP Header 분석
    • HTTP Message Body 읽기 및 변환
  3. 분석한 결과를 통해 프로세스 실행
  4. 비지니스 로직 실행
  5. HTTP Response Message 생성
    • HTTP Start Line 생성
    • Header 생성
    • HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 응답
    • 처리가 불가하다면 예외처리
  6. 응답 전달
  7. 연결 종료

Ⅱ. Servlet 동작 순서

⭐ localhost:8080/example HTTP API를 호출하면 일어나는 일

📌 Servlet 예시코드

  • URL (/example) 호출시 service() 메서드 실행

    @WebServlet(name="ExampleServlet", urlPatterns = "/exmaple")
    public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현
    
      @Override
      protected void service(
        HttpServletRequest request,  // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
        HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
      ) {
        // application logic
      }
    
      }

📌 Servlet 동작순서

  1. WAS는 HTTP 요청 메세지를 기반으로 새로운 Request, Response 객체 생성
  2. WAS는 만들어진 Request, Response 객체를 서블릿 컨테이너에 넘겨주며 ExampleServlet 객체 호출
  3. ExampleServlet에서 비지니스 로직 처리
  4. 응답에 필요한 정보를 개발자가 입력
  5. WAS는 Response 객체 정보(개발자가 입력한 정보)로 HTTP 응답 메세지 생성

📌 개발자가 하는 일

  1. Request 객체에 있는 HTTP 요청 정보를 꺼내서 사용
    • 요청 정보(URL, Method, Message Body)를 통해 필요한 기능(비지니스 로직)을 수행
  2. 생성된 Response 객체에 HTTP 응답 정보 입력

Ⅲ. Servlet Container

📚 Servlet을 지원하는 WAS 내부에 있는 것. 초기화, 생성, 관리, 호출, 종료 역할 수행

  • Servlet 생명주기

    • Servlet은 서블릿 컨테이너가 생성 및 관리
    • WAS(서블릿 컨테이너 포함) 종료시 Servlet도 함께 종료
  • Servlet 객체 생성시점

    • 개발자가 직접 인스턴스화하지 않으며 코드만 작성하면 서블릿 컨테이너가 생성함
  • 서블릿 예시 코드

    @WebServlet(name="ExampleServlet", urlPatterns = "/example")
    public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현
    
        @Override
        protected void service(
            HttpServletRequest request,  // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
            HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
        ) {
            // application logic
        }
    
    }
    @WebServlet(name="Example2Servlet", urlPatterns = "/example2")
    // 위와 같은 코드
    
    @WebServlet(name="Example3Servlet", urlPatterns = "/example3")
    // 위와 같은 코드
    
    @WebServlet(name="Example4Servlet", urlPatterns = "/example4")
    // 위와 같은 코드
  • Servlet Container가 하는 일

    1. 서블릿 초기화, 생성, 관리, 호출, 종료 역할 수행, Servlet 객체를 싱글톤으로 관리
    2. 동시 요청 처리를 위해 Multi Thread 지원
💡 싱글톤 : 객체를 하나만 생성하여 생성된 인스턴스를 공유하여 사용하는것
특정 클래스의 인스턴스가 여러개 생성되지 않도록 하여 자원낭비 방지 및 인스턴스 공유로 일관된 상태유지
❗ 공유 변수 사용 주의

3. Thread

📚 애플리케이션 코드를 하나하나 순차적으로 실행하는 것, Java에서 main method 실행시 main Thread가 실행되며 한번에 하나의 코드 라인만 수행. 동시 처리 필요시 Thread 추가 생성 해야함

  • Servlet 객체의 호출 → 클라이언트에서 Request전달시 Thread가 Servlet 객체를 호출
  • 단일 요청 : Single Thread

    1. 클라이언트 요청 및 TCP/IP 연결
    2. Thread 할당 후 Servlet 호출
    3. 응답 후 Thread 반환
  • 동시 요청 : Single Thread

    1. 첫번째 요청의 작업을 Single Thread가 수행중
    2. 두번째, 세번째 요청이 들어오고 연결을 완료
    3. Thread를 사용하기 위해 작업이 끝날때 까지 대기
    4. 요청이 모두 사라질 때까지 대기 → 작업 수행 → 반복
  • 첫번째 요청 작업 지연이나 Error 발생시 → 모든 요청이 Time out 오류 발생


4. Multi Thread

📚 Single Thread 사용중 동시 요청을 할때 하나라도 지연되거나 서버문제 발생시 나머지 요청들에도 영향을 끼치는 문제 → 여러개의 Thread를 생성해서 사용 / WAS는 Multi Thread 지원

👉 Multi Thread로 동시요청을 처리하는 방법

  1. 요청마다 새로운 Thread 생성 → 완료시 Thread 종료
  • 장점
    • 동시 요청 처리 가능, 하나의 Thread에 지연등의 문제 발생시에도 나머지 Thread는 정상동작
  • 단점
    • Thread 생성 무제한, 생성 비용이 높음
    • 수많은 동시 요청 발생시 리소스(Memory, CPU 등)부족으로 서버가 다운
    • Thread 사용시 Context Switching 비용 발생

⭐ 멀티 태스킹의 진실과 Context Switching

📌 CPU(프로세서)는 한순간에 하나의 프로세스만 실행 가능

  • 작업 관리자 (현재 실행중인 프로세스)
    • 실행 중인 작업들은 모두 동시 수행처럼 보이지만 매우 짧은 시간 안에 수십, 수천 번 실행할 프로세스를 교체중임
  • Context Switching
    • Task1과 Task2가 서로 교체되는 시점마다 Task1이 Ready 상태로 돌아간다는 정보, 진행정보, Task2는 작업시작지점에 대한 정보들을 로딩하는 시간

  1. Thread Pool
    • 이미 생성된 여러개의 Thread가 수영하는 수영장
    • 요청이 들어오면 Thread Pool에서 Thread를 받아 사용 → 사용 완료된 Thread는 반납
    • Thread Pool에 있는 Thread가 모두 사용 중이면 Thread가 생길 때까지 대기하거나 거절

5. SSR(Server Side Rendering)

📚 서버에서 동적으로 HTML을 만들어 클라이언트에게 제공하는 기술 JSP, Thymeleaf

  • SSR 동작 흐름

    1. 서버(WAS)에 HTML 요청 → 로직을 거친 후 DB 조회
    2. 조회 결과를 기반으로 HTML 동적 생성 → 생성된 HTML 응답
  • 장점

    • 초기 페이지 로드 시 서버에서 완전히 렌더링된 HTML을 반환하여 첫 페이지 로딩이 빠름
    • 검색 엔진 크롤러가 완전한 HTML을 즉시 수집할 수 있어 SEO에 유리
      ex) 전자상거래 사이트, 뉴스 사이트
  • 단점

    • 모든 요청을 렌더링하므로, 높은 트래픽 상황에서 서버의 부하 크게 증가
    • 초기 페이지 이외의 페이지들도 렌더링 후 반환되므로 속도가 느림
  • SEO(Search Engine Optimization) : 검색 엔진에서 상위에 노출되도록 최적화하는 과정


6. CSR(Client Side Rendering)

📚 웹 브라우저에서 자바스크립트를 사용해 동적으로 HTML을 생성해서 적용하는 기술.
웹을 앱 처럼 부분 변경 가능하게 함 React, Vue

  • CSR 동작 흐름

    1. HTML 요청 → 비어있는 HTML 응답 → JS가 존재하는 주소 링크 응답
    2. 자바스크립트(클라이언트 로직, 렌더링 포함)를 요청
    3. HTTP API 요청 후 화면에 필요한 데이터를 JSON 형태(다른형태 가능)로 응답받음
      {
          "name": "황원욱",
          "job": "developer"
      }
    4. 응답받은 JSON 데이터로 HTML을 동적으로 그림
  • 장점

    • 클라이언트 측에서 렌더링하므로 사용자 인터랙션(상호작용)에 빠르게 반응
    • 초기 로딩 후에 서버와 통신 없이 빠르게 페이지 간 전환 가능
      ex) Google Map, SNS Application
  • 단점

    • 초기 로딩 시 필요한 모든 자바스크립트 파일을 다운로드하고 실행 → 초기 로딩 시간 김
    • 검색 엔진 크롤러가 자바스크립트를 제대로 실행하지 못하면 SEO에 불리

7. 정리

  1. WAS는 Multi Thread 지원
    • 개발자가 Multi Thread 관련 코드는 고려하지 않아도 되며 Multi Thread 환경이므로 싱글톤 객체(Servlet, Spring Bean)는 주의해서 사용. 공유변수 사용 조심
  1. Thread Pool

    • Thread는 Thread Pool에 보관 및 관리
    • Thread Pool에 생성 가능한 Thread 최대치를 관리. Tomcat은 최대 200개 기본 설정 (변경 가능)
    • 성능테스트로 적정 Thread 수를 찾는다
    • 장점
      1. 요청 마다 Thread를 생성하는 단점 보완
      2. Thread가 미리 생성되어 있기에 생성, 종료 비용이 절약 → 응답 빠름
      3. 생성 가능한 Thread 최대치가 제한되어 있어서 많은 요청이 들어와도 안전한 처리 가능
    • 단점
      1. Thread Pool의 최대 Thread 수를 낮게 설정시 응답이 지연
      2. 요청이 많아지면 리소스 부족으로 서버 다운
  2. 이것만은 꼭 기억하기

    • 네트워크 통신은 HTTP
    • HTTP는 무상태 프로토콜이며 비연결성
    • HTTP Message 구조
      1. HTTP Method
      2. 상태코드
      3. HTTP Header
    • HTTP API는 Restful 하고 성숙도레벨 최소는 2
    • Servlet은 Java에서 Request, Response를 쉽게 다루게 해주는 객체
    • Servlet Container는 Servlet 객체를 싱글톤으로 관리
    • WAS는 다중 요청 처리를 위해 Multi Thread 지원
    • SSR 방식은 서버에서 동적인 페이지를 완성하여 응답한것을 브라우저에서 화면 출력
    • CSR은 HTTP API 통신으로 얻은 결과를 브라우저에서 동적으로 화면 출력
profile
<포르투갈어> 솜씨 있는. 재간 있는. 능란한. 기민한. (재주가) 비상한.

0개의 댓글