취미로 음악을 하는 개발자

[Spring Framework] Spring Data JPA 엔티티 클래스 (Entity Class) 본문

공대인/Spring[Boot]

[Spring Framework] Spring Data JPA 엔티티 클래스 (Entity Class)

영월특별시 2019. 9. 29. 01:33
728x90

프로젝트 생성



* 프로젝트 생성 시 lombok, MySQL(자신이 쓰는 DB 설정하도록, 필자는 MySQL 5.6 사용), JPA 설정

  또, 필자는 스프링부트 2.1.9 버전을 사용중입니다.



// application.properties

1
2
3
4
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jpa_ex?useSSL=false
spring.datasource.username=user
spring.datasource.password=password
cs


jpa_ex 라는 스키마를 생성해주고 user라는 유저를 만들어 적당히 권한을 지정해준다.

그 후에 Boot02Application을 실행하면 아래와 같은 메시지가 출력된다.



지금처럼 하나의 DataSource를 구성하는 것은 단순하지만, 2개 이상의 DataSource를 구성하기 위해서는 보다 복잡한 설정을 추가해야한다.




엔티티 클래스 설계


관계형 데이터베이스에 데이터를 보관하려면 테이블을 생성해주어야 한다. 여기서는 SQL 처리 없이 클래스와 JPA 설정만으로 테이블을 생성하는 방식을 사용할 것이다. JPA의 엔티티 클래스를 생성하는 작업은 아래와 같은 과정을 거친다.


1. 객체지향의 설계대로 클래스들을 설계

2. @Id, @Column 등을 이용해서 각종 제약 조건을 추가하고 설정

3. 엔티티 간의 연관관계를 설정



어노테이션

설명 

 @Id

  각 엔티티를 구별할 수 있도록 식별 ID를 가지게 설계

 @Column

 데이터베이스의 테이블을 구성할 때 인스턴스 변수가 컬럼이 되기 때문에 원한다면 컬럼명을 별도로 지정하거나 컬럼 사이즈, 제약 조건들을 추가하기 위해서 사용

 @Table

 클래스가 테이블이 되기 때문에 클래스의 선언부에 작성하여 테이블 명을 어떻게 지정할지 결정합니다. 만일 @Table이 지정되지 않으면 클래스 이름과 동일한 이름의 테이블이 생성됩니다.

 @Entity

 해당 클래스의 인스턴스들이 엔티티임을 명시


우선 클래스 선언부에 반드시 @Entity가 설정되어야 한다. @Entity는 해당 클래스가 엔티티 클래스임을 명시.

@Table을 설정하는 경우에는 기본적으로 데이터베이스에 클래스명과 동일한 이름으로 생성되는데 다른 이름으로 지정할 때 사용


@Id


: 가장 중요한 어노테이션으로, 해당 컬럼이 식별키(Primary Key, PK)라는 것을 의미. 모든 엔티티에 지정해주도록 한다.

식별키 지정하는 방식은 꽤 다양한데 일반적으로 아래와 같다.

1) 사용자가 직접 지정

2) 자동으로 생성되는 번호 등을 이용

3) 별도의 방법으로 필요한 데이터를 생성하는 방식

* 오라클에는 Sequence를 사용, MySQL은 Auto Increment를 사용


@Id는 주로 @GeneratedValue라는 어노테이션과 같이 이용해서 식별키를 어떤 전략으로 생성하는지를 명시함

@GeneratedValue는 strategy 속성과 generator 속성으로 구분함

 strategy

 AUTO, TABLE, SEQUENCE, IDENTITY 

 generator

 @TableGenerator, @SequenceGenerator


@GeneratedValue


: 식별키의 생성 전략을 지정. strategy 속성으로 식별키를 어떤 방식으로 부여하는지를 결정

AUTO            특정 데이터베이스에 맞게 자동으로 생성되는 방식

IDENTITY        기본 키 생성 방식 자체를 데이터베이스에 위임하는 방식, MySQL에서 주로 사용

SEUENCE        데이터베이스의 시퀀스를 이용해서 식별키 생성, 오라클에서 주로 사용

TABLE            별도의 키를 생성해주는 번호 테이블을 이용하는 방식



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package org.zerock.domain;
 
import java.sql.Timestamp;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
 
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
 
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
 
@Getter
@Setter
@ToString
@Entity
@Table(name="tbl_boards")
public class Board {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long bno;
    private String title;
    private String writer;
    private String content;
    
    @CreationTimestamp
    private Timestamp regdate;
    @UpdateTimestamp
    private Timestamp updatadate;
}
cs


Lombok을 이용해서 필요한 함수를 생성해 주었기 때문에 클래스의 코드 자체는 아주 간단하다.

보통 엔티티 클래스의 시간을 처리할 때 java.time.LocalDateTime을 이용하는 것이 일반적이지만,

여기서는 화면 처리 등에서 좀 더 편리하도록 Timestamp 타입을 이용할 것이다.


게시물 작성 시간과 최종 수정 시간을 의미하는 코드를 보면 @CreationTimestamp와 @UpdateTimestamp라는 어노테이션을 사용했다. 이 두 개는 javax.persistence가 아닌 orghibernate로 시작하는 패키지의 것이다.

이것은 Hibernate의 고유한 기능으로 엔티티가 생성되거나 업데이트 되는 시점의 날짜 데이터를 기록하는 설정이다.


스프링 부트에서는 별다른 설정이 없어도 기본 패키지 하위에 포함된 패키지들을 자동으로 조사하기 때문에 추가적인 설정은 필요없다. 대신 JPA와 관련된 설정을 application.properties에 추가한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jpa_ex?useSSL=false
spring.datasource.username=user
spring.datasource.password=password
 
# 스키마 생성(create)
spring.jpa.hibernate.ddl-auto=create
# DDL 생성 시 데이터베이스 고유의 기능을 사용하는가?
spring.jpa.generate-ddl=false
# 실행되는 SQL문을 보여줄 것인가?
spring.jpa.show-sql=true
# 데이터베이스는 무엇을 사용하는가?
spring.jpa.database=mysql
 
# 로그 레벨
logging.level.org.hibernate=info
# MySQL 상세지정
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
cs


spring.jpa.hibernate.ddl-auto는 데이터베이스에 구조를 생성하는 DDL을 처리하는 옵션을 지정한다

create          기존 테이블 삭제 후 다시 생성

create-drop   create와 같으나 종료 시점에 테이블 DROP

update         변경된 부분만 반영

validate        엔티티와 테이블이 정상적으로 매핑되었는지만 확인

none            사용하지 않음


spring.jpa.show-sql은 프로그램 실행할 때 동작하는 SQL문의 로그를 보여주기 때문에 개발을 할 때는 true로 지정하면 좋다.

위의 설정으로 바꾸고 프로젝트를 실행해보면 테이블을 새성하는 SQL문이 동작하는 모습을 볼 수 있다.




JPA로 프로젝트를 하기 위해서는 테이블 생성을 자동으로 할 것인지, 수동으로 할 것인지 고민할 필요가 있다.

일반적인 JDBC나 MyBatis 등은 수동으로 테이블을 생성하지만, JPA는 자동으로 생성할 수도 있다.


큰 규모의 프로젝트라면 테이블을 별도로 생성하고, 코드를 작성하는 것이 일반적이지만 JPA는 학습 곡선이 가파르기 때문에 

익숙하지 않은 상태라면 테이블 생성을 create나 update 등을 이용해서 처리하고 충분히 연습한 후에 테이블을 생성하고 코드를 작성하는 방식으로 익숙해지는 것이 좋다.



참고: 초급 개발자들을 위한 가볍고 넓은 스프링부트, 스타트 스프링 부트



Comments