소개
안녕하세요 ☺️
몰입을 즐기는 개발자, 박우빈입니다.
- (현) 캐치테이블(와드) 소프트웨어 엔지니어
- (전) 우아한형제들 소프트웨어 엔지니어
- 우아한테크코스 3기, 4기 리뷰어 / 우아한테크캠프pro 1기 리뷰어
강의
전체1수강평
- 실무에 도움이 많이 되었습니다.
kopiuo
2024.05.16
0
- 과목이 어렵네요..
yunho_hwang
2024.05.08
0
- 테스트 코드 작성을 이해하기에 정말 좋아요 !
김수용
2024.05.02
0
게시글
질문&답변
2024.06.01
jpaRepository 에서 update 메서드 테스트 질문 드립니다.
안녕하세요, 김규현 님! 좋은 질문이네요 ㅎㅎ 바로 답변드리자면, 비슷한 상황에서는 저도 후자로 말씀주신 방법을 사용할 것 같습니다. 테스트 코드를 위해 프로덕션 코드를 수정하는 것은 지양되어야 할 방식이기에 @Modifying 을 사용하는 것보다는, EntityManager를 통한 컨텍스트 제어 방법이 더 좋다고 생각합니다. 다만, 말씀주신 것처럼 'JPA에 종속적인 테스트'에 대해서는 조금 더 생각을 해보아야 하는데요. 애초에 제가 소개드린 Repository 테스트 방식이 JPA에 종속적인 Spring 통합 테스트(@SpringBootTest)여서, Repository 자체는 인터페이스로 순수 스펙만 명시되어 있다고 하더라도, 테스트 방식 자체가 JPA 종속성을 염두에 둘 수밖에 없는 방식이기 때문에 필요에 따라 EntityManager를 사용하는 것은 어쩔 수 없을 것 같습니다. 오히려 자연스럽다고 볼 수도 있고요. 결국은 테스트 환경을 실행했을 때 update 행위를 수행하는 구현체가 JPA(hibernate)를 기반으로 하기 때문이죠. 도움이 되셨기를 바랍니다. 감사합니다 🙂
- 0
- 2
- 34
질문&답변
2024.05.25
access token의 경우 테스트 코드에서 어떻게 처리해야되나요?
안녕하세요, jay 님! :) access token을 어떤 식으로 사용하고 검증하시는지, 작성하려는 테스트 코드가 어떤 레이어의 테스트인지, 단위/통합/인수 테스트 중 어떤 종류의 테스트인지에 따라 검증 방법은 달라질 것 같습니다. 작성중이신 코드를 말씀주셔야 그에 맞는 답변을 드릴 수 있을 것 같은데요. ㅎㅎ 몇 가지 가능한 방법을 떠오르는대로 말씀드리자면, 테스트용 토큰을 발급하여 사용하시거나, 토큰을 검증하는 부분을 mocking 처리하여 검증을 통과하도록 반환값을 조작하는 방법 등이 있을 것 같아요. 도움이 되셨기를 바랍니다. 감사합니다. 🙂
- 0
- 2
- 82
질문&답변
2024.05.17
a 서비스에서 b 서비스를 의존하는 코드에 대한 테스트는 어떻게 해야 되나요??
안녕하세요, 진짜 잘하고싶다 님! 하나씩 답변 드리겠습니다. 1. CommentService에서 다른 Service를 의존하게 되는 것 프로젝트의 아키텍처에 따라 달라질 수 있습니다만, 복잡도가 높아질수록 Service가 다른 Service와 협력하는 경우는 충분히 생길 수 있습니다. 2. 댓글 작성이라는 테스트를 짤 때 댓글 작성에 초첨을 맞출 수 없고 알림까지 테스트를 작성해야 되기 떄문에 핵심 기능 외에 다른 부가적인 기능 때문에 테스트의 집중도가 떨어집니다. 만약 두 서비스를 반드시 한 프로세스 내에서 검증해야 하는 것이 아니라면, 강의 중에 언급드리는 mocking을 사용하여 AlarmService에 대해 성공 혹은 실패 응답을 가정하고 CommentService의 테스트 코드를 작성할 수 있습니다. 3. 한 트랙잭션에 묶여서 알림을 생성하는데 문제가 발생하면 댓글도 생성되지 않습니다. 결국은 트랜잭션을 분리해야 하는 것이 맞습니다. '댓글'과 '알림'은 사실 전혀 다른 도메인인데요. 말씀하신대로 알림이 실패했다고 댓글 쓰기가 실패하면 안되기 때문에, 이 둘은 별도의 프로세스로 다뤄야 합니다. 당장 Service 레벨에서 적용을 고려해볼 수 있는 것은, 각 서비스가 각각의 트랜잭션을 가져가도록 하고, 트랜잭션의 전파 옵션(REQUIRES_NEW)을 고려해 보세요. ㅎㅎ 추가적으로, 대형 서비스의 경우 보통 댓글과 알림이라면 도메인이 아예 다르기 때문에 각각 별도의 시스템으로 구현합니다. 이런 경우, 두 시스템 간 데이터를 주고 받아야 할텐데요. 여러가지 방법이 있겠지만, 댓글과 알림은 반드시 실시간으로 동기화되어야 하는 도메인이 아니기 때문에(댓글에 대한 알림이 조금 늦게 온다고 사용자가 불편을 느끼지는 않기 때문에), 실시간 API call 보다는 이벤트 기반으로 동작하도록 하는 것이 효율적일 것입니다. 댓글 시스템에서 댓글이 생성되었다는 이벤트를 발행하면, 이를 SQS나 kafka같은 메시지 브로커에서 받아 대상인 알림 시스템에 전달해줍니다. 댓글 시스템에서는 이벤트 발행까지만 하면 댓글 쓰기에 대한 작업을 완료 처리할 수 있고, 알림 시스템에서는 발행된 이벤트를 받아서 무사히 알림을 발생시키기만 하면 되기 때문에, 두 시스템이 서로 간 의존성을 가지지 않고 동작할 수 있게 됩니다. 참고해 주세요 ㅎㅎ 도움이 되셨기를 바랍니다. 감사합니다. 🙂
- 0
- 1
- 74
질문&답변
2024.05.17
동시성 이슈 - 3회 이상 재시도를 자동으로 하게 하는 방법
안녕하세요, lch9502 님! 접근하신 방법이 맞습니다. 몇 가지 좀 더 말씀드리자면요. ㅎㅎ 테스트 코드를 통해 동시성 테스트를 할 수 있습니다. ExecutorService를 통해 스레드풀을 만들고 동시에 요청을 발생시키는 방법을 한번 찾아보셔도 좋을 것 같습니다 ㅎㅎ 위와 같은 재시도 방법의 경우, 비즈니스 플로우 상 크게 중요도가 높지 않은 케이스(즉, 3번 시도 후 실패해도 기능 상 중요하지 않거나, 사용자가 다시 요청을 하는 행위가 비용이 크지 않은 경우)에서 간단하게 시도해볼 수 있는 방법입니다. 만약 요청의 성공을 보장해야 하는 경우, 레디스 등을 활용한 분산락 같이 동시성 이슈를 해소하기 위한 여러가지 기법을 적용해볼 수 있으니 참고해 주세요. 도움이 되셨기를 바랍니다. 감사합니다. 🙂
- 0
- 1
- 95
질문&답변
2024.05.12
OrderRepositoryTest에서 단위테스트가 가능한가요?
안녕하세요, kksshh0612 님! 'productRepository와 관련된 코드가 들어가서 단위 테스트가 깨진다'는 표현과 문제 상황을 제가 잘 이해하지 못했습니다만, Order와 Product가 일대다-다대일 관계인데 각각 저장을 하기 때문에 문제가 발생하지 않나 라는 의미로 받아들였습니다. 우리가 given절에서 하는 일은 테스트하고자 하는 상황을 준비하는 것인데요, Order에 대한 테스트를 하기 위해서 필요한 내용은 Product를 생성하는 일과, 그 중간 매핑 테이블인 OrderProduct를 생성하는 일일 것입니다. 따라서, 강의 중 보여드린 것과 비슷하게 OrderProduct를 같이 만들어서 연관관계를 설정 후 저장해주면 크게 문제가 생기지 않을 것으로 생각되네요. 감사합니다. 🙂
- 0
- 1
- 67