Spring Data JPA #3 Spring Data JPA를 위한 프로젝트 생성 #1

2021. 10. 1. 15:13JAVA/Spring

본 글은 스타트 스프링 부트 도서의 내용을 복습하기 위해 작성된 글입니다.

0. SpringBoot 프로젝트 생성

File->New->Spring Starter Project

Lombok, Spring Data JPA, MySQL Driver 라이브러리 선택

 

1. 프로젝트 실행과 DataSource 설정

스프링 부트에 JDBC와 같은 추가 라이브러리를 포함해서 이용 시 가장 큰 제약은 실행이 안되는다는 점입니다. 이유는 데이터베이스 관련 설정이 전혀 없기 때문에 프로젝트를 실행할 수 없습니다. 이를 해결하기 위해서는 우선 필요한 데이터베이스를 구성하고 DataSource를 지정해 주어야 합니다.

 

1.1 MySQL 설정

데이터베이스에 접속해서 새로운 스키마 생성

새로운 사용자 계정 생성

Navigator->Administration->Users and Privilleges->Add Account->사용자 계정 생성

jpa_user 사용자 권한 설정

 

1.2 DataSource 설정

현재 프로젝트가 실행이 안되는 이유는 스프링 부트 내에 JDBC 등의 설정이 포함되어 있는데, 이에 대한 설정이 전혀 없기 때문입니다. 따라서 개발자는 프로젝트에서 기본적으로 사용할 DataSource에 대한 설정을 지정해주어야 합니다. 이 설정 방식은 크게 다음과 같은 방법이 있습니다.

  • 프로젝트 생성 시 포함되어 있는 application.properties를 이용해서 필요한 구성을 설정하는 방법
  • @Bean과 같은 어노테이션을 이용해서 Java 코드를 통해 필요한 객체를 구성하는 방법

본 글에서는 application.properties를 이용해서 데이터베이스 설정을 구성합니다.

 

application.properties 열기

application.properties 파일에 datasource 설정 입력

위의 설정에서 드라이버 클래스 이름을 입력 시 MySQL Driver가 6.0이상인 경우 위와 같이 설정합니다. 그 아래 버전인 경우에는 드라이버 클래스 이름이 다를 수 있습니다. (com.mysql.jdbc.Driver)

 

실행확인 (Boot02Application.java 실행)

 

2. 엔티티 클래스 설계

JPA는 자동으로 테이블을 생성할 수 있는 기능을 가지고 있으므로 1) SQL을 이용해서 테이블을 먼저 생성하고 엔티티 클래스를 만드는 방식이나, 2) JPA를 이용해서 클래스만 설계하고 자동으로 테이블을 생성하는 방식을 모두 사용할 수 있습니다. 예제에서는 SQL 처리 없이 클래스와 JPA 설정만으로 테이블을 생성하는 방식을 사용합니다.

 

JPA의 엔티티 클래스 생성하는 작업과정

  1. 객체지향의 설계대로 클래스들을 설계합니다.
  2. @Id, @Column 등을 이용해서 각종 제약 조건을 추가하고, 설정합니다.
  3. 엔티티 간의 연관관계를 설정합니다.

2.1 엔티티 클래스 설계

'org.zerock.domain' 패키지 생성하고 Board 클래스 생성

package org.zerock.domain;

import java.sql.Timestamp;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@Entity
@Table(name="tbl_boards")
public class Board {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long bno;
	private String title;
	private String writer;
	private String content;
	
	@CreationTimestamp
	private Timestamp regdate;		// LocalDateTime
	@UpdateTimestamp
	private Timestamp updatedate;	// LocalDateTime
}

 

2.2 JPA를 위한 어노테이션 추가

Java 코드로 클래스를 생성했다면 다음 단계는 클래스에 적절한 어노테이션을 적용해 JPA에서 필요한 정보들을 설정하는 것입니다.

그중에서 대표적인 어노테이션과 설명은 아래와 같습니다.

  • @Id : 각 엔티티를 구별할 수 있도록 식별 ID를 가지게 설계합니다.
  • @Column : 데이터베이스의 테이블을 구성할 때 인스턴스의 변수가 칼럼이 되기 때문에 원한다면 칼럼명을 별도로 지정하거나 칼럼의 사이즈, 제약 조건들을 추가하기 위해서 사용합니다.
  • @Table : 클래스가 테이블이 되기 때문에 클래스의 선언부에 작성하여 테이블명을 어떻게 지정할지 결정합니다. 만일 @Table이 지정되지 않으면 클래스 이름과 동일한 이름의 테이블이 생성됩니다.
  • @Entity : 해당 클래스의 인스턴스들이 엔티티임을 명시합니다.
  • @GeneratedValue : 식별키의 생성 전략을 지정합니다. strategy라는 속성을 이용해서 식별키를 어떤 방식으로 부여하는지를 결정할 수 있습니다.
    • strategy : AUTO, TABLE, SEQUENCE, IDENTITY
      • AUTO : 특정 데이터베이스에 맞게 자동으로 생성되는 방식
      • IDENTITY : 기본 키 생성 방식 자체를 데이터베이스에 위임하는 방식, 데이터베이스에 의존적인 방식, MySQL에서 주로 많이 사용
      • SEQUENCE : 데이터베이스의 시퀀스를 이용해서 식별키 생성(오라클에서 사용)
      • TABLE : 별도의 키를 생성해주는 채번 테이블(번호를 취할 목적으로 만든 테이블)을 이용하는 방식
    • generator : @TableGenerator, @SequenceGenerator

@Column, @Table 어노테이션의 속성 및 다른 어노테이션에 대한 설명은 아래 링크로 보실수 있습니다.

https://www.datanucleus.org/products/accessplatform_6_0/jpa/annotations.html

 

JPA Annotations Reference (v6.0)

JPA annotations are all usable as part of meta-annotations. A meta-annotation is, in simple terms, a user-defined annotation that provides one or multiple other annotations (including annotation attributes). Let’s provide a couple of examples @Entity @Ca

www.datanucleus.org

 

2.3 application.properties에 JPA 설정

스프링 부트에서는 별다른 설정이 없어도 기본 패키지 하위에 포함된 패키지들을 자동으로 조사하기 때문에 작성된 엔티티용 클래스나 프로젝트와 관련된 추가적인 설정은 필요하지 않습니다. 대신에 JPA와 관련된 약간의 설정을 application.properties 파일에 추가해 줍니다.

 

위 설정을 한 후 프로젝트를 실행해보면 스프링 부트가 동작하면서 테이블을 생성하는 SQL문이 동작하는 모습을 볼 수 있습니다.

 

spring.jpa.hibernate.ddl-auto 옵션 종류

  • create : 기존 테이블 삭제 후 다시 생성
  • create-drop : create와 같으나 종료 시점에 테이블 DROP
  • update : 변경된 부분만 반영
  • validate : 엔티티와 테이블이 정상적으로 매핑되었는지만 확인
  • none : 사용하지 않음

 

References

스타트 스프링 부트, 구멍가게 코딩단 저