바쁘신 분들은
Data Source Timezone 세팅법
만 보시기 바랍니다.
나머지 목차들은 보충적인 내용들입니다.
참고로 여기서 DataSource 로 연결하는 DBMS 는 Postgres 입니다.
다른 DBMS 를 사용중이면 이 글과 무관하게 Timezone 을 세팅하지 않아도 정상동작할
수도 있다는 점 유의하시기 바랍니다.
intellij
에서는 Postgres Datasource
의 timezone
세팅을 안하면 timezone=UTC
을 사용합니다. 그래서 select now()
같은 쿼리를 돌리면 UTC
기준으로 시간을 표기합니다.
select now()
쿼리의 결과는 04 시 57분
13시 57분
(=오후 1시 57분)UTC
와 우리나라(Asia/Seoul
)의 표준시 의 차이가 9
시간입니다.이렇게 시간대가 잘못되어서 조회되는 것을 원치 않으면 Intellij
의
Data Source Timezone
설정을 우리나라(Asia/Seoul
) 표준시로 세팅해야 합니다 .
지금부터 그 방법을 알아보겠습니다 😎
IntelliJ
실행시키고 Ctrl + Shift + A
입력DataBase Tool Window
가 보이게 됩니다.DataBase Tool Window
에서 timezone
변경하고자 하는datasource
에 마우스 대고 오른쪽 클릭Properties
버튼 클릭Options
탭 클릭time zone
선택란에서 Asia/Seoul
선택Apply
버튼 클릭
참고(1)
: 지금 설정을 바꾼Data Source
가 이미 query Console 을 열고 사용하던 중이면 곧바로 적용되지 않습니다. 귀찮지만 연결을 한번 Deactivate 하고, 다시 Connect(= Query console 에서 아무 쿼리나 실행) 하면 됩니다.
참고(2)
: 이 방법은 한번 DataSource 를 새로 생성할 때마다 수동으로 해줘야 합니다.
만약에 자동으로 DataSource 의 timezone 을 세팅하는 법을 알고 싶다면 자동으로 timezone 적용시키기을 확인해주세요.
그런데 Dbeaver
로 똑같은 DataSource
에 접속하여 select now()
쿼리를 실행하면 정상적으로 한국의 timezone 을 적용한 시간을 보여줍니다. 왜 이럴까요?
그 이유는 바로 DBeaver
가 DB 연결 시에 DB timezone
을 자동으로
DBeaver
를 실행시킨 컴퓨터의 timezone
과 똑같이 설정하기 때문입니다..
Intellij
에서는 이런 동작 방식이 사용자에게 더 큰 혼란을 줄 수 있다고 판단하여 기본 timezone=UTC
로 하고, 사용자들이 직접 고르도록 하는 겁니다.
사실 이건 IntelliJ 를 만드신 분들의 의도입니다.
Postgres: Database console sets different timezone in session that PGAdmin 을 읽으면 그 이유가 잘 나옵니다. 그리고 이유뿐만 아니라 Debeaver 와 IntelliJ 의 동작방식이 다른 이유 등도 잘 설명해줍니다. 해당 글 일부를 발췌해서 아래에 복사했으니, 보고 싶으신 분은 참고하시길 바랍니다.
Some conclusions for those who bump in here:
TLDR: Until the driver made it possible to find out about the server time zone, the current solution is the least problematic. And you need to set the time zone in the Options tab.
의도적으로 UTC 가 적용되도록 한 거네요!
IntelliJ 는 결국 Jdbc Driver 를 통해서 DB 연결을 합니다.
그러니 해당 Jdbc Driver 를 통한 연결을 시도할 때 timezone 옵션을 같이 전송해주면 됩니다.
이렇게 한번만 하면 같은 DBMS
에 timezone
옵션을 추가한 똑같은 Jdbc Driver
가 사용되므로 일정하게 같은 timezone
이 적용됩니다.
방법은 아래와 같습니다.
1. Driver Sources and Drivers 세팅 창에서 Drivers
탭 선택
2. Jdbc Driver 선택
3. Advanced
탭 클릭
4. VM options
에 -Duser.timezone=Asia/Seoul
입력
5. Apply
클릭
이후에 이 Jdbc Driver 를 사용해서 연결을 시도하는 Data Source 생성 시,
자동으로 timezone=Asia/Seoul
이 적용됩니다.