프로젝트 기록

    서로 다른 타임존에서 데이터 핸들링 하기

    🔍 상이한 타임존이 가져오는 문제점 지금 하고 있는 "Voca-World"는 언어 학습 웹 서비스로 다양한 국가의 사용자가 이용할 예정이므로 서로 다른 타임존이 갖는 문제를 해결해야 했다. 가장 큰 문제는 오늘 공부한 단어를 조회하는 로직이었다. 만약 한국 시간으로 2023/07/28 06:00시에 단어를 저장했다면 UTC 시간을 갖는 국가의 경우 2023/07/27 21:00시가 된다. 즉 오늘 공부한 단어 조회가 안되게 된다. 🔍 단어 조회 로직 단어 조회 로직은 파라미터로 클라이언트의 시간을 전달받아서 날짜를 추출하는 형식으로 구성되어있다. @Override public List findWordsWithDate(WordDTO.Request request) { LocalDate now = DateFo..

    TimeZone으로 인한 데이터 조회 실패

    TimeZone으로 인한 데이터 조회 실패

    현재 Voca-World라고 하는 언어 학습 웹 서비스를 운영중이다. 최근에 AWS와 Docker를 이용하여 서버를 배포했는데 저장한 영어 단어가 조회되지 않는 현상이 발생했다. 이 문제를 해결한 과정을 기록하려고 한다. 🔍 문제 해결 과정 문제의 원인을 살펴보기 위해 서버의 로그 파일을 확인해 보았다. 단어 저장시 문제가 생겼을 수 있기 때문에 단어 저장 -> 단어 조회 순서로 로그를 확인해봤다. 저장한 시간보다 9시간 늦은 시간으로 표기되었지만 타임존이 다른걸 생각해보면 문제는 없어보였다. 하지만 로그를 편하게 보기 위해 로그의 시간 기록도 한국 시간으로 바꿔주었다. [logback-variables.properties] LOG_PATTERN=[%-5level] %d{yyyy-MM-dd HH:mm:s..

    Docker Compose를 이용한 Vue 프로젝트 실행

    Docker Compose를 이용한 Vue 프로젝트 실행

    이전에는 voca 프로젝트의 backend 스프링 프로젝트와 DB를 컨테이너로 올리는 작업을 진행하였다. 현재 운영 서버는 Nginx를 이용하고 있어 이를 맞추고자 한다. 🔍 vue 빌드하기 웹브라우저는 HTML, CSS, JS 이 세개의 언어만 해석할 수 있기 때문에 모든 사람이 이용하게 하려면 App.vue파일을 그대로 올리는 것이 아닌 build를 해야 한다. Vue 프로젝트는 npm run build 명령어를 통해 간단하게 빌드할 수 있다. 빌드가 성공하면 dist라는 폴더가 생기는데 이 폴더를 그대로 서버에 올리면 된다. 이를 도커 파일로 작성해보자. dockerfile을 프론트 프로젝트 루트에 생성한다. FROM node:latest as build-stage # 디렉토리 전환 명령어로 이후의..

    Docker Compose를 이용한 프로젝트 실행

    Docker Compose를 이용한 프로젝트 실행

    🔍 도커 컴포즈 보통 도커를 사용하여 프로젝트를 관리하면 여러개의 컨테이너를 실행하고 관리하게 되는데 (DB랑 백엔드 프로젝트 하나만 묶어도 2개이다), 모든 컨테이너를 ps 커맨드로 확인하면서 관리하는게 쉽지만은 않다. 이런 불편함을 해소하고자 나온 것이 도커 컴포즈이다. 도커 컴포즈는 시스템 구축과 관련된 명령어를 하나의 텍스트 파일에 기재해 명령어 한번에 시스템 전체를 실행하고 종료할 수 있도록 도와준다. 🔍 도커 컴포즈 실습 간단하게 진행하고 있는 백엔드 프로젝트로 도커 컴포즈 실습을 진행하였다. 일단 필요한 컨테이너는 총 두 가지이다. MySQL DB 컨테이너 스프링부트 .jar파일을 빌드하고 실행해주는 컨테이너 도식도는 위와 같으며 yml으로 된 도커 컴포즈 파일을 작성함으로써 이 도커 컨테이..

    트랜잭션 전파 레벨 정하기

    트랜잭션 전파 레벨 정하기

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