@Component

코딩냥이·2024년 9월 10일

Annotation

목록 보기
7/34

@Component

@Component는 스프링 프레임워크에서 가장 기본적인 어노테이션 중 하나로, 클래스를 스프링의 관리 대상 빈(Bean)으로 지정하는 역할을 합니다.

기능

  • 클래스를 스프링 컨테이너가 관리하는 빈으로 등록합니다.
  • 컴포넌트 스캔의 대상이 되어 자동으로 빈으로 등록됩니다.
  • 다른 특화된 어노테이션(@Controller, @Service, @Repository 등)의 기본이 됩니다.

사용 방법

@Component
public class EmailService {
    
    public void sendEmail(String to, String subject, String body) {
        // 이메일 전송 로직
        System.out.println("Sending email to " + to);
        System.out.println("Subject: " + subject);
        System.out.println("Body: " + body);
    }
}

사용 예:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(MyApplication.class, args);
        EmailService emailService = context.getBean(EmailService.class);
        emailService.sendEmail("user@example.com", "Hello", "This is a test email");
    }
}

주요 특징

  1. 자동 빈 등록: 컴포넌트 스캔을 통해 자동으로 스프링 컨테이너에 빈으로 등록됩니다.
  2. 의존성 주입: @Autowired나 생성자 주입을 통해 다른 빈을 주입받을 수 있습니다.
  3. 메타 어노테이션: 다른 스테레오타입 어노테이션(@Controller, @Service, @Repository)의 메타 어노테이션으로 사용됩니다.
  4. 범용성: 특정 계층이나 역할에 국한되지 않는 일반적인 스프링 관리 컴포넌트를 나타냅니다.

@Component vs 특화된 어노테이션

@Component는 일반적인 스프링 관리 컴포넌트를 나타내는 반면, 다음의 특화된 어노테이션들은 특정 역할이나 계층을 더 명확히 나타냅니다:

  • @Controller: 웹 요청을 처리하는 프레젠테이션 계층 컴포넌트
  • @Service: 비즈니스 로직을 포함하는 서비스 계층 컴포넌트
  • @Repository: 데이터 접근 계층 컴포넌트

이 특화된 어노테이션들은 내부적으로 @Component를 포함하고 있어 기본적인 기능은 동일하지만, 더 구체적인 의미를 부여합니다.

컴포넌트 스캔

스프링은 @ComponentScan 어노테이션이 있는 클래스의 패키지부터 시작해서 하위 패키지의 모든 클래스를 스캔하여 @Component (및 그 특화된 형태들)가 붙은 클래스를 찾아 빈으로 등록합니다.

@Configuration
@ComponentScan(basePackages = "com.example.myapp")
public class AppConfig {
    // 설정 내용
}

빈 이름 지정

기본적으로 클래스 이름의 카멜 케이스 버전이 빈 이름으로 사용되지만, 직접 이름을 지정할 수도 있습니다:

@Component("myCustomEmailService")
public class EmailService {
    // 클래스 내용
}

의존성 주입

@Component로 등록된 빈은 다른 빈에 주입될 수 있습니다:

@Component
public class NotificationService {

    private final EmailService emailService;

    @Autowired
    public NotificationService(EmailService emailService) {
        this.emailService = emailService;
    }

    public void sendNotification(String user, String message) {
        emailService.sendEmail(user, "Notification", message);
    }
}

생명주기 관리

@Component 클래스에서도 빈의 생명주기 콜백 메서드를 정의할 수 있습니다:

@Component
public class DatabaseConnector {

    @PostConstruct
    public void init() {
        System.out.println("DatabaseConnector is initialized");
    }

    @PreDestroy
    public void cleanup() {
        System.out.println("DatabaseConnector is being destroyed");
    }
}

조건부 빈 등록

@Conditional 어노테이션과 함께 사용하여 조건부로 빈을 등록할 수 있습니다:

@Component
@Conditional(LinuxCondition.class)
public class LinuxService {
    // Linux 환경에서만 등록될 서비스
}

테스트

@Component로 등록된 빈은 스프링의 테스트 지원을 통해 쉽게 테스트할 수 있습니다:

@SpringBootTest
class EmailServiceTest {

    @Autowired
    private EmailService emailService;

    @Test
    void sendEmail_ShouldSendEmailSuccessfully() {
        // 테스트 로직
    }
}

베스트 프랙티스

  1. 적절한 사용: 특정 계층이나 역할에 해당하지 않는 일반적인 컴포넌트에 사용합니다.
  2. 명확한 책임: 각 컴포넌트는 단일 책임 원칙을 따라 명확한 역할을 가져야 합니다.
  3. 의존성 주입 활용: 생성자 주입을 통해 필요한 의존성을 주입받아 사용합니다.
  4. 테스트 용이성: 컴포넌트를 설계할 때 단위 테스트가 쉽도록 고려합니다.
  5. 적절한 패키지 구조: 컴포넌트 스캔이 효율적으로 작동할 수 있도록 패키지 구조를 잘 설계합니다.

결론

@Component 어노테이션은 스프링 프레임워크에서 빈을 정의하는 가장 기본적인 방법입니다. 이를 통해 POJO(Plain Old Java Object)를 스프링 관리 컴포넌트로 쉽게 전환할 수 있으며, 의존성 주입, 생명주기 관리 등 스프링의 다양한 기능을 활용할 수 있게 됩니다. 특화된 어노테이션들의 기반이 되는 @Component는 스프링의 핵심 개념 중 하나로, 스프링 기반 애플리케이션 개발에 있어 중요한 역할을 합니다.

profile
HelloMeow~!

0개의 댓글