@NotNull
, @Min
, @Max
, @Size
등 데이터 벨리데이션 적용package com.fastcampus.programming.dmaker.dto;
import com.fastcampus.programming.dmaker.type.DeveloperLevel;
import com.fastcampus.programming.dmaker.type.DeveloperSkillType;
import lombok.*;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class CreateDeveloper {
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public static class Request{
@NotNull
private DeveloperLevel developerLevel;
@NotNull
private DeveloperSkillType developerSkillType;
@NotNull
@Min(0)
@Max(20)
private Integer experienceYears;
@NotNull
@Size(min = 3, max = 50, message = "memberId size must 3 ~ 50")
private String memberId;
@NotNull
@Size(min = 3, max = 20, message = "name size must 3 ~ 20")
private String name;
@Min(18)
private Integer age;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class Response{
private DeveloperLevel developerLevel;
private DeveloperSkillType developerSkillType;
private Integer experienceYears;
private String memberId;
}
}
@PostMapping("/create-developers")
public List<String> createDevelopers(@Valid @RequestBody CreateDeveloper.Request request){
// GET /developers HTTP/1.1
log.info("request : {}", request);
return dMakerService.createDeveloper(request);
@Valid
를 @RequestBody
앞에 붙여줘야 validation 적용이 됨
log로 request정보를 알아보기 위해 @ToString
을 request에 추가
package com.fastcampus.programming.dmaker.exception;
import lombok.Getter;
@Getter
public class DMakerException extends RuntimeException{
private DMakerErrorCode dMakerErrorCode;
private String detailMessage;
//기본 에러 메시지
public DMakerException(DMakerErrorCode errorCode){
super(errorCode.getMessage());//RuntimeException에 담아줄 데이터를 넣어줌
this.dMakerErrorCode = errorCode;
this.detailMessage = errorCode.getMessage();
}
//디테일 메시지
public DMakerException(DMakerErrorCode errorCode, String detailMessage){
super(detailMessage);//RuntimeException에 담아줄 데이터를 넣어줌
this.dMakerErrorCode = errorCode;
this.detailMessage = detailMessage;
}
}
-> RuntimeException 클래스를 extends함
-> DMakerErrorCode 클래스를 enum 클래스로 생성
package com.fastcampus.programming.dmaker.exception;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum DMakerErrorCode {
NO_DEVELOPER("해당되는 개발자가 없습니다."),
DUPLICATED_MEMBER_ID("MemberId가 중복되는 개발자가 있습니다."),
LEVEL_EXPERIENCE_YEAR_NOT_MATCHED("개발자 레벨과 연차가 맞지 않습니다."),
INTERNAL_SERVER_ERROR("서버에 오류가 발생했습니다."),
INVALID_REQUEST("잘못된 요청입니다.");
private final String message;
}
private void validateCreateDeveloperRequest(CreateDeveloper.Request request) {
//business validation
validateDeveloperLevel(
request.getDeveloperLevel(),
request.getExperienceYears()
);
developerRepository.findByMemberId(request.getMemberId())
.ifPresent((developer ->{
throw new DMakerException(DUPLICATED_MEMBER_ID);
} ));
}
private void validateDeveloperLevel(DeveloperLevel developerLevel, Integer experienceYears) {
if(developerLevel == DeveloperLevel.SENIOR && experienceYears < 10){
throw new DMakerException(LEVEL_EXPERIENCE_YEAR_NOT_MATCHED);
}
if(developerLevel == DeveloperLevel.JUNIOR && experienceYears > 4 ){
throw new DMakerException(LEVEL_EXPERIENCE_YEAR_NOT_MATCHED);
}
}
-> 비즈니스 벨리데이션 적용 완료
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class Response{
private DeveloperLevel developerLevel;
private DeveloperSkillType developerSkillType;
private Integer experienceYears;
private String memberId;
public static Response fromEntity(Developer developer){
return Response.builder()
.developerLevel(developer.getDeveloperLevel())
.developerSkillType(developer.getDeveloperSkillType())
.experienceYears(developer.getExperienceYears())
.memberId(developer.getMemberId())
.build();
}
}
-> Developer -> CreateDeveloper.Response 형식으로 바꿈