본문 바로가기
개발하기/Spring(Java)

Spring Boot JPA 엔티티 설정과 (MariaDB) 데이터베이스 연동하기

by lovedeveloping 2025. 3. 13.
반응형

안녕하세요. 오늘은 Spring Boot와 JPA를 사용하여 데이터베이스 연동 프로젝트를 진행하다가 여러 오류를 만났고, 이를 해결하는 과정을 정리해보려 합니다. 이 글이 비슷한 문제로 고민하는 분들에게 도움이 되길 바랍니다.

참고로  https://youtu.be/OiAYmtq4Av8?si=2cdqBgsy4M8vpZ6D

해당 영상을 통해 공부중 오류 발견

이분의 영상을 보고 학습 중입니다. (잘 가르쳐 주셔서 감사합니다.)

1. 기본 엔티티 설정하기

package sinecure.sheep.study.data.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.*;

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name = "product") //테이블 자동 생성
public class ProductEntity {

    @Id
    String productId;

    String productName;

    Integer productPrice;

    Integer productStocks;
}

이 코드에서 중요한 부분은:

  • @Entity: JPA 엔티티임을 나타냅니다
  • @Id: 기본 키를 지정합니다
  • @Table: 테이블 이름을 지정합니다

2. 리포지토리 인터페이스 생성하기

Spring Data JPA를 사용하면 간단히 리포지토리 인터페이스를 생성하여 기본적인 CRUD 기능을 사용할 수 있습니다.

package sinecure.sheep.study.data.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import sinecure.sheep.study.data.entity.ProductEntity;

public interface ProductRepository extends JpaRepository<ProductEntity, String> {
    // 추가 메서드 필요시 여기에 정의
}

JpaRepository<엔티티클래스, ID타입>을 상속받으면 기본적인 메서드들을 사용할 수 있습니다.

3. DAO 패턴 구현하기

데이터 접근 계층을 구현하기 위해 DAO 패턴을 적용할 수 있습니다.

// DAO 인터페이스
package sinecure.sheep.study.data.dao;

import sinecure.sheep.study.data.entity.ProductEntity;

public interface ProductDAO {
    ProductEntity saveProduct(ProductEntity productEntity);
    ProductEntity getProduct(String productId);
}

// DAO 구현체
package sinecure.sheep.study.data.dao.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sinecure.sheep.study.data.dao.ProductDAO;
import sinecure.sheep.study.data.entity.ProductEntity;
import sinecure.sheep.study.data.repository.ProductRepository;

@Service
public class ProductDAOImpl implements ProductDAO {

    ProductRepository productRepository;

    @Autowired // 객체 주입 받기 (자동으로 연결시켜주는 어노테이션)
    public ProductDAOImpl(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    @Override
    public ProductEntity saveProduct(ProductEntity productEntity) {
        productRepository.save(productEntity);
        return productEntity;
    }

    @Override
    public ProductEntity getProduct(String productId) {
        ProductEntity productEntity = productRepository.getReferenceById(productId);
        return productEntity;
    }
}

여기서 주의할 점은:

  • getById() 메서드는 최신 Spring Data JPA에서 deprecated(권장하지 않음)됨
  • 대신 getReferenceById() 메서드를 사용

4. 데이터베이스 연결 설정하기

Spring Boot 애플리케이션에서 데이터베이스 연결을 위해서는 application.properties 파일에 적절한 설정이 필요합니다. 초기에는 다음과 같이 최소한의 설정만 했습니다:

spring.application.name=study

이 설정만으로는 데이터베이스 연결 정보가 없어 애플리케이션이 시작되지 않았습니다. 다음과 같은 오류가 발생했습니다:

Execution failed for task ':sinecure.sheep.study.StudyApplication.main()'. > Process 'command '/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

5. MySQL 데이터베이스 연결하기

MySQL을 사용하기 위해 다음과 같이 설정과 의존성을 추가했습니다:

  1. application.properties에 데이터베이스 연결 정보 추가:
spring.application.name=study

# 데이터베이스 설정
spring.datasource.url=jdbc:mysql://localhost:3306/spring?createDatabaseIfNotExist=true
spring.datasource.username=유저명
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

  2. MySQL 드라이버 의존성 추가

// build.gradle
implementation 'com.mysql:mysql-connector-j'

여기서 주의할 점:

  • 예전에는 mysql:mysql-connector-java로 사용했으나, 최신 버전에서는 com.mysql:mysql-connector-j로 변경되었습니다.
  • spring.jpa.hibernate.ddl-auto=update 설정은 테이블이 없을 때만 생성하고, 있다면 엔티티 변경사항만 업데이트합니다.

6. 자주 발생하는 오류와 해결 방법

6.1. @Entity 어노테이션 인식 안 됨

JPA 의존성 추가:
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

6.2. MySQL 드라이버 클래스 로드 실패

Cannot load driver class: com.mysql.cj.jdbc.Driver
  • MySQL 커넥터 의존성 추가: implementation 'com.mysql:mysql-connector-j'

6.3. 데이터베이스 찾을 수 없음

Unknown database '데이터베이스명'
  • URL에 createDatabaseIfNotExist=true 옵션 추가
  • 또는 직접 데이터베이스 생성: CREATE DATABASE spring;

7. JPA 테이블 생성 옵션

spring.jpa.hibernate.ddl-auto 값에 따라 테이블 생성 전략이 달라집니다:

  • create: 매번 애플리케이션 시작 시 테이블 삭제 후 재생성
  • create-drop: 시작 시 생성, 종료 시 삭제
  • update: 테이블이 없으면 생성, 있으면 필요한 변경사항만 적용 (안전모드)
  • validate: 엔티티와 테이블 구조 일치 여부만 확인
  • none: 아무 작업도 하지 않음

개발 단계에서는 update 옵션이 유용하며, 운영 환경에서는 validate 또는 none을 사용하는 것이 안전합니다.

결론

Spring Boot와 JPA를 사용한 데이터베이스 연동은 매우 편리하지만, 초기 설정 과정에서 여러 오류가 발생할 수 있습니다. 이 글에서 다룬 내용이 비슷한 문제를 겪는 분들에게 도움이 되길 바랍니다.

결과 이미지
결과 이미지

 

반응형