[TIL 25] 간단한 게시판 구현하기_Spring

돗치·2024년 3월 13일

Spring으로 간단한 게시판 구현해보기 #1

1. 기본 설정

데이터 베이스 생성: 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에서 ERD 그리는 법

MySQL WorkBench의 왼쪽 메뉴 클릭
+클릭 후 Add Diagram 클릭.

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

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

2. DB 구성 및 ERD 작성

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;

이 코드를 넣어준다.

3. 엔티티 구성

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")을 위에 넣어준다.

0개의 댓글