본문 바로가기

분류 전체보기26

로컬에서만 Spring Boot에서 HTML Resource 파일이 제공 가능 했던 이유 Restdocs 설정을 하고 생성 된 HTML이 src/main/resources/static 경로에 존재하면 해당 파일명으로 GET 요청을 날렸을 때정적 파일이 서빙 되는 줄 알았다. 물론 로컬에서는 해당 경로에 존재하면 정상적으로 정적 파일이 제공이 되는데 빌드 된 파일로 서버에 띄우게 되면 리소스를 찾지 못하는 문제가 있었다. 먼저 리소스 관련 HTTP 요청 처리 과정을 보면 HTTP 요청을 할 때 해당 요청 경로를 담당하는 컨트롤러가 없으면ResourceHttpRequestHandler 의 handleRequest를 타고 가는데 여기서 getResource 함수에서 리소스를 가져오게 된다.  파싱하는 코드들을 지나서 리소스를 가져오는 부분은 해당 부분이다.resolverChain.resolveR.. 2024. 5. 2.
Spring Kafka Record 삭제하기 Spring에서 카프카로 '정확히 한 번' 을 어떻게 테스트 할 수 있을지 고민을 하다가 내린 결론은 테스트 할 수 없을 것 같다는 것이다. MockProducer 등등 에러를 재현할 수 있는 객체들이 있지만, 네트워크 에러를 재현 하는 건 어떻게 해야 할 지.. 감이 아직 안 온다. (디버깅 포인트 걸고.. 카프카 중지시키기?? 밖에 떠오르지 않는다.) 코드를 짜보면서 삽질을 조금 하다가 토픽의 레코드 수를 확인하는 코드를 작성하였는데, 다음과 같이 작성하였다.  fun getMessageCount(topicName: String, kafkaTemplate: KafkaTemplate): Long { val adminClient: AdminClient = AdminClie.. 2024. 5. 1.
Spring Boot Warm Up Warm Up Spring Boot 어플리케이션을 배포하게 되면 첫 요청에 대한 응답은 상대적으로 느리고 이후 요청부터 점점 테스트 했던 지연시간 만큼 줄어드는 걸 확인 할 수 있다. 원인은 JVM의 클래스 로딩 방식이 Lazy 한 것과 Spring Boot 내부에서 사용하는 Bean들 중 지연 로딩을 적용 한 것들이 실제 요청을 받을 때 생성하기 때문에 그만큼 응답 시간에 영향을 미치기 때문이다. 그렇다면 원인을 파악했으니 지연 로딩되는 클래스들과 Bean들을 첫 요청 전에 로딩 시켜 놓으면 첫 요청이 느린 문제를 해결 할 수 있다. 이렇게 사전에 준비를 해놓는 것을 'Warm Up'이라고 부른다. (물론 JVM JIT Compiler cache - Tiered Compilation 을 통한 최적화 하.. 2024. 4. 17.
Feign Client Connection Pool Feign Client를 무작정 사용하면 알아서 커넥션 풀을 사용할까? 알아서 사용 했으면 이렇게 글로 정리 하지도 않았을 것이다. 우선 커넥션 풀을 사용 할 필요가 있는 서비스와 사용 할 필요가 없는 서비스를 두 가지 유형으로 분리해보면 기준은 '자원' 이 될 것이다. (이 안에는 시간과 물리적인 자원이 포함된다.) 즉 자원이 여유로운 상황에서는 굳이 커넥션 풀 관리를 할 필요는 없을 것이니까 Client 구현체 설정을 안 해주면 Default를 사용하게 된다. 근데 Default 생성 부분에서는 커넥션 풀에 관한 설정이 없다. 즉 요청마다 3way-handshake 과정을 거치고 이후에 요청을 받는 것이다. 커넥션 풀을 사용는 것이 중요한 케이스 MSA 환경에서 다른 서버의 API 값을 불러오는 상황.. 2024. 3. 25.