TIL - 20260130

juni·2026년 1월 30일

TIL

목록 보기
254/316

0130 스프링 부트 프로젝트 (2/N): JPA를 이용한 데이터베이스 연동


✅ 1. 데이터베이스 연동을 위한 의존성 추가

  • Spring Boot 애플리케이션이 데이터베이스와 통신하기 위해서는 몇 가지 핵심 라이브러리(의존성)가 필요합니다. 이들은 build.gradle 파일에 추가합니다.
  1. Spring Data JPA (spring-boot-starter-data-jpa):

    • JPA(Java Persistence API)를 Spring에서 더 쉽고 편리하게 사용할 수 있도록 도와주는 스타터입니다.
    • 내부적으로 Hibernate(JPA 구현체), JDBC, 커넥션 풀(HikariCP) 등 데이터베이스 연동에 필요한 대부분의 라이브러리를 포함하고 있습니다.
  2. JDBC 드라이버 (JDBC Driver):

    • 애플리케이션이 특정 종류의 데이터베이스(MySQL, MariaDB, H2 등)와 실제로 통신할 수 있도록 해주는 "번역기" 역할을 하는 라이브러리입니다.
    • 예시: mysql-connector-j (MySQL용), mariadb-java-client (MariaDB용), h2database (H2 인메모리 DB용)

✅ 2. 데이터베이스 연결 정보 설정 (application.yml)

  • 애플리케이션이 어떤 데이터베이스에, 어떻게 접속해야 하는지에 대한 정보를 src/main/resources/application.yml 파일에 작성합니다.
spring:
  # --- 데이터베이스 연결 설정 ---
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver # 사용할 JDBC 드라이버 클래스
    url: jdbc:mysql://localhost:3306/my_db?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 # DB 서버 주소
    username: my_user # DB 접속 계정
    password: my_password # DB 접속 비밀번호

  # --- JPA 및 Hibernate 설정 ---
  jpa:
    hibernate:
      ddl-auto: update # 애플리케이션 실행 시, 엔티티와 DB 테이블을 비교하여 자동으로 스키마 변경
    properties:
      hibernate:
        show_sql: true # JPA가 실행하는 SQL을 콘솔에 출력
        format_sql: true # SQL을 보기 좋게 포맷팅
        default_batch_fetch_size: 100 # N+1 문제 완화를 위한 배치 사이즈 설정
    open-in-view: false # OSIV 설정 (성능 이슈로 false 권장)
  • spring.jpa.hibernate.ddl-auto 옵션 (중요):
    • create: 애플리케이션 실행 시마다 기존 테이블을 삭제하고 새로 생성. (테스트용)
    • create-drop: create와 같지만, 종료 시 테이블 삭제. (테스트용)
    • update: 엔티티의 변경 사항을 감지하여, 기존 테이블에 변경된 부분만 반영. (개발 초기 단계에서 편리)
    • validate: 엔티티와 테이블이 일치하는지만 검사하고, 다르면 오류 발생.
    • none: 아무것도 하지 않음. (운영 환경에서는 none 또는 validate 사용 권장. 스키마 변경은 Flyway와 같은 마이그레이션 도구로 관리)

✅ 3. 엔티티(Entity) 클래스 작성

  • 엔티티란 데이터베이스의 테이블과 직접적으로 매핑되는 Java 객체입니다.

  • 주요 어노테이션:

    • @Entity: 이 클래스가 JPA가 관리하는 엔티티임을 선언.
    • @Id: 테이블의 기본 키(PK)에 해당하는 필드.
    • @GeneratedValue(strategy = GenerationType.IDENTITY): 기본 키 값을 데이터베이스(e.g., MySQL의 AUTO_INCREMENT)가 자동으로 생성하도록 위임.
    • @Column: 필드와 매핑될 컬럼의 세부 속성(이름, nullable, unique 등)을 지정.
    • @CreationTimestamp / @UpdateTimestamp: 데이터가 생성되거나 수정될 때, 해당 시간을 자동으로 기록.
package com.example.myproject.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import java.time.LocalDateTime;

@Entity
@Getter
@NoArgsConstructor // JPA는 기본 생성자를 필요로 함
public class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 100)
    private String title;

    @Column(nullable = false, columnDefinition = "TEXT")
    private String content;

    @CreationTimestamp // 엔티티가 생성될 때의 시간 자동 저장
    private LocalDateTime createdAt;

    // 생성자
    public Post(String title, String content) {
        this.title = title;
        this.content = content;
    }
}```

---

### ✅ 4. 리포지토리(Repository) 인터페이스 작성

*   **리포지토리**는 엔티티에 대한 데이터베이스 CRUD(Create, Read, Update, Delete) 작업을 담당하는 인터페이스입니다.

*   **`JpaRepository`**:
    *   Spring Data JPA가 제공하는 인터페이스로, 이를 상속받는 것만으로 기본적인 CRUD 메서드를 자동으로 사용할 수 있습니다.
    *   **사용법**: `public interface MyRepository extends JpaRepository<엔티티_타입, ID_타입> { ... }`

```java
package com.example.myproject.repository;

import com.example.myproject.domain.Post;
import org.springframework.data.jpa.repository.JpaRepository;

// Post 엔티티를 다루고, ID의 타입은 Long
public interface PostRepository extends JpaRepository<Post, Long> {
    // 이 인터페이스를 정의하는 것만으로 save(), findById(), findAll() 등 사용 가능
}
  • 이제 서비스(Service) 계층에서 이 PostRepository를 주입받아, postRepository.save(newPost)postRepository.findById(1L)과 같은 메서드를 호출하여 데이터베이스와 상호작용할 수 있습니다.

📌 요약

  • Spring Boot에서 DB를 연동하려면 spring-boot-starter-data-jpaJDBC 드라이버 의존성이 필요합니다.
  • application.ymldatasourcejpa 관련 설정을 통해 DB 연결 정보와 JPA 동작 방식을 정의합니다.
  • @Entity 어노테이션이 붙은 클래스는 DB 테이블과 매핑되며, JPA를 통해 관리됩니다.
  • JpaRepository 인터페이스를 상속받으면, 별도의 구현 없이도 기본적인 CRUD 기능을 자동으로 사용할 수 있어 데이터 접근 계층의 개발이 매우 간편해집니다.

0개의 댓글