❓ 해당 주제를 찾아본 이유
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가지 이유였다.
- application.properties 외부 설정을 통해 DataSource를 스프링 빈으로 등록했다.
- spring-boot-starter-jdbc 의존성을 주입하여 스프링 빈으로 등록한 DataSource를 사용하여 JdbcTemplate 스프링 빈 등록
궁금했던 점 해결 완료! 😃
'Spring > 기타' 카테고리의 다른 글
[Spring] @SpringBootTest에서 환경이 다른 여러 테스트 실행 시 DDL을 여러번 실행하는 오류 트러블 슈팅하기 (6) | 2023.04.29 |
---|---|
[Spring] @ResponseBody VS ResponseEntity<T> : 무엇을 사용할까? (1) | 2023.04.16 |
[Spring] @Valid 여러 검증 어노테이션 검증 순서 설정 방법 (1) | 2023.01.24 |
[Spring] MockMvc @RequestPart MultipartFile 파일 테스트 시 에러 트러블 슈팅 (0) | 2023.01.06 |
[Spring] Postman multipart/form-data 여러 개 파일 보내기 (0) | 2023.01.05 |