본문 바로가기
Spring

Spring Boot sample project - 2. Spring Boot 설정

by BENGGRI 2023. 12. 20.
반응형

github :  https://github.com/orgs/benggri-public-organization/repositories

 

benggri-public-organization

benggri-public-organization has 2 repositories available. Follow their code on GitHub.

github.com

 

먼저, 개발환경 설정을 보고 오세요!

 


사용한 기술들...

Backend:
  jdk 17: 
  Spring boot 3.2.0:
    security(JWT)
    jpa
    querydsl
Frontend:
  javascript
  nodejs 20
  Nextjs 14
Tool:
  VS Code
    Plugins: Dev Containers(Micorosoft)

 

 

Git repository

git repository 는 두개를 준비하였습니다.

이름에서 알 수 있듯이 frontend 와 backend 를 분리하였습니다.

  • frontend : Nextjs 로 만들었습니다
  • backend: Spring boot 로 만들었습니다

계속 진행 중이라 읽으시는 시점에 따라 소스가 바뀌어있을 것 같습니다.(?)

소스를 수정하며 게시글을 업데이트 할 수 없겠다는 생각이 들어 큼지막한 내용만 설명드리겠습니다.

 

늘 그렇듯 샘플 프로젝트는 기본적으로 간단한 게시판입니다.

 


Spring boot 

Git Repository backend 를 사용 할 때...


더보기

앞서 설명한 것과 같이 VS Code 의 Dev Containers 를 사용하여 별도로 jdk 를 설치할 필요는 없습니다.

jdk 17: 
Spring boot 3.2.0:
  security(JWT)
  jpa
  querydsl

Git Clone 을 하여 프로젝트를 import 합니다.

(VS Code 에서 Git clone 을 하셔도 되고 명령어로 Git clone 을 하셔도 됩니다.)

(잘 모르실 경우 https://learn.microsoft.com/ko-kr/azure/developer/javascript/how-to/with-visual-studio-code/clone-github-repository?tabs=activity-bar 링크를 참조하세요.)

 

Spring boot 실행하기

 

Querydsl Compile (QClass 만들기)

 

Swagger 

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'

http://localhost:8090/swagger-ui/index.html

 


완전히 새로 만들고 싶을 때...

Dev Container 만들기


더보기
  • VS Code 를 여세요.
  • 프로젝트를 위한 폴더를 만들고 File - Open folder...(Ctrl + K, Ctrl + O) 여세요.
    (저의 경우 workspace/spring-boot-sample 입니다.)
  • 키보드의 Ctrl + Shift + P 를 누르세요.
  • Dev Containers: Add Dev Container Configuration Files... 를 검색하고 클릭하세요.
  • Java & PostgreSQL 을 검색하고 클릭하세요.
  • 21-bullseye 를 선택하세요.

 

  • Select the options for the ' Java & PostgreSQL ' dev container 와 Select additional featuers to install 에서는 아무것도 선택하지 않고 OK 버튼을 클릭하세요.
  • .devcontainer 폴더와 하위 3개 파일이 생성됩니다.

 


Devcontainer 설정하기

위 과정을 실행하셨다면 아래 파일들이 보이실 겁니다.

  • devcontainer.json
  • docker-compose.yml
  • Dockerfile

각 파일에 대한 설명은 다른 글에서 작성하도록 하겠습니다.

각 파일에 대한 설정을 복사 붙여넣기 하고 수정하실 부분을 수정하세요.


더보기

devcontainer.json

// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/java-postgres
{
  "name": "여기는 Dev Container 의 이름을 적어주세요",
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspaces/여기는 폴더 이름을 적어주세요",
  "features": {
    "ghcr.io/devcontainers-contrib/features/zsh-plugins:0": {
      "plugins": "",
      "omzPlugins": "https://github.com/zsh-users/zsh-autosuggestions",
      "username": "vscode"
    },
    "github-cli": "latest"
  },
  "forwardPorts": [8090],
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint",
        "eamodio.gitlens",
        "esbenp.prettier-vscode",
        "octref.vetur",
        "Orta.vscode-jest",
        "ritwickdey.LiveServer",
        "bradlc.vscode-tailwindcss",
        "mechatroner.rainbow-csv",
        "vmware.vscode-boot-dev-pack",
        "vscjava.vscode-java-pack",
        "vscjava.vscode-lombok",
        "vscjava.vscode-gradle",
        "bierner.markdown-mermaid"
      ],
      "settings": {
        "files.eol": "\n",
        "editor.tabSize": 4,
        "editor.renderWhitespace": "all",
        "typescript.validate.enable": false,
        "eslint.alwaysShowStatus": true,
        "editor.formatOnSave": true,
        "eslint.workingDirectories": [{ "mode": "auto" }],
        "editor.codeActionsOnSave": {
          "source.fixAll.eslint": true
        },
        "remote.localPortHost": "allInterfaces",
        "java.format.settings.profile": "GoogleStyle"
      }
    }
  },
  "remoteUser": "vscode"
}

 

docker-compose.yml

version: "3.8"
volumes:
  postgres-data:
services:
  app:
    container_name: 여기는 Container 이름을 적어주세요
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      POSTGRES_PASSWORD: 여기는 PostgreSQL DB 비밀번호가 될 거예요
      POSTGRES_USER: 여기는 PostgreSQL DB 계정 이름이 될 거예요
      POSTGRES_DB: 여기는 PostgreSQL DB Database 이름이 될 거예요
      POSTGRES_HOSTNAME: postgresdb # 여긴 변경하지마세요
    volumes:
      - ../..:/workspaces:cached
    command: sleep infinity
    network_mode: service:postgresdb
  postgresdb:
    container_name: postgresdb
    image: postgres:16.1-bullseye
    restart: always
    volumes:
      - postgres-data:/benggri/postgresql
    ports:
      - 5432
    environment:
      - POSTGRES_PASSWORD=여기는 PostgreSQL DB 비밀번호가 될 거예요
      - POSTGRES_USER=여기는 PostgreSQL DB 계정 이름이 될 거예요
      - POSTGRES_DB=여기는 PostgreSQL DB Database 이름이 될 거예요

 

Dockerfile

FROM mcr.microsoft.com/devcontainers/java:1-21-bullseye

# 시간 및 날짜 설정
ENV TZ Asia/Seoul

RUN apt-get update && \
    apt-get -y install wget curl && \
    echo "DONE"

 

  • 각 파일을 복사 붙여넣기 수정까지했으면 Ctrl + Shift + P 누르시고 Dev Containers: Rebuild Without Cache and Reopen in Container 검색하시고 선택해주세요.
  • 성공적으로 실행이 되면 devcontainer.json 파일 내용 중 customizations > vscode > extensions 에 적혀있는 모든 extensions 를 설치할 거예요.
    (시간이 필요하다는 말입니다.)
  • extensions 까지 설치가 다 되면(왼쪽에 아이콘들이 막 생겨나요) 아래 단계로 진행하세요.

 

Spring Boot Project 만들기


더보기
  • VS Code 에서 열려 있는 폴더는 workspace/spring-boot-sample 입니다.
  • Ctrl + Shift + P 를 누르시고 Spring Initializr: Create a Gradle Project... 를 검색하고 선택하세요.
  • 작성일(2023년12월) 기준 최신 버전인 3.2.0 을 선택하겠습니다.
  • Java 선택합니다.
  • Group Id 를 작성하세요.
    (저의 경우는 com.benggri 입니다.)
  • Artifact Id 를 작성하세요.
    주의할 점은 프로젝트의 folder 명과 일치하도록 해주셔야합니다.
    (저의 경우 spring-boot-sample 입니다.)
  • Jar 선택하세요.
    (Jar War 차이는 다른 글에서 설명하겠습니다. 일단 Jar 로 하시죠.)
  • Dependencies 는 원래 선택해야하지만 따라하는 과정이라 선택하지 않고 진행하겠습니다.
    (Selected 0 dependencies 를 선택해주세요.)
  • 폴더는 한단계 위를 선택해주세요.
    ( 저의 경우는 /workspaces/ 입니다.)
  •  그러면 VS Code 오른쪽 아래 메시지가 나옵니다. Continue 눌러주세요.
  • 스프링 프로젝트가 생성되었습니다.

 


 

Spring Boot Project 설정하기

  • postgresql 
  • security (JWT)
  • JPA
  • Querydsl
  • Swagger

build.gradle 설정은 아래와 같습니다.

더보기
  • build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.benggri' // 여기는 개인에 따라 다를 거예요
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

// ADD Line 1 ::: START
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
// ADD Line 1 ::: END

repositories {
    mavenCentral()
}

// 여기가 중요합니다
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-aop'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security' // security
    compileOnly 'org.projectlombok:lombok' // lombok
    runtimeOnly 'org.postgresql:postgresql' // postgresql
    annotationProcessor 'org.projectlombok:lombok' // lombok
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'

    // JWT
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3'
    implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
    implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
    // JWT

    // QueryDSL
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    implementation 'com.querydsl:querydsl-apt:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
    annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
    // QueryDSL

    // Swagger
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
    // Swagger
}

// ADD Line 2 ::: START
def querydslSrcDir = 'src/main/generated'
sourceSets {
  main {
    java {
      srcDirs += [ querydslSrcDir ]
    }
  }
}

compileJava {
    options.compilerArgs << '-Aquerydsl.generatedAnnotationClass=javax.annotation.Generated'
}

tasks.withType(JavaCompile) {
    options.generatedSourceOutputDirectory = file(querydslSrcDir)
}

clean {
  delete file(querydslSrcDir)
}
// ADD Line 2 ::: END

tasks.named('test') {
    useJUnitPlatform()
}

 

 


src/main/resources/application.properties 파일이 있을텐데 application.yml 로 바꿔주세요.

(이유는, 기술적인 이유보다 제가 보기 편하고 작성하기 편해서 입니다.)

src/main/resources/application.yml 설정은 아래와 같습니다.

주의하실 점은 spring > database 항목의 url, username, password 는 .devcontainer/docker-compose.yml 에서 설정한 값을 입력하셔야합니다.

더보기
  • src/main/resources/application.yml 
spring:
  profiles:
    default: local
  mvc:
    pathmatch:
      matching-strategy: ant-path-matcher
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true
    hibernate:
      ddl-auto: create-drop # create-drop: drop & create, create: create, update: update
    defer-datasource-initialization: true
  sql:
    init:
      mode: always
      platform: h2
  # .devcontainer/docker-compose.yml 파일에서 postgresdb 에서 설정한 값을 입력하세요
  # 저의 경우 benggri 입니다
  datasource:
    url: jdbc:postgresql://postgresdb:5432/benggri?useSSL=false 
    username: benggri
    password: benggri
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace
server:
  port: 8090

여기까지 진행하셨다면 프로젝트 폴더는 이렇게 생겼을 거예요.

 

지금 상태에서 Spring Boot 를 실행하면 정상적으로 실행이 됩니다.


 

 

반응형

댓글