diff --git a/.gitignore b/.gitignore index 4b5567f..827af67 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,8 @@ application.yml application-common.yml application-domain.yml application-infra.yml -application-domain-production.yml \ No newline at end of file +application-domain-production.yml + +### Monitoring ### +monitoring-docker-compose.yml +prometheus.yml \ No newline at end of file diff --git a/api-module/build.gradle b/api-module/build.gradle index 8812f99..e0cd0d0 100644 --- a/api-module/build.gradle +++ b/api-module/build.gradle @@ -28,6 +28,10 @@ dependencies { implementation 'io.jsonwebtoken:jjwt-api:0.12.6' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.6' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.6' + + // Prometheus Monitoring + implementation 'org.springframework.boot:spring-boot-starter-actuator' + runtimeOnly 'io.micrometer:micrometer-registry-prometheus' } tasks.register("prepareKotlinBuildScriptModel"){} \ No newline at end of file diff --git a/api-module/src/main/java/hongik/triple/apimodule/application/survey/SurveyService.java b/api-module/src/main/java/hongik/triple/apimodule/application/survey/SurveyService.java index 153febe..2b46476 100644 --- a/api-module/src/main/java/hongik/triple/apimodule/application/survey/SurveyService.java +++ b/api-module/src/main/java/hongik/triple/apimodule/application/survey/SurveyService.java @@ -70,16 +70,12 @@ public SurveyRes getSurveyQuestions() { .build(); } - public Page getSurveyList(Long memberId, Pageable pageable) { + public Page getSurveyList(Member member, Pageable pageable) { // Validation - if (memberId != null) { - memberRepository.findById(memberId) - .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다.")); - } // Business Logic - Page surveys = (memberId != null) - ? surveyRepository.findByMember_MemberIdOrderByCreatedAtDesc(memberId, pageable) + Page surveys = (member.getMemberId() != null) + ? surveyRepository.findByMember_MemberIdOrderByCreatedAtDesc(member.getMemberId(), pageable) : surveyRepository.findAllByOrderByCreatedAtDesc(pageable); // Response diff --git a/api-module/src/main/java/hongik/triple/apimodule/presentation/survey/SurveyController.java b/api-module/src/main/java/hongik/triple/apimodule/presentation/survey/SurveyController.java index 302d3ef..6da10c3 100644 --- a/api-module/src/main/java/hongik/triple/apimodule/presentation/survey/SurveyController.java +++ b/api-module/src/main/java/hongik/triple/apimodule/presentation/survey/SurveyController.java @@ -2,15 +2,18 @@ import hongik.triple.apimodule.application.survey.SurveyService; import hongik.triple.apimodule.global.common.ApplicationResponse; +import hongik.triple.apimodule.global.security.PrincipalDetails; import hongik.triple.commonmodule.dto.survey.SurveyReq; import hongik.triple.commonmodule.dto.survey.SurveyRes; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -40,17 +43,61 @@ public ApplicationResponse getSurveyQuestions() { } @PostMapping("/response") - public ApplicationResponse registerSurvey(@RequestBody SurveyReq request) { + @Operation(summary = "설문조사 제출", description = "사용자가 작성한 설문조사 응답을 제출합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", + description = "설문조사 제출 성공", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = SurveyRes.class))), + @ApiResponse(responseCode = "400", + description = "잘못된 요청 (유효하지 않은 설문조사 데이터)"), + @ApiResponse(responseCode = "500", + description = "서버 오류") + }) + public ApplicationResponse registerSurvey( + @io.swagger.v3.oas.annotations.parameters.RequestBody( + description = "설문조사 응답 데이터", + required = true, + content = @Content(schema = @Schema(implementation = SurveyReq.class))) + @RequestBody SurveyReq request) { return ApplicationResponse.ok(surveyService.registerSurvey(request)); } @GetMapping("/list") - public ApplicationResponse getSurveyList(@AuthenticationPrincipal UserDetails userDetails, @PageableDefault Pageable pageable) { - return ApplicationResponse.ok(surveyService.getSurveyList(1L, pageable)); // TODO: userDetails -> memberId 추출 + @Operation(summary = "설문조사 결과 목록 조회", description = "사용자가 진행한 모든 설문조사 결과를 페이징하여 조회합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", + description = "설문조사 목록 조회 성공", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = Page.class))), + @ApiResponse(responseCode = "401", + description = "인증되지 않은 사용자"), + @ApiResponse(responseCode = "500", + description = "서버 오류") + }) + public ApplicationResponse getSurveyList( + @Parameter(hidden = true) @AuthenticationPrincipal PrincipalDetails principalDetails, + @Parameter(description = "페이징 정보 (page, size, sort)", + example = "page=0&size=10&sort=createdAt,desc") + @PageableDefault Pageable pageable) { + return ApplicationResponse.ok(surveyService.getSurveyList(principalDetails.getMember(), pageable)); // TODO: userDetails -> memberId 추출 } @GetMapping("/detail/{surveyId}") - public ApplicationResponse getSurveyDetail(@PathVariable(name = "surveyId") Long surveyId) { + @Operation(summary = "특정 설문조사 상세 조회", description = "설문조사 ID로 특정 설문조사의 상세 정보를 조회합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", + description = "설문조사 상세 조회 성공", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = SurveyRes.class))), + @ApiResponse(responseCode = "404", + description = "존재하지 않는 설문조사"), + @ApiResponse(responseCode = "500", + description = "서버 오류") + }) + public ApplicationResponse getSurveyDetail( + @Parameter(description = "조회할 설문조사 ID", required = true, example = "1") + @PathVariable(name = "surveyId") Long surveyId) { return ApplicationResponse.ok(surveyService.getSurveyDetail(surveyId)); } } diff --git a/infra-module/build.gradle b/infra-module/build.gradle index 0bb696b..d2e96ae 100644 --- a/infra-module/build.gradle +++ b/infra-module/build.gradle @@ -6,7 +6,7 @@ dependencies { implementation project(":common-module") // Redis - implementation 'org.springframework.boot:spring-boot-starter-data-redis' + // implementation 'org.springframework.boot:spring-boot-starter-data-redis' // WebClient implementation 'org.springframework.boot:spring-boot-starter-webflux'