[Spring Data] JPA (1) - 환경셋팅 / Entity 클래스 만들기

k·2024년 2월 7일
0

spring data

목록 보기
1/5

JPA가 뭘까?

JPA는 "Java Persistence Api"로써, 자바에서 데이터를 영구적으로 저장하기 위한 표준 인터페이스를 제공하는 API이다.

JPA는 객체와 관계형 데이터베이스(RDB) 간의 매핑(Mapping)을 지원하며, 데이터베이스에 대한 독립성을 제공하는 ORM(Object-Relational Mapping) 기술의 한 형태이다.

JPA를 왜 사용하는걸까?

  • 비즈니스 측면으로 봤을 때, 유지 보수 및 확장성이 탁월
  • 복잡한 SQL문 회피 가능 ( DAO를 통한 함수 접근 )
  • 표준화된 인터페이스 제공
  • 데이터의 일관성과 영속성 관리 가능

간단하게 이야기하면 간편하고 효율적으로 DB에 대한 접근을 가능하게 하기 때문에 JPA를 사용하는 것을 지향한다.

H2 데이터베이스에 대한 소개

H2 데이터베이스는 순수 Java로 구현되어 가벼우면서 내장형으로 사용될 수 있는 특징을 가지고 있다. 여러 환경에서 사용되며, 특히 테스트 및 개발 용도로 널리 사용된다.

H2 데이터베이스는 mysql 과 같은 관계형 데이터베이스(RDB)와의 마이그레이션이 편리하기 때문에 초기에 H2 데이터베이스를 사용하려한다.

환경 셋팅

0. build.gradle 의존성 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
}

1. application.yml 작성

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 마다 사용되는 문법에 관련된 부분이다.
  • datasourcedatasource
    datasourcedatasource는 데이터베이스의 연결 정보를 적는 섹션
    • url
      • h2:mem
        • In-memory h2 데이터베이스를 사용
      • testdb
        • 데이터베이스 이름
    • driver-class-name
      • org.h2.Driver 라는 H2 데이터베이스의 클래스 드라이버
    • username
      • DB 연결시 계정
    • pasword
      • DB 연결시 비밀번호
  • h2h2
    h2h2는 h2-console에 대한 활성화 여부를 설정하기 위한 섹션
    • console.enabled를 true로 함으로써 h2-console 페이지 접근 가능
  • jpajpa
    jpajpa는 "java persistence api"를 설정
    • hibernate.ddl-auto
      • 하이버네이트 DDL 생성 전략 설정가능
        • update
          어플리케이션 실행시 기존의 내용에서 변경된 사항만 변경
        • create
          어플리케이션 실행시 생성(존재하면 삭제 후 생성)
        • create-drop
          어플리케이션 실행시 생성, 종료시 삭제
    • hibernate.show-sql
      • 하이버네이트가 생성하는 sql을 콘솔에 출력하지 여부[true, false]

2. h2-console 접근

http://localhost:8080/h2-console 로 접근해보자.

위처럼 뜨면 성공이다. 만약 위에 처럼 뜨지않는다면, h2.console.enabled 를 false로 해놓았을 가능성이 있다. 한번 확인해보면 좋을 것이다.

JDBC URL은 본 필자는 추후 마이그레이션을 위해서 In-Memory 형태로 h2를 진행하기 위해서 url을 설정을 한 상태이기 때문에, 그대로 따라했다면 별 이상 없을 것이다.

아까 설정한 username과 password 입력 후 connect를 진행한다.

위와 같이 뜨면 h2-console 접근에 성공한 것이다.

이제부터 본격적으로 Entity를 만들어 보도록 하곘다.

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;
}

Column 생성시 사용되는 "기본 어노테이션"

  • @Entity
    해당 클래스를 JPA Entity로 지정하기 위해서 선언한다.
  • @Table
    Entity 클래스와 맵핑되어 있는 데이터베이스 테이블의 세부정보 설정할 수 있다.
    (테이블명, 스키마, 인덱스 등을 설정 가능)
  • @Index
    테이블에 인덱스를 설정할 수 있다.

    columnList = "column1, column2" 는 조합 인덱스이다. columnList = "column1" 는 일반 인덱스이다.

    unique = true 옵션으로 고유 인덱스를 만들 수 있다.

  • @Id
    @Entity가 선언되어 만들어진 클래스에 필수적으로 필요한 요소이다.

    보통 Primary Key 라고 불린다.

  • @GeneratedValue
    컬럼의 값을 전략에 따라 자동으로 생성할 때 사용된다.

    GenerationType.IDENTITY 전략을 많이 사용한다.
    Mysql에서 auto_increment와 동일한 동작을 수행한다.

  • @Column
    엔터티 클래스의 필드를 데이터베이스 테이블의 컬럼과 매핑한다.

    특정 컬럼명, 길이, 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:

해결 방법

위와 같은 오류 발생시 다음 링크내에 내용에 따라 해결 할 수 있다.

https://velog.io/@knu-kang/Trouble-Shooting-Caused-by-org.h2.jdbc.JdbcSQLSyntaxErrorException-Syntax-error-in-SQL-statement-해결

Entity가 로드되었는지 확인

위의 코드를 잘 작성했다면, 어플리케이션을 실행해보자.

http://localhost:8080/h2-console 에 접속해서 테이블이 정상적으로 들어왔는지 확인해보자.

위와 같이 확인이 되면, Entity가 H2 In-Memory내에 정상적으로 로드가 된 것이다.

profile
You must do the things you think you cannot do

0개의 댓글