스프링 DB 접근 기술

2025. 9. 24. 14:37개발/스프링

반응형

H2 데이터베이스 설치

실무에서는 Mysql, Oracle을 쓰지만, 이번시간에는 20년전에 개발했던 DB를 사용해보자.

 

테이블 생성하기

  • 테이블 관리를 위해 프로젝트 루트에 `sql/ddl.sql` 파일을 생성

순수 Jdbc

환경 설정

  • build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가
  • DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다. 스프링 부트는 데이터베이스 커넥션 정보를
    바탕으로 DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다.

구현 클래스 추가 이미지

스프링 설정 이미지

  • 개방-폐쇄 원칙(OCP, Open-Closed Principle)
    • 확장에는 열려있고, 수정, 변경에는 닫혀있다.
  • 스프링의 DI (Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.
  • 회원을 등록하고 DB에 결과가 잘 입력되는지 확인하자.
  • 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다.

스프링 통합 테스트

  • `@SpringBootTest` 스프링 컨테이너와 테스트를 함께 실행한다.
  • `@Transactional` : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트
    완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.
  • 단위테스트로 진행하는 것이 좋다.
    • 단위테스트로 하는 연습이 필요하다.
    • 진짜 좋은 테스트는 단위테스트로 하는 것이다.
    • 컨테이너를 올리는 건 좋은 테스트가 아니다.

스프링 JdbcTemplate

  • 순수 Jdbc와 동일한 환경설정을 하면 된다.
  • 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다.
  • 개발을 잘할수록 테스트케이스를 꼼꼼하게 잘 짜더라.

JPA

  • JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
  • JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

스프링 데이터 JPA

  • 스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다. 
  • 여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다.
  • 스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 즐거워집니다.
    지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다.
  • 실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수 입니다.
  • 주의
    • 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술입니다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 합니다.
  • 앞의 JPA 설정을 그대로 사용한다.

스프링 데이터 JPA 제공 기능

  • 인터페이스를 통한 기본적인 CRUD `findByName()` , `findByEmail()` 처럼 메서드 이름 만으로 조회 기능 제공
    페이징 기능 자동 제공
  • 참고: 실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는 라이브
    러리를 사용하면 된다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적 쿼리도 편리하
    게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, 앞서 학습
    한 스프링 JdbcTemplate를 사용하면 된다.

퀴즈

  • 순수 JDBC를 사용할 때, 데이터베이스 리소스(연결, Statement 등) 관리가 어려웠던 주된 이유는 무엇일까요?
    • JDBC는 연결, Statement, ResultSet 등 사용한 리소스를 개발자가 일일이 코드로 닫아줘야 했습니다. 이 과정이 번거롭고 누락 시 문제 발생 소지가 있었습니다.
  • 스프링 통합 테스트에서 `@Transactional` 어노테이션을 테스트 메서드에 붙여 사용하는 핵심 목적은 무엇인가요?
    • @Transactional은 테스트 실행 중 데이터베이스에 적용된 변경 사항을 테스트 종료 후 자동으로 되돌립니다. 이를 통해 각 테스트가 이전 테스트의 영향을 받지 않고 독립적으로 실행될 수 있습니다.
  • 순수 JDBC와 비교할 때, 스프링의 `JdbcTemplate`가 개발 생산성을 높여주는 주된 이유는 무엇일까요?
    • JdbcTemplate는 연결 확보, Statement 준비, 결과 매핑, 리소스 해제 등 순수 JDBC에서 반복적으로 작성해야 했던 많은 코드를 추상화하여 개발자가 SQL 실행 자체에 집중하도록 돕습니다.
  • JPA나 ORM 기술을 사용하는 가장 근본적인 목적은 무엇인가요?
    • ORM의 핵심은 객체 세상과 관계형 데이터베이스 세상의 차이를 줄이는 것입니다. 객체 모델을 중심으로 개발하며, 객체-테이블 매핑과 그에 필요한 SQL 작업을 ORM 프레임워크가 대신 수행합니다
  • 스프링 데이터 JPA 사용 시, 리포지토리 구현 코드 없이 인터페이스만으로 개발할 수 있게 되는 이유는 무엇일까요?
    • 스프링 데이터 JPA는 개발자가 정의한 리포지토리 인터페이스를 보고, 애플리케이션 구동 시점에 필요한 데이터 접근 로직의 구현체를 프록시 기술 등을 통해 자동으로 생성하여 스프링 빈으로 등록해줍니다.
반응형

'개발 > 스프링' 카테고리의 다른 글

AOP  (0) 2025.09.28
GET, POST 메서드  (1) 2025.09.22
회원 관리 예제 - 웹 MVC 개발  (0) 2025.09.22
스프링 빈과 의존관계  (0) 2025.09.20
회원 관리 예제 - 백엔드 개발  (0) 2025.09.19