에러

[예외 처리] isEmpty일 때 Custom Exception 실패 후기

ummchicken 2023. 1. 25. 01:06

예외 처리에 관해 이것저것 해보고 있음.

 

 

저번 회원가입 시 중복 이름 입력에 대한 Custom Exception을 해보고, 

이번엔 게시물 이미지를 한 개도 등록하지 않았을 경우 Custom Exception을 해보았다.

 

 

나름대로 코드를 짜고... 이게 맞는 로직인가? 싶었는데, 

일단 테스트코드가 통과하긴 한다...

++ 후에 알고보니 잘못된 코드였음.

 

 

아무튼 실패도 값진 경험이니 기록을 해보겠다.

 

 

먼저, ErrorCode를 enum 타입으로 만든다.

[ErrorCode.java]

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;

@AllArgsConstructor
@Getter
public enum ErrorCode {

    // 회원 이름 중복
    MEMBERNAME_DUPLICATED(HttpStatus.CONFLICT, ""),

    // 레시피 이름 중복
    RECIPENAME_DUPLICATED(HttpStatus.CONFLICT, ""),

    // 레시피 이미지 등록하지 않은 경우
    RECIPEIMG_NULL(HttpStatus.NOT_FOUND, "첫 번째 레시피 이미지는 필수 입력 값 입니다.");

    private HttpStatus httpStatus;
    private String message;

}

404 : Not Found, 요청한 URI에 대한 리소스 없을 때 사용.

409 : Conflict, 리소스 상태에 위반되는 행위 시 사용.

 

 

그리고 Controller에 코드를 수정한다.

[Controller.java]

[수정 후]

if(recipeImgFileList.get(0).isEmpty() && recipeFormDto.getId() == null) {
    model.addAttribute("errorMessage", ErrorCode.RECIPEIMG_NULL.getMessage());
    return "recipe/recipeForm";
}

 

[수정 전]

if(recipeImgFileList.get(0).isEmpty() && recipeFormDto.getId() == null) {
	model.addAttribute("errorMessage", "첫 번째 레시피 이미지는 필수 입력 값 입니다.");
    return "recipe/recipeForm";
}

 

기존 코드는 이미지 파일이 등록되지 않으면(Empty), errorMessage를 만들어 viewPage에 전달을 했었다.

수정 후는 내가 만든 ErrorCode.RECIPEIMG_NULL.getMessage()를 errorMessage에 담아 viewPage에 전달을 한다.

 

 

 

그리고 테스트 코드 작성.

[Test.java]

@Test
@DisplayName("레시피 이미지 등록하지 않았을 때 테스트")
@WithMockUser(username = "admin", roles = "USER")
public void recipeImgIsEmpty() {
    RecipeFormDto recipeFormDto = new RecipeFormDto();
    recipeFormDto.setRecipeName("테스트 레시피");
    recipeFormDto.setRecipeLevel(RecipeLevel.EASY);
    recipeFormDto.setRecipeDetail("테스트 레시피 입니다.");
    recipeFormDto.setPrice(30000);

    List<MultipartFile> multipartFileList = new ArrayList<>();

    try {
        recipeService.saveRecipe(recipeFormDto, multipartFileList);
    } catch (Exception e) {
        e = assertThrows(AppException.class, () -> {
            recipeService.saveRecipe(recipeFormDto, multipartFileList);
        });
        assertEquals("첫 번째 레시피 이미지는 필수 입력 값 입니다.", e.getMessage());
    }

}

→ 레시피 이미지를 등록하지 않고 예외 생성을 해본다.

 

 

 

테스트도 성공 했고, viewPage 실험도 

성공해서 다행이다 했지만... 

 

 

혹시 몰라 에러 메세지를 바꿔서 테스트를 해보니... 

그래도 통과가 되는 것이었다.

 

 

??????????????????????????????????????

 

 

역시나... 코드를 잘못 짰던 것이다.

 

 

원인을 분석해보았다.

 

 

if(recipeImgFileList.get(0).isEmpty() && recipeFormDto.getId() == null) {
    model.addAttribute("errorMessage", ErrorCode.RECIPEIMG_NULL.getMessage());
    return "recipe/recipeForm";
}

제일 먼저, 이 코드에 치명적인 실수가 있었던 거 같다.

(물론 다른 것들도 많겠지만ㅋ)

 

내가 만든 AppException의 RECIPEIMG_NULL을 발생하는 것이 아닌, 

RECIPEIMG_NULL의 에러메세지인 "첫 번째 레시피 이미지는 필수 입력 값 입니다."만 단순히 넘길 뿐이었다.

 

그러니까 RECIPEIMG_NULL을 발생시키는 것이 아니라, 

그냥 에러 메세지만 우연히 일치했던 것일 뿐.

 

 

 

후... Hooooooooooooooooo.................

어렵고도 어려운 코딩의 세계이다.

 

 

 

암튼 코드 원상복귀 시켜놓고, 더 연구를 해봐야겠다.

 

 

 

 

- 어설픈 테스트코드 작성 실패 후기 끝 -