2024.01.03~2024.01.10 기간 동안 각자 API와 개인 퀘스트 수행해온 내용을 발표하고 피드백하는 시간을 가졌다!
- ErrorCode 및 공동 Domain 정의
- JPA entity 생성 및 공동 Controller 정의
- Spring Security, Swagger 설정
- Junit test 설정
그 중 내 파트인 JPA entity 생성 및 공동 Controller 정의 중 공동 Controller 정의에 대해 기록하고자 한다. 참고로 JPA entity 생성 관련된 글은 여기에 기록해 놓았다!
@RestController
public class ExampleController {
@PostMapping("/api/comment")
public DTOResCommon createUser(@RequestBody DTOReqCommon userRequest) {
// 댓글이 없는 상황 예시
// 에러 응답이 'Requested resource comment is not found'
if (userRequest == null) {
String resourceName = "comment";
ErrorCode errorCode = ErrorCode.NOT_FOUND;
return createErrorResponse(errorCode, resourceName);
}
return createSuccessResponse();
}
// 성공 시 response 생성
private DTOResCommon createSuccessResponse() {
DTOResCommon response = new DTOResCommon();
response.setRetCode(ErrorCode.OK.getCode());
response.setRetMsg(ErrorCode.OK.getMessage());
return response;
}
// 에러 시 response 생성
private DTOResCommon createErrorResponse(ErrorCode errorCode, String resourceName) {
DTOResCommon response = new DTOResCommon();
response.setRetCode(errorCode.getCode());
response.setRetMsg(errorCode.getMessage(resourceName));
return response;
}
공동 Controller 생성 전, 예시 Controller에서는 response를 생성하기 위해 createSuccessResponse() 또는 createErrorResponse()를 호출하는 구조로 구성되어 있었다. 메서드화를 하는 것은 좋았지만, 이렇게 되면 Controller마다 해당 메서드들을 생성해야 하기 때문에, 공동 Controller를 만들고, 이를 상속받아 응답을 생성하는 구조로 변경하였다
변경
@Tag(name = "예시 컨트롤러")
@SecurityRequirement(name = "bearer-key")
@RequestMapping(path = "/api/v1/common")
@RestController
public class ExampleController extends CommonController {
@Operation(summary = "공동 Domain 적용 API", description = "1. 그대로 요청 2. sendDate \"string\"에서 null로 바꾼 뒤 요청")
@PostMapping("/comment")
public DTOResCommon createUser(@RequestBody DTOReqCommon userRequest) {
// 댓글이 없는 상황 예시
// 에러 응답: 'comment not found'
if (userRequest.getSendDate() == null) {
return setResult(ErrorCode.NOT_FOUND, "comment");
}
return setResult(ErrorCode.OK);
}
public class CommonController {
protected ObjectMapper objectMapper = new ObjectMapper()
.enable(SerializationFeature.INDENT_OUTPUT);
@Value("${study.systemId}")
protected String systemId;
protected DTOResCommon setResult(ErrorCode result, String... vars) {
DTOResCommon res = new DTOResCommon();
res.setSendDate(DateUtil.getCurrentDateTime());
res.setSystemId(systemId);
res.setRetCode(result.getCode());
if (vars.length > 0 && vars[0] != null && !vars[0].isEmpty()) {
res.setRetMsg(result.getMessage(vars[0]));
} else {
res.setRetMsg(result.getMessage());
}
return res;
}
objectMapper도 CommonController에서 한 번만 생성되어 사용되도록 했다2024.01.26
개인적인 일정들도 있고, TDD를 처음 적용해볼 예정이라 여유롭게 기한을 잡았다!
대신 기한이 지나치게 길면 효율성이 떨어질 수 있기에 중간 점검일을 두었다
2024.01.15
2024.01.22