๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „์ฒด ๊ธ€79

RESTful API ์„ค๊ณ„ ์›์น™ / ๋„ค์ด๋ฐ ๊ทœ์น™ RESTful API ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ RESTful API Naming ๋ฆฌ์†Œ์Šค ํ‘œํ˜„์— ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ. ๊ณ„์ธต๊ด€๊ณ„๋ฅผ ๊ตฌ๋ถ„์ง“๊ธฐ ์œ„ํ•ด ์Šฌ๋ž˜์‹œ(/)๋ฅผ ์‚ฌ์šฉํ•˜๋ผ. URI ๋งˆ์ง€๋ง‰์— ์Šฌ๋ž˜์‹œ๋ฅผ ๋ถ™์ด์ง€ ๋งˆ๋ผ. ํ•˜์ดํ”ˆ(-) ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ๋ผ. ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ. ์†Œ๋ฌธ์ž๋งŒ์„ ์‚ฌ์šฉํ•˜๋ผ. ๋ฆฌ์†Œ์Šค ํ‘œํ˜„์— ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ. RESTful URI ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฆฌ์†Œ์Šค๋Š” ์ˆ˜ํ–‰๋˜๋Š” ํ–‰์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์ด๋‹ค. ์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ด๋Š ๋ฒ”์ฃผ์— ํ•ด๋‹นํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ ๋ฒ”์ฃผ์— ๋งž๋Š” ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. โ˜‘๏ธ ๋ฌธ์„œ(Document) ๋‹จ์ผ ๊ฐœ๋…(ํŒŒ์ผ ํ•˜๋‚˜, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค row) ๋‹จ์ˆ˜ ์‚ฌ์šฉ(/device-management, /user-managemen.. 2023. 5. 8.
HTTP RESTful API / ์•ˆ์ „์„ฑ๊ณผ ๋ฉฑ๋“ฑ์„ฑ REST(Representational State Transfer) ์ž์›์„ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. HTTP ์—์„œ์˜ REST ๋ž€? 1. HTTP URI(Uniform Resource Identifier)๋กœ ์ž์›(Resource)์„ ๋ช…์‹œ 2. HTTP Method(POST, GET, PUT, DELETE, PATCH ๋“ฑ)๋กœ 3. ํ•ด๋‹น ์ž์›(URI)์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ HTTP REST ๊ตฌ์„ฑ์š”์†Œ ์ž์›(Resource): HTTP URI ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„(Verb): HTTP Method ํ‘œํ˜„(Representations) HTTP REST ํŠน์ง• ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ(Server-Client) ๋ฌด์ƒํƒœ์„ฑ(Stateless) ์บ์‹œ ์ฒ˜๋ฆฌ.. 2023. 2. 22.
Spring boot with Swagger 3.0 OpenAPI๋ž€? OpenAPI Specification(OAS)๋ผ๊ณ ๋„ ํ•˜๋Š” OpenAPI๋Š” RESTful API๋ฅผ ๊ธฐ์ •์˜๋œ ๊ทœ์น™์— ๋งž๊ฒŒ API Spec์„ json์ด๋‚˜ yaml๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. RESTful API ๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ํ‘œ์ค€์œผ๋กœ ์„œ๋น„์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” API ์˜ ๊ธฐ๋Šฅ๊ณผ End Point ๋ฅผ ๊ฐœ๋ฐœ์ž๋‚˜ ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ „์—๋Š” Swagger 2.0๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋ ธ๋‹ค๊ฐ€ 3.0๋ฒ„์ „์œผ๋กœ ์˜ฌ๋ผ์˜ค๋ฉด์„œ OpenAPI 3.0 Specification(๋˜๋Š” Swagger 3.0)์œผ๋กœ ์นญํ•œ๋‹ค. ๐Ÿ”Ž Open API(Open Application Programming Interface, ๊ณต๊ฐœ API) ๋ˆ„๊ตฌ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๊ฐœ๋œ API๋ฅผ ๋งํ•œ๋‹ค. Public.. 2022. 11. 3.
์ƒ์„ฑ ํŒจํ„ด ์ƒ์„ฑ ํŒจํ„ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ ˆ์ฐจ๋ฅผ ์ถ”์ƒํ™”ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ์‹œ์Šคํ…œ์ด ์–ด๋–ค ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์บก์Šํ™”ํ•œ๋‹ค. ๊ฐ์ฒด์˜ ์ƒ์„ฑ/์กฐํ•ฉ์„ ์บก์Šํ™”ํ•˜์—ฌ ํŠน์ • ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ๋นŒ๋” (Builder) ๋ณต์žกํ•œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ์ •๊ณผ ํ‘œํ˜„๋ฐฉ๋ฒ•์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ๋งŽ์€ Optional ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋‚˜ ์ง€์†์„ฑ ์—†๋Š” ์ƒํƒœ ๊ฐ’๋“ค์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•œ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ์‹œ์  ์ถ”์ ์ด ์‰ฝ๋‹ค. ๐Ÿ’ก ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ์ตœ์†Œํ™” ์ˆ˜์ •์ž ํŒจํ„ด์€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘์–ด ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ์‹œ์ ์„ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“  ๋ฐ˜๋ฉด, ๋นŒ๋” ํŒจํ„ด์€ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ์‹œ์ ์ด ๊ฐ์ฒด์˜ ์ƒ์„ฑ ์‹œ์  ๋ฟ์ด๋ผ ์ถ”์ ์ด ์‰ฝ๊ณ  ์œ ์ง€.. 2022. 10. 28.
GoF ๋””์ž์ธ ํŒจํ„ด ๋””์ž์ธ ํŒจํ„ด ๊ณผ๊ฑฐ์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ถ•์ ๋œ ๋…ธํ•˜์šฐ์— ์ด๋ฆ„์„ ๋ถ™์—ฌ ์ดํ›„์— ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ํŠน์ • ๊ทœ์•ฝ์„ ๋งŒ๋“ค์–ด ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค. ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ์ด๋‚˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ์‘์šฉ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ๋“ค์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์„œ๋กœ ๊ณตํ†ต๋˜๋Š” ์„ค๊ณ„ ๋ฌธ์ œ ๋ฐ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ์‚ฌ์ ์„ ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋””์ž์ธ ํŒจํ„ด์€ ๋ชจ๋“ˆ์˜ ์„ธ๋ถ„ํ™”๋œ ์—ญํ• ์ด๋‚˜ ๋ชจ๋“ˆ ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์„ค๊ณ„ํ•  ๋•Œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ „ํ˜•์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ์‹์ด๋‹ค. GoF(Gang of Four) ๋””์ž์ธ ํŒจํ„ด 1995๋…„ 23๊ฐœ ํŒจํ„ด์„ ์ˆ˜๋กํ•œ ๋…ผ๋ฌธ์—์„œ ๋””์ž์ธ ํŒจํ„ด์„ ๊ตฌ์ฒดํ™”ํ•˜์˜€๋‹ค. ๋ชฉ์ ์— ๋”ฐ๋ผ ์ƒ์„ฑ ํŒจํ„ด 5๊ฐœ, ๊ตฌ์กฐ ํŒจํ„ด 7๊ฐœ, ํ–‰์œ„ ํŒจํ„ด 11๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๊ณผ์ •์— ๊ด€์—ฌํ•˜๋Š” ์ƒ์„ฑ ํŒจํ„ด ๊ฐ์ฒด์˜ ํ•ฉ์„ฑ์— ๊ด€์—ฌํ•˜๋Š” ๊ตฌ์กฐ ํŒจํ„ด ๊ฐ์ฒด๊ฐ€ ์ƒ.. 2022. 9. 16.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์œ ์šฉํ•œ ํ•จ์ˆ˜ ๋ชจ์Œ ๊ฐ์ฒด ํ‚ค ์ด๋ฆ„ ๋ณ€๊ฒฝํ•˜๊ธฐ โœ๏ธ ๊ฐ์ฒด const originObj = { old1: '๊ฐ’1', old2: '๊ฐ’2', old3: '๊ฐ’3', old4: '๊ฐ’4', old5: '๊ฐ’5' }; const func = ({old1: new1, old2: new2, ...rest}) => { return {new1, new2, rest}; } const newObj = func(originObj); console.log(newObj); โœ๏ธ ๊ฐ์ฒด ๋ฐฐ์—ด const originList = [{ old1: '๊ฐ’1', old2: '๊ฐ’2', old3: '๊ฐ’3', old4: '๊ฐ’4', old5: '๊ฐ’5' }, { old1: '๊ฐ’1', old2: '๊ฐ’2', old3: '๊ฐ’3', old4: '๊ฐ’4', old5: '๊ฐ’5' }]; con.. 2022. 8. 29.
in-memory / cache / redis / memcached in-memory ์ปดํ“จํ„ฐ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์ธ RAM์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ ค์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. in-memory DB ๋ฉ”๋ชจ๋ฆฌ์™€ ๋””์Šคํฌ ๊ฐ„ ๋ณ‘๋ชฉ์ด ์—†์–ด SSD, HDD ๊ฐ™์€ ์ €์žฅ๊ณต๊ฐ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ์†๋„๊ฐ€ ๋น ๋ฅธ ๋Œ€์‹  ๋น„์šฉ์ด ๋น„์‹ธ ํฐ ์šฉ๋Ÿ‰์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜์†์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์•„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” DB๋ฉด in-memory DB๋ผ๊ณ  ํ•œ๋‹ค. RDBMS์ธ MySQL์—์„œ๋„ in-memory ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๊ณ , NoSQL์ธ Redis๋„ in-memory DB์ด๋‹ค. โœ” disk-based DB ์™ธ๋ถ€ ์ €์žฅ ์žฅ์น˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ณ , ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. in-memor.. 2022. 7. 10.
์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ’€์ด ๋ชจ์Œ ๋‘ ์ •์ˆ˜ ์‚ฌ์ด์— ์†ํ•œ ์ •์ˆ˜์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ function solution(a, b) { return (a + b) * (Math.abs(b - a) + 1) / 2; } ๋‘ ๋ฒกํ„ฐ์˜ ๊ฐ ์„ฑ๋ถ„๋ผ๋ฆฌ์˜ ๊ณฑ์˜ ํ•ฉ์‚ฐ(๋‚ด์ ) ๊ตฌํ•˜๊ธฐ function solution(a, b) { // a, b ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๋™์ผํ•จ์œผ๋กœ ๊ฐ€์ • return a.reduce((acc, _, i) => acc += a[i] * b[i], 0); } 0๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ ์—†๋Š” ์ˆซ์ž ๋”ํ•˜๊ธฐ function solution(numbers) { return 45 - numbers.reduce((cur, acc) => cur + acc, 0); } 2022. 7. 8.
javascript ๊ฐ์ฒด ํ‚ค ์ด๋ฆ„ ๋ณ€๊ฒฝ ๊ฐ์ฒด ํ‚ค ์ด๋ฆ„ ๋ณ€๊ฒฝํ•˜๊ธฐ (๊ฐ์ฒด ๋ฐฐ์—ด) map ์ธ์ž๋กœ ๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ๋ถ„ํ•ดํ•˜์—ฌ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ๋ฆฌํ„ดํ•œ๋‹ค. let origins = [{ old1: 'origins[0].old1', old2: 'origins[0].old2', old3: 'origins[0].old3' }, { old1: 'origins[1].old1', old2: 'origins[1].old2', old3: 'origins[1].old3' }]; let results = origins.map(({ old1: new1, old2: new2, ...rest }) => ({ new1, new2, ...rest })); ๊ฐ์ฒด ํ‚ค ์ด๋ฆ„ ๋ณ€๊ฒฝํ•˜๊ธฐ (๊ฐ์ฒด) let origin = { old1: 'origins[0].old1', old2.. 2022. 7. 8.
javascript ๋ฐฐ์—ด ๋‚ด ์ค‘๋ณต ๊ฐ’ ๊ตฌํ•˜๊ธฐ ๋ฐฐ์—ด ๋‚ด์—์„œ ์ค‘๋ณต ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [1, 1, 2, 3, 5] ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต ๊ฐ’์ธ [1] ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ค‘๋ณต ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๋Œ€์ƒ ๋ฐฐ์—ด์ด ๊ฐ์ฒด๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด์ด๋ผ๋ฉด ๊ฐ์ฒด์—์„œ ์ค‘๋ณต์„ ๊ฒ€์‚ฌํ•  ๋Œ€์ƒ๋งŒ ์ถ”์ถœํ•œ๋‹ค. (์ค‘๋ณต์ด ๊ฐ์ฒด ๋‚ด ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ์ž์ฒด๋ผ๋ฉด JSON.stringify() ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.) // ๋ฐ์ดํ„ฐ let arr = [{ "name": "ํ™๊ธธ๋™", "phoneNumber": "010-1111-1111" }, { "name": "๊น€๊ธธ๋™", "phoneNumber": "010-2222-2222" }, { "name": "๊ณ ๊ธธ๋™", "phoneNumber": "010-3333-3333" }, { "name": "์„œ๊ธธ๋™", "phoneNumber": ".. 2022. 6. 23.