본문 바로가기

CS

(34)
캐싱 전략 캐싱 전략은 애플리케이션에서 성능 최적화와 데이터 접근 속도를 높이는 핵심 기법으로 특히 스프링 애플리케이션에서 레디스를 활용할 경우, RedisTemplate을 통해 다양한 캐싱 패턴을 구현할 수 있습니다. 여기서는 대표적인 다섯 가지 전략을 살펴보고, 각 상황을 설명하는 간단한 코드 예시를 함께 정리해 보겠습니다. 캐싱 전략 정리 Cache-Aside Cache-Aside 패턴은 가장 보편적으로 사용되는 방식으로 애플리케이션이 먼저 DB가 아닌 캐시를 조회하고, 캐시에 없을 경우 DB에서 읽은 후 캐시에 적재합니다. 단순하고 효율적이라는 장점이 있지만, 최초 캐시 미스 시 요청자는 지연을 경험할 수 있습니다. public String getUserName(Long userId) { String..
스프링 시큐리티 - 필터의 종류 (1) 개발자 유미의 시큐리티 강의를 보고 작성했습니다. DisableEncodeUrlFilter DisableEncodeUrlFilter는 시큐리티의 DefaultSecurityFilterChain에 기본적으로 등록되는 필터로, 필터 체인의 가장 앞단에 위치합니다. 이 필터의 목적은 URL에 세션 ID가 인코딩되어 포함되는 것을 방지하는 데 있습니다. 만약 세션 ID가 URL에 포함되면, 브라우저 주소창이나 서버 로그 등을 통해 민감한 정보가 외부로 유출될 위험이 있습니다. 이를 막기 위해 시큐리티에서는 이 필터를 통해 기본적으로 URL 인코딩 기능을 비활성화합니다. 이 필터는 커스텀 SecurityFilterChain을 사용하더라도 자동으로 등록되며, 필요에 따라 비활성화할 수 있습니다. 비활성화는 .s..
스프링 시큐리티 - 필터 정보 공유 및 상속과 요청 전파 개발자 유미의 시큐리티 강의를 보고 작성했습니다. SecurityContextHolder Spring Security의 SecurityFilterChain은 인증과 인가 같은 보안 기능을 여러 필터에 나누어 수행합니다. 각 필터는 독립적으로 동작하지만, 앞에서 처리한 정보를 다음 필터가 활용해야 하는 경우가 자주 발생합니다. 이를 위해 필터 간에 상태를 공유할 수 있는 구조가 필요합니다. Spring Security는 이러한 목적을 위해 SecurityContextHolder라는 저장소 개념을 제공합니다. 예를 들어, 인가를 담당하는 필터는 현재 사용자의 권한 정보를 확인해야 합니다. 이 권한 정보는 앞 단계의 인증 필터에서 생성된 Authentication 객체에 담겨 있으며, 해당 객체는 Securi..
스프링 시큐리티 - 전체적인 흐름 개발자 유미의 시큐리티 내부 구조 영상을 보고 만들었습니다. 시큐리티 적용 전 : 클라이언트가 웹 애플리케이션에 요청을 보내면, 해당 요청은 먼저 서버 컴퓨터에 도달하게 됩니다. 이 서버는 보통 웹 애플리케이션 서버 역할을 하는 소프트웨어를 통해 요청을 처리하게 되며, 대표적인 예로 톰캣이 있습니다. 톰캣은 요청을 처리할 때 가장 먼저 서블릿 필터 체인을 거칩니다. 필터는 요청과 응답을 가로채어 전처리나 후처리를 수행할 수 있는 컴포넌트로, 예를 들어 로그인 여부 검사, CORS 설정, 로깅, 보안 검사, 인코딩 설정 등이 여기에 해당합니다. 여러 개의 필터가 존재할 수 있으며, 설정된 순서대로 하나씩 실행됩니다. 필터를 모두 통과한 요청은 그 다음에 서블릿으로 전달되고, Spring Boot 기반 애..
Redis가 싱글 스레드로 만들어진 이유 Redis가 단일 스레드로 설계된 이유는 주로 성능 최적화, 복잡성 감소, 그리고 데이터 일관성을 유지에 있습니다. 단일 스레드 모델은 멀티스레드 모델에 비해 설계와 구현이 상대적으로 간단합니다. 멀티스레드 환경에서는 동시성 문제(레이스 컨디션, 데드락 등)를 처리하기 위해 복잡한 동기화 메커니즘이 필요하지만, 단일 스레드 환경에서는 이런 문제를 자연스럽게 회피할 수 있습니다. 동시에 여러 스레드가 동일한 데이터를 수정하려고 할 때 발생할 수 있는 데이터 불일치 문제를 방지합니다. 모든 명령어가 순차적으로 처리되기 때문에, 복잡한 락(lock) 메커니즘 없이도 데이터의 일관성을 자연스럽게 유지할 수 있습니다. Redis는 주로 메모리 내에서 빠르게 수행되는 I/O 작업을 처리하는 인메모리 데이터베이스..
MySQL InnoDB에서 갭락과 넥스트키 락이란 무엇이며, 어떻게 팬텀 리드를 방지하나요? 우선 정말 대략적인 설명으론 InnoDB는 MySQL의 대표적인 스토리지 엔진입니다. 쉽게 말해, MySQL이 데이터를 어떻게 저장하고 관리할지를 결정하는 내부 시스템입니다. MySQL은 하나의 데이터베이스 시스템이지만, 내부에서 다양한 스토리지 엔진을 선택할 수 있고, 그 중에서도 InnoDB는 기본(default) 스토리지 엔진이자 가장 널리 사용되는 엔진입니다. 그렇다면 Phantom Read란 무엇인가요? Phantom Read는 트랜잭션이 동일한 조건의 쿼리를 반복 실행할 때, 나중에 실행된 쿼리에서 처음에는 존재하지 않았던 새로운 행이 나타나는 현상을 말합니다. 이는 주로 읽기 일관성(Read Consistency) 을 유지하는 과정에서 발생할 수 있는 문제로, 데이터의 삽입이나 삭제가 다른 ..
브라우저에서 www.google.com을 검색하면 일어나는 일 언젠가 누군가에게 이런 질문을 들었던 기억이 있다. “브라우저 URL 입력창에 ‘www.google.com’을 입력하면 어떤 일이 일어날까요?” 당시에는 별생각 없이 넘겼지만, 최근 들어 이 질문이 웹 기술 전반에 대한 깊은 이해를 평가하기 위한 면접 질문으로 자주 활용된다는 사실을 알게 되었다. 처음엔 단순한 질문처럼 느껴졌지만, 자세히 들여다보면 브라우저, 네트워크, DNS, HTTP, 렌더링까지 다양한 기술이 유기적으로 작동하는 과정을 담고 있다는 점에서 매우 흥미롭고, 의미 있는 질문이라는 걸 깨달았다. 그래서 이 좋은 질문을 주제로 블로그 글을 작성해보려 한다. 브라우저는 Domain에 해당하는 IP를 찾는다 DNS(Domain Name System)는 웹사이트의 도메인 이름과 해당 서버의 IP..
equals()와 hashCode() 재정의 Java에서 객체를 비교할 때 자주 사용하는 equals()와 hashCode()는 한 번쯤은 제대로 짚고 넘어가야 하는 주제입니다. 처음에는 단순해 보이지만, 실제로는 지켜야 할 규칙도 많고 생각보다 까다로운 부분도 있습니다. 이 글에서는 equals와 hashCode의 기본 동작부터 주의할 점, 실수하기 쉬운 사례까지 차근차근 정리해보았습니다.Object 클래스의 기본 equals 동작 equals 메서드는 Java에서 객체 간의 동등성을 비교하기 위해 사용하는 메서드로 기본적으로 모든 Java 객체는 Object 클래스를 상속받기 때문에, equals 메서드는 모든 객체에 포함되어 있습니다. Object 클래스의 equals 메서드는 기본적으로 참조(레퍼런스)가 같은지를 비교합니다. 즉, 두 ..