학습 계기 최근 업무중에 만난 코드에서 궁금증이 생겼었습니다. Static Nested Class에 @Service 애너테이션이 적용되어 있고, 해당 클래스 내부에 @Transactional이 적용되어 있어서, 왜 중첩클래스? 왜 static 선언? 이게 프록시가 적용되나? 등의 의문이 있었는데 마침 토비의 스프링 채널에 업로드된 Nested Class 관련 영상이 있어서 학습하고 정리해봤습니다. 용어 정리 Top-level Class vs Nested Class Static Nested Class vs Non-static Nested Class (inner class) Local Class Anonymous Class 이러한 용어들에 대해 아직 정확히 구분하지 못하고 있었다는 걸 배웠네요. 관련하여 쉐..
웹 애플리케이션의 성능을 위해 고려해야할 부분은 정말 많습니다. WS 관점에선 이중화, 로드밸런싱, 캐싱, 커넥션 등, WAS 관점에선 스레드풀, 커넥션, 억셉트카운트, DB커넥션풀 등, DB 관점에선 커넥션 수와 인덱스 등이 있습니다. 그 중에서도 가장 드라마틱한 성능 개선을 만들어주는 것은 바로 캐시입니다. 가장 큰 병목을 유발하는 지점에 대해 수행하지 않고 재사용하거나, 수행하더라도 아주 짧은 시간 내에 처리될 수 있게 개선해주기 때문입니다. 캐시도 CPU에서부터 WAS, WS까지 정말 여러 영역에 걸쳐있는데요 첫번째로 WAS에서 사용되는 로컬 캐시에 대해 이해해보고자 합니다. 거기서도 다시 좁혀서 스프링에서 캐싱이 어떻게 제공되는지 살펴보겠습니다. 이를 위해 스프링 공식 문서를 통해 스프링이 제공..
open-in-view WARNING 로그 spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 관련하여 별도 설정을 하지 않았다면, 스프링 부트 애플리케이션을 실행할 때마다 위와 같은 로그를 보게 됩니다 spring.jpa.open-in-view 라는 설정이 기본 설정값에 의해 활성화 되어있습니다. view 렌더링 과정에서 쿼리가 수행될 수 있음을 경고하고 있습니다. view 렌더링 과정까지 쿼리가 수행될 수 있기 때문에, 그 과정..
MyRSS 프로젝트를 진행하며 스프링 설정 파일을 리팩터링한 내용을 정리해봤습니다. 설정 파일 공개 필요성 spring: config: import: - classpath:/2022-MyRSS-secret/application.yml 위 내용은 리팩터링 이전 application.yml 파일 내용의 전부입니다. 서브모듈로 Private Repository를 품고 있고, 그 안에 환경 설정 내용들을 담아두었습니다. Github Actions, Jenkins에서는 Github Personal Token을 전달해 서브모듈까지 가져와서 CI/CD를 수행합니다. 그대로 계속 작업해도 아무 문제 없지만, 공개 가능한 설정은 공개하도록 리팩터링하고 싶었습니다. 추가적으로, 서브모듈로 관리되는 보안이 필요한 접속정보 ..
전체 코드는 여기에서 확인하실 수 있습니다 :) 두 곳에 Ajax 요청을 보낸 뒤, 결과를 취합해 후속 작업을 해야 한다면? 언제 처리가 완료될지 정확히 알 수 없는 두 가지 작업이 있고, 그 작업들이 모두 완료된 이후에 취합하여 후속작업을 처리해야 한다고 가정해보겠습니다. 가령 서비스 레이어에서 두 곳의 엔드포인트에 요청을 보내고, 응답 값을 취합해서 결과에 따른 분기처리가 필요한 상황이라고 생각해볼 수 있을 것 같아요. 요청한 클라이언트에게 즉시 결과를 응답해야 한다면 두 요청을 쓰레드 풀 작업 큐에 넣고, 두 Future 객체의 get() 메서드를 이용해 기다린 후 응답한다 이 방법의 장점은 하나의 요청이 응답될 때까지 기다렸다가 다음 요청이 나가는 것이 아니라, 동시에 두 가지 요청이 호출된다는 ..