ORM 기술을 사용해서 테이블을 생성해 보자.
User 모델링 후 테이블 생성 및 컬럼 제약 추가
package com.tencoding.blog.dto;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.DynamicInsert;
import com.tencoding.blog.model.RoleType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
// 1. mysql server 실행
// 2. 테이블 생성
// 3. 제약 추가
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
// @DynamicInsert //null 필드가 들어 올때 무시하라 --> 디폴트값 선언하면 적용됨
public class User {
@Id // Primary key PK로 지정한다.
@GeneratedValue(strategy = GenerationType.IDENTITY) // 프로젝트에서 연결된 DB 넘버링 전략을 따라간다.(오토인크리먼트 적용)
private int id;
@Column(nullable = false, length = 30)
private String username;
@Column(nullable = false, length = 100)
private String password;
@Column(nullable = false, length = 50)
private String email;
//@ColumnDefault("'user'")// 문자라는 것을 알려주어야 한다. --> ('')
@Enumerated(EnumType.STRING) // DB에게 String타입이라고 알려 줘야 한다.
private RoleType role; // Enum 변경
@CreationTimestamp // 시간이 자동으로 입력된다.
private Timestamp createDate;
}
Board 테이블 생성 및 제약 및 연관 관계 추가 하기
package com.tencoding.blog.dto;
import java.sql.Timestamp;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false, length = 150)
private String title;
@Lob // 대용량 데이터 선언
private String content;
@ColumnDefault("0")
private int count;
// 연관 관계 설정
@ManyToOne (fetch = FetchType.EAGER)
@JoinColumn(name = "userId") // 컬럼명을 직접 지정
private User userId;
// 오브젝트를 다룰 때 가지고 와 달라고 요청해야 함(mappedBy)
// Board <---> Reply 관계
// 연관 관계에 주인이 아니다 (select 할 때 가지고 와야하는 데이터이다.)
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
private List<Reply> reply;
// reply - FK board table 생성이 된다 1.정규화 위반!!!
@CreationTimestamp
private Timestamp createDate;
}
Reply테이블 생성 생성 및 제약 및 연관 관계 추가 하기
package com.tencoding.blog.dto;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.CreationTimestamp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false, length = 200)
private String content;
// board 연관 관계 처리
@ManyToOne
@JoinColumn(name = "boardId")
private Board board;
// user 연관 관계 처리
@ManyToOne
@JoinColumn(name = "userId")
private User user;
@CreationTimestamp
private Timestamp createDate;
}
테이블 설계가 다됬을경우!!!
ddl-auto: update 로 수정
server:
port: 9090
servlet:
context-path: /blog
spring:
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Seoul
username: ****
password: ******
jpa:
open-in-view: true
hibernate:
ddl-auto: update
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
use-new-id-generator-mappings: false
show-sql: true
properties:
hibernate.format_sql: true
jackson:
serialization:
fail-on-empty-beans: false
댓글