목록Tech/Spring (25)
우당탕탕
Spring Boot 가상 스레드(Virtual Threads) 적용하기 2편 -@Async + JMeter 고급 벤치마킹 안녕하세요! 1편에서 기본 설정을 진행한 상태에서 이번 2편에서는 @Async와 VirtualThreadTaskExecutor를 결합해 진짜 고성능 서비스를 만들어 볼 예정입니다. 실제 배포 직전 체크리스트까지 완성합니다.1편의 내용이 궁금하시다면?! -> https://mozzi-devlog.tistory.com/116목표@Async + 가상 스레드 완벽 통합- 커스텀 VirtualThreadTaskExecutor 생성- 병렬 API 처리 (외부 API 호출 + DB 쿼리)- JMeter로 10만 동시 요청 부하 테스트실제 트레이딩 시스템 및 실시간 알림 서비스에 바로 적용 가능!..
Spring Boot 가상 스레드(Virtual Threads) 적용하기 1편 안녕하세요! 이번에는 Java 21+의 가상 스레드(Virtual Threads)를 Spring Boot에 적용해 고성능 서버를 만들어 보겠습니다. 가상 스레드는 기존 플랫폼 보다 동시성을 활용하여 성능에 이점이 존재합니다.목표가상 스레드로 Spring Boot 성능 최적화.- Spring Boot 3.2+ + Java 21 프로젝트 생성- application.properties 한 줄 설정- 동시 요청 벤치마킹으로 효과 확인MSA나 실시간 서비스에 딱!1. 프로젝트 생성https://start.spring.io 접속 후 아래와 같이 설정: Project: Gradle - Groovy Language: Java Spring ..
Spring Security + Redis로 DDoS 방어 구축하기 서버를 운영하다 보면 DDoS 공격과 같은 외부 공격을 받는 경우가 존재합니다. API 호출이 초당 10만 건 정도로 폭주하면 Redis 캐싱과 Spring Security 조합으로 99.9% 차단이 가능합니다. 실제 운영 경험에서 Redis 분산 락 + Rate Limiting으로 트래픽 폭증 시 CPU 사용량을 80% → 25%로 줄인 사례를 코드와 함께 정리했습니다.DDoS 공격 패턴과 Redis의 역할운영 중 자주 보는 DDoS 패턴은 IP 단위 초당 1000+ 요청입니다. Spring Security만으로는 IP 블랙리스트가 메모리 폭증하고, Redis는 분산 환경에서 상태 공유가 핵심입니다. 공격 유형 Redis 활용 차..
운영 환경을 위한 실용적인 로그 레벨 설정 방법 운영 환경에서 로그 레벨을 어떻게 설정하는지는 서비스 안정성과 디버깅 효율성을 좌우합니다. 개발 중에는 DEBUG로 모든 걸 찍다가 운영에 배포하면 로그가 폭주하거나 반대로 중요한 정보가 누락되는 경우가 많죠. 개인적으로 Spring Boot MSA 운영하면서 느꼈던 로그 레벨 경험을 정리해 보겠습니다.로그 레벨별 실제 사용 사례먼저 운영하면서 자주 쓰는 로그 레벨을 환경별로 표로 정리하면 다음과 같습니다.DEBUG는 개발/테스트 전용입니다. 운영에서 켜두면 CPU 15-20% 추가 소모 + 디스크 I/O 폭증으로 서비스가 다운됩니다. 실제로 한 번 DEBUG를 실수로 켜두고 트래픽 폭증 시 로그 파일 용량초과로 서버가 다운된 적이 있습니다.Spring B..
빈 라이프사이클과 초기화 실수 feat. Proxy(프록시) 이번에는 프록시와 내부 호출에서 벗어나, 스프링에서 자주 실수하는 빈 라이프사이클 및 초기화와 관련된 내용을 다룹니다.1. @PostConstruct 초기화 타이밍 실수스프링 빈이 생성되고 DI가 끝난 후 호출되는 @PostConstruct 하지만 이 시점에 DB 커넥션 등 외부 자원이 완전히 준비됐다고 기대하면 안됩니다.예를 들어 DB 트랜잭션이나, 다른 빈에서 초기화를 의존할 때 순서 관련 오류가 자주 발생합니다.@Componentpublic class MyBean { @Autowired private UserRepository userRepository; @PostConstruct public void init() ..
@Transactional 분리 시 발생하는 Self Invocation 오류와 그 원인 및 해결Self Invocation과 @Transactional의 관계 Spring에서 트랜잭션을 선언할 때 흔히 사용하는 방식은 바로 @Transactional 어노테이션을 메서드나 클래스에 붙이는 것이다. 이 어노테이션 덕분에 해당 메소드의 실행 시작과 함께 트랜잭션이 열리고, 작업이 끝나면 커밋 또는 롤백이 자동으로 처리된다. 그런데 개발하다 보면 이런 상황이 자주 생긴다.“한 서비스 내 메소드A에서 메서드 B를 호출하는데, B에만 @Transactional을 붙였더니 트랜잭션이 동작하지 않는 것 같다?” “@Transactional(propagation=REQUIRES_NEW)로 새로운 트랜잭션을 만들었는..
