Back-End

[Spring] 어노테이션 세부사항 정리

Minch13r 2025. 4. 24. 11:45

@Component 🏷️

@Component는 클래스 레벨에 사용하는 어노테이션

주요 특징 ✨

  • 자동 스캔: Spring이 컴포넌트 스캔을 통해 자동으로 빈으로 등록
  • 클래스 단위: 클래스 자체를 Spring 컨테이너에 등록
  • 타입 기반: 해당 클래스 타입의 빈을 생성
  • 하위 어노테이션: @Controller, @Service, @Repository는 모두 @Component의 특수한 형태
@Component
public class UserService {
    // 클래스 내용
}

작동 방식 ⚙️

  1. <context:component-scan> 설정이나 @ComponentScan 어노테이션을 통해 스캔 범위 지정
  2. Spring이 해당 범위 내의 @Component 클래스들을 찾아 자동으로 빈 등록
  3. 기본적으로 클래스명의 첫 글자를 소문자로 바꾼 이름을 빈 이름으로 사용 (userService)

@Bean 🌱

@Bean은 메소드 레벨에 사용하는 어노테이션

주요 특징 ✨

  • 수동 등록: 개발자가 직접 빈 생성 로직을 작성합니다.
  • 메소드 단위: 메소드가 반환하는 객체를 Spring 컨테이너에 등록합니다.
  • 구성 기반: @Configuration 클래스 내에서 주로 사용됩니다.
  • 세밀한 제어: 객체 생성과 설정을 세밀하게 제어할 수 있습니다.
@Configuration
public class AppConfig {
    
    @Bean
    public UserService userService() {
        return new UserService(userRepository());
    }
    
    @Bean
    public UserRepository userRepository() {
        return new JpaUserRepository();
    }
}

작동 방식 ⚙️

  1. @Configuration 클래스가 로드될 때 @Bean 메소드들이 실행됨
  2. 메소드가 반환하는 객체가 Spring 컨테이너에 등록됨
  3. 기본적으로 메소드명이 빈 이름이 됨 (userService)

주요 차이점 🔄

특성 @Component @Bean
적용 대상 클래스 메소드
등록 방식 자동(컴포넌트 스캔) 수동(명시적 선언)
제어 수준 제한적 세밀함
주요 용도 직접 작성한 클래스 서드파티 라이브러리 클ㄹ래스
의존성 주입 자동 (@Autowired) 명시적 (메소드 내에서)

언제 무엇을 사용? 🤔

@Component 사용 상황 👍

  • 직접 개발한 클래스를 빈으로 등록할 때
  • 간단하게 빈을 등록하고 싶을 때
  • 표준 스프링 스테레오타입을 사용하고 싶을 때 (@Service, @Repository 등)

@Bean 사용 상황 👍

  • 서드파티 라이브러리 클래스를 빈으로 등록할 때 (직접 수정 불가)
  • 조건부 빈 생성이 필요할 때 (if-else 로직)
  • 빈 생성 과정에서 복잡한 로직이 필요할 때
  • 동일한 타입의 여러 빈을 다른 설정으로 등록할 때

@Configuration 🔧

@Configuration은 스프링의 설정 클래스를 지정하는 어노테이션

주요 특징 ✨

  • 빈 설정 전용 클래스: 스프링 IoC 컨테이너에게 "이 클래스는 빈 설정 정보를 포함하고 있어요"라고 알려줍니다.
  • @Bean 메소드의 컨테이너: 주로 @Bean 어노테이션이 붙은 메소드들을 포함합니다.
  • XML 설정의 대체재: 기존 XML 기반 설정을 자바 코드로 대체합니다.
  • CGLIB 프록시: 스프링은 @Configuration 클래스를 CGLIB로 프록시화하여 특별하게 처리합니다.
@Configuration
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:testdb");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        return dataSource;
    }
    
    @Bean
    public JdbcTemplate jdbcTemplate() {
        // 같은 클래스 내의 다른 @Bean 메소드 호출 - 싱글톤 보장!
        return new JdbcTemplate(dataSource());
    }
}

작동 방식 ⚙️

  1. 스프링이 @Configuration 클래스를 발견하면 CGLIB를 사용해 해당 클래스의 프록시를 생성
  2. 이 프록시는 @Bean 메소드가 여러 번 호출되더라도 항상 같은 인스턴스를 반환하도록 보장
  3. 이를 통해 스프링 빈의 싱글톤 특성을 유지

@Configuration vs @Component 🤔

@Configuration @Component
주로 빈 설정 목적 일반 스프링 빈 등록 목적
CGLIB 프록시 생성 일반 클래스로 등록
@Bean 메소드 싱글톤 보장 @Bean 사용 가능하나 싱글톤 보장 안됨
설정 정보 집중화 비즈니스 로직 구현

'Back-End' 카테고리의 다른 글

[DDD] 도메인 주도 설계 애그리거트  (0) 2025.05.22
[Spring] Mybatis  (1) 2025.05.08
[Spring] AOP  (1) 2025.04.23
[Spring] 빈 생명주기  (1) 2025.04.22
[Spring] 내용 정리  (1) 2025.04.21