Springboot

🚀 Spring Boot의 핵심 개념 심화 - 내부 동작 원리 및 주요 기능

수아파파's 2025. 3. 19. 20:28
반응형

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 동작 과정

  1. Spring Boot 실행 시 @SpringBootApplication이 @EnableAutoConfiguration을 포함
  2. 클래스패스에 있는 라이브러리 감지 (spring.factories)
  3. 자동 설정 클래스를 로드 (@ConditionalOnClass, @ConditionalOnMissingBean 활용)
  4. 개발자가 명시적으로 설정한 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 생명주기

  1. 객체 생성 (new 키워드로 인스턴스 생성)
  2. 의존성 주입 (@Autowired 등을 활용한 DI)
  3. 초기화 (@PostConstruct 실행)
  4. 사용 (비즈니스 로직 실행)
  5. 소멸 (@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 요청 처리 흐름

  1. 클라이언트가 HTTP 요청을 보냄
  2. DispatcherServlet이 요청을 가로채고 적절한 핸들러(Controller)로 전달
  3. HandlerInterceptor에서 요청을 선처리
  4. Controller에서 비즈니스 로직 수행 후 응답 반환
  5. HandlerInterceptor에서 응답 후처리
  6. 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의 동작 원리를 익히자!

🚀 이제 실전 프로젝트에 적용해보자!

반응형