Spring에서의 Bean은 Spring IoC 컨테이너에서 관리되는 객체를 나타낸다.
이러한 객체는 Spring 애플리케이션에서 필요한 서비스를 제공하거나 다양한 기능을 수행하는데 사용되며, 다양한 방법으로 Bean을 정의하고 구성할 수 있다.
기존의 Java 프로그래밍에서는 class를 생성하고 new를 입력해서 원하는 객체를 직접 생성한 후에 사용을 했지만 Spring 에서는 직접 new를 이용한 객체가 아닌, Spring에 의해 관리당하는 자바 객체를 사용한다. 이처럼 Spring에 의해 생성되고 관리되는 자바 객체를 Bean이라고 한다.
ex )
A 객체에서 B 객체에 있는 메소드를 사용하고 싶으면, B 객체를 직접 A 객체 내에서 생성하고 메소드를 호출 (모든 작업을 사용자가 제어함)
사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 됨 (사용자의 제어권을 다른 주체에게 넘김, IOC 적용)
Spring Bean은 주로 XML 파일이나 Java Config를 사용하여 정의된다. XML 파일에서는 <bean>
요소를 사용하고, Java Config에서는 @Bean
어노테이션을 사용하여 Bean을 정의한다.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserInfo() {
// userRepository를 사용하여 사용자 정보를 가져오는 비즈니스 로직
return "User information from UserService";
}
@Repository
public class UserRepository {
public String findUserById(String userId) {
// 사용자 정보를 데이터베이스 등에서 조회하는 로직
return "User with ID " + userId;
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
// UserService Bean을 가져와서 사용
UserService userService = context.getBean(UserService.class);
String userInfo = userService.getUserInfo();
System.out.println(userInfo);
// UserRepository Bean을 가져와서 사용
UserRepository userRepository = context.getBean(UserRepository.class);
String userById = userRepository.findUserById("123");
System.out.println(userById);
context.close(); // 애플리케이션 컨텍스트 종료
}
}
ComponentScan을 통해 패키지 내의 @Component, @Service, @Repository, @Controller
등의 어노테이션이 부여된 클래스들을 스캔하여 자동으로 Bean으로 등록할 수도 있다.
@SpringBootApplication
=@Configuration
: 클래스가 Spring의 설정 파일임을 나타냄@EnableAutoConfiguration
: Spring Boot의 자동 구성을 활성화@ComponentScan
: 컴포넌트 스캔을 활성화userService를 Bean으로 등록
@Configuration // 명시적인 설정 파일을 정의
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
@Bean
: 메서드 단위로 Bean을 정의하는 방식, 어떤 클래스의 어떤 메서드를 통해 Bean을 생성할지를 명시적으로 제어할 수 있다.
@Service
: 클래스 단위로 해당 클래스를 Spring 컨테이너에 서비스로 등록한다.
Spring IoC 컨테이너가 Bean의 생명주기와 의존성을 관리한다.
개발자가 객체의 생성과 관리를 직접하지 않고, IoC 컨테이너가 대신 수행한다.
Bean은 초기화(init)와 소멸(destroy) 단계에서 특정 작업을 수행할 수 있다.
@PostConstruct
와 @PreDestroy
어노테이션 또는 InitializingBean, DisposableBean
인터페이스를 사용하여 라이프사이클 메서드를 정의할 수 있다.
Spring은 의존성 주입을 통해 Bean 간의 관계를 설정한다.
생성자 주입, 세터 주입, 필드 주입 등 다양한 방식으로 의존성을 주입할 수 있다.
XML 또는 Java Config를 사용하여 의존성을 설정할 수 있다.
Bean의 스코프는 해당 Bean의 인스턴스가 생성되고 유지되는 범위를 나타낸다.
주요 스코프로는 Singleton, Prototype, Request, Session 등이 있다.
프로파일을 사용하여 특정 환경에서만 사용되는 Bean을 정의할 수 있다.
예를 들어, 개발 환경에서 사용되는 Bean과 운영 환경에서 사용되는 Bean을 분리할 수 있다.
@Conditional
어노테이션을 사용하여 특정 조건을 만족할 때만 Bean을 등록할 수 있다.
조건에 따라 동적으로 Bean을 활성화 또는 비활성화할 수 있다.
@Value
어노테이션을 사용하여 외부 프로퍼티 값을 Bean의 필드에 주입할 수 있다.
PropertySourcesPlaceholderConfigurer
등을 사용하여 프로퍼티를 관리할 수 있다.
Spring은 AOP를 통해 관점 지향 프로그래밍을 지원한다.
트랜잭션 관리, 로깅, 보안 등과 같은 공통된 관심사를 분리하여 모듈화할 수 있다.
Spring Bean은 위의 특성들을 통해 모듈화, 유지보수성, 확장성을 향상시키고, 의존성 주입을 통해 느슨한 결합을 유지하여 테스트 및 개발을 용이하게 한다.