JPA는 "Java Persistence Api"로써, 자바에서 데이터를 영구적으로 저장하기 위한 표준 인터페이스를 제공하는 API이다.
JPA는 객체와 관계형 데이터베이스(RDB) 간의 매핑(Mapping)을 지원하며, 데이터베이스에 대한 독립성을 제공하는 ORM(Object-Relational Mapping) 기술의 한 형태이다.
간단하게 이야기하면 간편하고 효율적으로 DB에 대한 접근을 가능하게 하기 때문에 JPA를 사용하는 것을 지향한다.
H2 데이터베이스는 순수 Java로 구현되어 가벼우면서 내장형으로 사용될 수 있는 특징을 가지고 있다. 여러 환경에서 사용되며, 특히 테스트 및 개발 용도로 널리 사용된다.
H2 데이터베이스는 mysql 과 같은 관계형 데이터베이스(RDB)와의 마이그레이션이 편리하기 때문에 초기에 H2 데이터베이스를 사용하려한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.h2database:h2'
}
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password: password
h2:
console:
enabled: true
jpa:
hibernate:
ddl-auto: update
show-sql: true
database-platform: org.hibernate.dialect.H2Dialect
# database-platform은 추론해서 해주지만, 가끔 오류가 뜰 떄도 있다.
# 이 때, 이 부분을 추가하면 해결된다.
# dialect는 방언이라는 의미로 각 DB 마다 사용되는 문법에 관련된 부분이다.
http://localhost:8080/h2-console 로 접근해보자.
위처럼 뜨면 성공이다. 만약 위에 처럼 뜨지않는다면, h2.console.enabled 를 false로 해놓았을 가능성이 있다. 한번 확인해보면 좋을 것이다.
JDBC URL은 본 필자는 추후 마이그레이션을 위해서 In-Memory 형태로 h2를 진행하기 위해서 url을 설정을 한 상태이기 때문에, 그대로 따라했다면 별 이상 없을 것이다.
아까 설정한 username과 password 입력 후 connect를 진행한다.
위와 같이 뜨면 h2-console 접근에 성공한 것이다.
이제부터 본격적으로 Entity를 만들어 보도록 하곘다.
dependencies {
annotationProcessor 'org.projectlombok:lombok'
...
}
만약 lombok이 깔려있지않다면 build.gradle에 위 요소를 추가해주자.
lombok은 간단하게 말하면 코드를 조금 더 가독있고 짧게 줄여줄 수 있는 도우미 역할 정도로 생각하면 좋을 것 같다.
아래의 코드를 먼저 작성해보자.
//User.java
@Entity
@Table(name = "USER", indexes = {
@Index(name="idx_userid_username", columnList = "u_id, u_name", unique= true),
@Index(name="idx_username", columnNames="u_name")
})
class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
@Column(name = "u_id", nullable = false, unique = true, length = 255)
String userId;
@Column(name = "u_pw", nullable = false, length = 255)
String userPw;
@Column(name = "u_name", nullable = false, length = 255)
String userName;
}
columnList = "column1, column2" 는 조합 인덱스이다. columnList = "column1" 는 일반 인덱스이다.
unique = true 옵션으로 고유 인덱스를 만들 수 있다.
보통 Primary Key 라고 불린다.
GenerationType.IDENTITY 전략을 많이 사용한다.
Mysql에서 auto_increment와 동일한 동작을 수행한다.
특정 컬럼명, 길이, null 허용 여부 등을 설정할 수 있다.
에러 내용
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "create table [*]user (id integer generated by default as identity, u_id varchar(255) not null, u_name varchar(255) not null, u_pw varchar(255) not null, primary key (id))"; expected "identifier"; SQL statement:
해결 방법
위와 같은 오류 발생시 다음 링크내에 내용에 따라 해결 할 수 있다.
위의 코드를 잘 작성했다면, 어플리케이션을 실행해보자.
http://localhost:8080/h2-console 에 접속해서 테이블이 정상적으로 들어왔는지 확인해보자.
위와 같이 확인이 되면, Entity가 H2 In-Memory내에 정상적으로 로드가 된 것이다.