반응형

❓ 해당 주제를 찾아본 이유

JdbcTemplate을 쓸 때 여러 구글링을 통해 사용 방법을 알아보게 되었다.

대부분의 사람들이 JdbcTemplate 을 주입받아서 사용하는 것이 아니라,

DataSource 를 주입받아서 JdbcTemplate 객체를 생성해서 사용했다.


      
private final JdbcTemplate jdbcTemplate;
@Autowired
public RaceResultDao(final DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}

 

처음 든 생각은 '왜?' 였다.

JdbcTemplate 이 스프링 실행 시에 스프링 빈으로 자동으로 등록되어 있다면

DataSource 를 의존성 주입하는 것이 아니라,

JdbcTemplate 을 바로 주입하면 되지 않을까? 란 생각이 들었다.

그래서 JdbcTemplate 은 스프링 실행 시에 스프링 빈으로 자동 등록이 되어 있지 않는구나! 생각했었다.

그러나, 다음과 같이 JdbcTemplate 을 직접 의존성 주입해줬을 때 잘 동작하는 것을 보게 되었다.


      
private final JdbcTemplate jdbcTemplate;
@Autowired
public RaceResultDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

JdbcTemplate 이 주입된다는 것은 스프링 실행 시에 스프링 빈으로 자동으로 등록되어 있다는 것인데,

어떤 원리로 자동으로 등록되는지 궁금해서 찾아보게 되었다.


🎯 결론

결론부터 말하는 것이 이상하긴 하지만,

JdbcTemplate 은 설정으로 등록된 DataSource 스프링 빈을 사용하여 스프링 빈으로 등록되게 된다.

 


🎯 그렇다면, DataSource는 어떻게 자동으로 스프링 빈으로 등록될까?

DataSource 도 스프링이 자동으로 생성하여 스프링 빈으로 관리하고 있을까?

아니다!

 

DataSource 는 DB와 관련된 커넥션 정보를 담고 있는 객체로 DB 서버와의 연결을 담당한다.

그러므로 스프링이 자체적으로 생성할 수 없고, 매번 별도로 설정해줘야 한다!

위의 말에서 힌트를 얻어서 감이 왔을 수도 있다.

외부 설정 파일인 application.properties 에서 DB 정보를 다음과 같이 선언했을 것이다.

 

✅ application.properties


      
spring.h2.console.enabled=true // console 사용 여부
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL // database url 설정
spring.datasource.driver-class-name=org.h2.Driver // datasource driver 설정

이러한 외부 설정 파일은 스프링이 아니라 스프링 부트의 기능이다.

스프링 부트의 'Auto Configuration' 기능을 통해 지정한 DB 정보로

DataSource가 스프링 빈으로 자동 등록된다.

 


🎯 DataSource만 스프링 빈으로 등록되어 있으면 JdbcTemplate이 자동 등록될까?

 

DataSource가 Spring Boot의 Auto Configuration 기능으로 스프링 빈으로 등록됐을 때

JdbcTemplate 이 스프링 실행 시에 스프링 빈에 등록될까?

 

아니다!

1가지 조건이 더 존재한다.

바로, spring-boot-starter-jdbc 의존성을 추가해줘야 한다.

 

✅ build.gradle


      
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
}

해당 의존성을 추가하게 되면, 스프링이 실행될 때 설정으로 등록된 DataSource 를 사용하여

JdbcTemplate 을 스프링 빈으로 등록하게 된다.

 


📘 요약

 

애플리케이션에서 JdbcTemplate이 스프링 빈으로 등록되어 있던 이유는 다음 2가지 이유였다.

  1. application.properties 외부 설정을 통해 DataSource를 스프링 빈으로 등록했다.
  2. spring-boot-starter-jdbc 의존성을 주입하여 스프링 빈으로 등록한 DataSource를 사용하여 JdbcTemplate 스프링 빈 등록

궁금했던 점 해결 완료! 😃

반응형
BE_성하