feat: api wrapping

This commit is contained in:
2025-11-17 15:23:36 +09:00
parent c081892ae7
commit 57943ebed4
6 changed files with 40 additions and 6 deletions

View File

@@ -51,7 +51,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-actuator'
// SpringDoc OpenAPI (Swagger) // SpringDoc OpenAPI (Swagger)
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
} }
tasks.named('test') { tasks.named('test') {

View File

@@ -0,0 +1,24 @@
package com.kamco.cd.kamcoback.config;
import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
import jakarta.persistence.EntityNotFoundException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@Order(value = 1)
@RestControllerAdvice
public class GlobalExceptionHandler {
// 로그인 정보가 잘못됐습니다 권한 없음
@org.springframework.web.bind.annotation.ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(EntityNotFoundException.class)
public ApiResponseDto<String> handlerEntityNotFoundException(EntityNotFoundException e) {
log.warn("[EntityNotFoundException] resource :{} ", e.getMessage());
String message = String.format("%s [%s]", e.getMessage(), e.getCause());
return ApiResponseDto.createException(ApiResponseDto.ApiResponseCode.NOT_FOUND, message);
}
}

View File

@@ -34,12 +34,13 @@ public class AnimalCoreService
@Transactional @Transactional
public AnimalDto.Basic create(AnimalDto.AddReq req) { public AnimalDto.Basic create(AnimalDto.AddReq req) {
ZooEntity zoo = null; ZooEntity zoo = null;
if (req.getZooId() != null) { if (req.getZooUuid() != null) {
zoo = zoo =
zooRepository zooRepository
.getZooByUid(req.getZooId()) .getZooByUuid(req.getZooUuid())
.orElseThrow( .orElseThrow(
() -> new EntityNotFoundException(" not found with id: " + req.getZooId())); () ->
new EntityNotFoundException("Zoo not found with uuid: " + req.getZooUuid()));
} }
AnimalEntity entity = new AnimalEntity(req.getCategory(), req.getSpecies(), req.getName(), zoo); AnimalEntity entity = new AnimalEntity(req.getCategory(), req.getSpecies(), req.getName(), zoo);
AnimalEntity saved = animalRepository.save(entity); AnimalEntity saved = animalRepository.save(entity);

View File

@@ -45,7 +45,7 @@ public class ZooApiController {
content = content =
@Content( @Content(
mediaType = "application/json", mediaType = "application/json",
schema = @Schema(implementation = ZooDto.AddReq.class))), schema = @Schema(implementation = ZooDto.Detail.class))),
@ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content),
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
}) })

View File

@@ -3,6 +3,7 @@ package com.kamco.cd.kamcoback.zoo.dto;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.kamco.cd.kamcoback.config.enums.EnumType; import com.kamco.cd.kamcoback.config.enums.EnumType;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -14,6 +15,7 @@ import org.springframework.data.domain.Sort;
public class AnimalDto { public class AnimalDto {
@Schema(name = "AnimalAddReq", description = "동물 생성 요청")
@Getter @Getter
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor
@@ -23,9 +25,10 @@ public class AnimalDto {
private Category category; private Category category;
private Species species; private Species species;
private String name; private String name;
private Long zooId; // 동물원 ID (선택) private String zooUuid; // 동물원 UUID (선택)
} }
@Schema(name = "AnimalBasic", description = "동물 기본 정보")
@Getter @Getter
public static class Basic { public static class Basic {
@@ -98,6 +101,7 @@ public class AnimalDto {
private final String text; private final String text;
} }
@Schema(name = "AnimalSearchReq", description = "동물 검색 요청")
@Getter @Getter
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor

View File

@@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.zoo.dto;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -13,6 +14,7 @@ import org.springframework.data.domain.Sort;
public class ZooDto { public class ZooDto {
@Schema(name = "ZooAddReq", description = "동물원 생성 요청")
@Getter @Getter
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor
@@ -24,6 +26,7 @@ public class ZooDto {
private String description; private String description;
} }
@Schema(name = "ZooBasic", description = "동물원 기본 정보")
@Getter @Getter
public static class Basic { public static class Basic {
@@ -63,6 +66,7 @@ public class ZooDto {
} }
} }
@Schema(name = "ZooDetail", description = "동물원 상세 정보 (동물 개수 포함)")
@Getter @Getter
public static class Detail extends Basic { public static class Detail extends Basic {
@@ -82,6 +86,7 @@ public class ZooDto {
} }
} }
@Schema(name = "ZooSearchReq", description = "동물원 검색 요청")
@Getter @Getter
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor