데이터 베이스 생성: simple_board

application.yaml 설정:
spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: validate
datasource:
url: jdbc:mysql://localhost:3306/simple_board?useSSL=false&useUnicode=true&allowPublicKeyRetrieval=true
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ???
build.gradle 설정:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
MySQL WorkBench의 왼쪽 메뉴 클릭
+클릭 후 Add Diagram 클릭.

아래 이 버튼을 누르면 Table을 만들 수 있다.
이건 확장할 수도 있고 더블클릭을 탭해서 작업할 수 있다.
그 아래 보이는 것들은 관계를 맺는 법

논리부터 작성하는 게 맞지만 물리부터 만들어본다.
board Table

post Table

reply Table

1:N 관계를 준다.

이제
File -> Export -> Forward Engineer SQL CREATE Script를 클릭한다.

Skip Creation of FOREIGN KEYS
Skip Creation of FK Indexes as well 을 체크해주고 Next해서 코드를 받아오자.

CREATE TABLE IF NOT EXISTS board (
id BIGINT(32) NOT NULL AUTO_INCREMENT,
board_name VARCHAR(100) NOT NULL,
status VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS post (
id BIGINT(32) NOT NULL AUTO_INCREMENT,
board_id BIGINT(32) NOT NULL,
user_name VARCHAR(50) NOT NULL,
password VARCHAR(4) NOT NULL,
email VARCHAR(100) NOT NULL,
status VARCHAR(36) NOT NULL,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
posted_at DATETIME NOT NULL,
PRIMARY KEY (id)
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS reply (
id BIGINT(32) NOT NULL AUTO_INCREMENT,
post_id BIGINT(32) NOT NULL,
user_name VARCHAR(50) NOT NULL,
password VARCHAR(4) NOT NULL,
status VARCHAR(50) NOT NULL,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
replied_at DATETIME NOT NULL,
PRIMARY KEY (id)
) ENGINE = InnoDB;
이 코드를 넣어준다.
com.example.simpleboard
├── board
│ └── db
│ ├── BoardEntity.java
│ └── BoardRepository.java
├── post
│ └── db
│ ├── PostEntity.java
│ └── PostRepository.java
├── reply
│ └── db
│ ├── ReplyEntity.java
│ └── ReplyRepository.java
└── SimpleBoardApplication.java
BoardEntity.java
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@Entity(name = "board")
public class BoardEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String boardName;
private String status;
}
BoardRepository.java
public interface BoardRepository extends JpaRepository<BoardEntity, Long> {
}
PostEntity.java
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@Entity(name = "post")
public class PostEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long boardId;
private String userName;
private String password;
private String email;
private String status;
private String title;
@Column(columnDefinition = "TEXT")
private String content;
private LocalDateTime postedAt;
}
PostRepository.java
public interface PostRepository extends JpaRepository<PostEntity, Long> {
}
ReplyEntity.java
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@Entity(name = "reply")
public class ReplyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long postId;
private String userName;
private String password;
private String status;
private String title;
@Column(columnDefinition = "TEXT")
private String content;
private LocalDateTime repliedAt;
}
ReplyRepository.java
public interface ReplyRepository extends JpaRepository<ReplyEntity, Long> {
}
각 Entity에는
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@Entity(name = " ")을 주고
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)에 id를 지정한다.
TEXT로 자료형을 설정한 content에 대해서는 @Column(columnDefinition = "TEXT")을 위에 넣어준다.