[TIL](230905) IllegalArgumentException와 IllegalStateException의 차이점을 알아보자

Noh Jihyeon·2023년 9월 5일
0

TIL

목록 보기
20/49
post-thumbnail

Spring Boot를 이용하여 간단한 회원서비스를 만들어보았다.
클라이언트의 요청 중 데이터 저장소를 정하지 않았기 때문에 repository는 유동적으로 설정했고 최소한의 볼륨을 잡고 CRUD를 구현해 봤다.
여러가지 테스트를 진행하던 중 코드상에 문제가 없으나 에러가 발생했다. 이 문제를 해결해보자!



🔸문제점

@Test
    public void 중복회원_예외() {
        //given
        Member member1 = new Member();
        member1.setName("spring1");
        Member member2 = new Member();
        member2.setName("spring1");

        //when
        memberService.join(member1);
        try {
            memberService.join(member2);  
            fail();
        } catch (IllegalStateException e) {
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다");
        }
    }

실패테스트를 진행하는데 테스트가 실패했다.



🔸시도해 본 것들

https://imcodiiing.tistory.com/289


위의 테스트를 이어서 이번엔 회원가입 실패테스트를 구현해 봤다.
    public Long join(Member member){
        // 조건1: 같은 이름이 있는 중복회원은 안된다

        validateDuplicateMember(member);
        memberRepository.save(member);
        return member.getId(); 
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {   
                    throw new IllegalArgumentException("이미 존재하는 회원입니다");
                });
    }

회원가입 시에 이미 있는 name이라면 예외처리로 구현되는 코드를 작성했고 테스트 실패로 나왔다.

코드상에는 문제가 없어 보이는데 무엇이 문제일까?

답은 사용한 예외 클래스에 있었다.

1. service 코드

2. Test 코드

사용된 예외클래스가 IllegalStateException과 IllegalArgumentException로 불일치했다.

내가 느끼기엔 큰 차이가 아니라고 생각했는데 코드 테스트를 실패할 정도라면 둘의 차이점이 뭘까??




IllegalStateException와 IllegalArgumentException의 차이점



IllegalStateException
: 메서드가 호출되었을 때, 메서드의 현재 상태가 호출을 수행하기에 적절하지 않은 경우에 발생합니다.
일반적으로 메서드 호출 전에 객체의 상태를 확인하고, 메서드 호출이 허용되지 않을 때 이 예외가 발생합니다.
예를 들어, 어떤 작업을 수행하기 전에 반드시 초기화가 필요한데 초기화되지 않은 상태에서 작업을 시도할 때, 이 예외가 발생할 수 있습니다.

IllegalArgumentException
: 메서드에 잘못된 인수(argument)가 전달된 경우에 발생합니다.
메서드가 인자로 받은 값을 검증하다가, 값이 허용되지 않는 범위이거나 예상하는 형식과 다를 때 이 예외가 발생합니다.
예를 들어, 양수를 요구하는 메서드에 음수 값을 전달하거나, 숫자를 요구하는 메서드에 문자열을 전달할 때, 이 예외가 발생할 수 있습니다.


<정리>

IllegalStateException은 메서드 호출 시 객체의 상태가 잘못된 경우를 나타내고,

IllegalArgumentException은 메서드 호출 시 인자로 전달되는 값 자체가 잘못된 경우를 나타낸다.


두 가지 클래스의 차이점은 알게 됐는데 그럼 Test코드에 IllegalArgumentException로 써도 상관없을지 궁금해져서 직접 실행해 봤다.

테스트 코드와 서비스 코드의 예외 클래스를 일치시켜 주면 테스트는 정상적으로 수행되는 것을 확인했다.

다만, 지금 구현한 코드는 사용자가 입력한 값이 이미 존재할 경우 예외처리를 진행하기 때문에값이 허용범위를 벗어난 것이 아니라 해당 메서드를 실행할 수 없는 상태이기 때문에 의미상으로는 IllegalStateException가 더 적절하다고 생각된다.


🔸해결

**
service와 Test모두 IllegalStateException로 통일시켜 주었다.

👉 테스트 정상확인.**




🔸알게 된 점

예외처리를 진행할 때 예외메시지가 같더라도 예외 클래스를 더 명확한 의미로 사용하면 코드를 더 쉽게 이해할 수 있다.

또한, 이후에 다른 상황에서도 예외 클래스를 사용할 때 일관성을 유지할 수 있다.

애초에 예외 클래스는 특정한 상황에서 발생하는 문제를 나타내는 것이고, 각각의 예외 클래스는 서로 다른 상황에서 발생하는 문제를 대표하기 때문에 예외 클래스를 정확하게 사용하는 것은 코드의 가독성과 유지 보수성을 높이는데 도움이 된다는 것을 배웠다.

앞으로 예외 처리를 할 때, 어떤 예외를 기대하고 사용해야 하는지를 명확히 구분하여 코딩을 해야겠다.

profile
꼭꼭 씹어서 소화시키는 맛있는 코딩

0개의 댓글