스프링 부트를 배우면서 톰캣이 내장되어 있다라는 것을 배우는데
정작 Web Server랑 뭐가 어떻게 다른지 헷갈릴 때가 있다.
이 기회에 정리해봤다.
Web Server는 정적인 자원(HTML, CSS, 이미지 파일 등)을 클라이언트에게 전달하는 역할
어떤 로직도 처리하지 않고 있는 파일 그대로 브라우저에 내려주는 것에 초점이 맞춰져 있다.
대표적인 예로는 Apache HTTP Server, Nginx 등이 있다.
특징으로는
WAS는 Web Application Server, 즉 동적인 로직을 처리하는 서버
사용자의 요청을 받아 내부에서 비즈니스 로직을 처리하고,
DB에 접근하거나 결과 데이터를 가공해 HTML 형태로 반환하는 등
말 그대로 어플리케이션을 동작시킨다.
Java 기준에서는 Servlet Container가 있는 서버를 의미한다.
Tomcat, Jetty, JBoss 등이 WAS로 분류된다.
Spring Boot는 기본적으로 Tomcat을 내장한 구조
이 내장 톰캣은 단순한 Web Server가 아니라 Servlet Container로서의 역할을 수행
Spring Boot의 내장 톰캣은 단순히 정적인 파일만 서빙하는 게 아니라,
Controller의 로직을 처리하고 응답을 만들어주는 역할을 하기 때문에 WAS에 해당한다.
| 항목 | Web Server | WAS (Web Application Server) |
|---|---|---|
| 처리 대상 | 정적 파일 | 동적 요청 |
| 사용 목적 | 정적 리소스 전달 | 애플리케이션 실행 |
| 대표 기술 | Apache, Nginx | Tomcat, Jetty, JBoss |
| 서블릿 지원 여부 | ❌ | ⭕ |
스프링에서는 객체를 직접 생성해서 사용하는 게 아니라
스프링 컨테이너에 Bean으로 등록하고, 필요한 곳에 주입해서 사용하는 구조다.
이 Bean을 등록하는 방법은 대표적으로 세 가지가 있다.
가장 많이 쓰는 방식
Spring은 클래스에 어노테이션이 붙어 있으면 자동으로 감지해서 Bean으로 등록한다.
@Component
public class MyComponent {}
@Service
public class MyService {}
@Repository
public class MyRepository {}
@Controller
public class MyController {}
@SpringBootApplication에는 @ComponentScan이 포함되어 있어서,
해당 클래스 기준 하위 패키지를 자동으로 스캔한다.
직접 Bean을 생성하고 등록하고 싶을 때 사용한다.
의존성 주입도 수동으로 처리할 수 있어 정밀한 제어가 가능하다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
Spring 초창기에는 XML 파일을 통해 Bean을 등록했지만,
Spring Boot 이후로는 거의 사용하지 않는다.
<bean id="myService" class="com.example.MyServiceImpl"/>
| 등록 방식 | 장점 | 단점 | 사용 시기 |
|---|---|---|---|
| 어노테이션 기반 등록 | 코드 간결, 구조 파악 쉬움 | 세밀한 제어 어려움 | 일반적인 경우 |
| 자바 설정 클래스 등록 | 명확한 제어 가능, 외부 객체 등록 가능 | 설정 코드가 많아짐 | 복잡한 설정이 필요한 경우 |
| XML 설정 | 설정/코드 분리 | 가독성 떨어짐, Spring Boot에서 비권장 | 레거시 프로젝트 유지보수 시 사용 |