해결된 질문
작성
·
228
·
수정됨
0
안녕하세요 강사님,
먼저 좋은 강의와 강의가 나온지 일년이 가까지 되어가는데도 답변해주셔서 감사합니다.
public boolean sendOrderStatisticsMail(LocalDate orderDate, String email) {
// 찾아오기
//통계 합산하기.
boolean result = mailService.sendMail();
return true;
}
public Boolean sendMail(String fromEmail, String toEmail, String subject, String content) {
// mailSendClient는 메일을 전송하는 역할을 합니다.
boolean result = mailSendClient.sendEmail(fromEmail,toEmail,subject,content);
// 메일이 전송되었다면 메일 전송 내역을 저장합니다. - 기록용 엔티티 입니다.
if (result) {
mailSendHistoryRepository.save(..);
return true;
}
return false;
}
이렇게 역할을 나누어 메일 전송을 메일 서비스에게 위임했습니다.
조회한다
메일을 전송한다
메일 히스토리에 저장한다.
비즈니스 로직을 그대로 작성하다보면 아래와 같이 작성하게 되는 경우가 많습니다.
public boolean sendOrderStatisticsMail(LocalDate orderDate, String email) {
// 찾아오기
//통계 합산하기.
// mailSendClient는 메일을 전송하는 역할을 합니다.
boolean result = mailSendClient.sendEmail(fromEmail,toEmail,subject,content);
// 메일이 전송되었다면 메일 전송 내역을 저장합니다. - 기록용 엔티티 입니다.
if (result) {
mailSendHistoryRepository.save(..);
return true;
}
return false;
}
mailSendClient를 Subbing해서 테스트를 한다면
위에 코드나 아래 코드나 테스트 방식은 동일하게 작성이 됩니다.
강사님께서 작성하는 방법은 메일 후처리를 해주는 클래스를 추가가 됩니다.
테스트 코드를 작성하면 동일하게 동작하는데 클래스가 하나가 추가됩니다.
그럼에도 장점이 있기 때문에 사용한다고 생각되어지는데
제가 생각한 후처리기 클래스의 장점은
외부 네트워크를 직접 의존하지 않아도 된다.
메일 전송과 히스토리 저장을 하나의 서비스로 사용할 수 있다.
그리고 이렇게 후처리기 클래스 적용하는 기준이 있으실까요?
답변 1
1
안녕하세요, kamser 님! :)
저의 경우 후처리기 클래스를 사용하는 기준이 있다기 보다는, SRP(단일 책임 원칙)에 입각하여 클래스를 나누거나 합치거나 하고 있습니다.
당연히 책임을 나누기가 애매해 보이는 경우도 있는데요.
메일 전송의 경우 트랜잭션 관리 등의 이유로 책임을 잘게 쪼개어 클래스를 분리하기도 했다면, 또 어떤 상황에서는 클래스 수가 증가함에도 이점이 없거나, 미래 시점에도 이점이 없을 것 같다고 생각되는 경우 유지보수의 용이함을 위해 반대로 합치기도 합니다. (자주 있는 일은 아니지만요.)
항상 정답은 없으니 자신만의 원칙을 가지고, 때로는 피드백에 따라 그 원칙을 유연하게 수정하기도 하면서 계속 고민해 나가는 게 답인 것 같아요. ㅎㅎ
감사합니다. :)
감사합니다 !
강사님 혹시 다음 강의는 준비하시는게 있으신가요 ?