스프링 앱에서 데이터 소스 사용

김우진·2026년 2월 22일

Spring

목록 보기
13/17
post-thumbnail

[Spring] 12. 스프링 앱에서 데이터 소스 사용

애플리케이션의 데이터를 영구적으로 저장하기 위한 데이터 소스(DataSource)의 개념과 JdbcTemplate을 이용한 DB 연동 방법을 정리했습니다.


1. 데이터 소스 (DataSource)

데이터베이스와의 연결을 효율적으로 관리하는 핵심 구성 요소입니다.

  • 개념: DBMS에 대한 커넥션(연결)을 관리하는 객체입니다.
  • JDBC (Java Database Connectivity): 자바 앱에서 관계형 데이터베이스에 연결할 수 있도록 돕는 언어 기능입니다.
    • 구조: 앱 로직데이터 소스JDBC 드라이버DBMS
  • 추상화와 구현: JDK는 인터페이스(추상화)를 제공하고, 각 DBMS(MySQL, Oracle 등) 제작사가 제공하는 JDBC 드라이버가 이를 실제로 구현합니다.
  • 연결 관리: 데이터 소스가 없다면 매번 드라이버에 커넥션을 새로 요청해야 하지만, 데이터 소스는 커넥션을 풀(Pool)에 담아두고 필요할 때마다 재사용합니다.
  • 대표적 구현체: 스프링 부트에서 기본으로 채택한 HikariCP가 있습니다.

2. JdbcTemplate으로 영속성 데이터 작업

JdbcTemplate은 반복되는 JDBC 코드를 줄여주어 편리한 데이터 작업을 지원합니다. 스프링 부트는 H2 같은 의존성을 확인하면 데이터 소스와 JdbcTemplate을 자동으로 구성합니다.

데이터 변형 (INSERT, UPDATE, DELETE)

테이블에 레코드를 추가하거나 수정할 때는 update() 메서드를 사용합니다.

  1. @Repository: 클래스 위에 선언하여 스프링 컨텍스트의 빈으로 등록합니다.
  2. 생성자 주입: 애플리케이션 컨텍스트에서 JdbcTemplate 인스턴스를 주입받습니다.
  3. 쿼리 작성: 문자열 내 매개변수 값은 ?(물음표)로 대체합니다.
  4. update() 실행: 첫 번째 인자로 쿼리를, 이후 인자로 ?를 대체할 값들을 순서대로 전달합니다.

데이터 조회 (SELECT)

DB에서 레코드를 선택하여 객체 리스트로 변환할 때 사용합니다.

  1. SELECT 쿼리 정의: 조회할 대상을 정하는 쿼리를 작성합니다.
  2. RowMapper 구현: ResultSet(결과집합)의 각 행을 자바 객체로 매핑하는 방법을 정의합니다.
    • 매개변수 r: ResultSet (DB 데이터)
    • 매개변수 i: 행 번호 (int)
  3. 쿼리 메서드 호출: 쿼리와 RowMapper를 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)
    }

3. 컨트롤러 구현 및 데이터 흐름

  • 저장 엔드포인트: HTTP 요청 본문(@RequestBody)에서 데이터를 가져와 리포지터리의 저장 메서드를 호출합니다.
  • 조회 엔드포인트: 리포지터리를 통해 DB 데이터를 가져와 클라이언트에 응답 본문으로 반환합니다.
@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)
    }
}

4. 데이터 소스 구성 사용자 정의 (MySQL 예시)

실제 운영 환경에서 외부 DBMS를 연동하는 방법입니다.

  1. 의존성 추가: MySQL JDBC 드라이버를 프로젝트에 추가합니다.
  2. 애플리케이션 설정 (application.properties):
    • MySQL 접속 주소(URL), 계정명, 비밀번호를 작성합니다.
    • 스프링은 이 설정을 기반으로 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

5. 직접 사용자 빈 정의

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;
  }
}

🎯 요약

  1. 데이터 소스는 DB 커넥션을 관리하며, HikariCP가 대표적이다.
  2. JdbcTemplate은 JDBC의 복잡한 로직을 대신 처리해 주는 편리한 도구다.
  3. RowMapper는 DB 레코드를 자바 객체로 변환하는 지침서 역할을 한다.
  4. 실제 DBMS 연동은 설정 파일에 프로퍼티를 추가하는 것만으로 간단히 구현 가능하다.

#Spring #JDBC #DataSource #JdbcTemplate #MySQL #백엔드공부

0개의 댓글