[SB 3기] 코드잇 스프린트 위클리페이퍼 4주차
Q. 웹 서버(Web Server)와 WAS(Web Application Server)의 차이를 설명하고, Spring Boot의 내장 톰캣이 이 둘 중 어디에 해당하는지 설명해주세요.
✅ 웹서버란?
웹서버는 하드웨어와 소프트웨어 두 가지 측면에서 정의할 수 있다.
-
소프트웨어 측면:
클라이언트(주로 웹 브라우저)로부터 HTTP 요청을 받아, 그에 대한 응답으로 정적인 콘텐츠(.html, css, .js, 이미지 등)를 반환하는 소프트웨어이다.
ex. Apache HTTP Server, Nginx
-
하드웨어 측면:
이러한 웹 서버 소프트웨어와 웹 사이트의 정적 파일들을 저장하고 제공하는 물리적인 컴퓨터를 의미하기도 한다.
-
특징
- HTML, CSS, JavaScript, 이미지 파일, 폰트 등의 정적 콘텐츠를 직접 제공
- 동적인 콘텐츠 요청시, WAS 또는 백엔드 애플리케이션으로 요청을 전달
-
⚙️ 작동 방식
- 브라우저는 URL을 입력하면, 서버의 IP 주소를 찾는다.
- 브라우저가 HTTP 요청을 웹서버로 보낸다.
- 웹 서버는 요청에 따라 정적 콘텐츠를 찾거나, 동적 요청은 WAS로 전달한다.
- 웹 서버는 HTTP 응답으로 정적 콘텐츠를 브라우저에 반환한다.
- 브라우저가 정보를 화면에 표시한다.

이미지 출처 : MDN - What is a web server?
✅ WAS(Web Application Server)란?
WAS는 Web Application Server의 약자로, 웹 애플리케이션이 실행되는 환경을 제공하는 소프트웨어 또는 미들웨어이다.
클라이언트의 요청에 따라 비지니스 로직을 처리하고, 동적인 콘텐츠를 생성하여 응답하는 역할을 수행한다.
ex. Tomcat
- 특징
- 동적인 컨텐츠 생성 (Servlet, JSP, Spring MVC 등)
- 데이터베이스 연동
- 세션 및 트랜잭션 관리
- 웹서버와 함께 동작하며, 웹서버는 요청을 필터링하고 WAS로 전달
WAS는 JSP, Servlet 구동환경을 제공해주기 때문에 웹 컨테이너(서블릿 컨테이너)라고도 불린다.
- 브라우저는 URL을 입력하면 서버의 IP 주소를 찾는다.
- 브라우저가 HTTP 요청을 웹서버로 보낸다.
- 웹 서버가 해당 요청을 WAS로 전달한다.
- WAS는 애플리케이션 로직을 처리하고 DB나 외부 시스템과 연동하여 요청을 수행한다.
- WAS는 생성된 콘텐츠를 웹 서버에 전달한다.
- 웹 서버는 결과를 HTTP 응답으로 브라우저에 응답한다.
- 브라우저가 정보를 화면에 표시한다.
🆚 웹 서버와 WAS의 차이점
웹서버는 정적인 파일을 클라이언트에게 전달하고,
WAS는 클라이언트 요청에 따라 비즈니스 로직을 실행해 동적인 콘텐츠를 생성한다.
📌 Spring Boot의 내장 톰캣
Spring Boot는 기본적으로 Tomcat을 내장 서버로 사용하며, 이를 통해 별도의 WAS 설치 없이 애플리케이션을 실행할 수 있다.
- 내장 톰캣은 웹서버 + WAS의 역할을 동시에 수행한다.
- Spring Boot에서는 톰캣이 HTTP요청을 직접 수신하고, 요청에 따라 컨트롤러를 통해 동적 컨텐츠를 생성하여 응답한다.
Q. Spring Boot에서 사용되는 다양한 Bean 등록 방법들에 대해 설명하고, 각각의 장단점을 비교하세요.
1. Java Config 기반 등록
@Configuration을 선언한 클래스 내에서 @Bean 어노테이션이 적용된 메서드는, 해당 메서드가 반환하는 객체를 Spring Bean으로 등록한다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
- 장점
- Bean의 이름, 생성 방식, 의존성 등을 세밀하게 제어할 수 있다.
- 외부 라이브러리나 수정 불가능한 클래스처럼 어노테이션을 붙일 수 없는 클래스도 등록 가능하다.
- 단점
- 수동 등록 방식이므로 설정 코드가 길어지고 유지보수성이 떨어진다.
- Bean 이름이 중복될경우, 덮어쓰기되거나 예외가 발생할 수 있다. (
@Qualifier 등을 통해 해결 가능)
2. 컴포넌트 스캔 방식
Spring은 @Component가 적용된 클래스들을 컴포넌트 스캔을 통해 자동으로 Bean으로 등록해준다. (@Service, @Repository, @Controller 등의 어노테이션들도 포함)
Spring Boot에서는 기본적으로 @SpringBootApplication 안에 @ComponentScan이 포함되어 있어, 지정된 패키지 이하를 자동 스캔한다.
@Component
public class MyComponent {
}
- 장점
- 설정 코드 없이 클래스에 어노테이션만 붙이면 되므로 간결하게 Bean 등록이 가능하다.
- 클래스별 역할에 맞는 어노테이션을 부여하여 애플리케이션 구조가 명확해지고 유지보수가 용이하다.
- 단점
- 스캔 범위 밖의 클래스는 자동 등록 되지 않아 누락될 수 있다.
- 복잡한 의존성 설정이나 조건부 등록에는 한계가 있다.
3. XML 기반 등록
XML 설정 파일에서 태그를 이용하여 Bean으로 등록한다.
<beans>
<bean id="myService" class="com.example.MyServiceImpl"/>
</beans>
- 장점
- 설정과 코드를 명확히 분리할 수 있다. (소스 코드를 건드리지 않고, 설정 파일만 수정하여 다른 Bean을 사용할 수 있음)
- 외부 라이브러리나 수정 불가능한 클래스도 Bean으로 등록할 수 있다.
- 단점
- 설정 코드가 길어지면 관리가 복잡하여 가독성과 유지보수성이 떨어진다.
- 오류가 발생해도 컴파일 시점에 알 수 없고 런타임에 발생한다. (XML설정은 문자열 기반이므로, 컴파일 시점에 감지되지 않음)
참고문서📖