1. 스프링 웹 MVC
스프링 MVC는 웹 애플리케이션 개발을 간편하게 하는 Model-View-Controller 패턴을 따르는 프레임워크이다
클라이언트-서버 아키텍처를 통해 HTTP 기반으로 동작하며, 웹 애플리케이션 서버(WAS)와 웹 서버의 역할을 명확히 구분하여 애플리케이션의 성능을 최적화한다
2. 웹 서버와 웹 애플리케이션 서버
웹 서버는 HTTP 기반으로 정적 리소스(HTML, CSS, JS, 이미지 등)를 제공하는 반면, 웹 애플리케이션 서버(WAS)는 애플리케이션 로직을 처리하고 동적 콘텐츠를 제공한다.
cf) Apache나 NGINX는 주로 정적 리소스를 제공하는 웹 서버로 사용되며, Tomcat이나 Jetty는 WAS로 사용되어 동적 페이지와 애플리케이션 로직을 처리한다
3. 웹 시스템 구성
웹 시스템은 웹 서버와 WAS, 그리고 데이터베이스(DB)로 구성된다
정적 리소스는 웹 서버가 처리하고, 동적 애플리케이션 로직은 WAS가 처리하며, DB는 데이터 저장과 관리 역할을 담당한다. 이러한 구성은 리소스의 효율적인 관리와 시스템 성능 최적화를 도와준다
4. 서블릿과 HTTP
HTTP는 웹의 기본 통신 프로토콜이다
모든 데이터는 HTTP 메시지 형태로 전송되며, HTML, 텍스트, 이미지, 음성, 영상, JSON, XML 등 다양한 형태의 데이터를 포함할 수 있다
서블릿(Servlet)은 자바 기반의 웹 애플리케이션에서 클라이언트 요청을 처리하고, HTTP 응답을 생성하는 역할을 한다
서블릿 컨테이너는 이러한 서블릿의 생명주기를 관리하고, 클라이언트 요청에 따라 서블릿을 실행한다
5. 서블릿의 특징과 요청 처리 흐름
서블릿은 URL 패턴에 따라 호출되며, HTTP 요청 정보를 HttpServletRequest 객체로 전달받고, HttpServletResponse 객체를 통해 응답을 생성한다
서블릿 컨테이너는 요청 시 새로운 서블릿 객체를 생성하거나 기존 객체를 재사용하여 요청을 처리한다
이를 통해 자원의 효율적인 사용과 성능 최적화를 이룬다
5. 서블릿 컨테이너
톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다
서블릿 컨테이너의 역할
- 서블릿의 생성 및 관리: 서블릿 컨테이너는 서블릿 객체를 생성하고, 초기화하며, 라이프사이클을 관리한다
서블릿 객체를 효율적으로 재사용하고, 필요에 따라 초기화 및 종료할 수 있게 한다 - 클라이언트 요청의 처리: HTTP 요청이 들어오면, 서블릿 컨테이너는 요청을 적절한 서블릿으로 전달하고, 서블릿이 요청을 처리할 수 있도록 한다
이 과정에서 클라이언트의 요청 정보를 HttpServletRequest 객체로 전달하고, HttpServletResponse 객체를 통해 응답을 작성하게 한다 - 쓰레드 관리: 서블릿 컨테이너는 멀티 쓰레드를 지원하여 여러 클라이언트 요청을 동시에 처리할 수 있다
이를 통해 서블릿 컨테이너는 높은 성능을 유지하면서도 자원의 효율적인 사용을 가능하게 한다
서블릿 라이프사이클
- 생성: 서블릿 컨테이너는 애플리케이션이 시작될 때 서블릿을 생성한다
이 과정에서 서블릿 객체는 단일 인스턴스로 생성되며, 이후 모든 요청에서 재사용된다 - 초기화: 서블릿 객체가 생성된 후, 초기화 메서드(init)가 호출되어 서블릿이 요청을 처리할 준비를 한다
- 서비스: 클라이언트 요청이 들어오면, 서블릿 컨테이너는 service 메서드를 호출하여 요청을 처리한다
이 메서드는 클라이언트 요청에 따라 doGet, doPost 등 적절한 메서드를 호출하여 요청을 처리한다 - 종료: 애플리케이션이 종료되거나, 서블릿이 더 이상 필요하지 않으면, 서블릿 컨테이너는 destroy 메서드를 호출하여 서블릿을 종료한다
서블릿은 리소스를 해제하고, 정리 작업을 수행한다
서블릿 컨테이너의 특징
- 싱글톤 관리:
- 고객의 요청이 올 때 마다 계속 객체를 생성하는 것은 비효율
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
- 공유 변수 사용 주의
- 서블릿 컨테이너 종료시 함께 종료
- JSP 지원: 서블릿 컨테이너는 JSP(JavaServer Pages)도 서블릿으로 변환하여 처리한다
- 멀티 쓰레드 지원: 동시 요청을 위한 멀티 쓰레드 처리 지원
6. 멀티 쓰레드와 쓰레드 풀
웹 애플리케이션 서버는 여러 사용자의 요청을 동시에 처리하기 위해 멀티 쓰레드를 사용한다
이는 요청마다 쓰레드를 생성하여 처리하는 방식으로, 자원의 효율적인 사용을 위해 쓰레드 풀(Thread Pool)을 활용한다 쓰레드 풀은 미리 생성된 쓰레드를 재사용하여 쓰레드 생성과 관리 비용을 절감하고, 서버의 성능을 최적화한다
쓰레드의 역할과 중요성
쓰레드는 프로그램 내에서 독립적으로 실행되는 작업 단위이다
- 동시성: 여러 클라이언트 요청을 동시에 처리할 수 있어, 서버의 응답 시간을 줄이고 효율성을 높인다
- 리소스 최적화: 쓰레드를 사용하여 시스템의 CPU와 메모리를 효율적으로 활용할 수 있다
서블릿 컨테이너의 쓰레드 관리
서블릿 컨테이너는 쓰레드 풀(Thread Pool)을 사용하여 쓰레드를 관리합니다. 쓰레드 풀은 사전에 일정 수의 쓰레드를 생성해두고, 요청이 들어오면 이 쓰레드를 재사용하여 처리합니다. 이는 새로운 쓰레드를 생성하고 종료하는 오버헤드를 줄이고, 성능을 최적화하는 데 도움을 줍니다.
쓰레드 풀의 특징
- 미리 생성된 쓰레드: 쓰레드 풀은 사전에 설정된 수의 쓰레드를 생성하여 대기하고, 요청이 들어오면 즉시 사용할 수 있습니다.
- 최대 쓰레드 수: 쓰레드 풀은 최대 쓰레드 수를 관리하여, 시스템 자원이 고갈되지 않도록 합니다. 예를 들어, Tomcat에서는 기본적으로 최대 200개의 쓰레드를 설정할 수 있습니다.
- 쓰레드 재사용: 요청 처리가 끝나면, 사용된 쓰레드는 다시 풀에 반환되어 다음 요청을 처리할 수 있습니다.
실무에서의 쓰레드 관리
효율적인 쓰레드 관리는 서버의 성능과 안정성을 유지하는 데 매우 중요합니다. 다음은 쓰레드 관리와 관련된 몇 가지 실무 팁입니다:
- 최대 쓰레드 수 설정: 너무 낮은 최대 쓰레드 수는 서버의 동시 처리 능력을 제한하고, 너무 높은 값은 메모리와 CPU 리소스를 과도하게 사용하게 할 수 있습니다.
- 리소스 모니터링: 서버의 상태를 정기적으로 모니터링하여, 쓰레드 수를 조정하고, 최적의 성능을 유지할 수 있도록 합니다.
- 성능 테스트: 실제 운영 환경과 유사한 성능 테스트를 통해 쓰레드 풀의 설정을 조정하고, 서버의 처리 능력을 최적화합니다.
핵심
- 멀티 쓰레드에 대한 부분은 WAS가 처리
- 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다
- 개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발한다
- 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링빈)는 주의해서 사용한다
7. 서버사이드 렌더링, 클라이언트 사이드 렌더링
SSR - 서버 사이드 렌더링
• HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달
• 주로 정적인 화면에 사용, 복잡하지 않을 때 사
• 관련기술: JSP, 타임리프 -> 백엔드 개발자(필수!)
CSR - 클라이언트 사이드 렌더링
• HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성해서 적용
• 주로 동적인 화면에 사용, 웹 환경을 마치 앱 처럼 필요한 부분부분 변경할 수 있음
• 예) 구글 지도, Gmail, 구글 캘린더
• 관련기술: React, Vue.js -> 웹 프론트엔드 개발자
참고
• React, Vue.js를 CSR + SSR 동시에 지원하는 웹 프레임워크도 있음
• SSR을 사용하더라도, 자바스크립트를 사용해서 화면 일부를 동적으로 변경 가능
WebFlux(웹 플럭스)
스프링 WebFlux는 비동기 및 넌블로킹 방식으로 웹 애플리케이션을 개발할 수 있도록 해줍니다. 이는 특히 많은 요청을 효율적으로 처리해야 하는 경우 유용합니다. WebFlux는 함수형 스타일을 사용하여 동시처리 코드를 효율적으로 작성할 수 있습니다.
특징
- 비동기 넌 블러킹 처리
- 최소 쓰레드로 최대 성능 - 쓰레드 컨텍스트 스위칭 비용 효율화
- 함수형 스타일로 개발 - 동시처리 코드 효율화
- 서블릿 기술 사용 X
단점
- 웹 플럭스는 기술적 난이도가 매우 높다
- 아직은 RDB지원 부족
- 일반 MVC의 쓰레드 모델도 충분히 빠름
- 실무에서 아직 많이 사용 X
자바 뷰 템플릿
JSP
• 속도 느림, 기능 부족
프리마커(Freemarker), Velocity(벨로시티)
• 속도 문제 해결, 다양한 기능
타임리프(Thymeleaf)
• 내추럴 템플릿: HTML의 모양을 유지하면서 뷰 템플릿 적용 가능
• 스프링 MVC와 강력한 기능 통합
• 최선의 선택, 단 성능은 프리마커, 벨로시티가 더 빠름
'Frameworks > Spring(개인)' 카테고리의 다른 글
[SpringBoot] ResponseBodyAdvice로 API 응답 통합시키기 (0) | 2025.02.19 |
---|---|
[Spring 개인] Spring_Servlet / HTTP Request (0) | 2024.06.10 |
[Spring 개인] 스프링 컨테이너 / 스프링 빈 조회 (0) | 2024.06.07 |
[Spring 개인] Spring Security JWT (Access/Refresh Token) (1) | 2024.05.30 |
[Spring 개인] Spring Security OAuth2 + JWT (0) | 2024.05.29 |