제미나이의 도움을 받으며 커뮤니티 게시판 백엔드 서버를 만들어 볼겁니다. 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
@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
@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
@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 계층을 코드로 직접 구현해보겠습니다.
'개발 공부 > 백엔드' 카테고리의 다른 글
| 제미나이와 게시판 만들기: (3) 서비스 계층 구현과 테스트 (0) | 2025.10.04 |
|---|---|
| 제미나이와 게시판 만들기: (2) 순수 JPA로 리포지토리 구현하기 (0) | 2025.10.03 |
| REST API, 개념부터 설계 원칙까지 한 번에 이해하기 (0) | 2025.10.03 |
| AOP로 공통 관심 사항 깔끔하게 분리하기 (1) | 2025.10.02 |
| 스프링 DB 접근 기술 : 4. 스프링 데이터 JPA (0) | 2025.09.29 |