๐ŸŽ€ ํ”„๋กœ์ ํŠธ

    [์ธ์‚ฌ์ดํŠธ์•„์›ƒ] Next.js์˜ parallel route๋ฅผ ์ด์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ

    ๋ฐฐ๊ฒฝ ๋งค์šฐ ๋Š๋ฆฌ๋˜ ์ž๊ธฐ์†Œ๊ฐœ์„œ ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•œ ์‚ฌ๋ก€๋ฅผ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค. Next.js์˜ parallel route๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ์•ฝ 94% ๊ฐœ์„ ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•œ๋‹ค. ์ธ์‚ฌ์ดํŠธ์•„์›ƒ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ž‘์„ฑ ํŽ˜์ด์ง€๋ฅผ ์ ‘์†ํ•˜๋ฉด ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ž‘์„ฑํ–ˆ๋˜ ์ž๊ธฐ์†Œ๊ฐœ์„œ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์ด ํŽ˜์ด์ง€๋ฅผ ์ ‘์†ํ•˜๊ธฐ๊นŒ์ง€๋Š” ์•ฝ 10์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค. ์›์ธ ๋ฌธ์ œ์˜ ์›์ธ์€ ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ž‘์„ฑ ๋ผ์šฐํŒ… ๋ฐฉ์‹๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ž‘์„ฑํ•˜๊ธฐ ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•˜๋ฉด /resumes/${questionId}๋กœ ์ด๋™ํ•œ๋‹ค. questionId๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ž‘์„ฑํ–ˆ๋˜ ์ž๊ธฐ์†Œ๊ฐœ์„œ๋กœ, ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋ชฉ๋ก ์กฐํšŒ API ์กฐํšŒ ํ›„ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์ž๊ธฐ์†Œ๊ฐœ์„œ ์งˆ๋ฌธ ํ•ญ๋ชฉ์ด questionId์ด๋‹ค. ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋ ˆ์ด์•„์›ƒ์€ ์•„๋ž˜์™€ ๊ฐ™..

    [์ธ์‚ฌ์ดํŠธ์•„์›ƒ] React-Query ๋ฌดํ•œ์Šคํฌ๋กค ์ ์šฉ๊ธฐ

    TL;DR - ๋ฌดํ•œ์Šคํฌ๋กค - Intersection Observer API - React-Query์™€ Intersection Observer API๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌดํ•œ์Šคํฌ๋กค ๊ตฌํ˜„ํ•˜๊ธฐ - ์‹ค์ œ ์„œ๋น„์Šค์— ์ ์šฉํ•˜๊ธฐ ๋ฐฐ๊ฒฝ ์ธ์‚ฌ์ดํŠธ์•„์›ƒ์—์„œ๋Š” ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๊ฒฝํ—˜์„ ์ •๋ฆฌํ•˜๊ณ  ์ด๋ฅผ '๊ฒฝํ—˜ ์นด๋“œ'๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝํ—˜์นด๋“œ๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ž๊ธฐ์†Œ๊ฐœ์„œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ, ํ•œ ํŽ˜์ด์ง€์—์„œ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๊ฒฝํ—˜์นด๋“œ์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ํ† ๋Œ€๋กœ ์ž๊ธฐ์†Œ๊ฐœ์„œ๋ฅผ ์ž‘์„ฑ์„ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐํšํ•˜์˜€๋‹ค. ๋ฌดํ•œ์Šคํฌ๋กค ๋ฌดํ•œ์Šคํฌ๋กค์€ ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค์„ ์•„๋ž˜๋กœ ๋‚ด๋ฆฌ๋ฉด ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๊ฐ€ ์ž๋™์œผ๋กœ ๋กœ๋“œ๋˜์–ด ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š์•„๋„ ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค..

    Chromatic์œผ๋กœ Storybook ์ง€์†์  ๋ฐฐํฌํ•˜๊ธฐ (Github Actions)

    TL;DR 1. ์Šคํ† ๋ฆฌ๋ถ์„ ๋„์ž…ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ 2. chromatic์œผ๋กœ ์Šคํ† ๋ฆฌ๋ถ ๋ฐฐํฌํ•˜๊ธฐ 3. Github Actions๋ฅผ ์ด์šฉํ•ด Pull Reqeust์—์„œ ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ ํ™•์ธํ•˜๊ธฐ ์Šคํ† ๋ฆฌ๋ถ์„ ๋„์ž…ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ํ˜‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ๋“ค์ด PR๋กœ ์˜ฌ๋ผ์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. PR์„ ์—ด์‹ฌํžˆ ์ž‘์„ฑํ•˜๋”๋ผ๋„ ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์‰ฝ๊ฒŒ ๋จธ๋ฆฌ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, PR์„ ์—ด์‹ฌํžˆ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งค๋ฒˆ ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•ด์•ผํ•˜๊ณ  PR์„ ์ฝ๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๋˜ ์‹ ๊ฒฝ์จ์„œ ์ฝ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋†’์€ ์†Œํ†ต ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค๋ฒˆ pull์„ ๋ฐ›์•„์„œ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์–ด๋–ค UI์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์†์ˆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์•ผํ–ˆ์Šต..

    chrome์—์„œ set-cookie ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๋•Œ

    ํ˜„์žฌ ๋ฐฑ์—”๋“œ์—์„œ set-cookie ํ•ด์ฃผ๋Š” response๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค access-control-allow-credentials: true allow: POST, OPTIONS connection: close content-length: 21 content-type: application/json date: Wed, 22 Feb 2023 03:04:31 GMT referrer-policy: same-origin server: gunicorn set-cookie: access_token=value; expires=1:00:00; HttpOnly; Path=/; SameSite=None set-cookie: refresh_token=value; expires=14 days, 0:00:00; HttpOnl..

    Django Channels๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋žŒ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (2)

    2022.07.04 - [ํ”„๋กœ์ ํŠธ/capstone] - Django Channels๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋žŒ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (1) Django Channels๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋žŒ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (1) ๋ฐฐ๊ฒฝ ์‹ค์‹œ๊ฐ„ ์•„๋™ํ•™๋Œ€ ์•Œ๋ฆผ ์›น ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ์šฐ์„  ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ณด๋ฉด ํญ๋ ฅํ–‰์œ„ ๋ฐœ์ƒ -> DB์— ํ•ด๋‹น ๋‚ด์šฉ ์ €์žฅ -> ํ•ด๋‹น DB ๋‚ด์šฉ์„ ํด๋ผ์ด์–ธ min-kyung.tistory.com ์œ„ ๊ธ€์—์„œ๋Š” websocket์„ ์ด์šฉํ•ด Vue.js์™€ Django๋ฅผ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. DB์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋ฉด ํ”„๋ก ํŠธ๋กœ ์•Œ๋ฆผ ์ „์†กํ•˜๊ธฐ ์˜ค๋Š˜ ๋งŒ๋“ค ๊ธฐ๋Šฅ์€ DB์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋ฉด ํ”„๋ก ํŠธ๋กœ ์•Œ๋ฆผ์„ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํญ๋ ฅํ–‰์œ„๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด DB์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํ”„๋ก ํŠธ๋กœ ์ „์†ก๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค...

    Django Channels๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋žŒ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (1)

    ๋ฐฐ๊ฒฝ ์‹ค์‹œ๊ฐ„ ์•„๋™ํ•™๋Œ€ ์•Œ๋ฆผ ์›น ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ์šฐ์„  ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ณด๋ฉด ํญ๋ ฅํ–‰์œ„ ๋ฐœ์ƒ -> DB์— ํ•ด๋‹น ๋‚ด์šฉ ์ €์žฅ -> ํ•ด๋‹น DB ๋‚ด์šฉ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก DB์— ๋‚ด์šฉ์ด ์ €์žฅ๋˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ํ”„๋ก ํŠธ๋กœ ๋‚ ๋ ค์ค˜์•ผํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค ์ด๋ฅผ ์œ„ํ•ด Websocket์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿคท ์™œ Websocket? ํด๋ผ์ด์–ธํŠธ๊ฐ€ DB์— ๋‚ด์šฉ์ด ์ €์žฅ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ํ•ด์•ผํ•˜๋Š”๊ฑด ์•Œ๊ฒ ๋Š”๋ฐ ์™œ ํ•˜ํ•„ ์›น์†Œ์ผ“์„ ์‚ฌ์šฉํ–ˆ์„๊นŒ์š”? ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์—๋Š” ์ด 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 1. polling ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ์ค‘ ํ•˜๋‚˜๋กœ n์ดˆ๋งˆ๋‹ค request๋ฅผ ๋‚ ๋ ค์„œ response๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ n์ด ์ž‘์•„์งˆ ์ˆ˜๋ก ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์ด..