inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Practical Testing: 실용적인 테스트 가이드

Business Layer 테스트 (1)

a 서비스에서 b 서비스를 의존하는 코드에 대한 테스트는 어떻게 해야 되나요??

359

진짜 잘하고싶다

작성한 질문수 30

0

안녕하세요 강사님, 궁금한게있습니다.

인스타그램, 페이스북을 사용할 때 제가 쓴 게시글에 다른 사람이 댓글을 달면 알림이 생성되는데,

제가 작성한 로직에서는 CommentService에서 댓글을 작성하고 alarmService를 호출하여 알림까지 생성하는 로직입니다.

이렇게 로직을 짰을 때 제가 생각한 문제점에 대한 해답을 찾고 싶습니다.

1. CommentService에서 다른 Service를 의존하게 되는 것

2. 댓글 작성이라는 테스트를 짤 때 댓글 작성에 초첨을 맞출 수 없고 알림까지 테스트를 작성해야 되기 떄문에 핵심 기능 외에 다른 부가적인 기능 때문에 테스트의 집중도가 떨어집니다.

3. 한 트랙잭션에 묶여서 알림을 생성하는데 문제가 발생하면 댓글도 생성되지 않습니다.

이러한 경우 어떤 학습을 통해 개선할 수 있는지 가르쳐주실 수 있나요?

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 1

0

박우빈

안녕하세요, 진짜 잘하고싶다 님!

하나씩 답변 드리겠습니다.

 

1. CommentService에서 다른 Service를 의존하게 되는 것

프로젝트의 아키텍처에 따라 달라질 수 있습니다만, 복잡도가 높아질수록 Service가 다른 Service와 협력하는 경우는 충분히 생길 수 있습니다.

 

2. 댓글 작성이라는 테스트를 짤 때 댓글 작성에 초첨을 맞출 수 없고 알림까지 테스트를 작성해야 되기 떄문에 핵심 기능 외에 다른 부가적인 기능 때문에 테스트의 집중도가 떨어집니다.

만약 두 서비스를 반드시 한 프로세스 내에서 검증해야 하는 것이 아니라면, 강의 중에 언급드리는 mocking을 사용하여 AlarmService에 대해 성공 혹은 실패 응답을 가정하고 CommentService의 테스트 코드를 작성할 수 있습니다.

3. 한 트랙잭션에 묶여서 알림을 생성하는데 문제가 발생하면 댓글도 생성되지 않습니다.

결국은 트랜잭션을 분리해야 하는 것이 맞습니다. '댓글'과 '알림'은 사실 전혀 다른 도메인인데요.
말씀하신대로 알림이 실패했다고 댓글 쓰기가 실패하면 안되기 때문에, 이 둘은 별도의 프로세스로 다뤄야 합니다.
당장 Service 레벨에서 적용을 고려해볼 수 있는 것은, 각 서비스가 각각의 트랜잭션을 가져가도록 하고, 트랜잭션의 전파 옵션(REQUIRES_NEW)을 고려해 보세요. ㅎㅎ

추가적으로, 대형 서비스의 경우 보통 댓글과 알림이라면 도메인이 아예 다르기 때문에 각각 별도의 시스템으로 구현합니다. 이런 경우, 두 시스템 간 데이터를 주고 받아야 할텐데요.
여러가지 방법이 있겠지만, 댓글과 알림은 반드시 실시간으로 동기화되어야 하는 도메인이 아니기 때문에(댓글에 대한 알림이 조금 늦게 온다고 사용자가 불편을 느끼지는 않기 때문에), 실시간 API call 보다는 이벤트 기반으로 동작하도록 하는 것이 효율적일 것입니다.
댓글 시스템에서 댓글이 생성되었다는 이벤트를 발행하면, 이를 SQS나 kafka같은 메시지 브로커에서 받아 대상인 알림 시스템에 전달해줍니다. 댓글 시스템에서는 이벤트 발행까지만 하면 댓글 쓰기에 대한 작업을 완료 처리할 수 있고, 알림 시스템에서는 발행된 이벤트를 받아서 무사히 알림을 발생시키기만 하면 되기 때문에, 두 시스템이 서로 간 의존성을 가지지 않고 동작할 수 있게 됩니다. 참고해 주세요 ㅎㅎ

도움이 되셨기를 바랍니다.
감사합니다. 🙂

private 상수 테스트 관련 질문

0

82

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

124

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

159

2

테스트 문서화 질문입니다

0

104

2

단위테스트 질문이 있습니다

0

94

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

100

2

ERD 가장자리에 있는 도메인 테스트 질문

0

86

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

131

2

OrderCreateRequest DTO에 대해서 궁금한점

0

101

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

154

2

계층 관련 질문이 있습니다.

0

137

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

122

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

133

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

226

2

Service+Repository 통합테스트 관련 질문입니다.

0

149

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

183

2

test 용 .yml

0

89

2

throws Exception

0

78

2

카페키오스크 클래스 문의 ,,

0

87

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

171

2

테스트 코드에서 필요한 생성자

0

136

1

tearDown 순서

0

114

2

@Builder 생성자 private

0

133

2

@DisplayName gradle / intellJ

0

91

2