티스토리 뷰
웹 서버(Web Server)와 WAS(Web Application Server)의 차이를 설명하고, Spring Boot의 내장 톰캣이 이 둘 중 어디에 해당하는지 설명해주세요.
웹 서버(Web Server)
사용자가 브라우저에서 주소를 입력하면 미리 만들어진 파일을 그대로 꺼내서 보내주는 서버
주로 정적인 파일을 전달하는 역할
- HTML 파일
- CSS 파일
- 이미지, 동영상 같은 정적 리소스
대표적인 웹 서버
- Apache
- Nginx
WAS(Web Application Server)
사용자 요청에 따라 로직을 실행하고 계산하고 데이터베이스와 통신한 뒤 결과를 만들어서 응답
주로 동적인 처리를 담당하는 역할
- 로그인 처리
- 회원가입
- 게시글 목록 조회
대표적인 WAS
- Tomcat
- JBoss
Spring Boot의 내장 톰캣은 'WAS' 에 해당
Spring Boot를 실행하면 서버 설치 없이 바로 웹 서비스가 실행된다.
Spring Boot 안에 톰캣(Tomcat)이 포함되어 있기 때문
톰캣은 자바 코드를 실행하고, 컨트롤러를 호출하고, DB와 통신하며, 동적인 응답을 만들어낸다.
요약
웹 서버는 정적인 파일을 전달하고,
WAS는 로직을 실행해 동적인 결과를 만들어낸다.
Spring Boot의 내장 톰캣은 WAS이다.
Spring Boot에서 사용되는 다양한 Bean 등록 방법들에 대해 설명하고, 각각의 장단점을 비교하세요.
Bean이란?
Spring이 대신 만들어서 관리해주는 객체 입니다.
개발자가 직접 new로 생성하지 않아도 Spring이 대신 생성하고 보관하고 관리해주는 객체
애플리케이션 전반에서 공통으로 사용하는 핵심 구성 요소
Bean 등록 방법
Spring Boot에서는 주로 어노테이션 방식으로 Bean을 등록한다.
1. @Component 계열 (자동 스캔 방식)
클래스 위에 어노테이션을 붙여서 Bean으로 등록
Spring이 애플리케이션을 시작할 때 해당 클래스를 찾아 자동으로 Bean으로 등록한다.
//이 클래스는 Spring이 관리하는 Bean으로 등록된다
//애플리케이션 시작 시 Spring이 자동으로 생성해준다
@Component
public class UserService {
// 비즈니스 로직을 처리하는 메소드
public void signup() {
System.out.println("회원 가입 처리");
}
}
//비즈니스 계층이라는 의미를 명확히 하기 위한 어노테이션
@Component
public class UserService {
}
언제 사용하는가?
직접 만든 서비스, 레포지토리, 컨트롤러처럼 Spring 애플리케이션의 기본 구성 요소를 등록할 때 사용
설정이 단순하고 자동으로 관리되기 때문에, 대부분의 일반적인 비즈니스 로직 클래스에 가장 많이 사용
자주 사용하는 @Component 계열
- @Component : 일반적인 컴포넌트
- @Service : 서비스 로직
- @Repository : 데이터베이스 접근
- @Controller / @RestController : 웹 요청 처리
장점
코드가 매우 간단해서 초보자도 이해하기 쉽다
계층 구조(Service / Repository 등)가 한눈에 보인다
대부분의 Spring Boot 프로젝트에서 기본으로 사용
단점
Spring이 관리하는 클래스여야만 사용 가능
외부 라이브러리 클래스에는 직접 붙일 수 없음
Bean 생성 과정을 세밀하게 제어하기 어려움
2. @Configuration + @Bean (수동 등록 방식)
Bean을 직접 생성해서 등록하는 방법
설정 클래스에 @Configuration을 붙이고 메서드에 @Bean을 붙여서 Bean을 등록
//설정 정보를 담는 클래스
@Configuration
public class AppConfig {
//이 메소드가 반환하는 객체를 Bean으로 등록한다
@Bean
public UserService userService() {
//여기서 객체를 생성
return new UserService();
}
}
언제 사용하는가?
객체 생성 과정에 조건이나 설정 값이 필요하거나, 외부 라이브러리처럼 직접 수정할 수 없는 클래스를 Bean으로 등록할 때 사용
Bean 생성 시점과 방식을 개발자가 명확하게 제어해야 할 경우에 적합
장점
Bean 생성 과정을 완전히 제어 가능
외부 라이브러리도 Bean으로 등록 가능
설정이 한 곳에 모여 있어 관리가 쉬움
단점
코드가 상대적으로 길어짐
설정 클래스가 많아지면 복잡해질 수 있음
초보자에게는 약간 어려움
3. @Conditional, @Profile (조건부 등록 방식)
특정 조건에서만 Bean을 등록
// dev(개발) 환경에서만 이 Bean을 등록한다
// 운영(prod) 환경에서는 이 클래스가 아예 Bean으로 생성되지 않는다
@Profile("dev")
@Component
public class DevDataSource {
}
//properties
spring.profiles.active=dev
spring.profiles.active=dev 일 때만 Bean 등록
개발 / 운영 환경 분리할 때 자주 사용
//MyCondition 조건이 true일 때만 Bean을 등록한다
//조건이 false면 이 Bean은 생성되지 않는다
@Conditional(MyCondition.class)
@Bean
public UserService userService() {
return new UserService();
}
특정 조건이 만족될 때만 Bean 등록
Spring 내부 자동 설정에서도 많이 사용됨
언제 사용하는가?
개발, 운영 등 환경에 따라 서로 다른 Bean을 사용해야 할 때 적용
불필요한 Bean 로딩을 막고, 개발용 설정이 운영 서버에 적용되는 실수를 방지하기 위해 사용
장점
환경별 설정 분리 가능
불필요한 Bean 생성을 막을 수 있음
단점
구조를 이해하지 못하면 가독성이 떨어질 수 있음
디버깅이 어려울 수 있음
4. XML 설정 (전통적 방식)
과거 Spring 초기에는 XML 파일을 통해 Bean을 직접 등록하는 방식이 주로 사용되었다.
언제 사용하는가?
레거시 프로젝트에서 주로 사용
신규 프로젝트에서는 거의 사용하지 않음
요약
Spring의 Bean은
객체 생성을 개발자가 직접 관리하지 않고,
Spring에게 맡기기 위한 핵심 개념이다.
대부분은 @Component 계열을 사용하고,
설정이 필요한 경우 @Bean 방식을 사용하면 된다.
