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