클라이언트로부터 HTTP요청을 받아들이고, 값을 반환하하는 어플리케이션을 의미한다.
반환하는 값들로써는
가 존재할 수 있다. 정적컨텐츠를 제공하는 서버는 거의 남아있지않고, 대부분 동적인 콘텐츠를 반환하게 된다. 이런 동적인 콘텐츠는 DB에 질의하는 등의 작업과 같이 client에 반환 하는 작업 등이 합쳐서 서버에 로드가 커질 수 밖에 없다.
따라서 client에게 요청과 응답을 수행하는 부분만 남기고, 동적인 콘텐츠를 WAS로 분리하게 되었다.
전체적인 구조는 다음과 같다.

그렇다면 위의 그림처럼
WAS를 여러개 올려서 로드를 분산 시키는 것인가?
우리는 하나의 어플리케이션 위에서 해당 작업들을 분리하여 실행할 것이다. 이러한 구조를 CGI(Common Gateway Interface)라고 하며, 웹 서버들간의 정보를 주고받는 일종의 규칙이다. 따라서 WAS는 CGI규격에 맞게 설계된 서버이다.
이런 작업들을 분리할 수 있게 만들어 놓은 소프트웨어가 대표적으로 아파치, 톰캣이다.
Java로 구성된 CGI규격을 맞추기 위한 기술을 서블릿이라고 한다.
이런 서블릿을 관리해주는 것이 Servlet Container이다.
동적인 로직을 처리해주는 코드 혹은 class

클라이언트가 요청을 보내면 JVM환경 내에서 요청에 대한 비즈니스 로직 수행 후 결과를 반환하는 기술이 Web Application Server이며 이를 직접 수행하는 객체를 Servlet이라고 한다.
httpRequestMappging, httpResponseMapping 등의 객체로 변환하여 내부에서 처리를 함
서블릿을 관리해주는 것이 서블릿 컨테이너(etc. 톰캣, 아파치 등)

이렇게 서블릿 콘테이너는 각각의 요청마다 쓰레드를 하나씩 생성하여 ServeltRequest를 처리하고, 쓰레드를 닫는다.
WebServlet 어노테이션을 통해 다음과 같이 서블릿에 대한 요청을 분기처리할 수 있다.
@WebServlet(urlPatterns = "/api/products/*", loadOnStartup = 1)
public class AllInOneServlet extends HttpServlet {
public String getName() {
// 로직 작성 ...
}
}
스프링은 Dispatcher Servlet을 활용하여 적절한 @Controller에게 이 작업을 위임한다. (Handler Adapter를 통해)
@RestController
@RequestMapping("/droid")
class DroidController() {
fun getName(): String {
// 로직 작성
}
}
public class DispatcherServlet extends FrameworkServlet {
@Nullable
private boolean detectAllHandlerMappings = true;
// ...
}
디스패쳐 서블릿의 detectAllHandlerMappings값에 따라 init될 때 matchingBeans으로 등록된 컨트롤러들을 가져와서 매핑한다.
// org.springframework.web.servlet의 DispatcherServlet, Spring 6.0.7
private void initHandlerMappings(ApplicationContext context) {
this.handlerMappings = null;
if (this.detectAllHandlerMappings) {
// Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
Map<String, HandlerMapping> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
if (!matchingBeans.isEmpty()) {
this.handlerMappings = new ArrayList<>(matchingBeans.values());
// We keep HandlerMappings in sorted order.
AnnotationAwareOrderComparator.sort(this.handlerMappings);
}
}
}
기존의 웹서버에서 정적인 응답값 밖에 반환을 하지 못했지만, 동적인 페이지를 응답할 필요가 있었고, 이러한 처리를 담당하는 것이 WAS
위에서 이야기 했던 Servlet Container가 WAS
웹 서버: 클라이언트의 요청을 받고, 반환해주는 프로그램 혹은 기기 그 자체
ex) 아파치
WAS: 동적인 로직을 처리해주는 어플리케이션 서버
ex) Tomcat

스프링 MVC에서는 기본적으로 Tomcat을 활용한다.
HttpServletRequest요청을 만듬@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServelt {
@Override void service(HttpServletRequest request, HttpServletResponse respnse) {
//애플리케이션 로직
}
}
http요청을 HttpServletRequest로 파싱하여 만들어 줌
Handler Mapping을 통해 적절한 @Controller어노테이션을 찾아서 매핑Service, Repository를 찾아서 적절하게 처리서블릿콘테이너를 통해 비즈니스 로직을 분리하고 WAS에서 실행되도록 변경하기
WAS를 서블릿 컨테이너라고 함
NginX는 아파치와 같은 웹서버. 이는 아파치의 단점을 보완하기 위해 만들어짐
높은 성능을 가진 경량 웹 서버
10K Problem이라는 웹서버에 10,000개의 클라이언트 접속을 커버할 수 있는 문제를 해결하기 위해 NginX가 등장 -> 동시 접속자 처리 효율 증가서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 ‘프록시’, 그 중계 기능을 하는 것이 프록시 서버
프록시 서버를 사용하면 보안성, 성능, 안정성을 향상 시킬 수 있다.
리버스 프록시란??

웹 서버 앞에 놓여져 있으며, 로드 밸런싱에 활용될 수 있다. + 보안 강화
포워드 프록시??

클라이언트 앞부분에서 서버와의 요청을 관리
정부, 학교, 기업 등과 같은 기관은 해당 기관에 속한 사람들의 제한적인 인터넷 사용을 위해 방화벽을 사용.
스프링 부트(MVC) 또한 서블릿 컨테이너(톰캣 내장)를 사용하여 웹 서버를 만든다.
하지만 추가로 많은 기능과 유용한 도구를 제공한다.
Spring Boot는 자동 구성(Auto Configuration)과 스타터(starter) 디펜던시를 통해 기본적인 설정들을 자동으로 처리내장 서버 지원: Spring Boot는 내장형 웹 서버(Tomcat)를 제공
빠른 개발과 생산성 향상
통합 테스트 지원: Spring Boot는 통합 테스트를 지원하기 위한 다양한 기능들을 제공
개발자 친화적: Spring Boot는 개발자들이 더욱 편리하게 개발할 수 있도록 다양한 개발도구와 지원을 제공 또한 Actuator와 같은 기능들을 통해 애플리케이션의 상태 모니터링과 운영을 쉽게 할 수 있다.
제어 역전 (IoC) / 의존성 주입 (DI): 개발자들은 컴포넌트 간의 의존성을 코드에 직접 작성하지 않고, 스프링 컨테이너가 관리하는 설정 파일에 정의한다. 개발자가 작성한 코드가 프레임워크에 의존함
AOP(Aspect-Oriented Programming) 지원: 스프링은 AOP를 지원하여 애플리케이션의 여러 부분에서 반복되는 로직을 분리하여 모듈화하고 재사용성을 높일 수 있습니다. 특히 로깅, 트랜잭션 관리 등에서 유용하게 사용딤
웹서버 : 클라이언트가 어떤 문서를 요청하면 정적인 문서를 그대로 반환합니다.
WAS(Web Application Server) : 동적인 응답을 위해 서블릿을 통해 동적인 로직을 처리하는 서버를 의미 (ex - Tomcat)
Servlet : 동적인 로직을 처리해주는 코드를 의미합니다.
Servlet Container : 서블릿과 웹서버가 손쉽게 통신할 수 있게 해주며, 소켓을 만들고 listen, accept등을 API로 제공
Dispatcher Servlet : 스프링에서는 모든 요청에 대해 하나의 서블릿을 통해 처리합니다.
NginX : 아파치와 같은 웹서버입니다. 그러나 아파치의 단점을 보완하기 위해 만든 웹서버이다.