Closed kjsu0209 closed 3 years ago
저도 이 부분이 헷갈려서 바로 위에 이슈를 남겼는데,
SQLException은 체크 예외
이며, 이것을 catch로 잡아 봤자 복구 할 방법이 없으므로, 차라리 아이디 중복을 나타내는 예외인 DuplicatedUserIdException으로 포장하고 더 이상의 예외 처리를 하지 않겠다는 뜻으로 런타임 예외(언체크 예외
)로 만드는 것이 아닐까 추측을 해봅니다. 👀
유저 아이디가 중첩되는 경우에는 회원가입 작업을 중단시키고 오류 메세지를 유저에게 띄운다거나 충돌이 나지 않도록 하는 등의 예외 처리를 해 주어야 할 것이고, 그렇게 하기 위해서는 catch를 할 때 어떤 예외를 잡아야 하는지에 대한 고민에서 예외 전환이 등장합니다.DuplicateUserIdException 대신 SQLException을 메세지와 함께 감싸서 던진다면, 실제 예외를 처리해야 할 객체에서 이게 DB가 터진건지, id가 중복인건지, 커넥션이 모자란건지... 하는 걸 다룰 수가 없기 떄문이 아닐까요? 메세지를 직접 파싱해서 예외처리에 쓰는건 진짜 넌센스한 일이 될 테구요. 의미의 명확은 개발자와 같은 사람에게만 해당하는 일이 아니라 try/catch로 예외를 잡는 프로그램의 입장도 함께 포함하는 개념인 것 같습니다.
+@ 어떤 의미인진 모르겠지만 제가 이해한 내용은
중첩 예외의 예시로
DuplicateUserIdException
이 나오는데, 의미가 모호한 SQLException을 한 겹 감싸서 의미를 좀 더 명확하게 한다는 장점이 있다고 합니다.이 부분에 있어서 중첩 예외가 유용하다고 생각 되지만 SQLException을 던질 때
중복된 Id 값입니다
라는 오류 메시지를 같이 던져서 의미를 명확하게 하면 되지 않을까 의문이 듭니다.+@ 예를 들어 User, Order, Item이라는 테이블에 접근해서 insert를 수행하는 api를 개발한다면 unique 값 중복 에러를 어떻게 처리하면 좋을까요? 제가 생각한 방법은 DuplicateUniqueValueException을 하나 만들어서 에러가 발생할 경우 어느 테이블에서 발생했는지에 대한 것만 생성자 파라미터로 넘겨주는 것인데, 어차피 insert api를 호출하는 요청이 잘못 되었으니까 BadRequestException을 던질 수도 있겠죠,,, 어느 시점에서 exception의 의미를 명확하게 해 주어야 할지 생각하게 되네요 🤔