์ธ์ฆ ์ด ์ •๋ฆฌ :: 1. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” Auth Flow Best Case (feat. OpenIDC)
์›น (WEB)/๊ณต๋ถ€ 2022. 3. 15. 21:59

์ธ์ฆ Best Case ๊ธฐ๋ณธ flow (OpenIDC) Best Case๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ธ์ฆ flow(OpenIDC)๋ฅผ ๋จผ์ € ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, Auth Service๊ฐ€ ํƒ€ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹Œ ์ž์‚ฌ์˜ ์„œ๋น„์Šค์ผ ๋•Œ๋Š” OAuth ๊ธฐ๋ฐ˜์˜ flow๊ฐ€ ํ•„์š”์—†์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. (ํƒ€ ์„œ๋น„์Šค์ผ ๊ฒฝ์šฐ OAuth ๋ณด๊ธฐ) Client๊ฐ€ id(username)์™€ password๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ์š”์ฒญ์€ BFF → Server → Auth Service๋กœ ์ „ํ•ด์ง‘๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ id์™€ password๋กœ Auth Service์—์„œ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด access token, refresh token, id token ๋ฅผ Server๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Server๋Š” id token ์„ d..

๋‹ค์–‘ํ•œ Sticky ์ŠคํŽ™์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• (vanila js)
์›น (WEB)/๊ณต๋ถ€ 2022. 2. 2. 16:15

Sticky ์ŠคํŽ™์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ŠคํŽ™์— ํ•„์š”ํ•œ ์กฐ๊ฑด์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•ด๊ฐ€๋ฉด์„œ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ง€๋ฅผ ๊ณ ๋ฏผํ•ด๋ณด์ž. css์˜ poistion: sticky; ๋ฅผ ์ด์šฉํ•˜์ž. ์šฐ์„  Sticky๋˜์–ด์•ผ ํ•˜๋Š” Element๊ฐ€ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•ด์žˆ๋‹ค๋ฉด ์‰ฝ๋‹ค. css๋ฅผ ์ด์šฉํ•˜๋ฉด position: relative; ์ธ ๋ถ€๋ชจ์˜ ์ƒ๋‹จ์— ํ•ด๋‹น Element๊ฐ€ sticky๋œ๋‹ค. .sticky{ position: sticky; top: 0; } https://codepen.io/bucketressi/pen/GROoeKE Sticky-1 ... codepen.io sticky container๋ฅผ ๋งŒ๋“ค์ž. ์ด๋ฒˆ์—๋Š” sticky header(์ฒซ๋ฒˆ์งธ Sticky Element) ์•„๋ž˜์— sticky sub-header๊ฐ€ ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž...

React ๊ณต์‹ ๋ฌธ์„œ ๋‹ค์‹œ ์ฝ๊ธฐ (1. Main concepts)
์›น (WEB)/๊ณต๋ถ€ 2022. 1. 31. 20:43

Main Concepts ์ฒ˜์Œ React๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ฑฐ์˜ ์ดํ•ด ๋ชปํ•˜๊ณ  practice ์ •๋„๋งŒ ์ฐธ์กฐํ–ˆ์„ ๋“ฏ ์‹ถ์–ด์„œ ๋‹ค์‹œ ์ฝ์–ด๋ณด์•˜๋‹ค. ๊ฐœ๋…์„ ์ด๋ฒˆ์— ๋ช…ํ™•ํžˆ ํ–ˆ๋‹ค๊ฑฐ๋‚˜ ์ฒ˜์Œ ๋“ค์–ด๋ณธ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋Š”๋ฐ, Main concept์—์„œ๋„ ๊ฝค๋‚˜ ๋งŽ์•˜๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ๋กœ ํ•ด๋‹น ์ •๋ฆฌ ๊ธ€์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ณด๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค ๐Ÿ˜Š Introducing JSX React๋Š” ๊ธฐ์กด์— html, js ์™€ ๊ฐ™์ด ๊ธฐ๋Šฅ ๋ณ„๋กœ ๋ฌธ์„œ๋ฅผ ๋‚˜๋ˆ„๋˜ ๋ฐ์—์„œ ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ฒŒ ํ•จ์œผ๋กœ์จ js, html(jsx), css๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค. JSX์˜ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋“ค์€ ๋ Œ๋” ์‹œ์ ์— ์ด๋ฏธ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝ ๋˜๋ฏ€๋กœ XSS ๊ณต๊ฒฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. Rendering Elements React๋กœ ๋งŒ๋“ค์–ด์ง„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•˜๋‚˜์˜ root DOM ๋…ธ๋“œ๋ฅผ ..

Open Graph ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•˜๊ธฐ (feat. ์นด์นด์˜คํ†ก์—์„œ ๋ณ€๊ฒฝ์ด ์ ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ)
์›น (WEB)/๊ณต๋ถ€ 2022. 1. 9. 11:47

Open Graph๋ž€? ์–ด๋–ค ์›นํŽ˜์ด์ง€๋“  social graph์˜ ์ผ๋ถ€๋ถ„์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. Metadata og:title : url ๊ณต์œ  ์‹œ ์ œ๋ชฉ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ์˜์—ญ์ด๋‹ค. (์นด์นด์˜คํ†ก ๊ณต์œ ๋Š” title๋งŒ ๊ณต์œ ๋œ๋‹ค.) og:type : object์˜ type์ด๋‹ค. (ex_ video.movie, website) og:image : url ๊ณต์œ  ์‹œ ๋‚˜ํƒ€๋‚˜๋Š” ์ด๋ฏธ์ง€์ด๋‹ค. og:url : graph์—์„œ id๋กœ ์“ฐ์ด๋Š” url์ด๋‹ค. og:audio, og:video : audio, video ํŒŒ์ผ์˜ url์ด๋‹ค. og:description: object์— ๊ด€ํ•œ ์„ค๋ช…์ด๋‹ค.์นด์นด์˜คํ†ก ๊ณต์œ ์—์„œ๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ  ์Šฌ๋ž™ ๊ณต์œ , ๋ธ”๋กœ๊ทธ์—์„œ๋Š” description๊นŒ์ง€ ํ‘œ์‹œ๋œ๋‹ค. og:site_name : ๋ฐฉ๋Œ€ํ•œ ์›น์‚ฌ์ด..

[Next] _app.tsx์—์„œ url parmater ์‚ฌ์šฉ
์›น (WEB)/๊ณต๋ถ€ 2021. 11. 11. 22:18

์ƒํ™ฉ next.js์—์„œ๋Š” SSR์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— url์— ์žˆ๋Š” query๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜๊ฐ€ ์—†๋‹ค. ํ•ด๊ฒฐ 1 next page์—์„œ getServerSideProps ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด query๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค. const Page: NextPage = ({ params }) => { } export async function getServerSideProps (context) { const req = context.req; const params = new URLSearchParams(req._parsedUrl.query); return { props: { params } }; }โ€‹ ํ•ด๊ฒฐ 2 ํ•ด๊ฒฐ 1์˜ ๋ฐฉ๋ฒ•์œผ๋กœ page ๋‚ด๋ถ€์—์„œ๋Š” url parameter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ _app.tsx์™€ ๊ฐ™์ด ne..

CSS ์ ์šฉ๊ณผ์ • :: cascade, specificity, inheritance์— ๊ด€ํ•˜์—ฌ
์›น (WEB)/๊ณต๋ถ€ 2021. 10. 17. 10:42

์„ ํƒ์ž ์ถฉ๋Œ ์‹œ /*css*/ .special{ color: blue; } p{ color: red; } css๋Š” cascade์™€ specificity๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” rule์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ํ•ด๋‹น rule์— ๋”ฐ๋ผ ์ถฉ๋Œ ์‹œ ๋” ๊ฐ•ํ•œ ์„ ํƒ์ž๊ฐ€ ์ ์šฉ๋œ๋‹ค. cascade rule : ๋’ค์— ์ ์šฉ๋œ ์Šคํƒ€์ผ์ด ์•ž์„  ์Šคํƒ€์ผ์„ ๋ฎ์–ด์“ด๋‹ค. specificity rule : ์š”์†Œ๋ฅผ ๋” ํŠน์ •ํ•˜๋Š” ์„ ํƒ์ž๊ฐ€ ์Šคํƒ€์ผ์„ ์ฐจ์ง€ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์˜ˆ์ œ์—์„œ specificty rule์— ์˜ํ•ด color๋Š” blue๊ฐ€ ๋œ๋‹ค. specificity specificity๋Š” 4๊ฐ€์ง€์˜ ๋‹จ์œ„๋กœ ์ธก์ •๋œ๋‹ค. Thousands : style ์†์„ฑ ๋‚ด์— ์ •์˜๋˜์–ด ์žˆ๋Š” style(inline style)์ผ ๊ฒฝ์šฐ Hundreds : ID selector๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ..

Javascript ๊ธฐ๋ณธ :: declare (Typescript์—์„œ type ์—†์„ ๋•Œ)
์›น (WEB)/๊ณต๋ถ€ 2021. 9. 22. 14:15

๋งŒ์ผ Typescript๋กœ ๊ฐœ๋ฐœํ•˜๋˜ ์ค‘์— ์•„์ฃผ ์ž˜ ์ž‘์„ฑ๋œ JS ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์™€์„œ ์“ฐ๊ณ ์ž ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด์˜ ํ•จ์ˆ˜๋Š” typescript๋กœ ์ •์˜๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค. ๋ชจ๋“ˆ์ด ํ•ด๋‹น ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์—๋„ type์ด ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š์•„์„œ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ณ  ํ•ด์„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด declare ํ‚ค์›Œ๋“œ๋ฅผ ์จ์„œ ์ •์˜ํ•ด๋‘๋ฉด type์ด ์ธ์‹๋˜์–ด typescript compiler๊ฐ€ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. declare let module: any ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ "์ด๊ฑด ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ๋‹ค๋ฅธ ์ฝ”๋“œ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค."๋ผ๊ณ  ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

CommonJS vs ES Modules
์›น (WEB)/๊ณต๋ถ€ 2021. 9. 22. 13:57

๋ฐฐ๊ฒฝ ํ•จ์ˆ˜๋“ค๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ „์—ญ ์Šค์ฝ”ํ”„์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋‘”๋‹ค๋ฉด ๋‹ค๋ฅธ ๋‚ด๋ถ€ ์š”์†Œ์— ์˜ํ•ด ๋ง๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๊ณ , ์ˆœ์„œ๊ฐ€ ๋’ค์—‰์ผœ ์ „์—ญ ์Šค์ฝ”ํ”„์˜ ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ์ด๋ผ๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด ๊ฐ๊ฐ ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ importํ•˜์—ฌ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ด๋””์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  import, export ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด๋ผ ํ•˜๋Š”๋ฐ ํ˜„์žฌ 2๊ฐ€์ง€์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ํ™œ๋ฐœํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. CommonJS ES modules ์ฐจ์ด์  ๊ธฐ์ดˆ ๋ฌธ๋ฒ• CommonJS const module = require('์–ด์ฉŒ๊ตฌ'); const { func } = require('์–ด์ฉŒ๊ตฌ'); module.exports = '์–ด์ฉŒ๊ตฌ'; // default export..