JEP's Diary

시간기준 때문에 생긴 이슈 본문

Development/개발일지

시간기준 때문에 생긴 이슈

지으니88 2023. 3. 5. 16:54

지금까지 개발자 일을 하면서 배포날, 데모날, 행사날에 하나씩 이슈가 터졌던 경험이 있었는데...

이번 이슈는 처음 경험했던 거라 기록해본다. 다음에 또 이런일이 발생하지 않기 위해!

 

이슈의 원인은 각 앱에서 개발한 시간 기준이 달랐던 것.

 

정상 시나리오

앱A 와 앱B 가 있고 이는 서로 연동된다.

앱A에서 만료시간을 만들어서 QR 코드를 띄워주면 앱B에서 이를 읽고 데이터를 파싱하여 만료시간을 읽어낸다. 앱B가 만료시간을 읽어내는 과정은 QR 코드에 심어져 있는 만료시간 데이터가 long 값이어서 long 값을 다시 시간 타임스탬프로 변경해야 한다. 

이때 앱A에서 만든 만료시간과 앱B에서 읽어낸 만료시간이 서로 같아야 하는데 개발하고 테스트하는 단계에서 문제없이 잘 동작했던 부분이다.

 

이슈 발생

행사가 외국에서 있었어서 외국에서 위의 앱 연동을 사용하는데 이슈가 발생했다. 앱A에서 만든 QR 코드를 앱B에서 읽으면 자꾸 실패가 되는 것이었다. 이슈를 전달받고 사무실에서 테스트해보면 정상적으로 동작하여 원인을 찾는데 시간이 걸렸다. 원인은 만료시간을 만들때 기준이 되는 시간대가 달랐던 것.

앱A는 타임스탬프를 시간 String으로 변환할때 모두 한국시간 기준으로 변환하고 있었고, 앱B는 디바이스 지역 시간 기준으로 변환하고  있던 것이었다. 

 

앱A를 개발한 나의 입장에서는 타임스탬프를 시간 String 값으로 변환할때 제대로 알고 쓴게 아닌, 변환하는 코드를 구글링해서 복붙해서 사용하면서 결국 외워서 쓴 코드였기 때문에 원인을 찾는데도 한참 걸렸던 것 같다.

 

해결 방법

로직상에서 사용하는 시간/날짜 관련 데이터(변수)는 모두 UTC 기준으로 가지고 있고, 앱의 뷰에 표시할때는 다시 한국 기준 시간으로 변환하여 표시하는 방향으로 수정하기로 했다. 

다음주에...하던 기능 마무리 하고 관련한 부분 모두 다 리팩토링!

 

이 참에 유닉스 타임스탬프에 관하여 정리해보자.

 

유닉스 타임스탬프?

1970년 1월 1일 0시(UTC, Coordinated Universal Time) 기준으로 현재까지의 경과 시간을 초 단위로 환산하여 나타낸 값이다.  예를 들어 1970년 1월 1일 00:00:01은 '1'이다.

한국은 UTC+9 시간대에 속한다.

 

swift 에서 현재 타임스탬프 구하기

extension Date {
	var currentTimestamp = Int64 {
    	Int64(Date().timeIntervalSince1970) // timeIntervalSince1970은 TimeInterval(double) 타입
    }
}
 /**
        The interval between the date object and 00:00:00 UTC on 1 January 1970.
    
        This property's value is negative if the date object is earlier than 00:00:00 UTC on 1 January 1970.
    
        - SeeAlso: `timeIntervalSince(_:)`
        - SeeAlso: `timeIntervalSinceNow`
        - SeeAlso: `timeIntervalSinceReferenceDate`
*/
    public var timeIntervalSince1970: TimeInterval { get }

 

let unixTime = Date().timeIntervalSince1970 // 1634145125.736706
let date = Date(timeIntervalSince1970: unixTime) // 2021-10-13 17:12:05 +0000

 

Date to String, String to Date

 

Unix time을 사용하여 변경

  • Date to String: Date > unix time >  String
  • String to Date: String > unix time > Date

 

DateFomatter

https://formestory.tistory.com/6

 

유닉스 타임스탬프 변환 사이트

https://www.epochconverter.com/

 

Epoch Converter

Convert Unix Timestamps (and many other date formats) to regular dates.

www.epochconverter.com

 

참고

https://developer.apple.com/documentation/foundation/nsdate/1407504-timeintervalsince1970

 

timeIntervalSince1970 | Apple Developer Documentation

The interval between the date object and 00:00:00 UTC on 1 January 1970.

developer.apple.com

https://developer.apple.com/documentation/foundation/nsdate/1407504-timeintervalsince1970

'Development > 개발일지' 카테고리의 다른 글

SwiftUI의 LazyVStack의 아이템 갱신 이슈  (0) 2023.04.25
Concurrency와 쓰레드  (1) 2023.04.18
GitHub Copilot  (0) 2023.02.14
올해의 회사일의 목표, Xcode Cloud 사용해보기  (0) 2023.02.08
git flow 전략  (0) 2023.02.07