[TIL-20260206] Duration์œผ๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ

2026. 2. 7. 09:12ยทToday I Learned ๐Ÿง

 

๐Ÿ€ To Do List

โœ”๏ธ ์ฝ”ํ…Œ - 2์ฃผ์ฐจ ์ˆ™์ œ ๋ณต์Šต (๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ, set,์žฌ๊ท€ํ•จ์ˆ˜)

โœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - ํ† ํฐ ๋งŒ๋ฃŒ ์—ฌ๋ถ€ ์ฒดํฌ ๋กœ์ง ๊ตฌํ˜„

 

 

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ...

 

Duration์œผ๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ

 

๋ฐฐ๊ฒฝ

JWT refresh token์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด N์ผ ์ด๋‚ด ๋งŒ๋ฃŒ ์˜ˆ์ •์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ–ˆ๊ณ ,

์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ์ง์€ jwt provider์— ๊ตฌํ˜„ํ–ˆ๋‹ค.

    fun shouldRefreshToken(refreshToken: String, baseDays: Long = 7): Boolean {
        val expiration = getExpiration(refreshToken).toInstant()
        val now = Instant.now()
        val duration = Duration.between(now, expiration)

        return duration.toDays() in 0..baseDays
   }

 

 

Date → Instant ๋ณ€ํ™˜

`JWT`์˜ `exp(Expiration Time)` `Date`ํด๋ž˜์Šค ์ด๊ธฐ ๋•Œ๋ฌธ์—, `Duration.between()`์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด `Instant`๋กœ ๋ณ€ํ™˜์ด ํ•„์š”ํ–ˆ๋‹ค.

 

 

Instant vs LocalDateTime

// Instant
val instant = date.toInstant()

// LocalDateTime  
val localDateTime = date.toInstant()
    .atZone(ZoneId.of("UTC"))
    .toLocalDateTime()

 

์ผ ๋‹จ์œ„๋กœ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์ด๋ผ, ์ฒ˜์Œ์—” `LocalDateTime`์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ `LocalDateTime`์˜ ๊ฒฝ์šฐ ํƒ€์ž„์กด ์„ค์ •๋„ ํ•„์š”ํ•˜๊ณ , `Instant`์— ๋น„ํ•ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ,

`Instant`๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค.

 

๐Ÿ’ก `Instant`๋Š” `UTC`๋กœ ํ‘œํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž„์กด ๊ฑฑ์ •์ด ์—†๋‹ค.

 

 

 

Duration.between()์œผ๋กœ ์‹œ๊ฐ„ ์ฐจ์ด ๊ณ„์‚ฐ

public static Duration between(Temporal startInclusive, Temporal endExclusive) {

 

`between()` ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐ์ฒด์˜ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ์ด์šฉํ•ด์„œ `Duration` ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

๋‹จ, ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด๋“ค์ด `Instant`, `LocalDateTime`์ฒ˜๋Ÿผ ์ดˆ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

 

์ฐธ๊ณ  >

 

[Kotlin Duration Class] ์‹œ๊ฐ„์˜ ๊ตฌ๊ฐ„์„ ํ‘œํ˜„ํ•˜๋Š” ํด๋ž˜์Šค

๋ชฉํ‘œ Duration Class๋Š” ์‹œ๊ฐ„์˜ ๊ตฌ๊ฐ„์„ ํ‘œํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•œ๋‹ค. ๊ฐœ์š” Duration Class๋Š” ๋‘ ์‹œ๊ฐ„ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ง€์†์‹œ๊ฐ„(duration)์„ ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค์ด๋‹ค. ์ง€์†์‹œ๊ฐ„์ด๋ฏ€๋กœ, ๋‚ ์งœ๋งŒ์œผ๋กœ๋Š” ๊ตฌ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

kotlinworld.com

 

 

 

Duration.toDays() ๋‚ด๋ฆผ ์ฒ˜๋ฆฌ

`toDays()`๋Š” 24์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๋‚ด๋ฆผ ์ฒ˜๋ฆฌ๋œ๋‹ค.

6์ผ 23์‹œ๊ฐ„ 59๋ถ„ ๋‚จ์Œ → toDays() = 6
7์ผ 0์‹œ๊ฐ„ 0๋ถ„ ๋‚จ์Œ   → toDays() = 7
7์ผ 23์‹œ๊ฐ„ 59๋ถ„ ๋‚จ์Œ → toDays() = 7
8์ผ 1์‹œ๊ฐ„ ๋‚จ์Œ       → toDays() = 8

 

 

์ผ ๋‹จ์œ„๋กœ ๋น„๊ต๋ฅผ ํ•˜๊ณ  ์‹ถ์–ด์„œ `toDays()`๋กœ ๊ตฌํ˜„์„ ํ–ˆ๋Š”๋ฐ, 
ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š๋‹ค๋ฉด `toHours()`๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, `Instant`๋กœ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ณ ๋ คํ•ด๋ด์•ผ๊ฒ ๋‹ค. ๐Ÿค”

 

 

Range(in)๋กœ ๊ฒฝ๊ณ„ ์กฐ๊ฑด ์ฒ˜๋ฆฌ

duration.toDays() in 0..baseDays
  • ๋งŒ๋ฃŒ์ผ ๋‹น์ผ์—๋Š” duration ๊ฐ’์ด 0์ด๊ธฐ ๋•Œ๋ฌธ์—, 0์„ ํฌํ•จ์‹œ์ผฐ๋‹ค.
  • ๋งŒ๋ฃŒ๋˜๊ธฐ N์ผ ์ „๋„ ํฌํ•จ์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, baseDays๋„ ํฌํ•จ์‹œ์ผฐ๋‹ค.
  • ์ด๋ฏธ ๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๊ธฐ ๋•Œ๋ฌธ์—, duration์ด ์Œ์ˆ˜๊ฐ€ ๋˜๋Š” ์กฐ๊ฑด์€ ์ œ์™ธ์‹œ์ผฐ๋‹ค.
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Today I Learned ๐Ÿง' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TIL-20260211] ์ฝ”ํ…Œ - ๋ณ‘ํ•ฉ ์ •๋ ฌ , Open API 3.0 Swagger ๋ฌธ์„œ ์ž‘์„ฑ  (0) 2026.02.12
[TIL-20260208] Instant๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ  (0) 2026.02.08
[TIL-20260205] Access Token ์žฌ๋ฐœ๊ธ‰ ๊ตฌํ˜„  (0) 2026.02.05
[TIL-20260204] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - ์žฌ๊ท€ ํ•จ์ˆ˜ (Recursive Function)  (0) 2026.02.04
[TIL-20260203] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - Linked List , ์ด์ง„ ํƒ์ƒ‰(Binary Search)  (0) 2026.02.03
'Today I Learned ๐Ÿง' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [TIL-20260211] ์ฝ”ํ…Œ - ๋ณ‘ํ•ฉ ์ •๋ ฌ , Open API 3.0 Swagger ๋ฌธ์„œ ์ž‘์„ฑ
  • [TIL-20260208] Instant๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ
  • [TIL-20260205] Access Token ์žฌ๋ฐœ๊ธ‰ ๊ตฌํ˜„
  • [TIL-20260204] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - ์žฌ๊ท€ ํ•จ์ˆ˜ (Recursive Function)
ํ•ด๋‹ˆ ๐ŸŒฑ
ํ•ด๋‹ˆ ๐ŸŒฑ
๊ธฐ๋ก์ด ์ž์‚ฐ์ด๋‹ค ( •ฬ€แด—•ฬ )ูˆโœ๏ธ
  • ํ•ด๋‹ˆ ๐ŸŒฑ
    haeni.dev
    ํ•ด๋‹ˆ ๐ŸŒฑ
  • ๋งํฌ

    • github
    • velog
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (25)
      • ์šฐ์‚ฌ๊ธฐ ๊ฐœ๋ฐœ์ผ์ง€ ๐Ÿฐ (4)
      • Today I Learned ๐Ÿง (19)
      • ๋ถ„๋…ธ์˜ ํƒ€์ดํ•‘ ๋กœ๊ทธ ๐Ÿ”ฅ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ฐฑ์—”๋“œ
    ci/cd
    ๊ฐœ๋ฐœ
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    til
    springboot
    AWS
    ๊ฐœ๋ฐœ์ž
    IT
    ์ฝ”ํ…Œ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
ํ•ด๋‹ˆ ๐ŸŒฑ
[TIL-20260206] Duration์œผ๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”