개발 공부/백엔드

제미나이와 게시판 만들기: (1) 프로젝트 설정과 도메인 설계

baby-t 2025. 10. 3. 22:01

제미나이의 도움을 받으며 커뮤니티 게시판 백엔드 서버를 만들어 볼겁니다. Spring Boot와 JPA를 사용하여 REST API 서버를 구축하는 전 과정을 차근차근 따라 해볼 예정입니다.

이 첫 번째 포스팅에서는 프로젝트를 생성하고, 가장 중요한 뼈대가 되는 도메인을 설계하는 과정을 다룹니다.

### 1. 프로젝트 시작하기 🚀

#### Spring Initializr로 뼈대 만들기

먼저, https://start.spring.io/ 에 접속하여 프로젝트의 기본 구조를 생성합니다.

항목 설정 값
Project Gradle - Groovy
Language Java
Spring Boot (최신 안정 버전)
Group com.example
Artifact community-board
Packaging Jar
Java 17

Dependencies에서는 아래 라이브러리들을 추가합니다.

  • Spring Web: 웹 애플리케이션 및 REST API 개발을 위한 핵심 라이브러리
  • Spring Data JPA: JPA를 편리하게 사용하기 위한 기술
  • H2 Database: 개발 및 테스트용 인메모리 데이터베이스
  • MySQL Driver: 실제 운영용 MySQL 데이터베이스 연결 드라이버

설정 완료 후 GENERATE 버튼을 눌러 프로젝트를 다운로드하고, 압축을 푼 뒤 IntelliJ IDEA에서 열어줍니다.

#### GitHub 연동

생성된 프로젝트를 GitHub에 연동하는 것은 좋은 습관입니다. git init부터 시작하여 첫 커밋을 push하는 과정까지 진행하여 버전 관리를 시작합니다.

### 2. 개발 순서 정하기: 계층형 아키텍처

프로젝트를 시작하기 전에 전체적인 개발 순서를 정하는 것이 좋습니다. 우리는 아래와 같은 계층형 아키텍처 순서에 따라 개발을 진행할 것입니다.

Domain 설계 → Repository 구현 → Service 구현 → Controller 구현

가장 먼저 데이터의 구조를 정의하고(Domain), 그 다음 데이터에 접근하는 계층(Repository), 비즈니스 로직을 처리하는 계층(Service), 마지막으로 외부 요청을 받는 계층(Controller) 순으로 만들어 나갑니다.

### 3. 도메인 설계: 세상의 뼈대 만들기 🏛️

게시판의 핵심 데이터는 **사용자(User), 게시글(Post), 댓글(Comment)**입니다. 이 세 가지를 JPA 엔티티로 설계하고, 서로 간의 관계를 매핑해 보겠습니다.

  • 한 명의 사용자는 여러 게시글과 댓글을 작성할 수 있다. (1:N)
  • 하나의 게시글에는 여러 댓글이 달릴 수 있다. (1:N)

User.java

Java
 
@Entity
public class User {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String nickname;
    private String password;

    @OneToMany(mappedBy = "user")
    private List<Post> posts = new ArrayList<>();

    @OneToMany(mappedBy = "user")
    private List<Comment> comments = new ArrayList<>();
    
    // Getters and Setters...
}

Post.java

Java
 
@Entity
public class Post {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    @ManyToOne
    @JoinColumn(name = "user_id") // DB에는 user_id 라는 FK 컬럼이 생성됨
    private User user;

    @OneToMany(mappedBy = "post")
    private List<Comment> comments = new ArrayList<>();
    
    // Getters and Setters...
}

Comment.java

Java
 
@Entity
public class Comment {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String content;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "post_id")
    private Post post;
    
    // Getters and Setters...
}

### 4. 비즈니스 로직 설계: 서비스 계층의 역할 🧠

이제 이 도메인들을 가지고 어떤 기능들을 만들지, 서비스 계층의 관점에서 비즈니스 로직을 미리 정의해 보겠습니다.

UserService

  • Long join(User user): 신규 회원 가입 (중복 아이디 검증)
  • User login(String username, String password): 로그인 (나중에 JWT 발급)
  • User findUser(Long userId): 내 정보 조회

PostService

  • Long createPost(Long userId, Post post): 게시글 작성
  • List<Post> findPosts(): 전체 게시글 목록 조회
  • Post findPost(Long postId): 특정 게시글 상세 조회
  • void updatePost(Long userId, Long postId, ...): 게시글 수정 (작성자 권한 확인)
  • void deletePost(Long userId, Long postId): 게시글 삭제 (작성자 권한 확인)

CommentService

  • Long createComment(Long userId, Long postId, ...): 댓글 작성
  • List<Comment> findCommentsByPost(Long postId): 특정 게시글의 댓글 목록 조회

이것으로 프로젝트의 기본 설정과 뼈대가 되는 도메인, 그리고 비즈니스 로직 설계까지 모두 마쳤습니다. 다음 포스팅에서는 오늘 설계한 Repository와 Service 계층을 코드로 직접 구현해보겠습니다.