diff --git a/.gitignore b/.gitignore
index 882ff9a..68b5389 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,204 +1,30 @@
-# Created by https://www.toptal.com/developers/gitignore/api/java,gradle,intellij,macos,windows
-# Edit at https://www.toptal.com/developers/gitignore?templates=java,gradle,intellij,macos,windows
-
-### Intellij ###
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
-# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-.idea
-
-# Gradle and Maven with auto-import
-# When using Gradle or Maven with auto-import, you should exclude module files,
-# since they will be recreated, and may cause churn. Uncomment if using
-# auto-import.
-# .idea/artifacts
-# .idea/compiler.xml
-# .idea/jarRepositories.xml
-# .idea/modules.xml
-# .idea/*.iml
-# .idea/modules
-# *.iml
-# *.ipr
-
-# CMake
-cmake-build-*/
-
-# Mongo Explorer plugin
-.idea/**/mongoSettings.xml
-
-# File-based project format
-*.iws
-
-# IntelliJ
-out/
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# SonarLint plugin
-.idea/sonarlint/
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-
-# Editor-based Rest Client
-.idea/httpRequests
-
-# Android studio 3.1+ serialized cache file
-.idea/caches/build_file_checksums.ser
-
-### Intellij Patch ###
-# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
-
-# *.iml
-# modules.xml
-# .idea/misc.xml
-# *.ipr
-
-# Sonarlint plugin
-# https://plugins.jetbrains.com/plugin/7973-sonarlint
-.idea/**/sonarlint/
-
-# SonarQube Plugin
-# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
-.idea/**/sonarIssues.xml
-
-# Markdown Navigator plugin
-# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
-.idea/**/markdown-navigator.xml
-.idea/**/markdown-navigator-enh.xml
-.idea/**/markdown-navigator/
-
-# Cache file creation bug
-# See https://youtrack.jetbrains.com/issue/JBR-2257
-.idea/$CACHE_FILE$
-
-# CodeStream plugin
-# https://plugins.jetbrains.com/plugin/12206-codestream
-.idea/codestream.xml
-
-# Azure Toolkit for IntelliJ plugin
-# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
-.idea/**/azureSettings.xml
-
-### Java ###
-# Compiled class file
-*.class
-
-# Log file
-*.log
-
-# BlueJ files
-*.ctxt
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-replay_pid*
-
-### macOS ###
-# General
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Icon must end with two \r
-Icon
-
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-.com.apple.timemachine.donotpresent
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
-### macOS Patch ###
-# iCloud generated files
-*.icloud
-
-### Windows ###
-# Windows thumbnail cache files
-Thumbs.db
-Thumbs.db:encryptable
-ehthumbs.db
-ehthumbs_vista.db
-
-# Dump file
-*.stackdump
-
-# Folder config file
-[Dd]esktop.ini
-
-# Recycle Bin used on file shares
-$RECYCLE.BIN/
-
-# Windows Installer files
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-# Windows shortcuts
-*.lnk
-
-### Gradle ###
+HELP.md
.gradle
-**/build/
-!src/**/build/
-
-# Ignore Gradle GUI config
-gradle-app.setting
+build/
+!gradle/wrapper/gradle-wrapper.jar
+!**/src/main/**/build/
+!**/src/test/**/build/
+/src/main/resources/application.yml
-# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
-!gradle-wrapper.jar
+.env
-# Avoid ignore Gradle wrappper properties
-!gradle-wrapper.properties
-
-# Cache of project
-.gradletasknamecache
-
-# Eclipse Gradle plugin generated files
-# Eclipse Core
-.project
-# JDT-specific (Eclipse Java Development Tools)
+### STS ###
+.apt_generated
.classpath
-
-### Gradle Patch ###
-# Java heap dump
-*.hprof
-
-# End of https://www.toptal.com/developers/gitignore/api/java,gradle,intellij,macos,windows
\ No newline at end of file
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+bin/
+!**/src/main/**/bin/
+!**/src/test/**/bin/
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+out/
+!**/src/main/**/out/
+!**/src/test/**/out/
diff --git a/Dockerfile b/Dockerfile
index 1b8797b..5522bd2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,21 +1,20 @@
-FROM openjdk:21-jdk-slim
+FROM bellsoft/liberica-openjdk-alpine:17
+# 다른 JDK 옵션:
+# FROM openjdk:8-jdk-alpine
+# FROM openjdk:11-jdk-alpine
-RUN apt-get update && apt-get install -y dos2unix
+CMD ["./gradlew", "clean", "build"]
+# 또는 Maven
+# CMD ["./mvnw", "clean", "package"]
-WORKDIR /app
+VOLUME /tmp
-COPY gradlew ./
-COPY gradle gradle
-COPY build.gradle ./
-COPY settings.gradle ./
+ARG JAR_FILE=build/libs/*.jar
+# Maven을 사용하는 경우
+# ARG JAR_FILE_PATH=target/*.jar
-RUN dos2unix gradlew
-
-COPY src src
-
-RUN ./gradlew build --no-daemon
+COPY ${JAR_FILE} app.jar
EXPOSE 8080
-# 만약 루트 디렉토리 이름이 다르다면 "build/libs/(디렉토리이름)-0.0.1-SNAPSHOT.jar" 으로 바꿔주기!
-ENTRYPOINT ["java", "-jar", "build/libs/techeer-partners-api-session-0.0.1-SNAPSHOT.jar"]
+ENTRYPOINT ["java", "-jar", "/app.jar"]
diff --git a/HELP.md b/HELP.md
deleted file mode 100644
index 4020dce..0000000
--- a/HELP.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Read Me First
-The following was discovered as part of building this project:
-
-* The original package name 'com.example.techeer-partners-api-session' is invalid and this project uses 'com.example.techeer_partners_api_session' instead.
-
-# Getting Started
-
-### Reference Documentation
-For further reference, please consider the following sections:
-
-* [Official Gradle documentation](https://docs.gradle.org)
-* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.5/gradle-plugin)
-* [Create an OCI image](https://docs.spring.io/spring-boot/3.3.5/gradle-plugin/packaging-oci-image.html)
-
-### Additional Links
-These additional references should also help you:
-
-* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)
-
diff --git a/README.md b/README.md
index 814c665..fe451fb 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,2 @@
-# Docker Desktop 활용법
-https://melodic-walleye-2ab.notion.site/Docker-Desktop-1395051bdea58049bcb9f9ebb10631f6?pvs=4
-
-
-# 과제 요구사항
-https://melodic-walleye-2ab.notion.site/1395051bdea580f3855cf4d35803dd5f?pvs=4
+## Techeer Partners에서 백엔드 공부하는 김홍석이라고 합니다
+
diff --git a/build.gradle b/build.gradle
index 0d20431..d639eaa 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,40 +1,35 @@
plugins {
- id 'java'
- id 'org.springframework.boot' version '3.3.5'
- id 'io.spring.dependency-management' version '1.1.6'
+ id 'java'
+ id 'org.springframework.boot' version '3.3.5'
+ id 'io.spring.dependency-management' version '1.1.6'
}
-group = 'com.example'
+group = 'TecheerPartners'
version = '0.0.1-SNAPSHOT'
java {
- toolchain {
- languageVersion = JavaLanguageVersion.of(21)
- }
-}
-
-configurations {
- compileOnly {
- extendsFrom annotationProcessor
- }
+ toolchain {
+ languageVersion = JavaLanguageVersion.of(17)
+ }
}
repositories {
- mavenCentral()
+ mavenCentral()
}
dependencies {
- implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
- //implementation 'org.springframework.boot:spring-boot-starter-security'
- implementation 'org.springframework.boot:spring-boot-starter-web'
- compileOnly 'org.projectlombok:lombok'
- runtimeOnly 'com.h2database:h2'
- annotationProcessor 'org.projectlombok:lombok'
- testImplementation 'org.springframework.boot:spring-boot-starter-test'
- testImplementation 'org.springframework.security:spring-security-test'
- testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
+ implementation 'org.springframework.boot:spring-boot-starter-web'
+ implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+ implementation 'com.mysql:mysql-connector-j' // MySQL 드라이버 추가
+ compileOnly 'org.projectlombok:lombok:1.18.24' // 최신 버전을 확인하고 사용하세요
+ annotationProcessor 'org.projectlombok:lombok:1.18.24'
+ implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
+
+
+
+ testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
- useJUnitPlatform()
+ useJUnitPlatform()
}
diff --git a/docker-compose.yml b/docker-compose.yml
index 9c7cf11..e586a46 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,9 +1,39 @@
version: '3.8'
services:
- spring:
+ application:
+ container_name: backend
+ restart: always
build:
- context: .
+ context: ./
dockerfile: Dockerfile
ports:
- "8080:8080"
+ environment:
+ SPRING_DATASOURCE_URL: jdbc:mysql://mysql_db:3306/${MYSQL_DATABASE}?useSSL=false&allowPublicKeyRetrieval=true
+ SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME}
+ SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
+ SPRINGDOC_SWAGGER_UI_PATH: /
+ depends_on:
+ - database
+ networks:
+ - team_h # 네트워크 추가
+
+ database:
+ container_name: mysql_db
+ image: mysql:latest
+ restart: always
+ ports:
+ - "3306:3306"
+ volumes:
+ - ./mysql/conf.d:/etc/mysql/conf.d/my.cnf
+ - ./mysql/initdb.d:/docker-entrypoint-initdb.d
+ environment:
+ MYSQL_DATABASE: ${MYSQL_DATABASE}
+ MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
+ networks:
+ - team_h # 네트워크 추가
+
+networks:
+ team_h: # 네트워크 정의
+ driver: bridge # 기본 브리지 네트워크 사용
diff --git a/gradlew.bat b/gradlew.bat
index 9b42019..9d21a21 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,94 +1,94 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-@rem SPDX-License-Identifier: Apache-2.0
-@rem
-
-@if "%DEBUG%"=="" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-goto fail
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
-
-:end
-@rem End local scope for the variables with windows NT shell
-if %ERRORLEVEL% equ 0 goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-set EXIT_CODE=%ERRORLEVEL%
-if %EXIT_CODE% equ 0 set EXIT_CODE=1
-if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
-exit /b %EXIT_CODE%
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/mysql/conf.d/my.cnf b/mysql/conf.d/my.cnf
new file mode 100644
index 0000000..61da16b
--- /dev/null
+++ b/mysql/conf.d/my.cnf
@@ -0,0 +1,3 @@
+[mysqld]
+character-set-server=utf8mb4
+collation-server=utf8mb4_unicode_ci
diff --git a/settings.gradle b/settings.gradle
index 88a5500..7253880 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1 @@
-// 루트 디렉토리 이름으로 맞춰주기!
-rootProject.name = 'techeer-partners-api-session'
-
+rootProject.name = 'TecheerPartners'
diff --git a/src/main/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplication.java b/src/main/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplication.java
deleted file mode 100644
index dd01199..0000000
--- a/src/main/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplication.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.example.techeer_partners_api_session;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class TecheerPartnersApiSessionApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(TecheerPartnersApiSessionApplication.class, args);
- }
-
-}
diff --git a/src/main/java/com/example/techeer_partners_api_session/config/WebConfig.java b/src/main/java/com/example/techeer_partners_api_session/config/WebConfig.java
deleted file mode 100644
index bc617fa..0000000
--- a/src/main/java/com/example/techeer_partners_api_session/config/WebConfig.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.example.techeer_partners_api_session.config;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-@Configuration
-public class WebConfig implements WebMvcConfigurer {
-
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**") // 모든 경로에 대해
- .allowedOrigins("http://localhost:3000") // 프론트엔드 주소 (React 예시)
- .allowedMethods("GET", "POST", "PUT", "DELETE") // 허용할 HTTP 메서드
- .allowedHeaders("*") // 모든 헤더 허용
- .allowCredentials(true); // 쿠키 등 인증 정보 허용
- }
-}
diff --git a/src/main/java/techeerpartners/techeerpartners/TecheerPartnersApplication.java b/src/main/java/techeerpartners/techeerpartners/TecheerPartnersApplication.java
new file mode 100644
index 0000000..3c0dff5
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/TecheerPartnersApplication.java
@@ -0,0 +1,13 @@
+package techeerpartners.techeerpartners;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class TecheerPartnersApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TecheerPartnersApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/techeerpartners/techeerpartners/board/controller/BoardController.java b/src/main/java/techeerpartners/techeerpartners/board/controller/BoardController.java
new file mode 100644
index 0000000..aa9239e
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/board/controller/BoardController.java
@@ -0,0 +1,53 @@
+package techeerpartners.techeerpartners.board.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import techeerpartners.techeerpartners.board.dto.response.BoardResponse;
+import techeerpartners.techeerpartners.board.dto.request.CreateBoardRequestDto;
+import techeerpartners.techeerpartners.board.dto.request.FixBoardRequestDto;
+import techeerpartners.techeerpartners.board.service.BoardService;
+import techeerpartners.techeerpartners.common.CustomApiResponse;
+
+import java.util.List;
+
+@Tag(name = "Board", description = "게시판 API")
+@RequestMapping("/board")
+@RestController
+@AllArgsConstructor
+public class BoardController {
+ private final BoardService boardService;
+ @Operation(summary = "할 일 추가", description = "새로운 할 일을 추가합니다.")
+ @PostMapping("/tasks")
+ public ResponseEntity createTask(@RequestBody CreateBoardRequestDto createBoardRequestDto) {
+ boardService.createBoard(createBoardRequestDto);
+ return ResponseEntity.status(HttpStatus.OK).body(CustomApiResponse.onSuccess("일정 추가됌"));
+ }
+ @Operation(summary = "할 일 수정", description = "할 일과,완료여부가 수정되었습니다.")
+ @PatchMapping("/tasks/{id}")
+ public ResponseEntity updateTask(@PathVariable Long id, @RequestBody FixBoardRequestDto fixBoardRequestDto) {
+ boardService.updateBoard(id,fixBoardRequestDto);
+ return ResponseEntity.status(HttpStatus.OK).body(CustomApiResponse.onSuccess("할 일이 수정됌."));
+ }
+ @Operation(summary = "할 일 삭제", description = "할 일이 삭제되어있습니다.")
+ @DeleteMapping("/tasks/{id}")
+ public ResponseEntity deleteTask(@PathVariable Long id) {
+ boardService.deleteBoard(id);
+ return ResponseEntity.status(HttpStatus.OK).body(CustomApiResponse.onSuccess("할 일이 삭제됌."));
+ }
+ @Operation(summary = "완료된 일과 미완료된 일들을 파라미터로 조회", description = "true인 일과 false인 일들을 파라미터로 조회합니다.")
+ @GetMapping("/tasks")
+ public ResponseEntity>> getTasks(@RequestParam boolean isDone) {
+ List tasks = boardService.getTasksByStatus(isDone);
+ return ResponseEntity.status(HttpStatus.OK).body(CustomApiResponse.onSuccess(tasks));
+ }
+ @Operation(summary = "모든 일 조회", description = "모든 일들을 조회합니다.")
+ @GetMapping("/all/tasks")
+ public ResponseEntity>> getAllTasks() {
+ List checkBoardResult = boardService.getAllTasks();
+ return ResponseEntity.status(HttpStatus.OK).body(CustomApiResponse.onSuccess(checkBoardResult));
+ }
+}
diff --git a/src/main/java/techeerpartners/techeerpartners/board/dto/request/CreateBoardRequestDto.java b/src/main/java/techeerpartners/techeerpartners/board/dto/request/CreateBoardRequestDto.java
new file mode 100644
index 0000000..1df2ba9
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/board/dto/request/CreateBoardRequestDto.java
@@ -0,0 +1,18 @@
+package techeerpartners.techeerpartners.board.dto.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CreateBoardRequestDto {
+ private String title;
+ private String content;
+
+
+
+}
diff --git a/src/main/java/techeerpartners/techeerpartners/board/dto/request/FixBoardRequestDto.java b/src/main/java/techeerpartners/techeerpartners/board/dto/request/FixBoardRequestDto.java
new file mode 100644
index 0000000..3728fb1
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/board/dto/request/FixBoardRequestDto.java
@@ -0,0 +1,15 @@
+package techeerpartners.techeerpartners.board.dto.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class FixBoardRequestDto {
+ private String content;
+ private Boolean isDone;
+}
diff --git a/src/main/java/techeerpartners/techeerpartners/board/dto/response/BoardResponse.java b/src/main/java/techeerpartners/techeerpartners/board/dto/response/BoardResponse.java
new file mode 100644
index 0000000..e9ceef6
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/board/dto/response/BoardResponse.java
@@ -0,0 +1,17 @@
+package techeerpartners.techeerpartners.board.dto.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BoardResponse {
+ private Long id;
+ private String title;
+ private Boolean isDone;
+
+}
diff --git a/src/main/java/techeerpartners/techeerpartners/board/entity/Board.java b/src/main/java/techeerpartners/techeerpartners/board/entity/Board.java
new file mode 100644
index 0000000..d022a1e
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/board/entity/Board.java
@@ -0,0 +1,32 @@
+package techeerpartners.techeerpartners.board.entity;
+
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.time.LocalDateTime;
+@Builder
+@Entity
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "Board")
+public class Board {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long boardId;
+
+ @Column
+ private String title;
+
+ @Column
+ private String content;
+
+ @Column(nullable = false)
+ @Builder.Default
+ private Boolean isDone = false;
+
+ @Column
+ private LocalDateTime createdAt = LocalDateTime.now();
+
+}
diff --git a/src/main/java/techeerpartners/techeerpartners/board/repository/BoardRepository.java b/src/main/java/techeerpartners/techeerpartners/board/repository/BoardRepository.java
new file mode 100644
index 0000000..28bf5bb
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/board/repository/BoardRepository.java
@@ -0,0 +1,13 @@
+package techeerpartners.techeerpartners.board.repository;
+
+import lombok.Getter;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import org.springframework.web.bind.annotation.RequestBody;
+import techeerpartners.techeerpartners.board.entity.Board;
+
+import java.util.List;
+@Repository
+public interface BoardRepository extends JpaRepository {
+ List findByIsDone(boolean isDone);
+}
\ No newline at end of file
diff --git a/src/main/java/techeerpartners/techeerpartners/board/service/BoardService.java b/src/main/java/techeerpartners/techeerpartners/board/service/BoardService.java
new file mode 100644
index 0000000..08a7ec3
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/board/service/BoardService.java
@@ -0,0 +1,66 @@
+package techeerpartners.techeerpartners.board.service;
+
+import jakarta.transaction.Transactional;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import techeerpartners.techeerpartners.board.dto.response.BoardResponse;
+import techeerpartners.techeerpartners.board.dto.request.CreateBoardRequestDto;
+import techeerpartners.techeerpartners.board.dto.request.FixBoardRequestDto;
+import techeerpartners.techeerpartners.board.entity.Board;
+import techeerpartners.techeerpartners.board.repository.BoardRepository;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class BoardService {
+ private final BoardRepository boardRepository;
+ @Transactional
+ public void createBoard(CreateBoardRequestDto createBoardRequestDto) {
+ Board board = Board.builder()
+ .title(createBoardRequestDto.getTitle())
+ .content(createBoardRequestDto.getContent())
+ .build();
+ boardRepository.save(board);
+ }
+ @Transactional
+ public void updateBoard(Long id, FixBoardRequestDto fixBoardRequestDto) {
+ Board board = boardRepository.findById(id)
+ .orElseThrow(() -> new IllegalArgumentException("ID를 찾을 수없음"));
+ Board updatedBoard = Board.builder()
+ .boardId(board.getBoardId())
+ .title(board.getTitle())
+ .content(fixBoardRequestDto.getContent())
+ .isDone(fixBoardRequestDto.getIsDone())
+ .createdAt(board.getCreatedAt())
+ .build();
+ boardRepository.save(updatedBoard);
+ }
+
+ @Transactional
+ public void deleteBoard(Long id) {
+ Board board =boardRepository.findById(id)
+ .orElseThrow(() -> new IllegalArgumentException("ID를 찾을 수없음"));
+ boardRepository.delete(board);
+ }
+ public List getTasksByStatus(boolean isDone) {
+ return boardRepository.findByIsDone(isDone).stream()
+ .map(board -> BoardResponse.builder()
+ .id(board.getBoardId())
+ .title(board.getTitle())
+ .isDone(board.getIsDone())
+ .build())
+ .collect(Collectors.toList());
+ }
+ public List getAllTasks() {
+ return boardRepository.findAll().stream()
+ .map(board -> BoardResponse.builder()
+ .id(board.getBoardId())
+ .title(board.getTitle())
+ .isDone(board.getIsDone())
+ .build())
+ .collect(Collectors.toList());
+ }
+
+}
diff --git a/src/main/java/techeerpartners/techeerpartners/common/CustomApiResponse.java b/src/main/java/techeerpartners/techeerpartners/common/CustomApiResponse.java
new file mode 100644
index 0000000..fa673cd
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/common/CustomApiResponse.java
@@ -0,0 +1,25 @@
+package techeerpartners.techeerpartners.common;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+@JsonPropertyOrder({"isSuccess", "message", "result", "errorCode"})
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class CustomApiResponse {
+ private final boolean isSuccess;
+ private final String message;
+ private final T result;
+ private final String errorCode;
+
+ public static CustomApiResponse onSuccess(T result) {
+ return new CustomApiResponse<>(true, "", result, null);
+ }
+
+ public static CustomApiResponse onFailure(String message, String errorCode) {
+ return new CustomApiResponse<>(false, message, null, errorCode);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/techeerpartners/techeerpartners/config/SwaggerConfig.java b/src/main/java/techeerpartners/techeerpartners/config/SwaggerConfig.java
new file mode 100644
index 0000000..47f68a5
--- /dev/null
+++ b/src/main/java/techeerpartners/techeerpartners/config/SwaggerConfig.java
@@ -0,0 +1,25 @@
+package techeerpartners.techeerpartners.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+
+@Configuration
+public class SwaggerConfig {
+ @Bean
+ public OpenAPI openAPI() {
+ return new OpenAPI()
+ .components(new Components())
+ .info(apiInfo());
+ }
+
+ private Info apiInfo() {
+ return new Info()
+ .title("Springdoc")
+ .description("Swagger UI")
+ .version("1.0.0");
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
deleted file mode 100644
index c7ffb1a..0000000
--- a/src/main/resources/application.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-spring.application.name=techeer-partners-api-session
-
-# H2
-spring.datasource.url=jdbc:h2:mem:todolistdb
-spring.datasource.driverClassName=org.h2.Driver
-spring.datasource.username=user
-spring.datasource.password=password
-spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
-spring.h2.console.enabled=true
-spring.h2.console.path=/h2-console
diff --git a/src/test/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplicationTests.java b/src/test/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplicationTests.java
deleted file mode 100644
index 4d67ec1..0000000
--- a/src/test/java/com/example/techeer_partners_api_session/TecheerPartnersApiSessionApplicationTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.example.techeer_partners_api_session;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class TecheerPartnersApiSessionApplicationTests {
-
- @Test
- void contextLoads() {
- }
-
-}
diff --git a/src/test/java/techeerpartners/techeerpartners/TecheerPartnersApplicationTests.java b/src/test/java/techeerpartners/techeerpartners/TecheerPartnersApplicationTests.java
new file mode 100644
index 0000000..c81506d
--- /dev/null
+++ b/src/test/java/techeerpartners/techeerpartners/TecheerPartnersApplicationTests.java
@@ -0,0 +1,13 @@
+package techeerpartners.techeerpartners;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class TecheerPartnersApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}