Spring Boot로 게시판 백엔드 서버를 만들어보자
정처기 공부를 시작하면서 직접적인 코딩보다는 이론과 알고리즘 위주의 공부를 하다보니 실질적인 프로젝트를 구현하는 데 필요한 감각이 많이 떨어졌다는 생각이 들어 간단한 게시판 프로젝트를 통해 감을 되찾고 새로운 기술들도 적용해보고자 한다.
우선은 기본적인 게시판 기능만 구현해 놓고 후에 회원가입 등 기능을 추가해가며 프로젝트를 발전시켜나가 볼 생각이다.
#1. 요구 사항 정의
- 전체 게시글 목록 조회
- 게시글 전체에 대하여 제목, 작성자명 조회하기
- 게시글 ID 내림차순으로 정렬하기
- 게시글 작성
- 제목, 작성자명, 작성 내용 등을 DB에 저장
- 선택한 게시글 조회
- 선택한 게시글의 제목, 작성자명, 작성 날짜, 작성 내용 등을 조회
- 선택한 게시글 삭제
- 선택한 게시글을 DB에서 삭제
- 게시글 검색
- 유저로부터 제공받은 keyWord가 포함된 제목을 가진 게시글들을 검색
- 페이지네이션
- 전체 목록, 검색된 목록에 대하여 페이징 처리
#2. 유스케이스 다이어그램
#3. API 명세서
#4. MySQL생성
DB는 Docker-compose를 사용하여 Docker MySQL을 생성해서 사용했다. 솔직히 Docker를 사용해야 할 이유는 없지만 후에 Redis도 활용하고 MSA로의 전환도 생각중에 있기 때문에 미리미리 Docker 공부도 할 겸 사용해보기로 했다.
- docker-compose.yml
version: '3.8'
services:
board-db:
image: mysql:8.0
container_name: board_mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: board_db
MYSQL_USER: root
MYSQL_PASSWORD: root
ports:
- "3307:3306"
volumes:
- board_db_data:/var/lib/mysql
volumes:
board_db_data:
#5. Build.gradle 설정
pulgins : 프로젝트를 빌드하기 위한 작업을 해주는 플러그인들
Repositories : SpringBoot 프로젝트에서 사용하는 라이브러리들을 받아오는 저장소
dependencies : 프로젝트에서 필요한 라이브러리 의존성을 설정하는 부분
- Build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.3'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
#6. application.yml 설정
- application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3307/board_db?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: root
password: root
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
open-in-view: false
show-sql: true
hibernate:
format_sql: true
ddl-auto: update # none, update, create, create-drop, validate
mvc:
hiddenmethod:
filter:
enabled: true # GET, POST 뿐 만 아니라 PUT, DELETE 등의 메서드도 사용하기 위한 설정
devtools:
livereload:
enabled: true
logging:
level:
org:
hibernate:
SQL: DEBUG
type:
descriptor:
sql:
BasicBinder: TRACE
#7. 프로젝트 구조
구조
config, controller, domain, dto, repository, service, util 패키지로 구성되어 있으며, 추후에 기능이 확장됨에 따라 패키지의 구조도 더 확장될 예정이다.
1. config 패키지
Spring Security에 필요한 설정 파일이 존재한다.
2. controller 패키지
Controller Class들이 모여 있으며, View로부터 오는 HTTP 요청 (API 요청)을 처리하는 역할을 한다.
3. domain 패키지
DB의 테이블과 매칭될 Class 파일들이 모여 있다. (Entity 클래스라고도 함)
4.dto 패키지
dto(data transfer object)란 각 계층간 데이터 교환을 위한 객체이다.
DB로부터 데이터를 얻어 Service, Controller 등으로 보낼 때 사용한다.
별도의 Logic을 갖지 않고 순수 getter, setter 메서드만 가진다.
5. repository 패키지
Entity에 의해 생성된 DB에 접근하는 메서드
보통 JpaRepository를 상속 받음으로써 기본적인 CRUD 동작이 모두 가능해진다.
=> JpaRepository<대상으로 지정할 엔티티, 해당 엔티티의 PK의 타입>
6. service 패키지
DB와 상호작용하는 비즈니스 로직을 수행하는 Class 파일들이 모여 있다.
7. util 패키지
그 외 필요한 객체들을 생성하기 위한 Class 파일들이 모여 있다
흐름을 설명하자면,
사용자는 Front View를 통해 SpringBoot의 API를 사용하게 되며,
모든 사용자의 요청은 Controller를 통해 분기 처리를 하게 된다.
Controller는 View로부터 받은 사용자의 요청을 Service에게 요청하며, Serivce는 내부 비즈니스 로직을 담당하게 된다.
Service는 DB(Entity)와 상호작용을 해서 데이터를 Create, Read, Update, Delete 등을 수행하게 된다.
또한 Front <-> Controller <-> Service 간 데이터를 주고 받을 때는 DTO(Data Transfer Object)라는 객체를 통해 데이터를 주고 받게 되는데
그냥 Domain 클래스의 객체를 통해 데이터를 주고 받아도 될텐데 DTO 클래스를 구분해서 사용하는 이유가 뭘까?
- View Layer와 DB Layer의 역할을 철저히 구분하기 위해서
- Table과 Mapping되는 Entity Class가 변경되면 여러 클래스에 영향을 끼치게 되지만 View와 통신하는 DTO Class는 자주 변경되므로 분리해야 한다.
- 즉 DTO는 Domain Model을 복사한 형태로, 다양한 Presentation Logic을 추가한 정도로 사용하며 Domain Model 객체는 Persistent만을 위해 사용한다.
'Develop > Java & Spring' 카테고리의 다른 글
[Spring Boot] 게시판 프로젝트 외전 #1 JUnit과 Mockito를 이용한 테스트 - 이론 (0) | 2025.03.25 |
---|---|
[Spring Boot] 게시판 프로젝트 #4 Service, Controller 구현 (0) | 2025.03.25 |
[Spring Boot] 게시판 프로젝트 #3 DTO, Repository 구현 (0) | 2025.03.25 |
[Spring Boot] 게시판 프로젝트 #2 Domain(Entity), Util 구현 (0) | 2025.03.25 |
BufferedReader, BufferedWriter,StringTokenizer, StringBuilder 빠른 입출력을 위한 함수들 (0) | 2025.03.21 |