inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

예외처리2

안녕하세요 호돌맨님 예외처리2 에서 질문이 있습니다.

685

고현우

작성한 질문수 4

3

좋은 강의 정말 감사드립니다.

호돌맨님 강의덕분에 기존에 공부했던 지식들 정리도 하고 더 좋은 설계가 어떤건지 잘 배우고 있습니다.

제가 예외처리2 강의를 보고 컨트롤러 테스트를 하다가 게시글 작성 실패케이스에서 오류가 생겨서 질문드립니다.

 

PostController

PostCreate

PostControllerTest

글 작성 요청 시 제목, 내용 모두 null 인 케이스 테스트입니다.

이 테스트에서 실패합니다.

로그는 아래와 같습니다.

응답 바디에도 아무것도 오지 않습니다.

로그를 쫓아서 ErrorResponse 에 브레이크 포인트를 찍어봤습니다.

 

ErrorResponse

여기서 validation 이 null로 잡힙니다.

PostControllerAdvice

이쪽 ExceptionHandler 작성할 시점에

생성자에 validation 을 매개변수로 받지 않았을땐 오류가 발생하지 않았는데 validation 을 매개변수로 받고 나서 오류가 생기는거면

@Builder 가 ErrorResponse 의 validation 초기화를 무시하고 null 값으로 생기는 현상 같습니다.

그래서 따로 빌더 안붙인 validation 을 받지 않는 생성자를 만드니 잘 돌아갑니다.

그런데 강의 마지막에 전체 테스트 한번 돌리고 마무리 하신것 같은데 호돌맨님은 어떻게 테스트 실패가 안뜬건지 궁금합니다.

그리고 혹시 더 좋은 방법이 있는지 방향을 알려주시면 감사하겠습니다.

vue.js aws spring-boot jpa spring-security

답변 1

1

호돌맨

안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.

우선 해결 되셨다니 다행입니다.
코드를 보면

public class ErrorResponse {

    // ...
    private Map<String, String> validation = new HashMap<>();
}

현우님이 위와 같이 초기화 해도 생성자에서 validation null이 들어오면 NPE가 발생할 수 있습니다.

강의에서 ErrorResponse는 최종적으로 아래와 같이 변경되었습니다.

@Getter
public class ErrorResponse {

    private final String code;
    private final String message;
    private final Map<String, String> validation;

    @Builder
    public ErrorResponse(String code, String message, Map<String, String> validation) {
        this.code = code;
        this.message = message;
        this.validation = validation != null ? validation : new HashMap<>();
    }

    public void addValidation(String fieldName, String errorMessage) {
        this.validation.put(fieldName, errorMessage);
    }
}

빌더를 통해 ErrorResponse 생성시 validation값을 넘기지 않으면 null이 되기 때문에 체크를 해서 new HashMap<>() 으로 초기화를 시켰습니다. 그리고 final이 추가 되었네요.

 

감사합니다.

0

고현우

앗 제가 따라치다가 놓쳤나봅니다. 다시 돌려보니까 이렇게 바껴있네요...

답변 감사합니다!

호돌맨님 강의 보면서 많은걸 배워갑니다. 좋은 강의 감사해요!

추석 잘 보내시길 바랍니다

Deprecated 관련 사항들

0

100

2

깃헙 collaboator 초대 관련

0

87

1

강의 듣다가 도커 이미지 생성시 각각도 가능하나 그렇게 사용하는데가 많은지 모르겠다라는 말을 듣고 남김니다

0

157

2

logout 후에 login 페이지 이동은 어디서 시켜주는건가요?

0

229

1

다중 데이터를 삭제 할 때

0

270

2

querydsl Q class 이슈

0

414

2

Windows WSL Vue 설정

2

246

1

Dip, @transactional

0

187

1

[vite] http proxy error: /auth/login

0

1043

2

로그인 하고 나서 GET요청으로 메인페이지 요청

0

234

2

GitHub Collaborator 초대 관련

0

256

2

Window에서 Vue.js 설정

0

321

2

(솔루션 수정)'tsyringe' Error: TypeInfo not known for "클래스명"

0

713

2

collaboator로 초대받을 수 있을까요??

0

283

2

SecurityMockContext 로부터 유저 정보를 가져오기

0

261

1

given 부분이 길어질 때 어떻게 처리하면 좋을까요?

0

317

1

섹션9 프론트의 코드를 보고싶습니다,,,

0

423

1

Spring Security - defaultSuccessUrl 질문

0

625

1

강의 화면이 나오지 않습니다. 음성과 자막만 나와요

0

302

1

JPAQueryFactory(em)의 객체 생성자 오류에 대해서 질문이 있습니다ㅜㅜ

0

689

2

ExceptionHandler가 AccessDeniedHandler(Http403Handler)를 먹어버리는 현상

0

1179

2

섹션10 언제 나오나요?

0

484

1

CommentService에서 Repository를 호출하지 않는데도

0

342

1

Editor....를 활용한 패턴에 질문있습니다.

0

494

1