728x90 Project9 [Project] 분산환경에서 캐시는 어떻게 적용해야할까? 우리가 보통 어플리케이션 레벨 기준으로 캐시를 적용한다고 하면 2가지로 나뉜다. 왼쪽 그림과 같은 로컬 캐시와 오른쪽 그림과 같은 글로벌 캐시로 나뉜다. 로컬 캐시와 글로벌 캐시는 각각 장, 단점을 가진다. 구분로컬 캐시 장점로컬 캐시 단점분산 캐시 장점분산 캐시 단점응답속도JVM 메모리 직접 접근으로 초저지연인스턴스 당 메모리 제한 (수백 MB~수 GB)네트워크 홉이 있지만 여전히 빠른 조회 (ms 단위)네트워크 비용·레이턴시(수십~수백 μs) 발생일관성단일 인스턴스 내 강력 일관성노드 간 데이터 불일치 가능단일 소스(클러스터)에서 일관성 관리 가능클러스터 복제 지연 시 일시적 불일치확장성애플리케이션 인스턴스 늘리면 캐시 미스 증가스케일아웃해도 캐시 데이터 공유되지 않음노드 추가로 무제한 수평 확장 .. 2025. 4. 23. [Project] 인스턴스 서버에 너무 많은 부하가 쏠리다면? 지금부터 우리 서비스의 아키텍쳐를 우선 설명하겟다. 초기 아키텍쳐고 서버에선 jwt을 엑세스토큰과 리프레쉬토큰로 검증해서 사용하고 있는데 문제점이 발생했다.토큰이 유효한지 확인하려면 아래와 같이 계속해서 데이터베이스를 조회하는 과정이 있었다. 이렇게 계속해서 데이터베이스를 거치는 과정은 비용이 클 뿐만 아니라 사용자에게 안좋은 영향을 끼치고 있었다.이러한 문제점을 데이터베이스를 거치는 대신 아래와 같이 Redis를 사용하여 서비스 로직을 단축시키는 아이디어 적용해 우리 서비스에 적용할 수 있었다. 그래서 그다음 아키텍쳐 구조는 아래와 같이 진화할 수 있었다. 우리 서버에서는 자주 조회되는 데이터에 대해서 로컬캐시로 저장하고 있었다. 캐싱전략은 Cash Aside 전략을 사용해 아래와 같은 흐름으로 동.. 2025. 4. 17. [Project] Spring 직렬화, 역직렬화 문제 - getWriter() has already been called for this response 프로젝트 진행 중 처음 보는 새로운 에러이다. 정보도 많이 없어서 게시물을 작성한다.2025-02-28T09:25:04.226Z WARN 1 --- [sejong-auth] [io-8080-exec-10] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler org.example.backend.common.exception.ExceptionControllerAdvice#handleException(HttpServletRequest, Exception)java.lang.IllegalStateException: getWriter() has already been called for this response at org.apache... 2025. 2. 28. [Project] 게시물 N+1 문제 해결기 (쿼리 40 -> 11 -> 1) 프로젝트 진행 중 게시물을 단순 조회를 테스트해보고 있었는데 쿼리가 하나가 아닌 우다닥 나오고 있었다. 사실 이게 나왔을때 좀 기뻣다. 배운 내용을 드디어 적용해볼 수 있겠구나! 유명한 JPA N+1 문제를 드디어 만난거다. 지금은 단순한 로직이라 빨리 찾을 수 있었다. 현재 board 하나를 단순히 조회하는데 위 사진처럼 긴 쿼리가 날아가는 것을 볼 수 있었다. 엄청 아주 긴 쿼리가 날아가는 것을 볼 수 있다. 40개의 쿼리가 단순 조회로 인해 발생하고 있었다. (2개는 처음 나오는 Hibernate) 이녀석이 왜이렇게 날아가나 찾아보니 아래와 같은 로직때문에 이런일이 발생하는 것을 볼 수 있었다.public static BoardResponse of(Board board) { retu.. 2025. 1. 31. 이전 1 2 3 다음 728x90