@Entity에 정의한 ddl 속성 db에 update 하기

2019. 3. 29. 11:20Spring/Basic

300x250
반응형
  • Entity에 정의한 ddl 속성을 db에 create 또는 update하기.
  • 컬럼에 대한 속성을 설정하기.
  • ColumnDefinition으로 세부사항 설정하기.

프로퍼티 파일에 spring.jpa.generate-ddl 속성을 true로 설정하고
(또는, spring.jpa.properties.hibernate.hbm2ddl.auto 속성을 update로 설정)

애플리케이션이 start되면서, 해당 table이 존재하지 않을 경우, entity에 설정한 대로 테이블이 자동 생성됩니다.


spring:
  profiles: local
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: "jdbc:mysql://127.0.0.1:3306/foodtruck?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC"
    username: jini
    password: "pwpw"
    hikari:
      auto-commit: false
      connection-test-query: SELECT 1
      minimum-idle: 10
      maximum-pool-size: 50
      transaction-isolation: TRANSACTION_READ_UNCOMMITTED
      pool-name: hikari-pool-1
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    properties:
      hibernate:
        format_sql: true
    generate-ddl: true

@Getter @Setter
@ApiModel(description = "사용자")
@Entity
@Table(name = "user")
@DynamicUpdate
public class User implements Serializable {

	private static final long serialVersionUID = -563329217866858622L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(updatable = false, nullable = false, columnDefinition = "INT(11)")
	private Long id;

	@ApiModelProperty(value = "0: 일반회원, 1: 사업자", allowableValues="0, 1")
	@Column(nullable = false, length = 1, columnDefinition = "CHAR(1) DEFAULT '0'")
	private String type;

	@ApiModelProperty(value="이메일", allowableValues="email@domain")
	@Column(nullable = false, unique = true, length = 100)
	private String email;

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

	@ApiModelProperty(value = "남자(1,3,5), 여자(2,4,6)", allowableValues="range[1, 6]")
	@Column(nullable = false, length = 1, columnDefinition = "CHAR(1) DEFAULT '1'")
	private String sex;

	@Column(nullable = false, length = 6)
	private String birthDate;

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

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

	@ApiModelProperty(value="삭제유무")
	@Column(nullable = false, columnDefinition = "CHAR(1) DEFAULT 'N'")
	private String delYn;

	@ApiModelProperty(value="생성일시")
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(updatable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
	private Date createTimestamp;

	@ApiModelProperty(value="수정일시")
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
	private Date updateTimestamp;

	public User() {
		this.delYn = "N";
		this.type = "0";
		this.sex = "1";
	}

}

@Getter, @Setter로 setter, getter 를 자동 생성해주고,
@Column 애너테이션에 컬럼명, null여부, unique 여부, 글자 크기 디폴트값 등에 대한 설정을 추가합니다.

del_yn 컬럼의 경우, CHAR(1)에 디폴트값은 'N'으로 생성된다.

문자열의 경우, 길이를 length로 설정해 줄 수 있기에 columnDefinition으로 설정하지 않아도 됩니다.

createTimestamp의 기본 값을 현재 시간으로 설정하고 싶다면, columnDefinition을 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 으로 설정하면 됩니다.
udpateTimestamp의 경우에는 row 업데이트 시 자동으로 update하고 싶은 것이니 ON UPDATE CURRENT_TIMESTAMP
을 추가합니다.

애플리케이션을 서버에 올리면, 아래와 같은 테이블이 자동 생성된다.

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `create_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `del_yn` char(1) NOT NULL DEFAULT 'N',
  `update_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `birth_date` varchar(6) NOT NULL,
  `email` varchar(100) NOT NULL,
  `name` varchar(50) NOT NULL,
  `password` varchar(150) NOT NULL,
  `phone_number` varchar(20) NOT NULL,
  `sex` char(1) NOT NULL DEFAULT '1',
  `type` char(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_ob8kqyqqgmefl0aco34akdtpe` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

04
id의 경우, 크기를 따로 지정하지 않았기 때문에 long타입의 디폴트 길이인 20에, bigint 형으로 생성되었다.

300x250
반응형