<aside> <img src="https://raw.githubusercontent.com/eirikmadland/notion-icons/master/v5/icon3/ul-github.svg" alt="https://raw.githubusercontent.com/eirikmadland/notion-icons/master/v5/icon3/ul-github.svg" width="40px" /> μ°Έμ‘° Github Code
</aside>
Validation
μννλ©΄μ λ°μ΄ν° λ°μΈλ νλ DTO μμ± ]public class CreateDeveloper {
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public static class Request{
@NotNull // λΉκ° νμ© X
private DeveloperLevel developerLevel;
@NotNull
private DeveloperSkillType developerSkillType;
@NotNull
@Min(0) // μ΅μ 0
@Max(20) // μ΅λ 20
private Integer experienceYears;
@NotNull
@Size(min = 3, max = 50, message = "memberId size must 3~50")
// λ°μ΄ν° ν¬κΈ° μ μ : μ΅μ 3, μ΅λ 50, Error λ©μμ§ μμ±
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;
}
}
Controller
μμ ]@PostMapping("/create-developers")
public List<String> createdevelopers(
@Valid @RequestBody CreateDeveloper.Request request
) {
log.info("POST /create-developers HTTP/1.1 ");
log.info("requset : {}", request);
dmakerService.createDeveloper(request);
return Collections.singletonList("Olaf");
}
@Valid
: data validation μννκΈ°μν΄μ μ μΈνλ μ΄λ
Έν
μ΄μ
@RequestBody
: JSON
ννλ‘ μμ²μ€λ λ°μ΄ν°λ₯Ό DTO
ννλ‘ λ³κ²½ν΄μ£Όλ μ΄λ
Έν
μ΄μ
Exception
ꡬν]@Getter
public class DMakerException extends RuntimeException {
private DMakerErrorCode dMakerErrorCode;
private String detailMessage;
// μλ¬μ½λλ§ λ°μμ μ²λ¦¬
public DMakerException(DMakerErrorCode errorCode) {
super(errorCode.getMessage());
this.dMakerErrorCode = errorCode;
this.detailMessage = errorCode.getMessage();
}
// μλ¬μ½λμ μμΈλ©μμ§ λ°μμ μ²λ¦¬
public DMakerException(DMakerErrorCode errorCode,
String detailMessage) {
super(detailMessage);
this.dMakerErrorCode = errorCode;
this.detailMessage = errorCode.getMessage();
}
}
@Getter
@AllArgsConstructor
public enum DMakerErrorCode {
NO_DEVELOPER("ν΄λΉλλ κ°λ°μκ° μμ΅λλ€."),
DUPLICATED_MEMBER_ID("MemberIdκ° μ€λ³΅λλ κ°λ°μκ° μμ΅λλ€."),
LEVEL_EXPERIENCE_YEARS_NOT_MATCHED("κ°λ°μ λ 벨과 μ°μ°¨κ° λ§μ§ μμ΅λλ€."),
INTERNAL_SERVER_ERROR("μλ²μ μ€λ₯κ° λ°μνμ΅λλ€."),
INVALID_REQUEST("μλͺ»λ μμ²μ
λλ€.");
private final String message;
}
validateCreateDeveloperRequest
λ©μλ μΆκ°private void validateCreateDeveloperRequest(CreateDeveloper.Request request)
throws DMakerException {
// Business Validation
DeveloperLevel developerLevel = request.getDeveloperLevel();
Integer experienceYears = request.getExperienceYears();
if (developerLevel == DeveloperLevel.SENIOR
&& experienceYears < 10) {
throw new DMakerException(LEVEL_EXPERIENCE_YEARS_NOT_MATCHED);
} else if (developerLevel == DeveloperLevel.JUNGNIOR
&& (experienceYears < 4 || experienceYears > 10)) {
throw new DMakerException(LEVEL_EXPERIENCE_YEARS_NOT_MATCHED);
} else if (developerLevel == DeveloperLevel.JUNIOR
&& experienceYears > 4) {
throw new DMakerException(LEVEL_EXPERIENCE_YEARS_NOT_MATCHED);
}
developerRepository.findByMemberId(request.getMemberId())
.ifPresent(developer -> {
throw new DMakerException(DUPLICATED_MEMBER_ID);
});
}