Domain exception

사용자 정의 예외 응답

`UserAlreadyExistsException`처럼 이름이 분명한 예외를 던지면, 필터는 상태 코드와 메시지를 일관된 JSON 구조로 정리합니다.

service

중복 사용자 발견

`UsersService.createUser()`는 이미 존재하는 username을 확인하고 Conflict 상황을 코드 이름으로 표현합니다.

throw

UserAlreadyExistsException

`HttpException`을 상속해 409 상태와 사용자에게 보여줄 메시지를 함께 전달합니다.

filter

HttpExceptionFilter

`catch()`에서 status, request url, response payload를 읽어 API 규격에 맞춥니다.

409 Conflict

클라이언트가 받는 형태

예외 이름은 서버 코드에 남고, 응답에는 클라이언트가 처리할 수 있는 상태 코드와 설명만 담습니다.

statusCode

409

timestamp

요청 실패 시각

path

`/users`처럼 실패한 URL

message

중복 username을 설명하는 안전한 문장

이름

서비스 코드는 읽히게

`throw new UserAlreadyExistsException()`은 조건문보다 실패 이유를 더 직접적으로 드러냅니다.

응답

외부 메시지는 제한

내부 DB 오류, stack trace, 민감한 식별자는 필터에서 노출하지 않습니다.

로그

서버 기록은 자세히

Logger나 tracing provider에는 원인과 request id를 남겨 장애 분석에 사용합니다.