본문 바로가기

프로그래밍/스프링부트(springboot)

[스프링부트/springboot] 스프링 부트 JPA 설정해보기

 

JPA(Java Persistence API)

 

  • 자바 ORM 기술에 대한 표준 명세로, JAVA에서 제공하는 API이다.
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
  • 기존 EJB에서 제공되던 엔티티 빈을 대체하는 기술이다.
  • ORM이기 때문에 자바 클래스와 DB테이블을 매핑한다.

 

ORM? SQL Mapper?

 

  • ORM은 DB 테이블을 자바 객체로 매핑함으로 써 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해 주지만 Mappe는 SQL을 명시해주어야 한다.
  • ORM은 RDB의 관계를 Object에 반영하는 것이 목적이라면, Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.

 

JPA는 왜 사용해야 할까?

 

  • SQL 중심적인 개발에서 객체 중심적인 개발이 가능하다.
  • 생산성이 증가 ( 간단한 메소드로 CRUD가 가능하다 )
  • 유지보수가 쉽다. ( 기존에는 필드 변경시 모든 SQL을 수정해야한다. 하지만 JPA는 필드만 추가해 주면 됩니다. )

 

 

이제 인텔리제이로 스프링부트로 JPA 를 사용해보겠습니다.

 

 

 

 

build.gradle에 필요한 라이브러리들을 저는 이렇게 넣어 놨습니다.

 

buildscript {
    ext {
        // 스프링 부트 버전
        springBootVersion = "2.2.0.RELEASE"
    }
    repositories {
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" } // plugin 저장소
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
    }
}

plugins {
    id 'org.springframework.boot' version '2.2.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group 'com.example.spring'
version '0.0.1-SNAPSHOT'

sourceCompatibility = 11
targetCompatibility = 11

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mariadb.jdbc:mariadb-java-client'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

    compileOnly ('org.projectlombok:lombok')
    annotationProcessor ('org.projectlombok:lombok')

    runtimeOnly ('org.springframework.boot:spring-boot-devtools')
    runtimeOnly ('org.mariadb.jdbc:mariadb-java-client')

    testCompile ('org.springframework.boot:spring-boot-starter-test')
}

 

전체부분은 위를 참조해 주세요.

 

저는 개인적으로 자바 11 버전으로 설정을 해두었는데 8 이면 sourceCompatibility = 8 로 수정해주시면 됩니다.

그리고 DB는 마리아 디비 ( Maria DB )로 예를 들었습니다.

 

 

 

resources 폴더의 application.yml을 만들어 설정을 하도록 하겠습니다.

 

 

yml 는 properties 파일로 설정과 다르게 일열로 쓰기 보다는 다음 줄에 띄어 쓰기를 하여 구분을 합니다.

처음에 datasource: 로 되어 있는 곳은 mariaDB에 대한 정보를 써주었고요.

jpa: 로 설정이 되어 있는곳은 jpa 설정을 조금 써 넣었습니다.

마지막은 logging 설정을 조금 써놨습니다.

 

spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: '0000'
  jpa:
    database-platform: org.hibernate.dialect.MariaDBDialect
    generate-ddl: false
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        show_sql: true

#logging 설정
lgging:
  level:
    org:
      hibernate: info

 

 

 

jpa를 사용하기 위해서 domain 객체를 담아줄 객체를 만들어 줍니다.

 

 

 

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

import javax.persistence.*;
import java.util.Date;

@Getter
@Setter
@ToString
@Table(name = "Board")
@Entity
public class Board {

    @Id
    @GeneratedValue
    private Long seq;
    private String title;
    private String writer;
    private String content;

    @Temporal(value = TemporalType.TIMESTAMP)
    @Column(insertable=false, nullable=false, columnDefinition = "TIMESTAMP default CURRENT_TIMESTAMP")
    private Date createDate;

    @Column(insertable=false, nullable=false, columnDefinition = "bigint(20) default 0")                         //  기본값 0으로 설정
    private Long cnt;

}

 

 

저는 일단 Board 라는 테이블에 seq, title, writer, content, createDate, cnt 의 필드를 가진 테이블을 만들기 위해 이렇게 지정해 두었습니다.

 

 

 

 

그리고 repository 라는 폴더를 만들고, 안에 BoardRepository 라는 인터페이스를 만듭니다.

 

import blog.dev.example.domain.Board;
import org.springframework.data.repository.CrudRepository;

public interface BoardRepository extends CrudRepository<Board, Long> { }

 

그다음 스프링 부트를 실행해 줍니다.

 

 

 

 

 

실행을 하게 되면 db 테이블을 만들지 않아도 생성이 됩니다.

 

 

 

컬럼은 저희가 설정하였던 대로 생성이 되었습니다.

 

그 다음 application.yml에 ddl-auto: create 로 설정한 부분을 ddl-auto: update 로 해서 생성이 아닌 수정용으로 변경합니다.

 

 

 

 

spring boot 에서 잘 작동되는지 확인하기 위해 junit을 사용해 데이터를 넣어보겠습니다.

 

 

 

test 폴더에 만들어 주시고요.

 

import blog.dev.example.domain.Board;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class BoardRepositoryTest {

    @Autowired
    private BoardRepository boardRepo;

    @Test
    public void testInsertBoard() {
        Board board = new Board();
        board.setTitle("첫 번째 게시글");
        board.setWriter("이름~~");
        board.setContent("내용입니다.");

        boardRepo.save(board);
    }

}

 

이렇게 작성해 주었습니다.

 

인텔리제이 기준으로 옆에 재생버튼을 클릭해 주어 junit을 실행해줍니다.

 

 

 

 

실행하게 되면 밑에 log로 자동으로 insert sql 이 생성되어 값이 넣어지는 것을 확인할 수 있습니다.

데이터가 확실하게 들어갔는지 확인하기 위해 데이터베이스에서 다시 한번 확인해 보도록 하겠습니다.

 

 

이렇게 값이 들어 간걸로 확인할 수 있습니다.