본문 바로가기

Tech

[JAVA] Spring Boot + JPA + H2를 사용한 RestAPI 만들기 예제

앞선 JPA 소개에 이어, 실제 코드는 어떻게 구현되어 데이터를 핸들링 하는지 살펴보고자 합니다.

간단한 메모용 CRUD RestAPI를 구현하기 위해 Spring boot를 사용하며, Data Access Layer는 JPA를 사용하겠습니다.

그리고 DB는 로컬개발용도인 H2 를 사용하겠습니다.(배포 profile 으로는 MySQL로 설정했음)

 

이 구성으로 실무에 사용해보진 못했는데,

공모전 프로젝트로 블럭체인 키 관리 어플리케이션 구현할때, 2명이 협업하며 쉽고 빠르게 제작이 가능했습니다.

2명은 서로 다른 플랫폼(MacOS 와 Windows10) 에서 별도 개발서버 없이 완벽한 크로스플랫폼 로컬 환경으로 개발 및 배포가 가능했습니다.

 

이번 지식공유를 위한 완성된 샘플 소스는 제 깃헙에 올려뒀으며,

아래 요구사항만 로컬에 설치 되어 있으면 동작합니다.

 

- Java 8

- Maven 3.x

- H2 

 

Github :

https://github.com/forfido/mysql-docker

 

 

 

Spring Boot Initialize을 사용하여 메이븐 프로젝트를 만듭니다.

Spring boot Initialize를 통해 기본 프로젝트 생성하는 방법은 여러가지(URL, IntelliJ, VSCode, STS) 있으니,

선호하는 방법대로 사용하면 되니 생략합니다.

이번 샘플 프로젝트에서 사용한 속성들은 다음과 같습니다.

 

  • Group : com.yhk.docksql
  • Artifact : demo
  • Name : yhk-mysql
  • Description : Rest API for JPA geesik
  • Package Name : com.yhk.docksql.demo
  • Packaging : jar 
  • Java Version : 1.8
  • Dependencies : Web, JPA, h2

(네이밍에 docker, mysql 이 들어간 이유는 다음에 연재되는 글에서 사용될 겁니다^^)

 

DataBase 및 JPA 설정

application.properties 대신, application.yml 으로 파일명 변경하여 사용하겠습니다.

 

spring:
  profiles:
    active: local


---
spring:
  profiles: local

  datasource:
    url: jdbc:h2:tcp://localhost:9092/mem:testdb;
    username: sa
    password:
    driver-class-name: org.h2.Driver

  ## Hibernate Properties
  # The SQL dialect makes Hibernate generate better SQL for the chosen database
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect

    # Hibernate ddl auto (create, create-drop, validate, update)
    hibernate:
      ddl-auto: update

 

▶ spring.profiles.active : local 

 빌드 시, 활성화된 profile은 local이다 라고 명시합니다.

 

▶ h2는 2가지 실행모드가 있습니다.

어플리케이션이 실행될때 런칭되는 임베디드 모드(port 8082) 와

OS에서 백그라운드에서 실행되는 서버 모드 (port 9092)

 

저는 서버 모드가 좋았습니다.

왜냐하면 임베디드 모드에서 DB쿼리를 하기 위해서는 웹콘솔로 접근해야 하는 불편함이 있습니다.

(임베디드는 실행 중인 어플리케이션을 죽이면 DB도 죽어서 쿼리도 못함)

 

그래서 서버 모드로 H2를 실행 후 Intellij IDE의 SQL창에서 쿼리하면 편합니다.

자세한 방법은 여길 참조(https://jojoldu.tistory.com/234)

 

dialect: org.hibernate.dialect.H2Dialect

jpa 에서 사용할 SQL 구문 벤더를 H2로 지정합니다.

 

 jpa.hibernate.ddl-auto = update

어플리케이션이 실행될때  DB Table 스키마를 자동 생성 및 업데이트 하겠다는 의미입니다.

(개발환경에서만 사용해야함!)

 

Note 모델(Entity) 만들기

  • @Entity : 자바 객체를 DB 테이블로 영속성 관리 하기 위해서는 이 Entity 어노테이션이 필요합니다
  • @Table : 이 Entity가 매핑될 테이블의 세부사항을 정의할 수 있습니다.
  • @Id : Primary Key를 정의
  • @GenerateValue : 기본키 생성 전략을 지정합니다
  • @NotBlank : Null이거나 공백문자인지 여부를 검증합니다
  • @Column : 이 어노테이션이 없어도 테이블 컬럼으로 매핑이 되지만, 상세한 컬럼 속성을 지정할 수 있습니다.

    그리고 기본적으로 regDate 필드는 데이터베이스에서 REG_DATE 또는 reg_date 라는 컬럼명으로 매핑됩니다. 즉 CamelCase 는 _ (밑줄)로 바뀝니다.

    만약 다른 이름을 지정하고 싶다면,

    @Column(name = "created_on")
    private String createdAt;
  • @Temporal :