티스토리 뷰

업무를 하던 중 백엔드 애플리케이션에서는 String으로 사용하던 날짜를 DB 컬럼에 넣어야하는 경우가 발생했습니다. DB는 PostgreSQL이고 컬럼 타입은 Timestamp 였습니다.

 

서비스 단에서 String to LocalDatetime 으로 변경할까도 고민했지만 서버와 DB의 타임존이 일치하지 않아 혼란을 일으킬 것 같다는 생각이 들었습니다.

 

해당 프로젝트에서는 MyBatis를 통해 직접 쿼리를 작성하고 있었기 때문에 저장 시 쿼리에서 타입을 변경하는 방안을 고려하였습니다.

 

PostgreSQL 은 timestamp 컬럼에 값을 넣을 때 ::timestamp 라는 값을 뒤에 적어주면 변경된다는 것을 알 수 있었습니다.

 

다음은 CUD 문법에서 string을 timestamp로 변경하여 적용하는 방법을 코드로 살펴본 것입니다.

 

-- 저장 시
INSERT INTO oc.airport_curfew_t (
    iata_cty_apo_cd, 
    iata_aircraft_type_code, 
    restriction_category, 
    curfew_start_date, 
    curfew_end_date
) VALUES(
    #{item.iataCtyApoCd}, 
    #{item.iataAircraftTypeCode}, 
    #{item.restrictionCategory}, 
    #{item.curfewStartDate}::timestamp, 
    #{item.curfewEndDate}::timestamp
)

-- 수정 시
UPDATE oc.airport_curfew_t
SET curfew_end_date = #{dto.curfewEndDate}::timestamp,
    update_timestamp = NOW()
WHERE iata_cty_apo_cd = #{dto.iataCtyApoCd}
    AND iata_aircraft_type_code = #{dto.iataAircraftTypeCode}
    AND restriction_category = #{dto.restrictionCategory}
    AND curfew_start_date = (
            #{dto.curfewStartDate}::timestamp
        )

-- 삭제 시
DELETE FROM oc.airport_curfew_t
WHERE (iata_cty_apo_cd, iata_aircraft_type_code, restriction_category, curfew_start_date)
 IN (
     #{item.iataCtyApoCd}, 
     #{item.iataAircraftTypeCode}, 
     #{item.restrictionCategory}, 
     #{item.curfewStartDate}::timestamp
 )

 

Date, Timestamp 타입의 경우 서버에서도 동일하게 LocalDate, LocalDatetime을 사용하여 처리하는 것이 더 좋을 것 같다는 생각입니다. 다음에는 서버와 DB 의 타임존 차이와 그로 인해 발생했던 문제 및 해결 방안을 공부해보려고 합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함