본문 바로가기

Programming/Java, Spring98

spring 단위 테스트에서 autowired와 mockbean의 차이 (feat. spybean) 단위 테스트를 작성하면서 쓰긴 쓰는데 한참 동안 차이점도 잘 모르고 썼던 것이 바로 @Autowired와 @Mockbean이었다. 둘의 차이점을 정리해보았다. 문제 파악하기 다음과 같은 코드에서 MockBean을 주입하는 것과 Autowired를 주입하는 것의 차이는 무엇일까? @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = TestConfig.class) class GenericServiceFeignSenderTest { @Autowired private GenericServiceFeignSender genericServiceFeignSender; @MockBean private ExternalApiClientV1 externalA.. 2023. 12. 13.
spring mock mvc에서 한 번쯤은 만나는 unnecessary stubbing을 lenient 옵션으로 해결하기 MVC 단위 테스트를 하면서 발생한 "Unnecessary stubbing" 에러를 lenient 옵션을 통해 해결한 경험을 소개한다. 아래 코드는 실제 코드를 조금 각색하고 추상한 코드이다. 에러가 난 상황 에러 메시지 Unnecessary stubbings detected. Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary (click to navigate to relevant line of code): 1. -> at kr.co.....TTLHelperTest.setUp(TTLHelperTest.java:32) 2. -> at kr.co.....TTLHelperTest.se.. 2023. 12. 13.
스프링 캐싱 메커니즘에서 @Cacheable과 @Cacheput 차이점은 ? @Cacheable과 @CachePut은 스프링의 캐싱 메커니즘에서 사용되는 애노테이션인데, 두 애노테이션의 캐싱 동작은 약간 다르다. @Cacheable 목적: 메서드의 실행 결과를 캐시에 저장, 동일한 입력값에 대해 메서드가 다시 호출될 때 캐시된 값을 반환. 동작: 주어진 파라미터로 캐시를 조회하고, 해당 값이 존재하면 메서드를 실행하지 않고 캐시된 값을 반환. 캐시에 값이 없을 경우 메서드를 실행하고 결과를 캐시에 저장한 후 반환. 주로 사용되는 경우: 결과가 변경되지 않고, 계산 비용이 높은 메서드에 사용한다. @CachePut 목적: 메서드의 실행 결과를 캐시에 항상 저장. 이미 캐시된 값이 있다면 덮어쓰기 동작: 메서드를 항상 실행하고 그 결과를 캐시에 저장. 이전에 캐시된 값이 있더라도 덮.. 2023. 12. 13.
Spring Webflux - 배경, 개념 Cpu bound vs I/O Bound, block vs non-block, mvc vs webflux Cpu bound vs I/O Bound 스프링 웹플럭스는 대량의 트래픽을 처리하는데 특화되어 있고 I/O 바운드에 가깝다. CPU Bound CPU를 중점적으로 다루는 작업들 암호화 압축화 주로 CPU 계산 능력에 따라 성능이 좌우되는 것들 단일 CPU 코어에 두 개의 작업을한다면 어떨까? 동시간 대에 하나의 명령만 실행하기 때문에 실제로는 app1과 app2가 번갈아가면서 실행하게 된다. 이렇게 실행되는 과정에서 Context Switing이 일어나고 성능 저하가 발생. 메모리 -> CPU : register 컨텍스트 스위칭은 Register 과정을 초기화한다. 즉, 2번 앱 정보를 가져와서 실행. -> 성능상 오버헤드 발생 해결 방법은 ? multi core를 활용 -> 병렬 처리를 한다. IO B.. 2023. 10. 16.
스프링 웹 환경에서 요청 응답 플로우 (request, filter, interceptor, controller, exceptionHandler) Request - Response 흐름 사용자의 요청이 서버에 도착하면, DispatcherServlet이 해당 요청을 처리한다. 이때, 요청과 응답에 대한 정보는 각각HttpServletRequest와 HttpServletResponse에 저장. Filter Filter는 요청과 응답에 대한 전처리와 후처리를 담당. LoggerFilter는 요청과 응답에 대한 로깅을 수행. 요청과 응답의 헤더 정보, 바디 정보 등을 로그로 남긴다. Interceptor Interceptor는 컨트롤러의 실행 전후에 특정 로직을 실행. AuthorizationInterceptor 는 요청 URL의 로그를 남기고, 특정 HTTP 메소드나 리소스에 대한 요청이면 통과시킨다. Controller 실제 비즈니스 로직을 처리하는.. 2023. 10. 16.