@Component 어노테이션은 스프링 프레임워크에서 클래스를 자동으로 빈으로 등록하기 위해 클래스에 붙이는 어노테이션이다.
이는 스프링 컨테이너가 어플리케이션 시작 시 해당 클래스의 인스턴스를 생성하고, 이를 스프링 어플리케이션 컨텍스트에서 관리하는 빈으로 등록함을 의미한다.
@Component
public class MyComponent{
//필드, 메서드, 생성자 등
}
@Component 어노테이션은 클래스 상단에 선언된다.
이는 해당 클래스가 스프링 빈으로 관리될 것을 의미한다.
스프링은 @ComponentScan 어노테이션이 적용된 설정에 따라 classpath를 스캔하고 @Component가 붙은 클래스를 자동으로 빈으로 등록한다.
@Component("") 형태로 빈 이름을 지정할 수 있다.
만약 명시적으로 지정하지 않으면 클래스명에서 앞 글자를 소문자로 변환하여 사용한다.
@Component 외에도 @Service, @Controller, @Repository가 존재한다.
이는 @Component 어노테이션의 특화된 형태이며 각각 서비스, 프레젠테이션, 데이터 접근 계층의 클래스에서 사용된다.
(기본적으로는 @Component와 동일한 형태로 작동)
@Component 어노테이션이 적용된 클래스는 @Autowired 어노테이션을 사용하여 다른 빈을 주입받을 수 있다.
이를 통해 생성자, setter, 필드 주입 등을 통한 의존성 주입이 가능하다.
@ResponseBody와 함께 사용한다.
둘을 합쳐서 @RestController로 사용 가능하다.
컨트롤러는 view를 반환하기 위하여 사용된다.
사용자에게 UI, 클라이언트에게 Response를 보내는 역할을 하는 모든 클래스가 포함된다.
클라이언트로부터 request를 받고, response하는 모든 API를 담는다.
-> 클라이언트의 요구사항을 이해하고 클라이언트의 요청을 서비스에게 전달하는 역할을 한다.
비즈니스 로직을 수행(정보를 알맞게 가공)하고 DAO를 이용하여 데이터에 접근한다.
-> 데이터를 가공하는 등 비즈니스 로직을 수행하고 이를 다시 컨트롤러에게 반환하는 역할을 한다.
DB, 메세징 시스템 등 외부와의 통신을 담당한다.
-> 서비스가 비즈니스 로직을 수행할 때 필요한 데이터를 CRUD하여 실제 데이터베이스에 데이터를 CRUD하는 역할을 한다.

<context:component-scan base-package="com.youjin.ch1">
이런식으로 패키지를 지정해주면 패키지 아래 서브 패키지까지 뒤져서 @Component가 붙어있는 클래스를 찾는다.
클래스를 찾아 빈으로 등록한다.
package com.youjin.ch1
import org.springframework.stereotype.*;
@Component
public class MyBean{
public void hello(){
System.out.println("hello");
}
}
이런식으로 클래스에 @Component 어노테이션을 붙여주면, 설정한 패키지 내에있는 클래스를 자동으로 빈으로 등록해준다.