📄 요구 사항
제목
, 내용
은 필수적으로 포함해야 한다.제목
은 1글자 이상 15글자 이하여야 한다.내용
은 1글자 이상 1000글자 이하여야 한다.제목
은 공백으로만 이루어질 수는 없다.Title
@Getter
@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Title {
private final static int TITLE_MAX_LENGTH = 15;
@Column(name = "title", nullable = false)
private String value;
public Title(String value) {
validate(value);
this.value = value;
}
private void validate(String value) {
if (value == null || value.isBlank()) {
throw new InvalidTitleException();
}
if (value.length() > TITLE_MAX_LENGTH) {
throw new InvalidTitleException();
}
}
}
Content
@Getter
@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Content {
private final static int CONTENT_MAX_LENGTH = 1000;
@Column(name = "content", nullable = false)
@Lob
private String value;
public Content(String value) {
validate(value);
this.value = value;
}
private void validate(String value) {
if (value == null) {
throw new InvalidContentException();
}
if (value.length() > CONTENT_MAX_LENGTH) {
throw new InvalidContentException();
}
}
}
@Embeddable
애노테이션을 사용해 해당 클래스가 다른 엔티티 클래스의 일부인 컴포지트 객체임을 알려준다.BadRequestException
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
public class BadRequestException extends RuntimeException{
public BadRequestException(String message) {
super(message);
}
}
RuntimeException
생성자를 호출해 예외 메시지를 설정한다. 예외 객체가 생성 될 때 해당 메시지가 나오게 됩니다. InvalidContentException
public class InvalidContentException extends BadRequestException {
private static final String MESSAGE = "내용은 1글자 이상 1000글자 이하여야 합니다.";
public InvalidContentException() {
super(MESSAGE);
}
}
InvalidTitleException
public class InvalidTitleException extends BadRequestException {
private static final String MESSAGE = "제목은 1자 이상 15자 이하여야 합니다.";
public InvalidTitleException() {
super(MESSAGE);
}
}
PostNotFoundException
public class PostNotFoundException extends BadRequestException {
private final static String MESSAGE = "존재하지 않는 게시글 입니다.";
public PostNotFoundException() {
super(MESSAGE);
}
}
super
를 통해 상위 클래스인 BadRequestException
의 생성자를 호출하고 MESSAGE 변수를 인자로 전달한다. 해당 예외 객체가 생성되면 예외에 맞는 메시지가 나오게 된다.PostExControllerAdvice
@RestControllerAdvice
public class PostExControllerAdvice {
@ExceptionHandler(BadRequestException.class)
public ResponseEntity<ErrorResult> badRequestExHandle(BadRequestException e) {
return ResponseEntity.badRequest().body(new ErrorResult(e.getMessage(), "400"));
}
}
RestControllerAdvice
생성한다. 이 클래스를 통해 BadRequestException
에 담긴 오류 메시지로 응답할 수 있다.PostRequest
@Getter
public class PostRequest {
@NotBlank(message = "제목은 1자이상 15자 이하여야 합니다.")
private String title;
@NotBlank(message = "내용은 1자이상 1000자 이하여야 합니다.")
private String content;
private String error_message;
private LocalDateTime regTime;
}
@NotBlank
애노테이션을 통해 검증한다.결과
PostService
public class PostService{
...
public PostResponse findPost(Long id){
Post post = getFindByIdPost(id);
return new PostResponse(post);
}
...
private Post getFindByIdPost(Long id) {
return postrepository.findById(id)
.orElseThrow(() -> new PostNotFoundException());
}
}
PostNotFoundException()
객체를 생성하여 오류에 대한 메시지를 남기고 예외를 던진다.결과
요구 사항 1번과 동일
요구 사항 2번과 동일
Keyword
@Getter
public class Keyword {
private final String value;
public Keyword(String value) {
this.value = value;
}
public static Keyword validKeyword(String value) {
if (value.trim().length() == 0) {
throw new InvalidKeywordException();
} else {
return new Keyword(value);
}
}
}
InvalidKeywordException
public class InvalidKeywordException extends BadRequestException {
private final static String MESSAGE = "검색 키워드는 빈칸 없이 1개 이상의 단어를 입력해 주세요";
public InvalidKeywordException() {
super(MESSAGE);
}
}
결과
📒 나의 생각