베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • jpa
    • 운영체제
    • Spring
    • 데이터베이스
    • BFS
    • 자바
    • 함수형인터페이스
    • 알고리즘
    • java
    • 코드업
    • 스프링시큐리티
    • 자바8
    • 백준
    • C++
    • 이펙티브자바
    • 토비스프링
    • leetcode
    • 스레드
    • dfs
    • 스프링

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    TimeZone으로 인한 데이터 조회 실패
    프로젝트 기록

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

    2023. 7. 28. 16:16

    현재 Voca-World라고 하는 언어 학습 웹 서비스를 운영중이다. 최근에 AWS와 Docker를 이용하여 서버를 배포했는데 저장한 영어 단어가 조회되지 않는 현상이 발생했다. 이 문제를 해결한 과정을 기록하려고 한다.

     

    🔍 문제 해결 과정

    문제의 원인을 살펴보기 위해 서버의 로그 파일을 확인해 보았다. 단어 저장시 문제가 생겼을 수 있기 때문에 단어 저장 -> 단어 조회 순서로  로그를 확인해봤다.

    단어 저장 쿼리와 파라미터 바인딩

    저장한 시간보다 9시간 늦은 시간으로 표기되었지만 타임존이 다른걸 생각해보면 문제는 없어보였다. 하지만 로그를 편하게 보기 위해 로그의 시간 기록도 한국 시간으로 바꿔주었다.

    [logback-variables.properties]

    LOG_PATTERN=[%-5level] %d{yyyy-MM-dd HH:mm:ss, ${logback.timezone:-Asia/Seoul}} [%thread] [%logger{0}:%line] - %msg%n

     

    [logback-spring-prod.xml]

    logback timezone설정

    Logback 설정 이후 다시 로그를 확인해보았다.

    로그백 설정 이후 로그

    이번엔 로그 기록 시간과 TIMESTAMP 기록 시간이 다르게 나왔다. 파라미터 첫 번째는 craeted_at이라는 컬럼으로 JPA Auditing 기능을 이용해 자동 삽입되는 컬럼이다.

    @Getter
    @MappedSuperclass
    @EntityListeners(AuditingEntityListener.class)
    public class BaseEntity {
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
        @CreatedDate
        @Column(updatable = false)
        private LocalDateTime createdAt;    
    }

     

    이 로그를 보고 스프링의 Timezone 설정도 필요한가라는 생각이 들었고 검색해보았다.

    스프링 타임존 Default값은 실행중인 컴퓨터의 시스템 타임존 설정과 맞춰진다. 여긴 한국이니까 Asia/Seoul로 설정된다.
    하지만 배포 서버의 경우 UTC+9로 설정되어 있다.

     

    이를 해결하기 위해 스프링 프로젝트에 타임존 설정을 해주었다.

    @SpringBootApplication
    public class VocaBeApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(VocaBeApplication.class, args);
        }
    
        @PostConstruct
        void started(){
            TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
        }
    
    }

     

    이것으로 타임존으로 인한 데이터 조회 문제를 해결할 수 있었다.

    타임존 수정 후 로그

     

    여기까지 디버깅하면서 서로 다른 타임존을 가진 유저에게 데이터를 전달할 때는 어떻게 해야하는가에 대한 의문이 들었다. 이 부분은 다음 포스팅에서 이어서 작성하도록 하겠다.

    저작자표시 비영리 변경금지 (새창열림)
      '프로젝트 기록' 카테고리의 다른 글
      • 로컬 PC 서버 만들기
      • 서로 다른 타임존에서 데이터 핸들링 하기
      • Docker Compose를 이용한 Vue 프로젝트 실행
      • Docker Compose를 이용한 프로젝트 실행
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바