본문 바로가기
  • 개발 로그를 기록하며,
    복습하고 깊이를 더해갑니다.
728x90

🍃SpringFramework85

[SpringBoot] Functional Interface를 활용한 Lazy 초기화 전략 Batch 애플리케이션에서 OpenSearch 클라이언트들의 불필요한 초기화를 방지하기 위해 Supplier를 활용한 Lazy 초기화 전략 적용 사례.📚 목차1. 배경 지식 1.1 Lazy 초기화란? 1.2 Functional Interface와 Supplier2. 문제 상황 2.1 기존 환경 2.2 문제점 인식 2.3 @Lazy 적용 시도3. 해결 방법: Supplier를 활용한 Lazy 초기화 3.1 핵심 아이디어 3.2 개선된 코드 3.3 동작 흐름 비교4. 실제 사용 예시5. 추가 개선: 캐싱을 통한 중복 초기화 방지6. 정리 1. 배경 지식Lazy 초기화란?Lazy 초기화(지연 초기화)는 객체의 생성을 실제로 필요한 시점까지 미루는 기법이다. Spring에서는 기본.. 2025. 10. 19.
[SpringBoot] 배치 애플리케이션 종료되지 않는 현상 (with. Connection Pool) Batch 작업이 끝났는데 왜 Application이 정상적으로 종료되지 못할까..? SpringBoot를 사용해 배치 애플리케이션을 개발하는 도중 분명 배치 작업이 끝났는데 애플리케이션(프로세스)가 종료되지 않는 현상이 발생하였다. 왜 애플리케이션이 종료되지 않은 것일까? 💡Elasticsearch Client의 Connection pool이 살아있어 jvm이 종료되지 못한 것 이었다.우선 애플리케이션이 정상적으로 종료되지 않는 이슈가 발생할 때 확인하는 방법에 대해 알아보자.작업이 끝났는데 종료되지 않으면 대부분 스레드가 문제다.. 특히 Non-daemon 스레드는 jvm이 강제로 종료시킬 수 없기 때문에 jvm이 종료되지 못하는 원인이 된다. ✅ jvm 프로세스에 의해 실행중인 스레드 확인하기jp.. 2025. 8. 24.
[SpringFramework] IoC 원칙에 위배되는 static 키워드? 📌 Spring에서 static 키워드를 지양해야 하는 이유Java를 사용할 때 static 키워드는 클래스 레벨에서 공유되는 변수 또는 메서드를 정의할 때 자주 사용된다. 대표적으로 static 메서드는 객체 생성 없이 호출할 수 있고, static 변수는 클래스 로딩 시 메모리에 올라가 하나의 값만을 공유하게 된다. 하지만 Spring Framework에서는 이러한 static 사용이 프레임워크의 철학 및 동작 방식과 충돌하며, 불필요하거나 문제가 될 수 있다. 1. Spring은 IoC 기반 프레임워크 • 객체 생성, 생명주기 관리, 의존성 연결 등을 개발자가 아닌 Spring 컨테이너가 제어한다. • 즉, 객체 인스턴스는 컨테이너가 주입하고 관리해야 하며, 필요한 구성은 모두 빈 단위로 주입 가.. 2025. 7. 28.
[SpringMVC] 비동기 처리 (with. Async) WAS에서 비동기로 처리하는 방법 Spring은 주로 웹 개발에 사용되기 때문에 비동기 처리가 필요한 경우는 보통 UX개선으로 화면의 블로킹 현상을 방지하기 위해 Client(js)에서 Axios등을 사용하여 비동기로 HTTP 요청을 보내는 방식으로 처리한다. 하지만 아래와 같이 서버(WAS)에서 비동기 처리가 필요한 경우도 있다. 무거운 연산 또는 I/O 작업 처리데이터베이스 쿼리, 대용량 파일 처리, 외부 API 호출 등으로 인해 응답 시간이 길고, 클라이언트가 기다리기 어려운 경우서버에서 비동기로 처리해 자원 낭비와 블로킹을 줄임서버 자원 제한 및 동시성 처리 필요제한된 쓰레드 풀에서 다수 요청을 효율적으로 처리해야 할 때서버 쓰레드가 블로킹 되면 전체 처리량이 떨어지므로 비동기 처리로 극복실시간 .. 2025. 6. 29.
[SpringFramework] Data 변경을 감지하여 실시간 정보 제공하기 사용자에게 실시간 정보를 제공하기 위해서는 어떤 방법들이 있을까? 시간에 따라 데이터가 빠르게 변화하는 현대 사회에서는 다양한 분야에서 최신 데이터를 빠르게 확인하는 것이 매우 중요해졌다. 주식 거래, 채팅, 금융 서비스 등의 서비스에서 데이터 갱신은 꼭 필요한 기능이며, 구현 방식에 따라 사용자 경험에 많은 영향을 끼칠 수 있다. 사용자가 데이터의 변경사항을 최대한 빠르게 확인할 수 있는것이 가장 좋겠지만.. 무조건 실시간으로 빨리 처리하는게 좋다고 할 수는 없다. 서비스 유형에 따라 약간의 지연도 있으면 안되는 주식 거래 같은 기능일 수도 있고, 어느정도의 데이터 지연은 감수할 수 있지만 시스템 리소스가 더 중요한 기능일 수도 있기 때문이다. 데이터 지연 시간과 처리 방법에 따라 실시간(Real ti.. 2025. 6. 15.
[SpringMVC] @Value로 Static 변수에 값 주입할 수 있을까? Spring에서 @Value 어노테이션은 application.properties와 같이 프로퍼티에 정의된 값을 주입하는데 사용된다.@Value 어노테이션 사용 방법.propertiesapp.name=MyApplicationapp.version=1.0.0 .java@Componentpublic class AppConfig { @Value("${app.name:default}") private String appName; @Value("${app.version:0}") private String appVersion;}보통 이렇게 @Value 형식에 맞춰 properties 값을 주입하여 주면 간단히 사용할 수 있지만 한 가지 주의할 점이 있다.@Value로 값을 주입할 변수가 sta.. 2024. 12. 10.
[SpringFramework] 서비스 중인 WAS 트러블슈팅 (with. Spring) WAS에서 에러가 발생하는데 GlobalException으로 잡히거나 Elastic의 HighLevel 클라이언트를 쓰는 경우 정확한 에러 파악이 어려울 수 있다 서버에서 발생한 에러 로그를 보고 파악하는 것이 가장 빠르고 간단한 방법이지만 에러 로그만으로 파악이 어려운 상황이 많고, 서버와의 환경이 달라 로컬(IDE)에서는 에러가 재현되지 않는 경우도 있다.서버 에러 확인 방법1. 에러가 발생하는 메서드의 에러 처리 (try/catch)를 제거한다.try {}catch(Exception e) {}2. log.debug()로 에러 발생이 의심되는 (Http 호출 등) 지점들에 로그를 찍는다log.info("호출 전 카운트 값 : {}", count);// 에러 의심 지점log.info("호출 후 카운트 .. 2024. 12. 9.
[SpringFramework] Filter로 XSS 취약점 대응하기 Servlet Filter를 등록하여 서버로의 HTTP 요청(request)에 대한 XSS 필터링 적용  XSS란?교차 사이트 스크립팅(XSS, Cross-Site Scripting)은 웹 애플리케이션 보안 취약점 중 하나로, 공격자가 악성 스크립트를 다른 사용자의 브라우저에서 실행하도록 만드는 공격 기법이다. 주로 웹 페이지에서 사용자 입력을 제대로 검증하지 않거나 필터링하지 않을 때 발생한다.XSS 공격은 사용자의 세션 쿠키, 개인 정보, 인증서 등을 탈취하거나, 악성 사이트로 리디렉션하거나, 피싱 공격을 수행할 수 있다.  그럼 XSS 공격을 막기 위해 어떻게 해야 할까? XSS는 주요 정보(session, cookie, 개인정보) 탈취, 사용자 리다이렉션, 사이트 조작 등 다양한 공격 방법이 있지.. 2024. 7. 4.
[SpringBoot] Thread starvation or clock leap detected (feat. 쓰레드 기아 현상) 트러블슈팅 Spring을 위해 열일하는 우리의 작고 귀여운 EC2가 자주 죽는 이유인 쓰레드 기아 현상이란? 제목에 있는 Thread starvation or clock leap detected 해당 에러가 어떤 에러이며, 왜 발생하는지 또 해당 에러로 인한 문제와 해결 방법에 대해 알아보자. 우선 EC2 서버가 갑자기 다운되는 상황은 자원 부족, 예외 처리 미흡, 서버 설정 문제 등 이 외에도 매우 다양한 원인들로 인해 갑작스럽게 돌연사 해버릴 수 있는 개복치 같은 서버의 사망 원인을 파악하기 위해서는 가장 쉬우면서도 중요한 서버의 로그를 확인해보면 서버의 상태나 죽었다면 죽은 이유를 파악할 수 있다. 서버가 이런 로그를 계속하여 뱉어냈다면 이 글에서 다루는 쓰레드 기아 문제이다. WARN 23318 --- [l.. 2024. 2. 11.
728x90