전체 글
-
'카페인 캐시 제 1형' : 인기 보관소 로컬 캐시 적용하기백엔드 : 서버공부/Spring 2025. 8. 7. 16:54
복잡한 쿼리대신 가볍고 빠르게서비스의 홈 화면에는 사용자에게 인기 보관 지역 정보를 보여주는 기능이 있다. 홈은 사용자가 앱을 켰을 때 가장 먼저 도달하는 화면이고, 그만큼 자주 접근하게 된다.초기에는 이 데이터를 매번 DB에서 조회하는 방식으로 처리했지만, 홈 화면 특성상 요청 빈도가 높아질수록 불필요한 부하가 발생할 수밖에 없었다. 이 문제를 해결하기 위해 캐시 도입을 고려했다.빠르고 가벼운 선택 : 로컬 캐시캐시 도입에 있어 먼저 선택한 것은 로컬 캐시였다. 이유는 다음과 같다.프로젝트에서 이미 락 데이터를 관리하기 위해 Caffeine 캐시를 사용 중이었다.인기 보관소는 실시간으로 변하지 않으며, 일정 주기로만 업데이트되어도 큰 문제가 없다.로컬 캐시는 네트워크 지연 없이 빠르게 데이터를 제공할 ..
-
Grafana와 Prometheus로 모니터링 구축하기백엔드 : 서버공부/Spring 2025. 8. 4. 15:38
들어가며이번 프로젝트를 진행하면서 서버의 메모리 사용량 등 시스템 상태를 모니터링할 필요가 생겼다. 이를 위해 Grafana와 Prometheus를 활용한 모니터링 환경을 구축하고자 한다.사실 이전에도 스프링 레거시 환경에서 해당 도구들을 적용하려 했지만, 의존성 문제로 인해 도입이 쉽지 않았다. 그러나 이번에 Spring Boot로 전환하면서 다시금 시도해볼 수 있는 기회가 생겼다.1. 모니터링이 필요한 이유다음과 같은 상황에 대비하기 위해 모니터링 시스템은 필수적이다.CPU, 메모리 사용량 등 시스템 자원을 실시간으로 확인장애 발생 여부 및 예외 로그를 빠르게 파악단순히 1시간 간격으로 상태를 점검하거나, 모든 기능을 수동으로 테스트하는 방식은 비효율적일 뿐 아니라 실시간성이 떨어진다. 반면, 모니터..
-
AOP 이해할 수 있다!백엔드 : 서버공부/Spring 2025. 7. 28. 17:42
들어가며스프링 개발에서 정말 어려우면서 중요한 개념이 AOP이다.AOP를 깊게 파고들면 정말 어려운데..그래서 오늘은 가볍게 개념을 정리해보려한다!할 수 있다능! AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)이란?개발을 하다 보면 핵심 비즈니스 로직 외에 반복적으로 들어가는 부가기능이 생긴다.예를 들어 로그 출력, 트랜잭션 처리, 보안 체크 같은 것들이다.이런 부가 기능을 매번 비즈니스 로직에 섞어서 작성하면, 코드는 지저분해지고 유지보수도 어려워진다.그래서 이런 공통 기능들을 따로 분리해서 필요한 곳에만 자동으로 적용할 수 있게 도와주는 방식이 AOP(관점 지향 프로그래밍)이다. AOP는 왜 쓸까?위 설명에서 알 수 있듯이 AOP를 사용하면 핵심 비즈니스 로직은 로직..
-
오늘은 필터(Filter) 랑 인터셉터(Interceptor) 알아볼게요백엔드 : 서버공부/Spring 2025. 7. 25. 12:38
들어가며인터셉터 필터라는 이름을 스프링을 개발하다보면 반드시 만나게된다.최근 팀프로젝트에서 팀원이 필터와 인터셉터를 통해 응답의 일관성을 보장하는 작업을 진행했는데옆에서 궁금해서 슬쩍 슬쩍 보다가이렇게 정리해보게 되었다. 인터셉터와 필터를 정리하며 이런 생각이 들었다.는 장난이고 진지하게 정리해보겠다. 필터먼저 필터라는 것을 알아보자.필터는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.여기서 디스패처 서블릿은 스프링의 가장 앞에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다.그러니까 필터는 스프링 컨테이너가 아니라 톰캣같은 서블릿..
-
별거 없습니다. 프록시가 내 메서드를 무시하는 이유에 대해서.백엔드 : 서버공부/Spring 2025. 7. 24. 12:44
들어가며@Transactional 을 붙였는데 트랜잭션이 안 먹는다.로그도 없고, 예외도 안 나고,알고 보니 메서드에 public을 안 붙였다. "CGLIB이면 protected도 프록시 되지 않나?""JDK 프록시는 인터페이스니까 그렇다 쳐도, CGLIB은 왜?" 스프링은 왜 굳이 모든 프록시 방식에서 public만 프록시 대상으로 제한했을까?이번 글에서는 이 프록시의 비밀을 알아보려한다. private 메서드는 @Transactional 을 붙일 수 없다.인텔리제이에서 private 메서드에 @Transactional 을 선언하면 위와 같이 컴파일 에러를 띄워준다. protected 로 선언을 하라는건데..우선 이 이유를 알아보자면 스프링 aop에서 프록시는 JDK Dynamic proxy또는 CG..
-
스레드 세이프에 대해 제가 한번 알려드릴까요?백엔드 : 서버공부/Spring 2025. 7. 12. 15:33
스레드 세이프(Thread-Safe)란 멀티스레드 환경에서 여러 스레드가 동시에 같은 함수, 변수, 또는 객체에 접근하더라도 정상적인 실행 결과를 보장하는 코드의 속성을 말한다.쉽게 말해, 하나의 스레드가 어떤 함수를 실행하고 있을 때, 동시에 다른 스레드가 같은 함수를 호출하더라도 서로 영향을 주지 않고 각자의 실행 결과가 올바르게 유지되는 것을 의미한다.스레드 세이프가 중요한 이유멀티스레드 환경에서는 여러 스레드가 동일한 자원(예: 변수, 객체 등)에 동시에 접근할 수 있기 때문에, 적절한 조치를 하지 않으면 Race Condition이나 Data Corruption 같은 문제가 발생할 수 있다.이런 문제를 방지하기 위해 스레드 세이프를 보장할 필요가 있다.스레드 세이프를 위한 대표적인 방법스레드 세..
-
진짜 그냥 면접 기록인데여잡다한 글 2025. 7. 5. 22:59
며칠 전, 오래전부터 정말 가고 싶다고 생각해온 금융권 회사의 면접을 다녀왔다.준비하면서 '내가 부족한 건 아닐까' 하는 걱정도 많았고,이력서에 쓴 기술 스택들이 '그저 스펙 나열'로만 보이지 않도록, 그 안에 담긴 내 고민과 경험을 진짜 말할 수 있을까도 계속 생각했다. 면접장에서 느꼈던 감정들우선 대면 면접도 처음이고 다대다 면접도 처음이라 매우 떨렸다..하지만 면접은 생각보다 즐거운 분위기였고, 자기소개부터 내가 중요하게 생각하는 가치 '사용자에게 신뢰를 주는 서비스'에 대해 이야기했다.그 가치가 내가 지원한 회사가 지향하는 방향과 닮아 있다는 걸 전하고 싶었다.내가 했던 기술적 고민들, 예를 들면 락을 쓰는 이유나 멱등성 설계의 배경 같은 것도 자연스럽게 얘기할 수 있었다.하지만, 모든 답변이 완..
-
Caffeine Cache 로 동시성 제어하는거 알려 드릴까요?백엔드 : 서버공부 2025. 6. 26. 15:13
바로 이전 글에서 다룬 동시성 제어와 관련하여, 코드 차원에서 처리할 수 있는 방법을 찾던 중 이번에 적용한 방안을 정리하게 되었다. 현재 진행중인 프로젝트는 단일서버이기 때문에 레디스는 오버 스펙이라고 판단해 JVM 수준의 락을 고려하던 중, 기존에 알고 있던 ReentrantLock을 활용하기로 결정했다. 처음에는 ConcurrentHashMap을 통해 락을 관리하려 했지만, 여러 문제점이 있었고, 실제 실무에서는 이러한 방식 대신 Caffeine Cache를 활용하는 추세라는 점을 알게 되었다. 이에 이번 프로젝트에서는 Caffeine Cache를 도입하여 락을 효율적으로 관리해보기로 하였다. 1. Caffeine Cache란?Caffeine Cache는 Java 기반의 고성능 메모리 캐시 라이..