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에서 백엔드 공부하는 김홍석이라고 합니다 +image 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() { + } + +}