[wisestudy] JPA/Hibernate 적용하기

getch_·2020년 6월 10일
0

ToyProject

목록 보기
3/5

Spring Boot에서 JPA/Hibernate를 사용하여 데이터베이스 연결

이전 포스트에 이어 Spring Boot에서 JPA/Hibernate를 적용하여 테이블 생성을 진행합니다.

로컬 데이터베이스 연동을 기준으로 합니다.

Table of Contents

  • JPA/Hibernate란
  • JPA/Hibernate 설정
  • MySQL 연결 테스트

JPA/Hibernate란

JPA

  • Java Persistence API (자바 ORM 기술에 대한 표준 명세)
  • 즉, ORM을 사용하기 위한 인터페이스의 모음
  • 인터페이스를 사용하여 ORM을 사용하기 위한 자바 API 규격(규칙/규약)을 명세한 것

Hibernate

  • JPA를 구현한 ORM 프레임워크
  • 즉, JPA를 기반으로 ORM을 사용하기 위한 실제 기능들을 구현한 인터페이스 모음
  • Hibernate 외에도 OpenJPA, EclipseLink 등이 있음

ORM이란?

  • Object-Relational Mapping, 객체와 RDB의 테이블을 연결하는 것
  • 즉, 모델 객체와 DB 테이블을 연결함으로써, 데이터베이스 관련 기술을 코드로 구현/관리 할 수 있도록 하는 기술
  • SQL Query가 아닌 자바 코드(메서드)로 데이터 조작이 가능
  • 물론, SQL Query도 사용할 수 있지만, @Query와 같은 Annotation으로 코드에서 사용할 수 있음

JPA/Hibernate 설정

1. maven dependency 설정

<dependencies>
	...
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<scope>runtime</scope>
	</dependency>
	...
</dependencies>
  • spring-boot-starter-data-jpa: JPA/Hibernate 의존성 설정
  • mysql-connector-java: MySQL용 JDBC 커넥터(드라이버) 의존성 설정

2. properties 설정

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/wisestudy?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
spring.datasource.username=wisestudy
spring.datasource.password=wise$tudy
spring.datasource.initialization-mode=always
spring.datasource.dbcp2.validation-query=SELECT 1

spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.open-in-view=false
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true

spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.format_sql=true

logging.level.web=DEBUG
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.BasicBinder=TRACE
  • datasource: JDBC 드라이버 설정, driver-class, DB 접속 정보 설정
  • jpa: JPA 관련 설정, O-R 매핑을 위한 DB 플랫폼 정보 설정, 테이블 생성 관련 설정
  • jpa.hibernate: Hibernate 구현체에 대한 설정, DDL 사용, SQL 로그 출력 형식 설정 등
  • logging.lovel.org.hibernate: Hibernate 런타임 로그 관련 설정

※ 상세 설정 정보는 검색을 통해 확인 부탁드립니다.


MySQL 연결 테스트

1. 도메인 객체 작성

  • 테이블 생성이 정상적으로 되는지 확인할 도메인 객체 생성
  • 샘플 코드
@Entity
@Table
@Getter
@Setter
public class User {

    @Id
    @Column(name = "user_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 50)
    private String email;

    @Column(nullable = false, length = 20)
    private String password;

    @Column(nullable = false, length = 20)
    private String name;

    @Column(name = "birthday")
    private LocalDate birth;

    @Column(name = "cell_phone", nullable = false, length = 20)
    private String cellPhone;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false, columnDefinition = "enum('FEMALE', 'MALE')")
    private Gender gender;
}
  • Annotation 설명
    • @Entity: 테이블에 대응되는 도메인 클래스를 의미, JPA가 동작할 때, 데이터를 다루는 작업 단위이기도 함
    • @Table: 테이블을 생성할 때 사용할 정보를 기술할 수 있음, 기술하지 않으면 클래스 명으로 테이블을 생성
    • @Id: Primary Key를 지정
    • @GeneratedValue: Primary Key 컬럼의 데이터를 삽입할 때, 사용할 전략, GenerationType.IDENTITY로 지정 시 PK 생성 전략을 데이터베이스에 위임
    • @Enumerated: Enum 타입을 사용시 지정

Annotation에 관련된 내용은 JPA/Hibernate 관련 서적 또는 검색을 통해 보다 자세히 알아보시면 좋습니다. :D
GenerationType.IDENTITY는 Spring Boot 2.0, Hibernate 5.0에서부터 GenerationType.AUTO가 IDENTITY 방식이 아닌 TABLE 방식이 기본 값으로 변경되었습니다.

2. 초기 더미 데이터 생성

  • properties 설정 추가
spring.jpa.properties.hibernate.hbm2ddl.import_files=classpath:sql/init-import.sql
spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
  • ...import_files: 데이터 삽입 SQL 파일 지정
  • ...import_files_sql_extrator: SQL 추출기 지정, 여기서는 멀티라인 추출기 사용, SQL 포멧을 보기 쉽게 하기 위해서 지정함
  • SQL 작성
    • /src/main/resources/sql/init-import.sql로 설정
    • Query 작성
    INSERT INTO
      `user` (`name`, `email`, `password`, `birthday`, `cell_phone`, `gender`)
    VALUES 
      ('TestUser1', 'test1@test.com', 'test1234', now(), '010-1234-5678', 'MALE');

3. SpringBoot 실행 로그 확인

  • org.hibernate.dialect.Dialect: Properties에 설정한 MySQL5InnoDBDialect 확인
  • org.hibernate.SQL 관련 로그 확인

참고

profile
한꺼번에 몰아치지 아니하고 오래도록.

2개의 댓글

comment-user-thumbnail
2021년 1월 31일

이 글 보고 안되던거 드디어 해결했습니다 알라븅 뽀뽀 쪽

1개의 답글