프로젝트 기록

    디자인패턴을 이용한 장바구니 기능 구현 - 레디스와 스프링부트 활용

    이커머스 프로젝트를 진행하면서 장바구니 기능에 추가 요구사항이 생겨 리팩토링 하는 과정을 기록합니다. 이번 리팩토링을 위해 전략 패턴과 팩토리 메소드를 사용하였습니다. 팩토리 메서드 패턴은 객체 생성을 위한 패턴으로, 객체를 생성하는 역할을 서브클래스에 위임하여 유연성을 제공합니다. 전략 패턴은 행위를 캡슐화하고 런타임에 행위를 변경할 수 있는 패턴입니다. 이 패턴은 애플리케이션의 일부를 동적으로 교체하고 다양한 전략을 적용할 수 있도록 도와줍니다. 기존 로직 Redis 저장소에 제품을 저장하는 기존 로직을 살펴보겠습니다. @Service class BasketItemService( ... ) { fun addBasketItem(basketItemRequest: BasketItemRequest) { //..

    스프링 세션 적용하기 (feat. filter)

    🔍 Session 정보 이용하기 ✏️ 1. 컨트롤러에서 HttpSession 클래스 이용하기 HttpSession 클래스를 파라미터로 받으면 session 정보를 사용할 수 있다. ✏️ 2. 필터 또는 인터셉터 이용하기 필자는 세션 정보를 거의 모든 요청 API에서 확인해야 한다. 따라서 Controller에서 session 정보를 불러오는 중복을 해결하기 위해 필터를 이용하였다. @Component class SessionFilter( private val redisSessionRepository: RedisSessionRepository, ): OncePerRequestFilter() { val log = logger() override fun doFilterInternal( request: Http..

    스프링 세션 - 이중 발급과, 인코딩된 세션

    🔍 트러블 슈팅 ✏️Key가 두 개 생성되는 문제 세션을 저장하는 로직은 다음과 같다. @Component class SessionFilter( private val redisSessionRepository: RedisSessionRepository, ): OncePerRequestFilter() { val log = logger() override fun doFilterInternal( request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain ) { val session = getSessionFromCookie(request) --- 1 if (session == null) { val sessionId = r..

    스프링 세션의 이해 - 등장 배경과 그 원리

    🔍 HttpSession ✏️ 세션이 왜 필요한가요? 웹에서 데이터를 전송하는 데 기본적으로 사용되는 HTTP는 본질적으로 상태가 저장되지 않는다. 즉, 동일한 사용자로부터 여러 요청이 들어와도 이를 인식하지 못한다. 그러나 웹 애플리케이션에서 사용자 인증, 장바구니 등과 같은 상태를 유지하는 것이 중요한 시나리오가 있다. 세션은 웹 애플리케이션이 특정 기간 동안 사용자를 인식하고 구분할 수 있게 함으로써 이러한 한계를 극복하는 데 중요한 역할을 한다. ✏️기존 세션의 문제점 전통적인 HttpSession은 컨테이너(ex. Tomcat) 에 종속되어 사용된다. 즉 컨테이너가 세션을 생성하고 애플리케이션에 세션 ID를 제공한다. 이런 방식은 기본적으로 클러스터링 환경에서 실행되는 경우 각 컨테이너가 자체 ..

    2차 캐시를 이용한 최적화 기록

    2차 캐시를 이용한 최적화 기록

    개인 프로젝트에 2차 캐시를 적용하면서 데이터 최적화를 시도한 기록을 기록합니다. 🔍 자바의 표준 캐시 (JCache) JCache는 자바 애플리케이션을 위한 표준화된 캐싱과 매커니즘을 제공합니다. 캐싱 표준으로 설계되었기 때문에, 벤더 중립적입니다. 즉, JCache API를 사용하여 애플리케이션을 개발하면 다른 캐시 API로의 전환이 용이합니다. JCache는 다음과 같은 표준 인터페이스를 제공하고 공급자를 제공받음으로써 벤더 중립적인 개발을 가능하게 도와줍니다. CacheManager - 캐시 설정, 구성 및 종료를 담당하는 인터페이스 CachingProvider CacheManager의 생명 주기를 생성하고 관리하는 인터페이스 대표적인 공급자로 Ehcache, Hazelcast, Caffeine,..