분류 전체보기

    도커 마운트

    도커 마운트

    🔍 도커를 도입하면서 생긴 문제 도커를 사용하면 컨테이너 안의 데이터 영역을 사용한다. 예를 들어 MySQL을 도커를 이용하여 사용하면 MySQL 컨테이너 안의 데이터 저장소에 DB 데이터가 저장이 된다. 문제는 도커 컨테이너는 소프트웨어 업그레이드 등의 이유로 언젠가는 삭제된다는 것이다. 이런 컨테이너의 생성 및 폐기는 매우 빈번하기 때문에 컨테이너의 재생성시마다 이런 데이터를 옮겨주는 것은 까다로울 수 있다. 도커에서는 컨테이너가 외부의 데이터 저장 영역, 즉 내 컴퓨터의 데이터에 접근할 수 있는 기능을 제공한다. 이를 데이터 퍼시스턴시라고 한다. 🔍 도커의 스토리지 마운트 마운트란 usb를 컴퓨터와 연결하는 것처럼 컨테이너와 데이터 저장 영역을 연결하는 것을 말한다. 도커에는 두 가지 종류의 스토리..

    트랜잭션 전파 레벨 정하기

    트랜잭션 전파 레벨 정하기

    🔍 이메일 인증 기능 이메일 인증 기능을 구현하고 있는데 트랜잭션 전파레벨과 관련한 문제가 있어 이를 정리하고자 합니다. 현재 로직은 다음과 같습니다. 회원가입을 하면 이메일로 UUID를 포함한 URL이 전송된다. 링크로 접속을 한다. 2-1. 만료가 되지 않았다면 사용자 인증 처리 된다. 2-2. 만료되었다면 UUID만 바꿔서 이메일은 재전송한다. 문제는 2-2에서 발생하였습니다. 이메일에는 바뀐 UUID로 전송이 되지만 DB에는 업데이트가 되지 않았습니다. 🔍 문제의 원인 문제의 원인은 빨간색 박스에 있습니다. 스프링에서 @Transactional는 같은 트랜잭션 안에서 하나의 쿼리라도 에러가 나면 모두 롤백하는 원자적 특성을 가지고 있습니다. EmailToken이 만료가 되면 이를 새로 생성하고 예..

    JWT 토큰 만료 에러 분석

    🔍 문제 상황 어제까지만 해도 잘 되던 my-page 기능이 제대로 동작하지 않는 문제가 있었다. my-page의 프로세스는 다음과 같다. my-page에 접속한다. 토큰이 있는지 확인한다. 만약 토큰이 없으면 로그인 페이지로 리다이렉트 한다. 토큰이 있으면 백엔드 서버로 이를 전송한다. 백엔드 서버에서 응답을 받는다. 만약 토큰이 유효하지 않으면 로그인 페이지로 리다이렉트 한다. (문제 상황) 토큰이 유효하면 사용자 정보를 JSON 형태로 리턴 받는다. 위와 같이 현재 진행하고 있는 프로젝트 'VOCA'는 JWT토큰을 베이스로 구성되어 있다. 현재 문제는 3-1로 토큰이 만료되거나 유효하지 않았을 때 리다이렉트 기능이 제대로 동작하지 않는다는 것이다. 🔍 Debug 서버의 에러 로그를 확인해보니 예상과..

    OSIV 필터와 지연로딩 에러

    OSIV 필터와 지연로딩 에러

    🔍 관련 포스팅 OSIV와 필터 🔍 OSIV란? (Open Session In View) 스프링의 트랜잭션 범위는 Service, Repository 레이어에서만 유지된다. 보통 JPA의 영속성 컨텍스트는 트랜잭션의 생명주기를 따라가는데, OSIV를 이용하면 영속성 컨텍스 brightmango.tistory.com 🔍 @AuthenticationPrincipal과 지연 로딩 @AuthenticationPrincipal 어노테이션을 이용하면 간편하게 session에 저장한 객체를 쉽게 받을 수 있다. 그런데 파라미터로 받은 객체를 가지고 지연 로딩을 하면 프록시 객체를 가지고 있기 때문에 에러가 발생한다. 현재 SecurityContextHolder에 session을 저장하는 코드는 인터셉터에 다음과 같이..

    OSIV와 필터

    OSIV와 필터

    🔍 OSIV란? (Open Session In View) 스프링의 트랜잭션 범위는 Service, Repository 레이어에서만 유지된다. 보통 JPA의 영속성 컨텍스트는 트랜잭션의 생명주기를 따라가는데, OSIV를 이용하면 영속성 컨텍스트의 생명주기를 뷰(컨트롤러)레이어까지 유지할 수 있다. 즉, 영속 상태를 컨트롤러에서까지 유지하기 때문에 컨트롤러 레이어에서 지연로딩이 가능해진다. 🔍 스프링 OSIV의 동작 원리 스프링이 제공하는 OSIV에는 두 가지 방법이 있으며 차이는 영속성 컨텍스트가 언제 생기는지에 있다. Servlet Filter를 이용하는 방법 Interceptor를 이용하는 방법 기본적으로 동작하는 과정은 동일하다. 사용자로부터 요청이 들어오면 설정에 따라 Filter 또는 Interc..