일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 토비의 스프링
- 쿠버네티스
- SpringBoot
- JPA
- 자바 ORM 표준 JPA 프로그래밍
- Stack
- Kotlin
- redis
- 스프링
- spring
- 스트림
- IntellJ
- gradle
- 백준
- Java
- 이스티오
- list
- mysql
- GC
- 자바
- thread
- 보조스트림
- Stream
- MSA
- 토비의 스프링 정리
- K8s
- jvm
- OS
- Real MySQL
- Collection
- Today
- Total
인생을 코딩하다.
[Spring] checked exception을 unchecked exception으로 변경해서 던져야 하는 경우 본문
예외를 처리할 때 로그를 활용하는 것 이외에 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을 사용하기 떄문에 로직에 대한 테스트가 좀 더 좋아졌다.
'Spring' 카테고리의 다른 글
[Spring] Spring AOP를 이용한 메서드 시간측정 / @LogExecutionTime (2) | 2020.10.29 |
---|---|
[Spring] ExceptionHandler (0) | 2020.10.25 |
[Spring] ArgumentMatcher<T> (단위테스트 할 때) (0) | 2020.10.21 |
[Spring] 생성자 주입(autowired 3가지 방법) (0) | 2020.10.18 |
[Spring] Spring Boot Devtools (0) | 2020.09.22 |