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를 사용합니다.