본문 바로가기
백엔드/스프링+boot

오류

by 임지혁코딩 2024. 1. 4.

사용자 입력에 대한 오류 검증을, 진행해야 한다. 

이를 계속해서 IF X>5 이런식으로 넣다보면, 관심사 분리를 침해하는 행위이다. 

-> ANNOTATION 기반으로, @Positive ,@SIze(min=2)등을 method 매개변수에 넣는다. (검증에 대한 특별한 코드가 필요없다) -> Validation 의존성을 추가해주어야 추가되는 기능이다. 

@Validated 를 class level에 -> 해당 class는, validation의 대상이된다. -> ConstraintViolationException 진행

@valid는 @validated 필요없이, MethodArgumentNotValidException 진행 .

 

@Test
void GivenException_WhengetMessage_Thenreturnmessage

해당 꼴로 test를 작성하는 연습을 하면, 협업에서 유리할 것 이다.

 

Paramaterized Test- >반복된 test를 사용하지 않는 tip 

MethodSource-> 소스로 메소드를 사용하겠다 . (대상이 메소드이다)

 

 

그 이후, 동일한 이름의 method를 작성해주어야 한다. 

그대로 작성하면 오류가나니, overloading중 매개변수 개수 변화를 사용하자 .

 

static Stream<Arguments> GivenException_WhengetMessage_Thenreturnmessage()
{
    return Stream.of(
            Arguments.arguments(OK,"OK - test message"),
            Arguments.arguments(BAD_REQUEST,"Bad request - text message"),
            Arguments.arguments(SPRING_INTERNAL_ERROR,"Spring-detected bad request - text message"),
            Arguments.arguments(SPRING_BAD_REQUEST,"Validation error - text message"),
            Arguments.arguments(VALIDATION_ERROR,"Internal error - text message"),
            Arguments.arguments(DATA_ACCESS_ERROR,"Spring-detected internal error - text message"),
            Arguments.arguments(INTERNAL_ERROR,"Data access error - text message")


    ) ;
}

이를 밑에 추가해주면, 해당 arguments들에 대하여 모두 진행해준다. <stream instance를 활용하여>

 

ERRORCODE의 MESSAGE METHOD가 좀 복잡하게 구현되어있는데,

this.getMessage는 일반적인 @Getter를 통한 생성자이다. (requiredargsconstructor를 통한 생성)

만약 exception이 발생하면 해당 exception의 message를, 그렇지 않다면 null이 아닐때만 message를 이값을 갖겠다는 것이고. 그렇지 않다면 exception이 발생될 것이고 그때 exception의 값을 위의 getMessage를 통해넣겠다는 것이다. 

 

예외 처리에 대한 test

예외 처리테스트를 위해선 1. exception handler 2. webrequet 3. httpservletrequest가 필요.

생성완료

 

그 이후 setup을 진행하여 각각 맞는 exception을 넣어주었다. 

 

assertThat(response)
        .hasFieldOrPropertyWithValue

를 통해 값을 비교할 수 있음을 기억하자. 

 

앞서 작성한대로, controller 레벨에서 exception 발생시 이를  catch해서   지정해둔 generalexception으로 throw하는 방식으로 .

 

이와 같이, 서비스단에서 insert를 하는데 빈 것이 들어왔다면? 

 

던져진 excpetion이 gerneralexeption 객체이고, message는 data_Acces_error를 가져야 한다 .

밑을 보면, repository가 inesrt event를 하다가 exception이 발생하면 ge를 발생시킨다. 

--> 검증시는 ge가 발생했는지와, 그리고 해당 ge를 발생시킨 method가 발생했는지를 확인하면 된다. 

그 증명

'백엔드 > 스프링+boot' 카테고리의 다른 글

기타 기술 + JPA 기본 설정  (0) 2024.01.04
VIew, View template  (1) 2024.01.04
테스트 2  (1) 2024.01.03
ERROR 처리  (0) 2024.01.02
리팩토링  (0) 2023.12.30