Taeyoung Kim

Engineering

6. 스프링 DB 접근 기술 정리

6. 스프링 DB 접근 기술 정리 학습 내용을 정리한 백필 노트입니다.

이 글은 2025년 학습 기록을 블로그 형식으로 정리한 백필 노트입니다.


1. H2 데이터베이스 설치

  • H2 DB 특징: 개발 및 테스트 용도로 가볍고 편리한 데이터베이스. 웹 UI 제공.

  • 다운로드: https://www.h2database.com

  • 버전 호환성

    • Spring Boot 2.x → H2 1.4.200
    • Spring Boot 3.x → H2 2.1.214 이상
  • 실행 방법

    • macOS/Linux: chmod 755 h2.sh./h2.sh
    • Windows: h2.bat
  • DB 파일 생성

    • 최초 실행: jdbc:h2:~/test~/test.mv.db 생성
    • 이후 실행: jdbc:h2:tcp://localhost/~/test
  • DDL 파일 (sql/ddl.sql) 예시

    drop table if exists member CASCADE;
    
    create table member (
        id bigint generated by default as identity,
        name varchar(255),
        primary key (id)
    );
    
    
  • 오류 발생 시 해결 방법

    1. H2 종료 후 재시작
    2. 주소창 IP를 localhost로 변경
    3. DB 파일 다시 생성 (jdbc:h2:~/test)

2. 순수 JDBC 방식

📍 환경 설정

build.gradle

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

application.properties

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa

⚠️ Spring Boot 2.4 이상에서는 spring.datasource.username=sa 반드시 추가.


📍 JdbcMemberRepository 구현

직접 JDBC API를 사용해 DB 접근 로직 구현:

  • CRUD 메서드: save(), findById(), findAll(), findByName()
  • Connection 관리: DataSourceUtils 사용
  • 리소스 정리: close()로 Connection/Statement/ResultSet 반환
  • 코드 특징: 반복적이고 복잡 — “옛날 방식”으로 간주됨

📍 스프링 설정 (SpringConfig)

@Bean
public MemberRepository memberRepository() {
    return new JdbcMemberRepository(dataSource);
}

  • DI를 통한 구현체 교체 가능

    → 개방-폐쇄 원칙(OCP): 확장에는 열려 있고 변경에는 닫혀 있음.


3. 스프링 통합 테스트

스프링 컨테이너 및 DB를 포함한 통합 테스트 예제.

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
    @Test
    public void 회원가입() { ... }
    @Test
    public void 중복_회원_예외() { ... }
}

  • @SpringBootTest: 스프링 컨텍스트 로드
  • @Transactional: 테스트 후 자동 롤백 (DB 초기화 보장)

4. 스프링 JdbcTemplate

📍 특징

  • JDBC 반복 코드 제거
  • SQL은 직접 작성해야 함
  • MyBatis와 유사한 역할

📍 JdbcTemplateMemberRepository

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

  • SimpleJdbcInsert로 insert 간소화
  • RowMapper로 ResultSet → 객체 매핑

📍 설정 변경

@Bean
public MemberRepository memberRepository() {
    return new JdbcTemplateMemberRepository(dataSource);
}


5. JPA (Java Persistence API)

📍 개요

  • SQL을 직접 작성하지 않아도 됨
  • 객체 중심 설계 가능
  • 생산성 향상

📍 build.gradle

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'

📍 application.properties

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

📍 엔티티 매핑

@Entity
public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

📍 JpaMemberRepository

  • EntityManager 사용
  • em.persist(), em.find(), em.createQuery() 활용

📍 트랜잭션 설정

@Transactional
public class MemberService { }

📍 스프링 설정

@Bean
public MemberRepository memberRepository() {
    return new JpaMemberRepository(em);
}

⚠️ JPA의 모든 데이터 변경은 트랜잭션 내에서 수행되어야 함.


6. 스프링 데이터 JPA

📍 핵심 개념

  • JPA + 스프링 통합으로 리포지토리 구현 없이 개발 가능
  • 기본 CRUD 자동 생성
  • findByName(), findByEmail() 등 메서드 이름 기반 쿼리 제공
  • 페이징 기능 자동 지원

📍 예제

public interface SpringDataJpaMemberRepository
        extends JpaRepository<Member, Long>, MemberRepository {
    Optional<Member> findByName(String name);
}

📍 스프링 설정

@Configuration
public class SpringConfig {
    private final MemberRepository memberRepository;
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository);
    }
}

  • 스프링이 자동으로 SpringDataJpaMemberRepository를 빈으로 등록.

📍 참고 자료


요약 비교

| 기술 | 주요 특징 | 코드량 | 장점 | | --- | --- | --- | --- | | 순수 JDBC | 직접 SQL 작성, 반복 많음 | 많음 | 기본 구조 이해 | | JdbcTemplate | 반복 제거, SQL 작성 필요 | 중간 | 생산성 향상 | | JPA | SQL 자동 생성 | 적음 | 객체 중심 개발 | | Spring Data JPA | 리포지토리 구현 불필요 | 최소 | CRUD 자동화, 실무 필수 |