TDD를 학습하다보면 테스트 더블이라는 말이 나온다. 그렇다면 테스트 더블은 테스트를 두번하는걸까?gpt한테 물어보니 이 용어는 영화 용어에서 스턴트 더블에서 왔다고 한다.그리고 찾아보니 더블이 두배라는 뜻이 있지만 대역이라는 뜻이 있다고 한다.그럼 뜻을 다시 해석해보면 테스트를 하기 위해 대역을 쓰는거라고 이해하면 될거 같다.요런 관점에서 생각을 해본다면테스트 더블에는 총 5가지의 대역들이 존재한다.mock, spy, stub, fake, dummy요렇게 5가지가 있다고 한다.이제 대역이라는 것을 바탕으로 생각을 해보면mock은 구현에 대한 대역spy는 구현에 대한 대역stub은 값에 대한 대역fake은 구현에 대한 대역dummy는 값에 대한 대역요렇게 나눌수 있을거다.근데 이상한건 구현3에 값이2개다..
학습 키워드Unit Test / Integration Test / E2E Test테스트 Pyramid테스트 커버리지 vs 유의미한 테스트유닛테스트라는건 뭘까?서비스단에서? 컨트롤단에서? 음 아무래도 상관없으려나유닛테스트는 단위테스트라고 하며그림을 보면 알수 있듯이 단위 테스트는 테스트 피라미드 바닥에 존재하며 굉장히 많은 수 가 있다는 것을 알 수 있습니다.이는 간단하게 작성이 되어진다는 뜻이 되어집니다.이전 포스트에서도 말했었지만 테스트코드는 굉장히 중요합니다. 그렇다는 이야기는 e2e를 하든 통합을 하든 유닛을 하든작성을 하는것이 좋습니다. 여기서 중요한 사실은 유닛테스트가 양이 제일 많다는 것입니다. 그렇다는건 유닛테스트를 중점으로 테스트코드를 짜야 된다는 뜻이 됩니다.그리고 그림에서 보면 알 수 ..
테스트 코드가 중요한건 개발자라면 누구나 인지하고 있다.하지만 생각보다 테스트 코드를 작성하는게 쉽지가 않다.어디부터 작성을 해야 하는걸까?뭘 어떻게 작성을 해야 하는걸까?그러다 개발이 종료된 이후에 테스트 코드를 도입하게 된다.그러면 의문이 드는게 검증이 되었는데 테스트 코드를 왜 짜는지에 대한 회의감이 들기 시작한다.결국 테스트코드는 작성하지 않는 꼴이 되버린다. 또 문제가 개발을 2번하는 느낌이 든다.이상하다. 분명 테스트 코드를 중요하다고 해서 테스트 코드를 짜는데 이게 따로 일을 하는 느낌이 든다.마치 구현 작업과 테스트 코드 작성 작업이 분리된 느낌이다.이게 나쁘다는게 아니다. QA테스트 같은 경우 개발이 완료된 이후에 QA가 테스트를 하게 된다.그러면 결국 2가지일을 따로 하게 될 수 도 있..
오랜만에 면접 공부를 진행하자.이 내용은 스파르타에서 진행했던 내용들을 토대로 정리한 내용이다.1. @Component, @Service, @Repository, @Controller 차이이 네 가지는 모두 스프링 컨테이너에 빈으로 등록되도록 도와주는 컴포넌트 스캔의 대상 어노테이션입니다.하지만 역할 구분과 내부 동작이 다릅니다.어노테이션설명@Component가장 일반적인 컴포넌트 등록용 어노테이션@Service비즈니스 로직을 담는 클래스에 사용. AOP 적용 시 의미 있는 대상@RepositoryDAO 계층에 사용. 스프링이 JDBC 예외를 DataAccessException으로 변환@Controller웹 요청을 처리하는 컨트롤러 클래스에 사용기존에 생각했을때 확인 목적으로 사용이 된다고 생각헀었다. ..
프로젝트에 선차감 방식을 도입하려고 합니다. 이 방식은 요청이 들어왔을 때 미리 자원을 차감하고, 대기 큐로 메시지를 전달할 수 있기 때문에 효율적인 흐름 제어가 가능합니다.하지만 선차감은 동기 방식으로 작동한다는 점이 고민입니다. 동기 방식 자체가 문제라기보다는, 이를 레디슨(Redisson) 분산 락과 함께 사용할 때 병목이 생길 수 있다는 점이 우려됩니다.레디슨은 분산 환경에서 락을 걸기 위한 네트워크 통신이 포함되어 있고, 여기에 동기 코드가 포함되면, 락 획득까지의 대기 시간이 누적될 수 있습니다.즉, 락을 기다리는 동안 동기 코드가 블로킹되면 전체 처리량이 감소할 수 있는 것이죠.그렇다고 선차감 로직을 비동기로 전환하면, 락 대기 시간은 줄어들 수 있지만, 정합성 문제가 발생하게 됩니다.실제로..