[Weekly Paper] Web Server와 WAS의 차이, Bean 등록 방법

Jerry·2025년 8월 5일

Q. 웹 서버(Web Server)와 WAS(Web Application Server)의 차이를 설명하고, Spring Boot의 내장 톰캣이 이 둘 중 어디에 해당하는지 설명해주세요.

A.

- 웹 서버(Web Server)와 WAS(Web Application Server)의 차이

Q. Spring Boot에서 사용되는 다양한 Bean 등록 방법들에 대해 설명하고, 각각의 장단점을 비교하세요.

A.

Bean 등록이란

Bean은 Spring IoC 컨테이너에 의해 관리되는 객체 인스턴스입니다.

// 예시: IoC 컨테이너에 등록된 객체
@Service
public class UserService {
    ...
}

Spring은 이 Bean들을 필요할 때 주입(@Autowired, @Inject, @RequiredArgsConstructor)해서 사용합니다.

1. 어노테이션 기반 자동 등록 (Component Scanning)

대표 어노테이션

어노테이션역할
@Component기본적인 Bean 등록용
@Service서비스 계층에 의미 부여 (@Component의 특수화)
@RepositoryDAO 계층 의미 + 예외 변환 AOP 포함
@ControllerMVC 컨트롤러 (웹 전용)
@RestControllerJSON 반환하는 컨트롤러

예시

@Component
public class MyComponent { ... }

@Service
public class UserService { ... }
  • Spring Boot는 기본적으로 @SpringBootApplication이 선언된 클래스 기준으로 하위 패키지를 자동 스캔하여 Bean으로 등록합니다.

장점

  • 선언만으로 간단하게 등록 가능
  • 계층 구분(Controller, Service 등)으로 가독성 증가
  • DI 및 AOP와 자연스럽게 연동됨

단점

  • 자동 스캔 범위 조절이 어려움 (실수로 누락되거나 중복될 수 있음)
  • 외부 라이브러리의 Bean 등록에는 적합하지 않음

2. 수동 등록: @Configuration + @Bean

@Configuration
public class AppConfig {
    
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
}

이 방식은 Java 코드 기반 명시적 등록이며, 과거 XML 설정을 대체하는 방식입니다.

장점

  • 등록 로직을 명확하게 제어 가능
  • 외부 라이브러리, 조건부 등록, DI 구성 등 복잡한 구성 가능
  • 테스트에서 Mock 대체가 쉬움

단점

  • 코드량이 다소 늘어남
  • 잘못 사용하면 Bean 간 의존성 순환 문제 유발 가능

3. XML 기반 등록 (Legacy 방식)

<bean id="userService" class="com.example.UserServiceImpl" />

현재는 거의 사용되지 않지만, 레거시 프로젝트나 Spring 초기 버전에서 사용됨.

장점

  • 설정 분리, 명시적 제어
  • XML만으로 빈 구성을 관리할 수 있음

단점

  • 가독성 낮고 IDE 지원 부족
  • 설정 실수나 오타 발견 어려움
  • 유지보수 비용 큼

4. @Import / @ComponentScan 사용

예시 1 – 특정 설정 클래스만 가져오기

@Import(AppConfig.class)
public class MainConfig { }

예시 2 – 커스텀 패키지 스캔

@ComponentScan(basePackages = "com.external.lib")
public class AppConfig { }

장점

  • 구조적으로 모듈 분리 시 유용
  • 외부 설정 조합 가능

단점

  • 구조 복잡도 증가 시 추적 어려움
  • 실수로 스캔 누락될 가능성

5. @ImportResource – XML 설정 일부 가져오기

@ImportResource("classpath:/beans.xml")

XML 설정을 유지하되, 일부만 Spring Boot에 연결할 때 사용

6. @Conditional, @Profile, @ConditionalOnXxx

Spring Boot의 강력한 조건부 Bean 등록 기능

@Bean
@Profile("dev")
public DataSource devDataSource() { ... }

@Bean
@ConditionalOnMissingBean(MyService.class)
public MyService myService() { ... }

장점

  • 환경별 빈 분기 처리 가능
  • 자동 설정(spring-boot-autoconfigure)과 궁합 좋음

단점

  • 조건식 복잡하면 디버깅 어려움
  • 등록된 Bean 추적이 힘들 수 있음

장단점 종합 비교

방식장점단점추천 상황
@Component, @Service간단, 직관적스캔 누락, 숨겨진 등록일반적인 서비스/DAO/컨트롤러
@Bean + @Configuration명시적, 테스트 친화코드 많음외부 라이브러리, 수동 설정
XML독립 설정 파일유지보수 어려움레거시 프로젝트
@Import, @ComponentScan모듈화 용이추적 어려움외부 설정 합칠 때
@Profile, @Conditional환경 구분, 자동 설정조건 복잡도 ↑멀티 환경 지원, 라이브러리 개발

결론

상황추천 방식
✅ 일반적인 Spring Boot 개발@Component, @Service, @Repository, @Controller
✅ 복잡한 설정, 외부 클래스 등록@Configuration + @Bean
✅ 환경에 따라 다른 Bean@Profile, @ConditionalOnMissingBean
✅ 레거시 XML 호환@ImportResource
✅ 다수의 설정 클래스 통합@Import, @ComponentScan(basePackages)
profile
Backend engineer

0개의 댓글