스프링에서의 어노테이션과 의존성 주입
@Service
- @Service 어노테이션은 스프링에서 서비스 레이어의 클래스를 정의할 때 사용합니다
- @Service 위치는 클래스 선언 위에 위치해야 합니다
- 의존성 주입: 이 어노테이션이 붙은 클래스는 스프링의 의존성 주입(Dependency Injection) 컨테이너에 빈(bean)으로 등록됩니다
- 따라서 다른 컴포넌트에서 이 서비스를 주입받아 사용이 가능합니다
- @Service는 @Component의 특수한 형태입니다. 그래서 @Component의 기능을 상속받으며, 의미상 서비스 역할을 명확하게 나타내기 위해 사용됩니다
- 서비스 레이어에서 비즈니스 로직을 담당하는 클래스에 주로 사용되고있습니다
@Service
public class UserService {
// 비즈니스 로직
}
@Component
- @Component 어노테이션은 일반적인 컴포넌트를 스프링에게 알려주는 역할을 합니다.
- @Component가 붙은 클래스는 스프링의 빈으로 등록되며, 다른 컴포넌트에서 의존성 주입을 통해 사용될 수 있습니다.
- 싱글톤: 스프링은 기본적으로 @Component나 @Service로 등록된 빈을 싱글톤으로 생성하여 관리합니다. - 즉, 애플리케이션 내에서 해당 클래스의 인스턴스는 하나만 존재하게 됩니다.
@Component
public class MyComponent {
// 컴포넌트 로직
}
@Autowired
- @Autowired 어노테이션은 스프링의 의존성 주입을 통해 다른 빈(객체)을 자동으로 주입받기 위해 사용합니다.
- 예를 들어, 특정 서비스 클래스에서 다른 인터셉터나 서비스 클래스를 주입받고자 할 때 사용합니다.
- 작동 방식은 스프링은 해당 타입의 빈을 찾아 자동으로 주입해 줍니다.
@Service
public class ProductService {
private final UserRepository userRepository;
@Autowired
public ProductService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 로직
}
💡 정리
- @Service와 @Component는 스프링에서 빈을 정의하고 의존성 주입을 위해 사용됩니다.
- 두 어노테이션 모두 스프링 컨테이너에서 빈으로 관리되며, @Service는 서비스 레이어를 명시적으로 정의하는 데 사용됩니다.
- @Autowired는 다른 빈을 자동으로 주입받기 위해 사용되며, 주입받는 빈은 클래스의 필드 또는 생성자에 선언할 수 있습니다.
- 생성자 주입이 일반적으로 더 권장됩니다.