Springboot로 디자인이 하나도 없고 매우 간단한 게시판을 구현하는 시리즈입니다.
최종 소스는 깃헙에서 확인하실 수 있습니다.
- [SpringBoot] 게시판 (1) - 준비작업
- [SpringBoot] 게시판 (2) - 게시글 추가하기
- [SpringBoot] 게시판 (3) - 게시글 조회,수정,삭제
- [SpringBoot] 게시판 (4) - 검색과 페이징
- [SpringBoot] 게시판 (5) - EC2에 배포하기
시리즈를 시작하기에 앞서...
프로젝트 구조나 개발 방법은 개인마다 조직마다 차이가 있습니다.
이 시리즈에서 제시 및 구현하는 방법 역시 정답은 아니며, 단지 입문자에게 참고가 되기를 바라며 작성하였습니다.
혹시라도 글을 읽으시다가 더 좋은 방법이나 팁을 공유해주시면 많은 분들에게 도움이 될 것 같습니다!
- 개발환경
- IntelliJ 2019.02
- Java 11
- SpringBoot 2.1.8
- Gradle 5.6
- MySQL 8.0.16
- 라이브러리
- JPA
- Thymeleaf
- Lombok
- LiveReload
1. 프로젝트 생성 및 환경 설정
먼저 프로젝트를 생성하여 환경 설정을 해보도록 하겠습니다.
- 프로젝트 생성
- 이글을 참고하여, Hello world를 출력해봅니다.
- 선택할 Dependency는 다음과 같습니다.
- Database 환경 설정
- 위의 두 글을 참고하여, MySQL 연동 및 JPA 설정을 셋팅합니다.
설정과 관련된 주요 파일은 다음과 같습니다.
bulid.gradle
plugins {
id 'org.springframework.boot' version '2.1.8.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.vitolee.board'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
apllication.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/board?serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: 1234
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
show-sql: true
hibernate:
format_sql: true
ddl-auto: create
logging:
level:
org:
hibernate:
SQL: DEBUG
type:
descriptor:
sql:
BasicBinder: TRACE
2. 프로젝트 구조
프로젝트를 생성하였으면, 디렉토리와 파일을 생성하여 구조만 잡아보도록 하겠습니다.
파일은 이후의 글에서 관련 내용이 나올때, 그 때 추가하셔도 되고, 지금 미리 추가하셔도 됩니다.
자바 파일의 디렉토리를 위와 같이 구성한 이유는 3 Layer Architecture와 관련이 있습니다.
각 디렉터리의 역할은 다음과 같습니다.
- controller
- URL과 실행 함수를 매핑
- 비즈니스 로직이 있는 service를 호출하여 비즈니스 로직 처리
- 반환할 템플릿을 정의 및 JSON 등으로 응답
- service
- 비즈니스 로직을 구현
- 데이터 처리(모델)를 담당하는 repository에서 데이터를 가져와서 controller에 넘겨주거나, 비즈니스 로직을 처리
- domain > entity
- DB 테이블과 매핑되는 객체(Entity)를 정의
- JPA에서는 Entity를 통해 데이터를 조작함
- domain > repository
- 데이터를 가져오거나 조작하는 함수를 정의
- Interface를 implements하여 미리 만들어진 함수를 사용할 수 있으며, 또한 직접 구현이 가능
- dto
- controller와 service 간에 주고 받을 객체를 정의하며, 최종적으로는 view에 뿌려줄 객체
- Entity와 속성이 같을 수 있으나, 여러 service를 거쳐야 하는 경우 dto의 몸집은 더 커짐
- ex) AEntity에 a 속성, BEntity에 b속성이 있을 때, ZDto에 a,b 속성으로 정의될 수 있음
- entity와 dto를 분리한 이유는 Entity는 DB 테이블이 정의되어 있으므로, 데이터 전달 목적을 갖는 객체인 dto를 정의하는 것이 좋다고 합니다. ( 참고 )
다음으로 resources 디렉터리의 역할은 다음과 같습니다.
- static
- css, js, img 등의 정적 자원들을 모아놓은 디렉터리입니다.
- templates
- 템플릿을 모아놓은 디렉터리입니다.
- Thymeleaf는 HTML을 사용합니다.
다음은 개발 편의를 제공하는 LiveReload를 적용해주시면 좋습니다.
매번 서버를 껏다 켤 필요가 없기 때문이죠.
설정 방법은 여기를 참고해주세요!
이상으로 준비작업을 모두 마쳤습니다.
다음 글에서는 게시글을 추가하는 작업을 통해, 내부적으로 좀 더 알아보도록 하겠습니다.
[ 참고자료 ]
https://jojoldu.tistory.com/251#2-3-controller--dto-구현