본문 바로가기
JAVA/토이프로젝트

간단한 게시판 만들

by PlusUltraCode 2024. 6. 22.

Tistory 블로그 포스트: Simple Board 만들기

1. 데이터베이스 만들기

1.1 board 테이블 생성

-- -----------------------------------------------------
-- Table `simple_board`.`board`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `simple_board`.`board` (
  `id` BIGINT(32) NOT NULL AUTO_INCREMENT,
  `board_name` VARCHAR(100) NOT NULL,
  `status` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

1.2 post 테이블 생성

sql
-- -----------------------------------------------------
-- Table `simple_board`.`post`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `simple_board`.`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(45) NOT NULL,
  `title` VARCHAR(100) NOT NULL,
  `content` TEXT NULL,
  `posted_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

1.3 reply 테이블 생성

sql
-- -----------------------------------------------------
-- Table `simple_board`.`reply`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `simple_board`.`reply` (
  `id` BIGINT(32) NOT NULL AUTO_INCREMENT,
  `post_id` BIGINT(32) NOT NULL,
  `user_name` VARCHAR(45) NOT NULL,
  `status` VARCHAR(4) NOT NULL,
  `title` VARCHAR(100) NOT NULL,
  `content` TEXT NOT NULL,
  `replied_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

2. Java 코드 작성하기

2.1 패키지 구조

  • board
    • controller
    • model
    • service
    • db
  • post
    • controller
    • model
    • service
    • db
  • reply
    • controller
    • model
    • service
    • db

2.2 데이터베이스와 연결

2.2.1 dbEntity와 dbRepository 생성

java
public interface BoardRepository extends JpaRepository<BoardEntity, Long> {}
public interface PostRepository extends JpaRepository<PostEntity, Long> {}
public interface ReplyRepository extends JpaRepository<ReplyEntity, Long> {}

2.3 엔티티 작성

2.3.1 기본 설정

@Entity
public class PostEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(columnDefinition = "TEXT")
    private String content;
}

2.3.2 JSON 및 Snake Case 사용

java
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class PostModel {
    // 멤버 변수들
}

2.4 데이터베이스 조회 및 예외 처리

2.4.1 Post 조회 및 비밀번호 검증

java
public PostEntity findPost(PostViewRequest postViewRequest) {
    return postRepository.findById(postViewRequest.getPostId())
                .map(it -> {
                    if (!it.getPassword().equals(postViewRequest.getPassword())) {
                        var format = "패스워드가 맞지 않습니다. %s vs %s";
                        throw new RuntimeException(String.format(format, it.getPassword(), postViewRequest.getPassword()));
                    }
                    return it;
                }).orElseThrow(() -> {
                    return new RuntimeException("해당 게시글이 존재 하지 않습니다." + postViewRequest.getPostId());
                });
}

2.5 기타 설정

2.5.1 @Transient 사용

데이터베이스와 연관 없는 멤버 변수 설정

java
코드 복사
@Transient private List<ReplyEntity> replyList = List.of();

배운 점 정리

  • 데이터베이스와의 연결을 위해 dbEntity와 dbRepository 인터페이스를 생성하고, 인터페이스는 JpaRepository<dbName, Long>을 확장하여 사용합니다.
  • 엔티티 클래스에서 id 필드는 @Id와 @GeneratedValue(strategy = GenerationType.IDENTITY)로 설정합니다.
  • 데이터베이스의 TEXT 타입 필드는 @Column(columnDefinition = "TEXT")로 설정합니다.
  • JSON과 Snake Case 전략을 위해 @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)를 사용합니다.
  • 데이터베이스 조회 시 Optional을 활용하여, 존재하지 않거나 비밀번호가 틀린 경우 적절한 예외를 던집니다.
  • 엔티티에 데이터베이스와 연관 없는 멤버 변수가 있을 경우 @Transient를 사용합니다.