애플리케이션의 데이터를 영구적으로 저장하기 위한 데이터 소스(DataSource)의 개념과 JdbcTemplate을 이용한 DB 연동 방법을 정리했습니다.
데이터베이스와의 연결을 효율적으로 관리하는 핵심 구성 요소입니다.
앱 로직 ➔ 데이터 소스 ➔ JDBC 드라이버 ➔ DBMSJdbcTemplate은 반복되는 JDBC 코드를 줄여주어 편리한 데이터 작업을 지원합니다. 스프링 부트는 H2 같은 의존성을 확인하면 데이터 소스와 JdbcTemplate을 자동으로 구성합니다.
테이블에 레코드를 추가하거나 수정할 때는 update() 메서드를 사용합니다.
JdbcTemplate 인스턴스를 주입받습니다.?(물음표)로 대체합니다.?를 대체할 값들을 순서대로 전달합니다.DB에서 레코드를 선택하여 객체 리스트로 변환할 때 사용합니다.
ResultSet(결과집합)의 각 행을 자바 객체로 매핑하는 방법을 정의합니다.r: ResultSet (DB 데이터)i: 행 번호 (int)JdbcTemplate에 전달하여 결과를 반환받습니다.@Repository //1)
public class PurchaseRepository {
private final JdbcTemplate jdbc;
public PurchaseRepository(JdbcTemplate jdbc) { //2)
this.jdbc = jdbc;
}
public void storePurchase(Purchase purchase){ //4)
String sql = "INSERT INTO purchase VALUES (NULL, ?, ?)"; //3)
jdbc.update(sql, //5)
purchase.getProduct(),
purchase.getPrice());
}
}
public List<Purchase> findAllPurchase(){ //1)
String sql = "SELECT * FROM purchase"; //2)
RowMapper<Purchase> purchaseRowMapper = (r,i) ->{ //3)
Purchase rowObject = new Purchase(); //4)
rowObject.setId(r.getInt("id"));
rowObject.setProduct(r.getString("product"));
rowObject.setPrice(r.getBigDecimal("price"));
return rowObject;
};
return jdbc.query(sql, purchaseRowMapper); //5)
}
@RequestBody)에서 데이터를 가져와 리포지터리의 저장 메서드를 호출합니다.@RestController
@RequestMapping("/purchase")
public class PurchaseController {
private final PurchaseRepository purchaseRepository;
public PurchaseController(PurchaseRepository purchaseRepository) {
this.purchaseRepository = purchaseRepository;
}
@PostMapping
public void storePurchase(@RequestBody Purchase purchase){
purchaseRepository.storePurchase(purchase); //1)
}
@GetMapping
public List<Purchase> findPurchase(){
return purchaseRepository.findAllPurchase(); //2)
}
}
실제 운영 환경에서 외부 DBMS를 연동하는 방법입니다.
application.properties):DataSource 빈을 자동으로 정의합니다.spring.datasource.url=jdbc:mysql://localhost/spring_quickly
spring.datasource.username=root
spring.datasource.password=[your_password]
#spring.datasource.initialization-mode=always
spring.sql.init.mode=always
package com.example.config;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class ProjectConfig {
@Value("${custom.datasource.url}") //application.properties 파일에 보관
private String datasourceUrl;
@Value("${custom.datasource.username}")
private String datasourceUsername;
@Value("${custom.datasource.password}")
private String datasourcePassword;
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(datasourceUrl);
dataSource.setUsername(datasourceUsername);
dataSource.setPassword(datasourcePassword);
dataSource.setConnectionTimeout(1000);
return dataSource;
}
}
#Spring #JDBC #DataSource #JdbcTemplate #MySQL #백엔드공부