인생을 코딩하다.

[Spring] checked exception을 unchecked exception으로 변경해서 던져야 하는 경우 본문

Spring

[Spring] checked exception을 unchecked exception으로 변경해서 던져야 하는 경우

Hyung1 2020. 10. 22. 15:37
728x90
반응형

예외를 처리할 때 로그를 활용하는 것 이외에 checked exception을 unchecked exception으로 변경해서 던져야 하는 경우가 있었다. 이를 자바에서는 RuntimeException 클래스를 상속받아서 할 수 있다.

 

@Transactional
    public void modify(Long id, String name) { // 이름 정보만 받아서 해당로직에 업데이트
        Person person = personRepository.findById(id).orElseThrow(() -> new RuntimeException("아이디가 존재하지 않습니다"));

        person.setName(name);

        personRepository.save(person);
    }

테스트 성공

 

 

orElseThrow(() -> new RuntimeException("아이디가 존재하지 않습니다")); 을 get()으로 바꾼뒤

@Transactional
    public void modify(Long id, String name) { // 이름 정보만 받아서 해당로직에 업데이트
        Person person = personRepository.findById(id).get();

        person.setName(name);

        personRepository.save(person);
    }

실행을 하여도 test는 성공한다

 

assertThrows~~~ 를 주석 처리한 후 personService의 modify를 직접 호출하면 NoSuchElementException이 뜬다.

NoSuchElementException은 RunTImeException을 상속 받은 것이라

assertThrows(RuntimeException.class, () -> personService.modify(1L, "suhun")); 로 검증해줬을때는 성공을 한다.

 

일반적으로 프로젝트 내에서 의도적으로 발생시킨 excption은 별도의 Custom Exception으로 생성해서 시스템 오류와는 별도로 취급하는 것이 좋다. 즉, 예상치 못한 시스템 오류와 개발자가 의도적으로 오류를 내는 경우를 분리

 

RunTimeException을 상속하는 PersonNotFoundException 클래스를 만들어

assertThrows(PersonNotFoundException.class, () -> personService.modify(1L, "suhun"));

PersonNotFoundException으로 좀 더 작은 범위에서 exception을 체크하게 되면 테스트는 빨라지고 심지어 로그까지 볼 수 있다.

 

잘 변경 되었는지 확인하기 위해서 다시

 

    @Transactional
    public void modify(Long id, String name) { // 이름 정보만 받아서 해당로직에 업데이트
        Person person = personRepository.findById(id).get();

        person.setName(name);

        personRepository.save(person);
    }

get()으로 변경하고 다시 샐행하면

 

PersonNotFoundException을 받아야 하는데 NoSuchElementException을 받았다고 오류 표시가 뜬다.

 

이렇게 좀 더 구체화된 exception을 사용하기 떄문에 로직에 대한 테스트가 좀 더 좋아졌다.

728x90
반응형
Comments