diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 7049f9ac..00000000 --- a/Jenkinsfile +++ /dev/null @@ -1,74 +0,0 @@ -pipeline{ - agent any - environment { - SCRIPT_PATH = '/var/jenkins_home/custom/kurum' - } - tools { - gradle 'kurum' - } - stages{ - stage('Checkout') { - steps { - checkout scm - } - } - stage('Prepare'){ - steps { - sh 'gradle clean' - } - } - stage('Replace Prod Properties') { - steps { - withCredentials([ - file(credentialsId: 'kurumprod', variable: 'kurumprod'), - file(credentialsId: 'firebase', variable: 'firebase') - ]) { - script { - sh 'cp $kurumprod ./src/main/resources/application-prod.yml' - sh 'cp $firebase ./src/main/resources/kuroom-90fb5-firebase-adminsdk-fbsvc-f264f66c64.json' - } - } - } - } - stage('Build') { - steps { - sh 'gradle build' - } - } - stage('Deploy') { - steps { - sh ''' - cp ./docker/docker-compose.blue.yml ${SCRIPT_PATH} - cp ./docker/docker-compose.green.yml ${SCRIPT_PATH} - cp ./docker/Dockerfile ${SCRIPT_PATH} - cp ./scripts/deploy.sh ${SCRIPT_PATH} - cp ./build/libs/*.jar ${SCRIPT_PATH} - chmod +x ${SCRIPT_PATH}/deploy.sh - ${SCRIPT_PATH}/deploy.sh - ''' - } - } - } - post { - success { - withCredentials([string(credentialsId: 'Discord-Webhook', variable: 'DISCORD')]) { - discordSend description: "✅ 성공: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})\n최근 커밋: '${env.GIT_COMMIT_MESSAGE}'", - footer: "footer 표시", - link: env.BUILD_URL, - result: currentBuild.currentResult, - title: "젠킨스 JOB", - webhookURL: "$DISCORD" - } - } - failure { - withCredentials([string(credentialsId: 'Discord-Webhook', variable: 'DISCORD')]) { - discordSend description: "❌ 실패: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})\n최근 커밋: '${env.GIT_COMMIT_MESSAGE}'", - footer: "footer 표시", - link: env.BUILD_URL, - result: currentBuild.currentResult, - title: "젠킨스 JOB", - webhookURL: "$DISCORD" - } - } - } -} diff --git a/README.md b/README.md deleted file mode 100644 index 43389191..00000000 --- a/README.md +++ /dev/null @@ -1,61 +0,0 @@ -## 쿠룸 백엔드 -image - -## 기술 스택 - -### 백엔드 -image - -
- -### 인프라 -image - - -### CI/CD -image - - -### 모니터링 -image - - -## 기술 의사 결정 - -
-

  Spring RestDocs

- -### 도입 배경 - ---- -- Swagger (Springdoc OpenAPI)와 같은 UI 기반 문서화 도구도 있지만,
-테스트 코드 기반이 아니라서, 실제 API와 문서가 불일치할 가능성이 있음 - -- Spring REST Docs는 테스트 코드 기반으로 API 문서를 자동 생성하기 때문에
-API 변경 사항이 있으면 테스트 코드 수정과 함께 문서도 자동 업데이트됨 -### 선택지 - ---- - -| | Swagger | Spring REST Docs | -|:---:|:-----------------------------------------------------------|:-----------------------------------------------------------------------------------------| -| 장점 | 쉬운 세팅 및 사용, 실제 API 호출 기능 제공 | 실제 API의 동작을 테스트하면서 문서가 생성되므로, 코드와 문서 사이의 불일치가 발생할 가능성이 적음 | -| 단점 | 코드에 주석을 기반으로 하므로, 실제 코드와 문서화 사이에 불일치 발생 가능 | 테스트 코드 작성에 투자해야 하는 시간과 노력이 필요 | - -### 최종 결정 - ---- -프로덕션 코드에 영향이 없고, 컨트롤러 테스트 코드를 의무화하는 Spring REST Docs와
API를 호출 할 수 있는 웹 기반 UI가 제공하는 Swagger UI 통합 사용 -
- -## 멤버 - -### 백엔드 - -| | | | | -|:-----------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------:| -| [혜리](https://github.com/Hyeri1ee) | [현준](https://github.com/buzz0331) | [재윤](https://github.com/tintin010) | [민우](https://github.com/kmw10693) | - - - - diff --git a/build.gradle b/build.gradle index 4043f622..5d57a1a1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,3 @@ -// 1. Import 추가 -//import org.hidetake.gradle.swagger.generator.GenerateSwaggerUI - buildscript { ext { restdocsApiSpecVersion = '0.18.3' // restdocsApiSpecVersion 버전 변수 설정 @@ -16,72 +13,10 @@ plugins { id 'com.epages.restdocs-api-spec' version "${restdocsApiSpecVersion}" //swagger generator 플러그인 추가 id 'org.hidetake.swagger.generator' version '2.18.2' - id 'jacoco' } group = 'ku-rum' version = '0.0.1-SNAPSHOT' - -jacoco { - toolVersion = "0.8.8" - reportsDirectory = layout.buildDirectory.dir('customJacocoReportDir') -} - -test { - finalizedBy jacocoTestReport // test 작업이 끝나고 jacocoTestReport를 실행 -} - -jacocoTestReport { - dependsOn test // test 종속성 추가 - - reports { - xml.required = true - csv.required = false - html.required = true - } - - def QDomainList = [] - for (qPattern in '**/QA'..'**/QZ') { // QClass 대응 - QDomainList.add(qPattern + '*') - } - - afterEvaluate { - classDirectories.setFrom(files(classDirectories.files.collect { - fileTree(dir: it, exclude: [ - '**/dto/**', - '**/event/**', - '**/*InitData*', - '**/*Application*', - '**/exception/**', - '**/service/alarm/**', - '**/aop/**', - '**/config/**', - '**/MemberRole*', - '**/oauth/**' - ] + QDomainList) - })) - } - - finalizedBy 'jacocoTestCoverageVerification' // jacocoTestReport 태스크가 끝난 후 실행 -} - -jacocoTestCoverageVerification { - violationRules { - - rule { - enabled = true - //코드 버커리지 체크 기준 - element = 'CLASS' - - limit { - counter = 'CLASS' - value = 'COVEREDRATIO' - minimum = 0.0 - } - } - } -} - java { toolchain { languageVersion = JavaLanguageVersion.of(17) @@ -127,8 +62,6 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' - annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" @@ -146,17 +79,6 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' - implementation 'org.apache.httpcomponents.client5:httpclient5:5.2' - implementation 'org.seleniumhq.selenium:selenium-java:4.12.1' - implementation 'io.github.bonigarcia:webdrivermanager:5.7.0' - - // Selenium Java - implementation 'org.seleniumhq.selenium:selenium-java:4.12.1' - - // WebDriver Manager - implementation 'io.github.bonigarcia:webdrivermanager:5.7.0' - implementation 'org.jsoup:jsoup:1.15.3' - // JWT implementation 'io.jsonwebtoken:jjwt-api:0.12.3' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3' @@ -165,9 +87,6 @@ dependencies { // OAUTH implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' - // JSOUP - implementation 'org.jsoup:jsoup:1.17.2' - // Spring REST Docs 의존성 testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' // 8. openAPI3 추가 diff --git a/docs/README_EN.md b/docs/README_EN.md deleted file mode 100644 index 2439cab9..00000000 --- a/docs/README_EN.md +++ /dev/null @@ -1,77 +0,0 @@ -

- -

- -# KU:Room -
- -[![KOR](https://img.shields.io/badge/한-45A1FC?style=for-the-badge&logo=XML&logoColor=white)](README_KR.md) -[![ENG](https://img.shields.io/badge/ENG-FF5733?style=for-the-badge&logo=XML&logoColor=white)](README_EN.md) - -University Life Guide **"KU:Room"** Backend Repository. - - -- From the 2025 academic year, the department will be reorganized into an Open Major Program, making it easier to access university life information! -- You can view **all university announcements** (academic, international, career, etc.) in one place! -- You can check the **campus map** and find information about various facilities (K-Cube, K-Hub, convenience stores, student cafeterias, etc.). -- **Community features** allow you to mark locations, post messages, and engage in discussions through comments. - -
- -## Table of Contents - -- [Backend Members](#backend-members) -- [Demo](#demo) -- [Architecture](#architecture) -- [Stack](#stack) -- [Collaboration](#collaboration) -- [License](#license) - - -
- -## Backend Members - - -| | | | | -|:-----------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------:| -| [Hyeri](https://github.com/Hyeri1ee) | [Hyunjun](https://github.com/buzz0331) | [Jaeyoon](https://github.com/tintin010) | [Minu](https://github.com/kmw10693) | - - -## Demo - -coming soon~ - -## Architecture - -coming soon~ - - -## Stack - -### 🛠️ Dependencies -- Java 17, Junit 5 -- Spring Boot 3.0 -- MySQL - -### 🛠️ Stack -#### Framework - -#### Database - -#### ORM - -#### Deploy - -#### API Docs - -#### Test - - -## Collaboration - -To make development more enjoyable and efficient, KU:Room follows these collaboration practices: - -

Automation with GitHub Actions

- -- When a pull request is created, a Jira task is automatically generated! -- Every day at 4 PM, pending pull requests are notified via Discord! -- Deadlines are automatically updated with labels, making it easier to track due dates! - - -## License -ⓒ 2025. KU:Room All rights reserved. diff --git a/docs/README_KR.md b/docs/README_KR.md deleted file mode 100644 index d6520702..00000000 --- a/docs/README_KR.md +++ /dev/null @@ -1,92 +0,0 @@ -

- -

- -# KU:Room -
- -[![KOR](https://img.shields.io/badge/한-45A1FC?style=for-the-badge&logo=XML&logoColor=white)](README_KR.md) -[![ENG](https://img.shields.io/badge/ENG-FF5733?style=for-the-badge&logo=XML&logoColor=white)](README_EN.md) - -대학생활 가이드 **"쿠름"** 백엔드 레포 입니다. - - -- 2025학년도부터 자유전공학부로 개편되어 대학생활 정보를 쉽게 얻을 수 있도록 만들었어요! -- **학교 공지사항**(학사,국제,취창업 등)을 한 번에 볼 수 있어요! -- **학교 맵**과 각종 편의시설(k-cube,k-hub,편의점,학생식당 등)의 위치와 정보들을 볼 수 있어요! -- **커뮤니티 기능**이 있어서 포인트를 찍고 글, 댓글로 소통할 수 있어요! - -
- -## 목차 - -- [백엔드멤버](#백엔드멤버) -- [데모](#데모) -- [아키텍쳐](#아키텍쳐) -- [스택](#스택) -- [협업방식](#협업방식) -- [권한](#권한) - - -
- -## 백엔드멤버 - - -| | | | | -|:-----------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------:| -| [혜리](https://github.com/Hyeri1ee) | [현준](https://github.com/buzz0331) | [재윤](https://github.com/tintin010) | [민우](https://github.com/kmw10693) | - - -## 데모 - -coming soon~ - -## 아키텍쳐 - -coming soon~ - - - - - -## 스택 - -### 🛠️ 의존성 -- Java 17, Junit 5 -- Spring Boot 3.0 -- MySQL - -### 🛠️ 스택 -#### Framework - - -#### Database - - -#### ORM - - -#### Deploy - - -#### API Docs - - -#### Test - - -## 협업방식 - -보다 더 재밌고 효율적인 개발을 하기 위해 쿠름은 이런 협업방식을 추구해요 - -

git action으로 업무 자동화

- -- Pull request를 생성하면 Jira 일정이 자동 생성돼요! -- 매일 오후 4시마다 남은 Pull request 목록들이 디스코드로 알림이 가요! -- 자동으로 마감기한 라벨이 변경되어 마감기한을 지키기 수월해요! - - - -## 권한 -ⓒ 2025. KU:Room All rights reserved. \ No newline at end of file diff --git a/src/main/java/ku_rum/backend/domain/oauth/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/ku_rum/backend/domain/oauth/handler/OAuth2AuthenticationSuccessHandler.java index ff202a3e..99199997 100644 --- a/src/main/java/ku_rum/backend/domain/oauth/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/ku_rum/backend/domain/oauth/handler/OAuth2AuthenticationSuccessHandler.java @@ -1,10 +1,14 @@ package ku_rum.backend.domain.oauth.handler; -import com.github.dockerjava.api.exception.BadRequestException; +import static ku_rum.backend.domain.oauth.handler.HttpCookieOAuth2AuthorizationRequestRepository.REDIRECT_URI_PARAM_COOKIE_NAME; + import jakarta.annotation.PostConstruct; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URI; +import java.util.Optional; import ku_rum.backend.domain.oauth.domain.OAuth2MemberInfo; import ku_rum.backend.domain.oauth.domain.PreSignupPrincipal; import ku_rum.backend.domain.oauth.domain.ProviderType; @@ -17,17 +21,10 @@ import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.core.oidc.user.OidcUser; -import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; import org.springframework.stereotype.Component; import org.springframework.web.util.UriComponentsBuilder; -import java.io.IOException; -import java.net.URI; -import java.util.Optional; - -import static ku_rum.backend.domain.oauth.handler.HttpCookieOAuth2AuthorizationRequestRepository.REDIRECT_URI_PARAM_COOKIE_NAME; - @Component @RequiredArgsConstructor public class OAuth2AuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { @@ -60,12 +57,13 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo getRedirectStrategy().sendRedirect(request, response, targetUrl); } - protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) { Optional redirectUri = CookieUtils.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME) .map(Cookie::getValue); if (redirectUri.isPresent() && !isAuthorizedRedirectUri(redirectUri.get())) { - throw new BadRequestException("승인되지 않은 리다이렉션 URI입니다"); + throw new RuntimeException("승인되지 않은 리다이렉션 URI입니다"); } String targetUrl = redirectUri.orElse(getDefaultTargetUrl()); diff --git a/src/main/java/ku_rum/backend/global/config/QueryDslConfig.java b/src/main/java/ku_rum/backend/global/config/QueryDslConfig.java deleted file mode 100644 index 0c9c46da..00000000 --- a/src/main/java/ku_rum/backend/global/config/QueryDslConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package ku_rum.backend.global.config; - -import com.querydsl.jpa.impl.JPAQueryFactory; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class QueryDslConfig { - - @PersistenceContext - private EntityManager entityManager; - - @Bean - public JPAQueryFactory jpaQueryFactory() { - return new JPAQueryFactory(entityManager); - } -} \ No newline at end of file diff --git a/src/main/java/ku_rum/backend/global/handler/GlobalExceptionControllerAdvice.java b/src/main/java/ku_rum/backend/global/handler/GlobalExceptionControllerAdvice.java index 1e24f012..75983373 100644 --- a/src/main/java/ku_rum/backend/global/handler/GlobalExceptionControllerAdvice.java +++ b/src/main/java/ku_rum/backend/global/handler/GlobalExceptionControllerAdvice.java @@ -1,28 +1,32 @@ package ku_rum.backend.global.handler; -import com.github.dockerjava.api.exception.BadRequestException; -import com.github.dockerjava.api.exception.InternalServerErrorException; +import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.ACCESS_DENIED; +import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.BAD_REQUEST; +import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.FIELD_ERROR; +import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.INTERNAL_SERVER_ERROR; +import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.METHOD_ARGUMENT_ERROR; +import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.METHOD_NOT_ALLOWED; +import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.SERVER_ERROR; +import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.URL_NOT_FOUND; + import jakarta.validation.ConstraintViolationException; +import java.util.ArrayList; +import java.util.List; import ku_rum.backend.global.exception.global.GlobalException; import ku_rum.backend.global.support.response.BaseErrorResponse; import lombok.extern.slf4j.Slf4j; import org.hibernate.TypeMismatchException; import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; import org.springframework.validation.FieldError; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.security.access.AccessDeniedException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.servlet.NoHandlerFoundException; -import java.util.ArrayList; -import java.util.List; - -import static ku_rum.backend.global.support.status.BaseExceptionResponseStatus.*; - @Slf4j @RestControllerAdvice @@ -36,7 +40,7 @@ public BaseErrorResponse handleServerException(final Exception e) { } @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler({BadRequestException.class, NoHandlerFoundException.class, TypeMismatchException.class}) + @ExceptionHandler({NoHandlerFoundException.class, TypeMismatchException.class}) public BaseErrorResponse handleBadRequest(final Exception e) { log.error("[handle BadRequest]", e); return new BaseErrorResponse(URL_NOT_FOUND); @@ -44,7 +48,8 @@ public BaseErrorResponse handleBadRequest(final Exception e) { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - public BaseErrorResponse handle_HttpRequestMethodNotSupportedException(final HttpRequestMethodNotSupportedException e) { + public BaseErrorResponse handle_HttpRequestMethodNotSupportedException( + final HttpRequestMethodNotSupportedException e) { log.error("[handle_HttpRequestMethodNotSupportedException]", e); return new BaseErrorResponse(METHOD_NOT_ALLOWED); } @@ -56,13 +61,6 @@ public BaseErrorResponse handle_ConstraintViolationException(final ConstraintVio return new BaseErrorResponse(BAD_REQUEST); } - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(InternalServerErrorException.class) - public BaseErrorResponse handle_InternalServerError(final InternalServerErrorException e) { - log.error("[handle_InternalServerError]", e); - return new BaseErrorResponse(INTERNAL_SERVER_ERROR); - } - @ResponseStatus(HttpStatus.FORBIDDEN) @ExceptionHandler(AccessDeniedException.class) public BaseErrorResponse handle_AccessDeniedException(final AccessDeniedException e) { @@ -82,7 +80,8 @@ public List MethodArgumentNotValidExceptionHandler(final Meth List responses = new ArrayList<>(); for (FieldError error : e.getFieldErrors()) { log.error("errorFieldName : {}, error message : {}", error.getField(), error.getDefaultMessage()); - BaseErrorResponse baseErrorResponse = new BaseErrorResponse(FIELD_ERROR.getStatus(), error.getDefaultMessage()); + BaseErrorResponse baseErrorResponse = new BaseErrorResponse(FIELD_ERROR.getStatus(), + error.getDefaultMessage()); responses.add(baseErrorResponse); } return responses; diff --git a/src/test/java/ku_rum/backend/domain/common/mail/presentation/MailControllerTest.java b/src/test/java/ku_rum/backend/domain/common/mail/presentation/MailControllerTest.java index c352d5c8..a933856a 100644 --- a/src/test/java/ku_rum/backend/domain/common/mail/presentation/MailControllerTest.java +++ b/src/test/java/ku_rum/backend/domain/common/mail/presentation/MailControllerTest.java @@ -14,10 +14,10 @@ import ku_rum.backend.domain.common.mail.dto.request.MailVerificationRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.openqa.selenium.json.JsonType; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; @@ -53,22 +53,22 @@ void authCode() throws Exception { .description("이메일 인증 요청") .requestFields( fieldWithPath("email") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("건국대학교 웹메일") .attributes(constraints("이메일 형식을 지켜야 합니다.")) ) .responseFields( fieldWithPath("code") - .type(JsonType.STRING) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 (OK)"), fieldWithPath("data") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 '메일이 성공적으로 전송되었습니다.' 반환합니다.") ).build()))); } @@ -98,26 +98,26 @@ void verificationCode() throws Exception { .description("이메일 인증 코드 검증") .requestFields( fieldWithPath("email") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("건국대학교 웹메일") .attributes(constraints("이메일 형식을 지켜야 합니다.")), fieldWithPath("code") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("건국대학교 웹메일") .attributes(constraints("사용자가 받은 인증코드를 입력받습니다.")) ) .responseFields( fieldWithPath("code") - .type(JsonType.NUMBER) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("올바른 인증코드 시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("올바른 인증코드 시 메시지 (OK)"), fieldWithPath("data.verified") - .type(JsonType.BOOLEAN) + .type(JsonFieldType.BOOLEAN) .description("인증 성공 여부") ).build()))); } diff --git a/src/test/java/ku_rum/backend/domain/user/presentation/UserControllerTest.java b/src/test/java/ku_rum/backend/domain/user/presentation/UserControllerTest.java index 18e321f0..a99e18b0 100644 --- a/src/test/java/ku_rum/backend/domain/user/presentation/UserControllerTest.java +++ b/src/test/java/ku_rum/backend/domain/user/presentation/UserControllerTest.java @@ -41,7 +41,6 @@ import ku_rum.backend.global.security.CustomUserDetails; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.openqa.selenium.json.JsonType; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; @@ -101,43 +100,43 @@ void createUser() throws Exception { .description("신규 유저 생성") .requestFields( fieldWithPath("loginId") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("멤버 아이디") .attributes(constraints("아이디 입력은 필수입니다. 최소 6자 이상입니다.")), fieldWithPath("email") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("멤버 이메일") .attributes(constraints("유저의 이메일")), fieldWithPath("nickname") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("멤버 닉네임") .attributes(constraints("닉네임 입력은 필수입니다. 최대 8자 이하입니다.")), fieldWithPath("password") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("멤버 패스워드") .attributes(constraints("비밀번호는 영어와 숫자를 포함해서 8자 이상 20자 이내로 입력해주세요.")), fieldWithPath("studentId") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("멤버 학번") .attributes(constraints("학번은 20으로 시작하고, 9자리여야 합니다.")), fieldWithPath("department") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("멤버 학과") .attributes(constraints("ex) 컴퓨터공학부")), fieldWithPath("agreementStatus") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("선택 동의 여부") .attributes(constraints("ex) AGREED/DISAGREED")) ) .responseFields( fieldWithPath("code") - .type(JsonType.STRING) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 (OK)") ).build()))); } @@ -202,13 +201,13 @@ void createUserBySocial() throws Exception { ) .responseFields( fieldWithPath("code") - .type(JsonType.NUMBER) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 (OK)") ).build()))); } @@ -236,22 +235,22 @@ void validateEmail() throws Exception { .description("이메일 중복 확인") .requestFields( fieldWithPath("email") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("멤버 이메일") .attributes(constraints("중복 확인할 이메일")) ) .responseFields( fieldWithPath("code") - .type(JsonType.NUMBER) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 값 (OK)"), fieldWithPath("data") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 '올바른 이메일 입니다.' 반환") ).build()))); } @@ -285,22 +284,22 @@ void changeProfile() throws Exception { ) .requestFields( fieldWithPath("imageUrl") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("새로 변경할 프로필") .attributes(constraints("새로 변경할 프로필입니다.")) ) .responseFields( fieldWithPath("code") - .type(JsonType.NUMBER) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 값 (OK)"), fieldWithPath("data") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 반환 메시지") ).build()))); } @@ -594,34 +593,34 @@ void getUserProfile() throws Exception { ) .responseFields( fieldWithPath("code") - .type(JsonType.NUMBER) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 값 (OK)"), fieldWithPath("data.profileImage") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("회원 프로필 이미지 URL"), fieldWithPath("data.email") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("회원 이메일"), fieldWithPath("data.loginId") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("회원 로그인 아이디"), fieldWithPath("data.nickname") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("회원 닉네임"), fieldWithPath("data.studentId") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("회원 학번"), fieldWithPath("data.departments[].department") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("회원 학과"), fieldWithPath("data.departments[].college") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("회원 단과대") ).build()))); } diff --git a/src/test/java/ku_rum/backend/domain/user/presentation/UserProfileControllerTest.java b/src/test/java/ku_rum/backend/domain/user/presentation/UserProfileControllerTest.java index 59448c55..9cf5bc1e 100644 --- a/src/test/java/ku_rum/backend/domain/user/presentation/UserProfileControllerTest.java +++ b/src/test/java/ku_rum/backend/domain/user/presentation/UserProfileControllerTest.java @@ -29,7 +29,6 @@ import ku_rum.backend.global.security.CustomUserDetails; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.openqa.selenium.json.JsonType; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; @@ -116,32 +115,32 @@ void resetAccount() throws Exception { .description("로그인 전 비밀번호 변경") .requestFields( fieldWithPath("emailRequest.email") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("인증 이메일 주소"), fieldWithPath("emailRequest.code") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("이메일 인증 코드"), fieldWithPath("loginId") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("비밀번호 변경할 아이디") .attributes(constraints("비밀번호를 변경할 아이디입니다.")), fieldWithPath("newPassword") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("새 비밀번호") .attributes(constraints("새 비밀번호입니다.")) ) .responseFields( fieldWithPath("code") - .type(JsonType.NUMBER) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 값 (OK)"), fieldWithPath("data") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 '아이디/비밀번호가 변경되었습니다.' 반환") ).build()))); } @@ -175,26 +174,26 @@ void passwordReset() throws Exception { ) .requestFields( fieldWithPath("prevPassword") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("기존 비밀번호") .attributes(constraints("기존 비밀번호입니다.")), fieldWithPath("newPassword") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("새 비밀번호") .attributes(constraints("새 비밀번호입니다.")) ) .responseFields( fieldWithPath("code") - .type(JsonType.NUMBER) + .type(JsonFieldType.NUMBER) .description("성공시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 값 (OK)"), fieldWithPath("data") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 '아이디/비밀번호가 변경되었습니다.' 반환") ).build()))); } @@ -224,16 +223,16 @@ void deactivateUser() throws Exception { ) .responseFields( fieldWithPath("code") - .type(JsonType.NUMBER) + .type(JsonFieldType.NUMBER) .description("성공 시 반환 코드 (200)"), fieldWithPath("status") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 상태 값 (OK)"), fieldWithPath("message") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 값 (회원 탈퇴가 완료되었습니다.)"), fieldWithPath("data") - .type(JsonType.STRING) + .type(JsonFieldType.STRING) .description("성공 시 메시지 값 (회원 탈퇴가 완료되었습니다.)") ).build() )