MailService 구조에 대해 생각을 여쭙고 싶습니다.
안녕하세요 강사님,
먼저 좋은 강의와 강의가 나온지 일년이 가까지 되어가는데도 답변해주셔서 감사합니다.
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(단일 책임 원칙)에 입각하여 클래스를 나누거나 합치거나 하고 있습니다.
당연히 책임을 나누기가 애매해 보이는 경우도 있는데요.
메일 전송의 경우 트랜잭션 관리 등의 이유로 책임을 잘게 쪼개어 클래스를 분리하기도 했다면, 또 어떤 상황에서는 클래스 수가 증가함에도 이점이 없거나, 미래 시점에도 이점이 없을 것 같다고 생각되는 경우 유지보수의 용이함을 위해 반대로 합치기도 합니다. (자주 있는 일은 아니지만요.)
항상 정답은 없으니 자신만의 원칙을 가지고, 때로는 피드백에 따라 그 원칙을 유연하게 수정하기도 하면서 계속 고민해 나가는 게 답인 것 같아요. ㅎㅎ
감사합니다. :)
private 상수 테스트 관련 질문
0
83
1
void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??
0
125
2
커버리지는 어떻게 활용하시는지 궁금합니다.
0
159
2
테스트 문서화 질문입니다
0
104
2
단위테스트 질문이 있습니다
0
96
2
컨트롤러는 모킹을 한 이유가 궁금합니다.
0
100
2
ERD 가장자리에 있는 도메인 테스트 질문
0
87
2
DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?
0
134
2
OrderCreateRequest DTO에 대해서 궁금한점
0
101
2
고전파의 테스트 대역 사용 대상, 공유 의존성
0
154
2
계층 관련 질문이 있습니다.
0
138
3
'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다
1
123
2
혹시 update 로직은 어떻게 테스트하나요? (@Setter?)
0
134
2
단위테스트와 통합테스트의 경계가 궁금합니다.
0
228
2
Service+Repository 통합테스트 관련 질문입니다.
0
150
2
OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요
0
183
2
test 용 .yml
0
90
2
throws Exception
0
78
2
카페키오스크 클래스 문의 ,,
0
87
2
Rest docs 문서용 테스트코드를 따로 작성해야 되나요?
0
172
2
테스트 코드에서 필요한 생성자
0
138
1
tearDown 순서
0
115
2
@Builder 생성자 private
0
136
2
@DisplayName gradle / intellJ
0
93
2





