본문 바로가기

Programming/SpringBoot

[SpringBoot] 간단한 게시판 만들기 #1 - 세팅

반응형

주의

스프링부트 맛보기 위해 정리한 글이므로 본 글은 참고용으로만 봐주시기 바랍니다.

 

Ref

https://victorydntmd.tistory.com/325

https://devlog-wjdrbs96.tistory.com/209


Spring Initializr을 통해 Project를 생성하였다.

 

Spring Boot DevTools

Spring Web

Thymeleaf

Spring Data JPA

Lombok

MySQL Driver

 

++ 추후 Google OAuth2 로그인을 위한 Spring Security도 Dependency를 추가 설정해주었다. 해당 부분은 build.gradl의 dependencies에 추가한 뒤 재빌드를 해주면 된다.

 

1. 빌드

 

'Build -> Build Project'를 통해 프로젝트 빌드를 수행한다.

빌드 툴은 Gradle

 

2. Lombok 사용을 위한 설정

 

** Lombok ? **

보통 DTO나 Model, Entity의 경우 여러 속성(Attribute)이 존재하고 이들이 가지는 Property에 대해 getter, setter, 생성자 등을 매번 작성해주어야 하는데 이러한 부분을 자동으로 만들어주는 Library이다.

 

Lombok을 사용하기 위해서는 몇 가지 설정이 필요하다.

 

Ref : https://goddaehee.tistory.com/208

 

3. SDK 선택

Java 11을 사용하기 위해 'Project Structure -> Project Settings -> Project에서 Prject SDK'를 기 설치해 둔 11을 선택

 

4. MySQL 생성

 

Database는 MySQL을 사용하였다.

Docker는 그나마 익숙하기 때문에 Docker로 MySQL을 생성하였으며, Docker-compose를 사용하였다.

❯ ls
docker-compose.yml  mysql

❯ cat docker-compose.yml
version: "3"
services:
  db: # 서비스 명
    image: mysql:8 # 사용할 이미지
    container_name: test-mysql # 컨테이너명 설정
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "dkagh1." # roor 계정 패스워드 설정
    command: # 명령어
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes: # 다렉토리 마운트 설정
      - ./mysql/:/var/lib/mysql

❯ docker-compose up -d

❯ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
325f96e2b957   mysql:8   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   test-mysql

 

DBeaver 툴을 통해 MySQL에 접속

 

5. Build.gradle 설정

 

plugins : 프로젝트를 빌드하기 위한 작업을 해주는 플러그인들

repositories : SpringBoot 프로젝트에서 사용하는 라이브러리들을 받아오는 저장소, Default : mavenCentral()

dependencies : 프로젝트에서 필요한 라이브러리 의존성을 설정하는 부분

plugins {
	id 'org.springframework.boot' version '2.6.1'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'shop.pingping2'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
	annotationProcessor 'org.projectlombok:lombok'

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'mysql:mysql-connector-java'
	compileOnly 'org.projectlombok:lombok'

	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
	implementation 'org.springframework.boot:spring-boot-starter-security'
}

test {
	useJUnitPlatform()
}

 

6. application.yml 설정

 

application.properties 파일을 삭제하고 application.yml 파일을 생성하여 yml 형식으로 관리하도록 하였다.

 

jpa : jpa 관련 설정

datasource : 연결할 Database 설정 (url, driver, username, password)

mvc : 히든메서드를 사용할 수 있도록 설정이 필요하다.

       >> GET, POST 뿐 만 아니라 PUT, DELETE 메서드를 사용하기 위해서 설정해야 함

 

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring_board?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: root
    password: dkagh1.

  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect  # JPA 데이터베이스 플랫폼 (InnoDB)
    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. Project 최종 구조

구조

각각 config, controller, domain, dto, repository, service 패키지로 구성이 되며, 각각 패키지 내부에는 class 파일, Enum 파일, Interface 파일 등이 존재하게 된다.

 

패키지 구조는 MVC 패턴에 의거하여 구성이 되어있다.

 

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에 접근하는 메서드(ex) findAll()) 들을 사용하기 위한 Interface 파일들이 모여있는 패키지이다.

보통 JpaRepository를 상속 받음으로써 기본적인 CURD 동작이 모두 가능해진다.

=> JpaRepository<대상으로 지정할 엔티티, 해당 엔티티의 PK의 타입>

 

6. service 패키지

DB와 상호작용하는 비즈니스 로직을 수행하는 Class 파일들이 모여져 있다.

 

 

 

대충 흐름을 설명하자면,

 

SpringBoot는 Java란 Programming Language로 API를 제공해준다.

 

사용자는 이런 API를 HTML 등의 Front View와 상호작용하며 데이터를 주고 받게 된다.

 

사용자는 Web Front를 통해 SpringBoot의 API를 사용하게 되며,

 

모든 사용자의 요청은 Controller를 통해 분기 처리를 하게 된다. (DispatcherServlet이 앞 단에 있긴 하지만 생략)

 

Controller는 View로부터 받은 사용자의 요청을 Service에게 요청하며, Serivce는 내부 비즈니스 로직을 담당하게 된다.

 

Service는 DB(Entity)와 상호작용을 해서 데이터를 Create, Read, Update, Delete 등을 수행하게 된다.

 

또한 Front <-> Controller <-> Service 간 데이터를 주고 받을 때는 DTO(Data Transfer Object)라는 객체를 통해 데이터를 주고 받게 된다. (선택 사항이지만 권장하는 부분)

 

 

보통 Doamin 클래스와 DTO 클래스를 구분하는 이유는?

  1. View Layer와 DB Layer의 역할을 철저히 구분하기 위해서
  2. Table과 Mapping되는 Entity Class가 변경되면 여러 클래스에 영향을 끼치게 되지만 View와 통신하는 DTO Class는 자주 변경되므로 분리해야 한다.
  3. 즉 DTO는 Domain Model을 복사한 형태로, 다양한 Presentation Logic을 추가한 정도로 사용하며 Domain Model 객체는 Persistent만을 위해 사용한다.

 

반응형