WEB

웹서버(Web Server)는 클라이언트가 브라우저 주소창에 URL을 입력하여 페이지를 요청할 때, HTTP 요청을 받아들여 HTML 문서와 같은 정적인 콘텐츠를 사용자에게 전달하는 역할을 합니다.

웹서버의 주요 임무는 단순히 저장된 웹 리소스(이미지, HTML 등)를 클라이언트로 전달하고, 동적인 요청이 있을 경우 해당 요청을 WAS로 전달하는 것입니다.

대표적인 웹서버는 Apache, Nginx, IIS(Windows 전용 웹서버) 등이 있습니다.


WAS

WAS(Web Application Server)는 이름에서 보이는 바와 같이 Web Server에서 Application이 추가된 형태입니다.

웹서버 + 웹 컨테이너 형태라고 볼 수 있습니다.

웹 컨테이너(Web Container)란 서버 환경에서 웹 애플리케이션을 실행하기 위한 실행 환경을 제공하는 소프트웨어입니다. 웹 컨테이너는 서블릿과 JSP와 같은 서버 사이드 기술을 실행하고 관리하는 역할을 합니다.

WAS는 웹서버와 유사하게 HTTP를 기반으로 동작하지만, 주로 동적인 서버 콘텐츠를 처리하는 역할을 합니다.

웹 애플리케이션과 서버 환경을 만들어 동작시키는 소프트웨어 프레임워크로, 정적인 콘텐츠뿐만 아니라 비즈니스 로직을 처리하고 데이터베이스 서버와 함께 동작하며, 웹서버와 달리 동적인 데이터 처리에 중점을 둡니다.

대표적인 WAS에는 Tomcat, JBoss, Jeus, WebSphere 등이 있습니다.

위의 내용을 요약하자면, 웹서버와 WAS의 차이점은 주로 정적인 데이터와 동적인 데이터의 처리에 있습니다. 웹서버는 주로 정적인 데이터를 처리하며, WAS는 동적인 데이터를 처리합니다.

❓ WAS에서 동적인 처리와 정적인 처리를 모두 처리하지 않고 웹서버와 WAS를 나누는 이유가 무엇일까?


WEB과 WAS를 구분하는 이유

1. 서버 부하 방지

WAS가 혼자서 모든 요청을 처리할 수 있다고는 하지만 그만큼 WAS가 감당하는 부담이 커지게 된다.

그렇기 때문에 기능을 분리해서 각 서버가 감당하는 부하를 줄일 수 있도록 웹서버와 WAS를 분리합니다.

2. 보안 강화

WAS에는 실제 Web Application이 올라가 있기 때문에 외부와 직접 연결이 되어 있다면 중요한 설정 파일이나 리소스들이 외부로 노출될 위험이 있습니다.

이를 막기 위해서 웹서버를 WAS 앞단에 배치해서 리소스를 안전하게 보호할 수 있습니다.

3. 웹서버에 여러 대의 WAS를 연결

규모가 큰 서비스에서는 하나의 웹서버에 하나의 WAS가 연결된 구조만으로는 많은 요청을 처리하는 데에 어려움이 생기기 때문에 수많은 요청을 한 군데가 아닌 여러 군데에서 처리를 할 수 있도록 동일한 Web Application을 여러 개 띄웁니다.

이때 여러 대의 WAS에 각각 요청을 들어오도록 하지 않고 앞에 웹서버를 두고 각 WAS들을 웹서버에 연결해서 웹서버로 들어오는 수많은 요청을 각 WAS들에 적절하게 분배해 주도록 한다.

이렇게 배치하여 로드밸런싱을 해줌으로써 하나의 WAS가 처리하는 요청의 양이 줄어들어 안정적인 서비스 운영이 가능해집니다.


Spring Boot의 내장 톰캣

Spring Boot는 내장 톰캣을 사용하여 웹 애플리케이션을 실행할 수 있는 편리한 기능을 제공한다는 특징을 갖고 있습니다.

내장 톰캣을 사용함으로써 외부 웹 서버를 설정하고 관리하는 번거로움을 줄일 수 있습니다. 이를 통해 웹 애플리케이션을 보다 간편하게 배포하고 확장할 수 있습니다.

Spring Boot가 어떻게 톰캣 서버를 내장하고 있는지 알아보겠습니다.

의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-web'

내장 톰캣을 사용하기 위해서 다음과 같은 의존성을 추가합니다.

빌드 후, 라이브러리 의존관계를 확인해 보면 내장 톰캣(tomcat-embed-core)이 포함된 것을 확인할 수 있습니다.

TomcatServletWebServerFactory.java

스프링 부트 내부에서 내장 톰캣을 생성하는 코드를 확인할 수 있습니다.

profile
정신 🍒 !

0개의 댓글

Powered by GraphCDN, the GraphQL CDN