분류 전체보기
-
오늘은 필터(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 기반의 고성능 메모리 캐시 라이..
-
제가 한번 스터디룸 동시가입 상황 제어해볼게요백엔드 : 서버공부/Spring 2024. 12. 25. 11:42
동시성 제어 구현기 최근 프로젝트에서 동시성 제어 관련 이슈를 겪었다. 스터디룸인원제한이 6명인데 동시에 5명인 스터디룸에 동시에 여러 사용자가 동시 가입하는 상황을 방지하고자하는 목적에서 구현 + 학습이 시작되었다! 비관적 락(Pessimistic Lock) 해결책으로 먼저 알게된것은 Pessimistic Lock 이었다. 비관적 락은 이름 그대로 '비관적'인 가정에서 출발한다. 데이터 수정 시 충돌이 발생할 것이라고 가정하고, 우선 락을 걸고 보는 방식이다. 데이터베이스에서의 구현 먼저 데이터베이스 레벨에서 비관적 락이 어떻게 동작하는지 살펴보자. MySQL을 예로 들면, FOR UPDATE 구문을 통해 락을 구현한다. SELECT * FROM studyroom WHERE id = 1 FOR..
-
그 날 AWS는 떠올렸다 : 람다백엔드 : 서버공부 2024. 11. 24. 22:18
이번에 AWS Lambda와 DynamoDB를 사용해 데이터 수집 시스템을 구현하게 되었다. 개발을 진행하면서 Spring과는 꽤 다른 패턴들을 많이 마주쳤는데, 특히 도메인 객체를 다루는 방식에서 차이점들을 발견했다. 그래서 스프링이 아님에도 간단하게 배운점 + 느낀점들을 정리하게 되었다. DynamoDB의 도메인 객체 가장 먼저 눈에 띈 것은 도메인 객체의 구조였다. Spring에서는 보통 아래와 같은 방식으로 작성했다.@Entitypublic class Event { @Id private String id; private final String title; protected Event() {}}하지만 DynamoDB에서는 조금 달랐다.@DynamoDbBeanpublic cla..
-
나도 사실은 Spring/WebClient 사용해본적 없어백엔드 : 서버공부/Spring 2024. 11. 24. 02:05
최근 프로젝트에서 외부 API로 요청을 보내야 하는 작업을 진행하게 되었다. 최초에는 RestTemplate을 통해 구현하였지만, 최근 스프링에서는 WebClient를 권장한다는 이야기를 듣고 RestTemplate을 WebClient로 교체하는 작업을 진행하였다. 처음에는 단순하게 최신 기술을 도입한다는 생각으로 작업을 시작했지만, 적용해보니 여러 장점들을 발견할 수 있었다. 내가 WebClient로의 전환을 하고 느낀 가장 큰 장점은 빌더 패턴을 활용할 수 있다는 점이었다. 이 점이 가장 마음에 들었는데, 프로젝트에서 DTO 등에 빌더 패턴을 사용하고 있었고, 레포지토리도 복잡한 경우엔 QueryDSL을 활용하기 때문에 빌더 패턴을 사용 중이었다. WebClient를 이용함으로써 코드 스타일..