[TIL-20260215] iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ Google ์†Œ์…œ ๋กœ๊ทธ์ธ ์ด์Šˆ ํ•ด๊ฒฐ
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do List โœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - ๊ตฌ๊ธ€ ํด๋ผ์ด์–ธํŠธ ์•„์ด๋”” ์ถ”๊ฐ€ ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ... ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ์‹คํŒจlocal ํ™˜๊ฒฝ์—์„œ OAuth 2.0 Playground URL , dev ํ™˜๊ฒฝ์—๋Š” iOS์šฉGoogle Client ID๋งŒ ๋“ฑ๋ก์„ ํ•ด๋‘” ์ƒํ™ฉ์ด์—ˆ๋‹ค.FE์—์„œ iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ Google ์†Œ์…œ ๋กœ๊ทธ์ธ ์‹œ๋„ ์‹œ ์ธ์ฆ ์‹คํŒจํ–ˆ๋‹ค๊ณ  ํ•˜์—ฌ ์›์ธ์„ ๋ถ„์„ํ•ด๋ณด๋‹ˆiOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์‹ค์ œ ๋””๋ฐ”์ด์Šค์™€ ๋‹ฌ๋ฆฌ Google ๋กœ๊ทธ์ธ ์‹œ Web Client ID๋กœ ์ธ์‹๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ์„œ๋ฒ„์— Google Client ID (Web์šฉ) ์ถ”๊ฐ€ properties ๊ฐ’์—๋„ ์œ„์™€ ๊ฐ™์ด web clinet id๋„ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค. ํ˜„์žฌ๋Š” dev ์„œ๋ฒ„๋งŒ ๊ตฌ์„ฑํ•ด๋‘” ์ƒํƒœ๋ผ ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœํ•ด๋’€๋Š”๋ฐprod ์„œ๋ฒ„..
[TIL-20260213] Swagger์—์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ํ…Œ์ŠคํŠธ
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do Listโœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - aceess token ์œ ํšจ์„ฑ ์ฒดํฌ api, ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ api, ์œ ์ € ์ •๋ณด ์กฐํšŒ/์ˆ˜์ • api ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ...Swagger์—์„œ MultipartFile๊ณผ DTO ํ•จ๊ป˜ ๋ฐ›๊ธฐ ์œ ์ € ํ”„๋กœํ•„ ์ˆ˜์ • API ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์š”์ฒญ dto์— ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ `MultipartFile`๋กœ ๋ฐ›๊ฒŒ ํ•ด๋’€๋Š”๋ฐ,Swagger UI์—์„œ๋Š” `String` ํ˜•ํƒœ๋กœ ๋ฐ›๋„๋ก ๋ณด์—ฌ์ง€๊ณ  ์žˆ์—ˆ๋‹ค. Swagger๋Š” ๋ณ„๋„ ์„ค์ •์ด ์—†์œผ๋ฉด Content Type์„ ๊ธฐ๋ณธ๊ฐ’์ธ `application/json`์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ ๊ตฌ์กฐ๋ฅผ ์ œ๋Œ€๋กœ ์ธ์‹ํ•˜์ง€ ๋ชป ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. Controller์—์„œ Content type ๋ช…์‹œํ•˜๊ธฐ `@PutM..
[TIL-20260212] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ณต์Šต - ํƒ‘(Tower) ๋ฌธ์ œ
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do Listโœ”๏ธ ์ฝ”ํ…Œ ๊ฐ•์˜ - stackโœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - ์œ ์ € ์ •๋ณด ์กฐํšŒ api, access token ์œ ํšจ์„ฑ ์ฒดํฌ api, dev ๋ฐฐํฌ ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ... ํƒ‘(Tower) ๋ฌธ์ œ https://www.acmicpc.net/problem/2493 ์ด์ค‘ for๋ฌธ ๋ฐฉ์‹์ž…๋ ฅ: [6, 9, 5, 7, 4]์‹œ๊ฐํ™”:๐Ÿ”ซ ๐Ÿ”ซ ๐Ÿ”ซ ๐Ÿ”ซ ๋ ˆ์ด์ €์˜ ๋ฐฉํ–ฅ(์™ผ์ชฝ์œผ๋กœ) I I I II I II I I II I I I I6 9 5 7 4์ถœ๋ ฅ: [0, 0, 2, 2, 4] ๊ฐ ํƒ‘์—์„œ ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ๋ ˆ์ด์ €๋ฅผ ๋ฐœ์‚ฌ์ž์‹ ๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์€ ํƒ‘์„ ๋งŒ๋‚˜๋ฉด ์ˆ˜์‹ ๋จ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์—ญ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์™ผ์ชฝ ํƒ‘๋“ค์„ ํ™•์ธ def get_receiver..
[TIL-20260211] ์ฝ”ํ…Œ - ๋ณ‘ํ•ฉ ์ •๋ ฌ , Open API 3.0 Swagger ๋ฌธ์„œ ์ž‘์„ฑ
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do Listโœ”๏ธ ์ฝ”ํ…Œ ๋ณต์Šต - ๋ณ‘ํ•ฉ ์ •๋ ฌ, ๋ถ„ํ•  ์ •๋ณตโœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - access token ์œ ํšจ์„ฑ ์ฒดํฌ API , swagger ๋ฌธ์„œ ์ˆ˜์ • ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ...๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge Sort)๋ฐฐ์—ด์˜ ์•ž๋ถ€๋ถ„๊ณผ ๋’ท๋ถ€๋ถ„์˜ ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ๊ฐ ์ •๋ ฌํ•œ ํ›„ ๋ณ‘ํ•ฉํ•˜๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๋‘ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ๋‹ค.array_a = [1, 2, 3, 5]array_b = [4, 6, 7, 8]def merge(array1, array2): i = 0 j = 0 result = [] while i ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ •array1 = [1, 2, 3, 5]array2 = [4, 6, 7, 8]1๋‹จ๊ณ„: โœ…[1, 2, 3, 5]โœ…[4, ..
[TIL-20260208] Instant๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do Listโœ”๏ธ ์ฝ”ํ…Œ ๊ฐ•์˜ - ๋ฒ„๋ธ” ์ •๋ ฌ, ์„ ํƒ ์ •๋ ฌโœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - ๋งŒ๋ฃŒ ์˜ˆ์ • ํ† ํฐ ์—ฌ๋ถ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ...toDays()๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ val expiration = getExpiration(refreshToken).toInstant()val now = Instant.now()val duration = Duration.between(now, expiration) # 691199์ดˆ -> 7์ผ 23์‹œ๊ฐ„59๋ถ„59์ดˆreturn duration.toDays() in 0..7 # true๋งŒ๋ฃŒ ์˜ˆ์ • ํ† ํฐ ์—ฌ๋ถ€ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ์ค‘, ๋งŒ๋ฃŒ์ผ์ด ์•ฝ 8์ผ์ด๋ผ ๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚˜๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ `false`๋กœ ๊ธฐ๋Œ€ํ–ˆ๋Š”๋ฐ `true`๊ฐ€ ๋‚˜์™”๋‹ค. 691199..
[TIL-20260206] Duration์œผ๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ
ยท
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 = In..
[TIL-20260205] Access Token ์žฌ๋ฐœ๊ธ‰ ๊ตฌํ˜„
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do Listโœ”๏ธ ์ฝ”ํ…Œ ๋ฌธ์ œ ํ’€์ด - ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ, ์ด์ง„ ํƒ์ƒ‰, ์žฌ๊ท€ํ•จ์ˆ˜โœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ... ๐Ÿšจ ๋ฌธ์ œ ์‚ฌํ•ญaccess token๊ณผ refresh token ๋ชจ๋‘ ์žฌ๋ฐœ๊ธ‰ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณ ๋ฏผ์ด ์ƒ๊ฒผ๋‹ค.๋‚ด๊ฐ€ ์‚ฌ์šฉํ•ด ์˜จ iOS ์•ฑ๋“ค์€ ๋กœ๊ทธ์ธ ์„ธ์…˜์ด ๊ฑฐ์˜ ๋Š๊ธฐ์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ, ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ์ด ์ž์ฃผ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€?ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์กฐ์—์„œ, access token ๋งŒ๋ฃŒ ๋  ๋•Œ๋งˆ๋‹ค refresh token๊นŒ์ง€ ํ•จ๊ป˜ ์žฌ๋ฐœ๊ธ‰ ๋˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•œ๊ฐ€?refresh token์„ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์—์„œ ์žฌ๋ฐœ๊ธ‰์ด ๋ฐ˜๋ณต๋˜๋ฉด ์„œ๋ฒ„ ๋ถ€ํ•˜๋‚˜ ๊ด€๋ฆฌ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์„๊นŒ? ๐Ÿค” ๊ณ ๋ฏผํ–ˆ๋˜ ์„ ํƒ์ง€..
[TIL-20260204] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - ์žฌ๊ท€ ํ•จ์ˆ˜ (Recursive Function)
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do Listโœ”๏ธ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๊ฐ•์˜ - ์žฌ๊ท€ ํ•จ์ˆ˜โœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - token ์žฌ๋ฐœ๊ธ‰ ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€์ค‘ ๋ณ‘์› ๋‹ค๋…€์˜ค๋А๋ผ ๋งŽ์ด ๋ชป ํ–ˆ๋‹ค. ์กฐ๊ธ‰ํ•ด ํ•˜์ง€ ๋ง๊ณ  ๊พธ์ค€ํžˆ ํ•ด๋ณด์ž ! ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ... ์žฌ๊ท€ ํ•จ์ˆ˜ (Recursive Function)์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์ข…๋ฃŒ ์กฐ๊ฑด ํ•„์ˆ˜์ข…๋ฃŒ ์กฐ๊ฑด์ด ์—†์œผ๋ฉด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ ธ `Stack Overflow`๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ’ก Tip ๋กœ์ง์ด ๋ฐ˜๋ณต๋˜๋Š” ๊ตฌ์กฐ๋ผ๋ฉด ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž. ํŒฉํ† ๋ฆฌ์–ผ ๊ตฌํ˜„ํŒฉํ† ๋ฆฌ์–ผ์€ 1๋ถ€ํ„ฐ ์–ด๋–ค ์–‘์˜ ์ •์ˆ˜ n๊นŒ์ง€์˜ ์ •์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณฑํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด `5!` ๋Š” `5! = 5 × 4 × 3 × 2 × 1 = 120`์ˆ˜์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด `n! = n × (n-1) × (n-2) × ...
[TIL-20260203] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - Linked List , ์ด์ง„ ํƒ์ƒ‰(Binary Search)
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do List โœ”๏ธ ์ฝ”ํ…Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜ - LinkedList ๋ฌธ์ œ, ์ด์ง„ํƒ์ƒ‰โœ”๏ธ ์ด๋ ฅ์„œ ์ดˆ์•ˆ ์ž‘์„ฑโœ”๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - refresh token ๋ฐœ๊ธ‰ ๋กœ์ง ์ˆ˜์ • ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ... Linked List์ˆซ์ž ๋ณ€ํ™˜ ํŒจํ„ด์ดˆ๊ธฐ๊ฐ’: sum = 01. 0 * 10 + 6 = 6 (6)2. 6 * 10 + 7 = 67 (์‹ญ์˜ ์ž๋ฆฌ๋กœ ๋ฐ€๊ณ  7 ์ถ”๊ฐ€)3. 67 * 10 + 8 = 678 (๋ฐฑ์˜ ์ž๋ฆฌ๋กœ ๋ฐ€๊ณ  8 ์ถ”๊ฐ€) `[6] -> [7] -> [8]` ์ด๋ ‡๊ฒŒ ์ด์–ด์ง„ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ `678` ์ˆซ์ž ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ๊ธฐ์กด ์ˆซ์ž๋ฅผ 10๋ฐฐ๋กœ ๊ณฑํ•˜๊ณ , ํ˜„์žฌ ์ˆซ์ž๋ฅผ ๋”ํ•ด์„œ ์™ผ์ชฝ์œผ๋กœ ์ž๋ฆฟ์ˆ˜๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. sum = sum * 10 +..
[TIL-20260202] Kotlin data class, enum class
ยท
Today I Learned ๐Ÿง
๐Ÿ€ To Do List ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Today I Learned ... Data Class DTO(Data Transfer Object)๊ณ„์ธต๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๋ฐ์ดํ„ฐ(ํ•„๋“œ), ์ƒ์„ฑ์ž์™€ getter, equals, hashCode, toString ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.`Kotlin`์—์„œ๋Š” `data` ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด, `equals, hashCode, toString` ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.`named argument`๊นŒ์ง€ ํ™œ์šฉํ•˜๋ฉด, `builder pattern`์„ ์“ฐ๋Š” ๊ฒƒ ๊ฐ™์€ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค. Enum Class ๋‚ด๋ถ€์ ์œผ๋กœ `Enum`์„ ์ƒ์† ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ถ”์ƒ์ ์ธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.`enum class ํด๋ž˜์Šค๋ช… : Enum() ``Kotlin`์€ ๋‹ค์ค‘ ์ƒ์†์„..