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