DB 설정을 위해 먼저 MYSQL Server와 MYSQL Workbench을 설치했다.
그 다음 MYSQL Workbench에서 새로운 MYSQL Connection을 생성하고, 생성된 Connection에서 DB를 새로 생성한다.
create database project;
생성된 DB를 확인하는 방법: show databases;
application.properties
# 콘솔에 SQL문 출력 여부
spring.jpa.show-sql=true
# DDL(create, alter, drop) 정의시 DB의 고유 기능을 사용할 수 있다.
spring.jpa.hibernate.ddl-auto=create
# logger를 통해 하이버네이트 실행 SQL을 남긴다.
spring.jpa.properties.hibernate.format_sql=true
# Mysql 사용
spring.jpa.database=mysql
spring.datasource.url=jdbc:mysql://localhost:3306/project?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
spring.datasource.username=<username>
spring.datasource.password=<password>
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=create
엔티티 클래스 개발 후 hibernate가 생성하는 DDL을 참고해서 DDL을 작성할 것이기 때문에, 지금은 ddl-auto
를 create
로 설정했다. DDL을 작성한 이후에는 MYSQL에 테이블을 미리 생성해놓고 ddl-auto
옵션을 update
로 변경할 것이다.
hibernate.ddl-auto
속성
create
: 기존 테이블을 삭제하고 새로 생성 (DROP + CREATE)create-drop
: CREATE 속성에 추가로 어플리케이션을 종료할 때 생성한 DDL을 제거 (DROP + CREATE + DROP)update
: DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정validate
: DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않음none
: 자동 생성 기능을 사용하지 않음
주의사항
- 개발 초기 단계는
create
또는update
- 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버는
create
또는create-drop
- 테스트 서버는
update
또는validate
- 스테이징과 운영 서버는
validate
또는none
참고: [JPA] Hibernate 엔티티(Entity) 매핑하기
BoardApplication을 실행하면, 아래와 같이 정상적으로 실행되는 것을 볼 수 있다.
도메인 패키지 생성 후 User
엔티티와 Board
엔티티를 개발한다.
User.java
package hello.board.domain;
import lombok.Getter;
import javax.persistence.*;
@Entity
@Getter
@Table(name = "users")
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;
private String loginId;
private String password;
private String name;
private int age;
}
@Entity
: DB의 테이블과 매핑@Table
: DB 테이블의 이름을 명시users
로 변경한다.@Id
: Primary Key를 뜻함@GeneratedValue
: Primary Key의 키 생성 전략(Strategy)을 설정하고자 할 때 사용GenerationType.IDENTITY
: 기본 키 생성을 데이터베이스에 위임한다. Entity를 등록할 때 DB에서 AUTO_INCREAMENT 하여 PK를 생성 후 INSERT 한다.GenerationType.AUTO(default)
: 기본값으로 DB 방언에 맞춰 자동으로 설정하여 준다.(default)SEQUENCE
, MySQL DB 선택 시 IDENTITY
사용GenerationType.SEQUENCE
: DB의 SEQUENCE를 이용해서 키를 생성. @SequenceGenerator와 같이 사용GenerationType.TABLE
: 키 생성 전용 테이블을 생성해서 키 생성. @TableGenerator와 함께 사용@Column
: DB Column을 명시Board.java
package hello.board.domain;
import lombok.Getter;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Getter
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "board_id")
private Long id;
private String title;
private String content;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private LocalDateTime registerDate;
}
애플리케이션을 실행하면 콘솔에서 hibernate가 생성한 테이블의 DDL을 확인할 수 있다.
drop table if exists board
drop table if exists user
create table board (
board_id bigint not null auto_increment,
content varchar(255),
register_date datetime(6),
title varchar(255),
user_id bigint,
primary key (board_id)
) engine=InnoDB
create table user (
user_id bigint not null auto_increment,
age integer not null,
login_id varchar(255),
name varchar(255),
password varchar(255),
primary key (user_id)
) engine=InnoDB
alter table board
add constraint FKfyf1fchnby6hndhlfaidier1r
foreign key (user_id)
references user (user_id)
또한 MYSQL Workbench에서 DB 테이블이 생성된 것을 확인할 수 있다.
이제 hibernate가 생성하는 DDL을 참고해서 DDL을 작성하고, application.properties에서 ddl-auto 옵션을 update로 바꿔준다.
drop table if exists board CASCADE;
drop table if exists users CASCADE;
create table users (
user_id bigint not null auto_increment,
login_id varchar(100) unique,
password varchar(100),
name varchar(100),
age int,
primary key (user_id)
) engine=InnoDB default charset=utf8mb4;
create table board (
board_id bigint not null auto_increment,
title varchar(255),
content text,
user_id bigint,
register_date datetime,
primary key (board_id),
constraint fk_user_board
foreign key (user_id)
references users (user_id) on update cascade
) engine=InnoDB default charset=utf8mb4;
MySQL - 테이블 생성 시 engine과 character 설정하기
- MySQL의 기본 엔진이 InnoDB이기 때문에 별다른 설정을 하지 않아도 디폴트로 적용이 되기는 하지만, 이 디폴트 설정이 어느 상황에서나 작용한다는 조건이 아니므로 테이블을 생성할 때 확실히 명시해주는 것이 좋습니다.
- 엔진 명시는 처음 테이블을 생성할 때, 필드 입력이 끝난 뒤에 엔진을 적어주면 됩니다. ENGINE=InnoDB 이런 식으로 적어주면 되고, 그 뒤에는 character set 설정을 해줬습니다.
BoardApplication을 실행하면 정상적으로 실행되는 것을 확인할 수 있다.