타류
10
2021-10-13 13:17:10 작성 2021-10-13 13:24:26 수정됨
3
112

Spring DB 자동 설정 시 초기화 가능여부


현재 TCP 서버를 SpringBoot로 작업 중에 있습니다.

여기서 궁금한 것이 있는데요.


DB 설정을 자동완성(application.properties에 db 설정 명시)을 사용하고 있는데 실제 프로그램을 실행 시켜보면 DB Pool이 할당이 되지 않고,  프로그램에서 DB 접근시... 정확히는 DataSource에서 getConnection()을 할 때 히카리가 DB Pool을 생성하는 것으로 보입니다.


혹시 이를 스프링을 기동하는 시점에서 DB Connection Pool을 생성하는 좋은 방법이 없을까요?


제가 아는 지식 수준에선
1. PostConstruct 와 같은 곳에서 datasource getConnection을 해오거나,

2. DB 설정을 java config로 빼내서 스프링 기동 시 bean 생성으로 db pool을 생성할 수 있긴 한데

개인 취향상 자동완성을 지향하는 편이고, PostConstruct 와 같이 따로 해당 Connection을 호출 하는 게 바람직 하지 않다고 느껴져 혹시 다른 방법이 있지 않나 여쭤 봅니다.


(참고로 그냥 서버 올려놓고 서비스 call해서 테스트 해볼 수 있지 않나? 싶은데 기동 시에 프로그램에서 사용하는 외부 설정들을 사전에 검증하고 싶습니다. 예를 들면 DB 계정 정보가 잘 못되거나 방화벽에 막혀 있을 경우 서버 기동엔 문제 없으나, 실제 실행까지 해봐야 하는 번거로움이 있습니다. )



0
  • 답변 3

  • 컴포지트
    2k
    2021-10-13 14:31:14

    DB Pool 할당을 히카리가 대신하는 겁니다. DB 서버에 직접 접근하거나, 세션 조회 권한 있으면 모니터링 툴(왠만한 DB 툴에서 지원) 확인해 보시면 스프링 앱 하나가 최소 4개, 최대 10개 (기본값은 10개의 Pool 잡음)를 잡고 있습니다.

    만약 히카리 기본 설정이 싫고 톰캣 DBCP 등 다른 DBCP에게 관리를 부여하고 싶다면 기존 application.properties 에서 제공하는 기본 세팅 말고, 말 그대로 config 용도로 활용하면서, "수동"으로 기존 스프링처럼 DB를 세팅할 수 있습니다.

    물론 위 방법을 이용해 수동으로 히카리CP 세팅과 검증 또한 가능합니다. 아래 문서 참고해서 @Configuration 어노테이션으로 세팅하시길.

    https://github.com/brettwooldridge/HikariCP#rocket-initialization

    그리고 properties 만 딸랑 세팅했는데도 Boot 가동 시 DBCP가 작동하는 이유는 그렇게 하도록 Auto Configuration Bean 을 생성했기 때문입니다. Spring Boot의 강점이죠.

    궁금증의 해답이 본문에서 살짝 벗어난 것처럼 보이겠지만, 충분한 궁금증의 해답이 될 겁니다.

    스프링 부트의 Autoconfiguration 원리 및 만들어 보기 – 민동현 – Dream Cometrue (donghyeon.dev)

  • Mambo
    6k
    2021-10-13 15:42:33

    그냥 간단하게 ApplicationStartedEvent 또는 ApplicationReadyEvent가 호출되는 시점에 

    SELECT 1 한번 호출하면 되지 않나 생각합니다. (Actuator 사용하면 DBHealthIndicator에 의해 결국 호출...)

  • 타류
    10
    2021-10-13 18:14:23 작성 2021-10-13 18:14:40 수정됨

    두분 다 답변 감사합니다. 일단 스프링 소스 까보고 DOC문서 찾아 봤는데
    자동설정을 통해 DB Pool 생성 시 스프링 내 따로 DB pool을 생성, 초기화 하는 옵션은 없네요.

    (첨언이지만,Bean을 통한 DataSource 정의 시엔 당연한 얘기겠지만 DataSource를 직접 Bean으로서 생성을 하며 메모리에 적재하기 때문에 해당 DB Pool이 생성 되지만, 자동 설정 경우 Datasource를 가져오는 시점에서 Connection pool이 null일 경우 자동 설정의 값을 읽어들여 이후에 DB Pool이 생성 되네요 )

    Mambo 님이 말씀하신 것처럼 결과적으론 서비스 기동 이후 소스 내에서 직접 DB Pool을 생성 해주는 trigger 역할의 소스가 필요하겠네요.

  • 로그인을 하시면 답변을 등록할 수 있습니다.