✅ Spring Boot AutoConfiguration 동작 원리
✅ Bean 생명주기 및 @PostConstruct, @PreDestroy 활용
✅ Spring Boot Actuator를 활용한 시스템 모니터링
✅ Spring MVC 내부 동작 원리: DispatcherServlet, HandlerInterceptor, Filter
1️⃣ Spring Boot AutoConfiguration 동작 원리
🔹 AutoConfiguration이란?
Spring Boot의 가장 강력한 기능 중 하나로,
- @EnableAutoConfiguration을 통해 필요한 빈(Bean)을 자동으로 구성
- 클래스패스에 존재하는 라이브러리를 감지하여 설정을 자동화
- META-INF/spring.factories 파일을 읽어 자동 설정 클래스를 로드
🔹 AutoConfiguration 동작 과정
- Spring Boot 실행 시 @SpringBootApplication이 @EnableAutoConfiguration을 포함
- 클래스패스에 있는 라이브러리 감지 (spring.factories)
- 자동 설정 클래스를 로드 (@ConditionalOnClass, @ConditionalOnMissingBean 활용)
- 개발자가 명시적으로 설정한 Bean이 없다면, 기본 설정을 자동으로 적용
📌 예제 코드: Spring Boot AutoConfiguration 설정 확인
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
// 등록된 빈 목록 확인
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println(beanName);
}
}
}
✅ AutoConfiguration을 통해 등록된 빈(Bean) 목록을 출력하여 확인 가능!
📌 자동 설정이 적용되는 주요 클래스 예제 (DataSourceAutoConfiguration)
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
✅ 만약 DataSource가 존재하면 자동으로 설정을 적용하며, 직접 빈을 설정하면 자동 설정을 무시함!
2️⃣ Bean 생명주기 및 @PostConstruct, @PreDestroy 활용
🔹 Spring Bean 생명주기
- 객체 생성 (new 키워드로 인스턴스 생성)
- 의존성 주입 (@Autowired 등을 활용한 DI)
- 초기화 (@PostConstruct 실행)
- 사용 (비즈니스 로직 실행)
- 소멸 (@PreDestroy 실행 후 GC에 의해 제거)
📌 예제 코드: Bean 생명주기 관리
@Component
public class CustomBean {
public CustomBean() {
System.out.println("Bean 생성자 호출");
}
@PostConstruct
public void init() {
System.out.println("Bean 초기화 완료!");
}
@PreDestroy
public void destroy() {
System.out.println("Bean 제거 중...");
}
}
✅ 애플리케이션 시작 시 @PostConstruct가 실행되고, 종료 시 @PreDestroy가 실행됨!
📌 실행 결과
Bean 생성자 호출
Bean 초기화 완료!
(애플리케이션 종료 시)
Bean 제거 중...
3️⃣ Spring Boot Actuator를 활용한 시스템 모니터링
🔹 Actuator란?
Spring Boot Actuator는 애플리케이션 상태를 모니터링하고 관리하는 엔드포인트 제공
- 기본적으로 애플리케이션 헬스 체크, 메트릭, 환경 정보 확인 가능
- Prometheus, Grafana 등의 모니터링 툴과 연동 가능
🔹 Actuator 설정
📌 build.gradle에 Actuator 추가
implementation 'org.springframework.boot:spring-boot-starter-actuator'
📌 application.properties 설정
management.endpoints.web.exposure.include=health,info,metrics
✅ http://localhost:8080/actuator/health로 헬스 체크 가능!
📌 Actuator 헬스 체크 API 응답 예제 (/actuator/health)
{
"status": "UP"
}
📌 커스텀 헬스 체크 추가 예제 (HealthIndicator 활용)
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
boolean serverIsRunning = checkCustomService();
if (serverIsRunning) {
return Health.up().build();
} else {
return Health.down().withDetail("Error", "Custom Service is Down").build();
}
}
private boolean checkCustomService() {
return true; // 실제 서비스 체크 로직 구현
}
}
✅ 이제 /actuator/health에서 커스텀 상태 확인 가능!
4️⃣ Spring MVC 내부 동작 원리: DispatcherServlet, HandlerInterceptor, Filter
🔹 Spring MVC 요청 처리 흐름
- 클라이언트가 HTTP 요청을 보냄
- DispatcherServlet이 요청을 가로채고 적절한 핸들러(Controller)로 전달
- HandlerInterceptor에서 요청을 선처리
- Controller에서 비즈니스 로직 수행 후 응답 반환
- HandlerInterceptor에서 응답 후처리
- Filter가 최종 응답을 가로채서 필요하면 수정
📌 Spring MVC 요청 흐름(아두이노)
Client → DispatcherServlet → HandlerMapping → Controller
→ Service → Repository → Database
→ Response → Filter → Client
🔹 DispatcherServlet이란?
Spring MVC의 핵심 컴포넌트로, 모든 HTTP 요청을 가로채어 컨트롤러로 전달
📌 설정 예제 (WebConfig.java)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public DispatcherServlet dispatcherServlet() {
return new DispatcherServlet();
}
}
🔹 HandlerInterceptor 사용 (요청 전/후 로깅)
📌 RequestInterceptor.java
@Component
public class RequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("요청 전 로깅: " + request.getRequestURI());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("요청 후 로깅");
}
}
📌 Interceptor 등록 (WebConfig.java)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestInterceptor());
}
}
✅ 이제 모든 요청을 가로채어 로깅 가능!
🎯 마무리: Spring Boot 핵심 개념 정리
🔥 Spring Boot 내부 동작 원리를 깊이 이해하면 유지보수성과 확장성이 향상됨!
✅ AutoConfiguration을 이해하면 불필요한 설정을 최소화 가능
✅ Bean 생명주기를 활용하여 초기화 및 종료 로직을 효과적으로 관리
✅ Actuator를 통해 애플리케이션 상태를 모니터링하고 헬스 체크 가능
✅ DispatcherServlet, Interceptor를 활용하여 Spring MVC의 동작 원리를 익히자!
🚀 이제 실전 프로젝트에 적용해보자!
'Springboot' 카테고리의 다른 글
🚀 Spring Boot에서 Bean 생명주기 자동 관리 여부 & 개발자가 직접 관리해야 하는 부분 (0) | 2025.03.19 |
---|---|
🚀 Springboot Bean 생명주기 란? (0) | 2025.03.19 |
🚀 Spring Boot 중급 개발자 커리 큘럼 (1) | 2025.03.19 |
Spring Boot Failed to configure a DataSource (데이터베이스 설정 오류) (0) | 2025.03.18 |
Springboot - Field required a bean of type '...' that could not be found (Bean 주입 실패) (0) | 2025.03.18 |