해결된 질문
작성
·
353
·
수정됨
1
안녕하세요 강사님, 먼저 좋은 강의 잘 듣고 있어서 감사의 말씀 드립니다.
테스트에 대한 질문은 아니지만 강의 중 작성해주신 코드에 관하여 궁금증이 생겨 질문 드립니다.
만약 문제가 되는 경우에는 삭제하도록 하겠습니다.
먼저 궁금증이 생긴 위치는 다음과 같습니다.
Business Layer 테스트 (3) 강의의 31:07
Stock 엔티티의 deductQuantity 메소드에서 예외를 발생시키는 코드
public void deductQuantity(int quantity) {
if (isQuantityLessThan(quantity)) {
throw new IllegalArgumentException("차감할 재고 수량이 없습니다.");
}
this.quantity -= quantity;
}
[질문]
강의 중에서 deductQuantity 메소드에서 왜 isQuantityLessThan로 검증해야 하는지 설명해 주셨는데 그 부분은 이해가 되었습니다.
그런데 예외 메세지를 직접 문자열로 작성해주는 부분에서 궁금증이 생겼습니다.
스프링 빈에서 MessageSource 인터페이스를 통해 별도의 properties 파일로 예외 메세지 관리가 가능한데, 엔티티는 스프링 빈으로 등록되는 것이 아니어서 MessageSource를 통해 예외 메세지를 가져올 수 없을 것이라 생각됩니다. (그러나 deductQuantity가 호출되는 시점에서 진짜로 차감할 재고 수량이 있는지 체크하는 것도 타당하다고 생각합니다.)
그렇다면 서비스에서는 MessageSource를 통해 에러 메세지를 가져오되, 엔티티에서는 문자열로 직접 작성하는 방법밖에 없을까요? (대부분의 메세지는 properties 파일에 작성해두고, 엔티티에서만 직접 문자열로 작성하는 것이 약간 통일되지 않았다는 느낌이 들기도 하는데 어쩔 수 없는 것 같기도 합니다..)
혹시 현업에서도 MessageSource로 메세지 처리가 가능한 부분은 MessageSource를 사용하고, 그렇지 않는 부분에서는 직접 문자열로 작성하는 방식이 많이 사용되는지도 궁금합니다.
답변 2
1
안녕하세요, 원준님! :)
좋은 질문이네요 👍
일단 저는 클라이언트에 던져야 할 예외 메시지를 관리할 때, 처음부터 MessageSource를 사용하지는 않고, Enum 등으로 관리하곤 하는데요.
만약 내가 만들고 있는 프로덕트의 성격이 글로벌하거나, 나라별 언어팩을 제공해야 할 요구사항이 있는 경우와 같이 특정 이유가 있는 경우에만 MessageSource를 사용할 것 같습니다.
Enum에서 관리한다면 서비스와 엔티티 모두 해당 Enum을 사용하면 되니 질문주신 내용은 아마 해결이 될 것 같은데요, MessageSource를 사용하는 상황을 가정해 본다면, 다음과 같이 접근할 것 같아요.
엔티티에서 custom한 런타임 예외를 만들고, 던짐 (디버깅의 용이성을 위해 상황을 설명하는 텍스트 메시지는 같이 넣어줌)
custom한 예외를 ControllerAdvice 등에서 받아서, 언어팩에 맞게 MessageSource에서 메시지를 가져와 클라이언트 응답을 구성
간단하게 프로젝트 전역에서 Enum을 사용하는 방법과, MessageSource를 사용하여 메시지를 관리해야 할 책임을 좀 더 고도화하여 분리하고자 하는 방법은 클라이언트향 메시지를 누구의 책임으로 볼 것이냐에 대한 차이인 것 같아요.
즉, 핵심 도메인 객체인 엔티티 내에서 예외 상황이 발생하였지만, 이를 사용자단에 어떻게 보여줄 것인가 하는 문제를 외부로 분리한 것이 후자의 방법인 것이죠 ㅎㅎ
도움이 되셨기를 바랍니다.
감사합니다 :)
1
안녕하세요, 인프런 AI 인턴이에요. 원준님의 질문에 대해 답변드리겠습니다.
강의에서 deductQuantity 메소드에서 예외 메세지를 직접 문자열로 작성하는 부분에 대한 궁금증이 있으신 거죠.
일반적으로 엔티티는 스프링 빈으로 등록되지 않기 때문에, MessageSource를 통해 예외 메세지를 가져올 수 없습니다. 엔티티는 데이터베이스와 직접적인 관련이 있고, 비즈니스 로직을 담당하기 때문에 스프링 빈으로 등록되지 않는 것이 일반적입니다.
따라서 엔티티에서 예외 메세지를 가져오기 위해 MessageSource를 사용할 수는 없습니다. 그래서 강의에서는 예외 메세지를 직접 문자열로 작성하는 것을 보여드린 것 같습니다.
만약 예외 메세지를 별도로 관리하고 싶으시다면, 엔티티 내부에서 직접 예외 메세지를 관리하거나, 별도의 Constants나 Enum을 활용하여 예외 메세지를 관리하는 방법을 고려하실 수 있습니다.
더 자세한 내용을 알고 싶으시다면, 스프링에서 예외 메세지를 관리하는 방법에 대해 찾아보시면 좋을 것 같아요. 답변이 도움이 되었길 바랍니다. 혹시 추가로 궁금한 점이 있으시면 언제든지 물어보세요. 감사합니다!