스프링 부트 게시판 프로젝트 - 3 | DB 설정 및 엔티티 개발

seren-dev·2022년 8월 16일
1

JPA, DB 설정

MYSQL Connection 생성

DB 설정을 위해 먼저 MYSQL Server와 MYSQL Workbench을 설치했다.
그 다음 MYSQL Workbench에서 새로운 MYSQL Connection을 생성하고, 생성된 Connection에서 DB를 새로 생성한다.
create database project;
생성된 DB를 확인하는 방법: show databases;

JPA 및 DB 설정

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

  • 애플리케이션 실행 시점에 자동으로 테이블 생성 (애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.)

엔티티 클래스 개발 후 hibernate가 생성하는 DDL을 참고해서 DDL을 작성할 것이기 때문에, 지금은 ddl-autocreate로 설정했다. 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 테이블의 이름을 명시
    • 데이터베이스가 user를 예약어로 잡고 있는 경우가 있을 수 있기 때문에 DB 테이블 명을 users로 변경한다.
  • @Id : Primary Key를 뜻함
  • @GeneratedValue : Primary Key의 키 생성 전략(Strategy)을 설정하고자 할 때 사용
    • GenerationType.IDENTITY : 기본 키 생성을 데이터베이스에 위임한다. Entity를 등록할 때 DB에서 AUTO_INCREAMENT 하여 PK를 생성 후 INSERT 한다.
    • GenerationType.AUTO(default) : 기본값으로 DB 방언에 맞춰 자동으로 설정하여 준다.(default)
      • Ex) 오라클 DB 선택 시 SEQUENCE ,  MySQL DB 선택 시 IDENTITY 사용
    • GenerationType.SEQUENCE : DB의 SEQUENCE를 이용해서 키를 생성. @SequenceGenerator와 같이 사용
    • GenerationType.TABLE : 키 생성 전용 테이블을 생성해서 키 생성. @TableGenerator와 함께 사용
  • @Column : DB Column을 명시
    @Column과 반대로 테이블에 컬럼으로 생성되지 않는 필드의 경우엔 @Transient 어노테이션을 적용한다.

참고: [JPA] Hibernate 엔티티(Entity) 매핑하기

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로 바꿔준다.

DDL

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;
  • user의 login_id 컬럼은 중복된 값을 가질 수 없으므로 unique 제약 조건을 추가했다.
  • board의 content 컬럼은 varchar 대신 text 자료형을 사용하였다.

MYSQL 데이터 타입 정리
MySQL 데이터형 및 크기

MySQL - 테이블 생성 시 engine과 character 설정하기

  • MySQL의 기본 엔진이 InnoDB이기 때문에 별다른 설정을 하지 않아도 디폴트로 적용이 되기는 하지만, 이 디폴트 설정이 어느 상황에서나 작용한다는 조건이 아니므로 테이블을 생성할 때 확실히 명시해주는 것이 좋습니다.
  • 엔진 명시는 처음 테이블을 생성할 때, 필드 입력이 끝난 뒤에 엔진을 적어주면 됩니다. ENGINE=InnoDB 이런 식으로 적어주면 되고, 그 뒤에는 character set 설정을 해줬습니다.

BoardApplication을 실행하면 정상적으로 실행되는 것을 확인할 수 있다.

0개의 댓글