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 이 생성되어 값이 넣어지는 것을 확인할 수 있습니다.
데이터가 확실하게 들어갔는지 확인하기 위해 데이터베이스에서 다시 한번 확인해 보도록 하겠습니다.
이렇게 값이 들어 간걸로 확인할 수 있습니다.
'프로그래밍 > 스프링부트(springboot)' 카테고리의 다른 글
Spring으로 비디오 스트리밍 만들어보기 (4) | 2022.06.28 |
---|---|
[스프링부트/springboot] 스프링 부트 JPA로 CRUD 해보기 (0) | 2020.12.14 |
[스프링부트/springboot] 스프링 부트 배너 변경하기 (0) | 2020.12.12 |
[스프링 부트/ springboot ] @Controller, @RestController로 컨트롤러 클래스 작성하기 (0) | 2020.05.20 |
[스프링 부트/springboot] 스프링 부트 시작하기 , Gradle Project ( 인텔리 제이[IntelliJ] 사용) (0) | 2020.05.19 |