Spring Bean은 Spring IoC(Inversion of Control) 컨테이너가 관리하는 객체를 의미한다. 쉽게 말해서, Spring이 생성하고 관리하는 모든 객체를 Spring Bean이라고 한다.
@PostConstruct, @PreDestroy 등으로 생명주기 제어1. Bean 정의 로드
↓
2. Bean 인스턴스 생성
↓
3. 의존성 주입
↓
4. 초기화 (@PostConstruct)
↓
5. Bean 사용
↓
6. 소멸 (@PreDestroy)
@Component // 기본 컴포넌트
@Service // 서비스 계층
@Repository // 데이터 접근 계층
@Controller // 웹 컨트롤러
@RestController // REST API 컨트롤러
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
<bean id="userService" class="com.example.service.UserService">
<constructor-arg ref="userRepository"/>
</bean>
@Component
@Scope("prototype")
public class PrototypeBean {
// 매번 새로운 인스턴스 생성
}
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
// HTTP 요청마다 새로운 인스턴스
}
src/main/java/com/example/demospringboot/
├── controllers/
│ └── UserController.java
├── services/
│ └── UserService.java
├── repositories/
│ └── UserRepository.java
└── config/
└── AppConfig.java
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
// 생성자 주입 - Spring이 UserService Bean을 자동 주입
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
}
@Service
public class UserService {
private final UserRepository userRepository;
// 생성자 주입 - Spring이 UserRepository Bean을 자동 주입
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User findById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new RuntimeException("User not found"));
}
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Spring Data JPA가 자동으로 구현체 생성
// 이 인터페이스 자체가 Spring Bean으로 등록됨
}
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// HTTP 요청/응답 로깅 설정
restTemplate.setInterceptors(Arrays.asList(
new LoggingInterceptor()
));
return restTemplate;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Service
public class ExternalApiService {
private final RestTemplate restTemplate;
// AppConfig에서 정의한 RestTemplate Bean이 주입됨
public ExternalApiService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public WeatherInfo getWeather(String city) {
String url = "https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q=" + city;
return restTemplate.getForObject(url, WeatherInfo.class);
}
}
Spring Bean은 Spring Framework의 핵심 개념으로, 객체의 생성과 의존성 관리를 Spring이 담당하게 함으로써 개발자가 비즈니스 로직에만 집중할 수 있게 해줌.
핵심 포인트:
Spring Boot에서는 @ComponentScan을 통해 자동으로 Bean을 스캔하고 등록하므로, 개발자는 비즈니스 로직 구현에만 집중할 수 있음.