Springboot로 디자인이 하나도 없고 매우 간단한 게시판을 구현하는 시리즈입니다.

최종 소스는 깃헙에서 확인하실 수 있습니다.


시리즈를 시작하기에 앞서...

프로젝트 구조나 개발 방법은 개인마다 조직마다 차이가 있습니다.

이 시리즈에서 제시 및 구현하는 방법 역시 정답은 아니며, 단지 입문자에게 참고가 되기를 바라며 작성하였습니다.

혹시라도 글을 읽으시다가 더 좋은 방법이나 팁을 공유해주시면 많은 분들에게 도움이 될 것 같습니다!


  • 개발환경
    • 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을 사용합니다.




3. devtools

다음은 개발 편의를 제공하는 LiveReload를 적용해주시면 좋습니다.

매번 서버를 껏다 켤 필요가 없기 때문이죠.


설정 방법은 여기를 참고해주세요!





이상으로 준비작업을 모두 마쳤습니다.

다음 글에서는 게시글을 추가하는 작업을 통해, 내부적으로 좀 더 알아보도록 하겠습니다.



[ 참고자료 ]

https://jojoldu.tistory.com/251#2-3-controller--dto-구현

https://haviyj.tistory.com/11

댓글 펼치기 👇
  1. 돌튀김 2020.01.03 03:54

    감사합니다. 보면서 잘 따라가고 있어요... 궁금하거나 문제가 있을시에도 이렇게 여쭤봐도 되는거죠? ㅎㅎ

  2. 고니GONY 2020.08.21 16:04

    안녕하세요 ! 프로그래밍 공부 시작한지 2달째 되는 학생입니다
    이 글 참고하면서 공부 할 생각인데
    혹시 괜찮으시다면 제 티스토리에 올려도 될까요 ??
    출처는 무조건 밝히겠습니다 !

  3. 돌칼 2020.08.26 17:10

    안녕하세요, 테스트해보다가 apllication.yml에 여러개의 datasource를 (master, slave..) 설정해주고 싶은데
    어떤식으로 추가해주면 될까요?