๐Ÿง‘‍๐Ÿ’ป ์งง์€ํ˜ธํก/~ 2021

๊ตฐ๋Œ€๋ฅผ ๋ง‰ ์ „์—ญํ•˜๊ณ  ๋‚˜์„œ ์ด๊ฒƒ์ €๊ฒƒ ์—ด์‹ฌํžˆ ํ•ด๋ณด์•˜์–ด์š”
์ด๋ฒˆ์— ์ฒ˜์Œ์œผ๋กœ SQL์„ ์จ๋ณด๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ์—ฌ๋Ÿฌ ๊ฒฝํ—˜๋“ค์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค. ์‚ฌ์•„์•„์‹ค sql์„ ๊นŠ์ด ๊ณต๋ถ€ํ•ด๋ณธ ์ ์ด ์—†์–ด์„œ ์•ฝ๊ฐ„์˜ ๊ผผ์ˆ˜์™€ ์•ผ๋งค๊ฐ€ ๊ฐ€๋“ ์„ž์—ฌ์žˆ๋‹ค. 1. Select ์ ˆ์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉ const selectItemsByCount = async (connection, limit, offset) => { const selectItemsByCountQuery = ` SELECT (select count(*) from wish where wish.item_id = item.item_id) wish_count, item.item_id, item.title, item.price, item.safety_pay, item.location, item.created_at, image.image_path FROM i..
nodejs์—์„œ ์ด๋ฏธ์ง€ ๋“ฑ์˜ ํŒŒ์ผ์„ ๋ฉ€ํ‹ฐํŒŒํŠธ ํ˜•์‹์œผ๋กœ ์—…๋กœ๋“œํ•  ๋•Œ multer ๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์„œ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ด์šฉํ•œ๋‹ค. npm i multer npm i multer-s3 aws-sdk s3.json { "accessKeyId": "AKIAVLEU2D2EIKMGBVQS", "secretAccessKey": "", "region": "ap-northeast-2" } ์ด์ „ ํฌ์ŠคํŒ…์—์„œ IAM์„ ์„ค์ •ํ•˜๊ณ  ๋ฐ›์€ ์–ด์„ธ์Šคํ‚ค์™€ ์‹œํฌ๋ฆฟํ‚ค๋ฅผ ๋„ฃ์–ด๋‘”๋‹ค. ์ด ์‹œํฌ๋ฆฟ ํ‚ค๊ฐ€ ์œ ์ถœ์ด ๋˜๋ฉด ์ฒญ๊ตฌ์„œ์— ์—„์ฒญ๋‚œ ์•ก์ˆ˜๊ฐ€ ์ฐํžˆ๊ณ  ์ถ”์šด ๊ฒจ์šธ์— ํ˜„๊ด€๋ฌธ ๋ฐ–์œผ๋กœ ๋‚ด์ซ“๊ธธ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ ๊ผญ๊ผญ ์ฃผ์˜ํ•œ๋‹ค. region์—๋Š” s3 ๋ฒ„ํ‚ท์— ์„ค์ •๋œ ๋ฆฌ์ „์„ ์ ๋Š”๋‹ค. ์„œ์šธ์ด๋‹ˆ๊นŒ ๋ณดํ†ต์€ ap-northeast-2 ๋กœ ๋˜์–ด ์žˆ์„๊ฑธ. multer.js multer์™€ ๊ด€..
์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ nodejs๋กœ ๊ตฌํ˜„ ์ค‘์ด๋‹ค. ์ด์ „์— ์ฒ˜์Œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‹จ์ˆœํžˆ ์„œ๋ฒ„์˜ ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ , ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ๋Š” ์ด๋ฏธ์ง€ํŒŒ์ผ์„ base64๋กœ ๋ณ€ํ™˜ํ•ด ๋‹ค์‹œ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์•„๋งˆ์กด์˜ S3์— ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. nodejs์—์„œ S3 ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ๋จผ์ € S3 ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•˜๊ณ , IAM์— ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋กํ•ด ์–ด์„ธ์Šค ํ‚ค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. 1. S3 ๋ฒ„ํ‚ท S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ์„ ํ•  ๋•Œ๋Š” ๋ชจ๋“  ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ์„ ํ’€๊ณ  ๋„˜์–ด๊ฐ„๋‹ค. ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ์—๋Š” ๋ฒ„ํ‚ท ์ •์ฑ…์„ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋ฒ„ํ‚ท ์ด๋ฆ„ ํด๋ฆญ > ๊ถŒํ•œ > ๋ฒ„ํ‚ท ์ •์ฑ… ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฒ„ํ‚ท ์ •์ฑ…์€ JSON ํ˜•์‹์œผ๋กœ ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ •์ฑ… ์ƒ์„ฑ๊ธฐ๋ฅผ ์ด์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฒ„ํ‚ท ARN์„ ํด๋ฆญ..
๋ฐ”๋กœ ์ง์ „ ํฌ์ŠคํŒ…์—์„œ antd ๊ทธ๋ฆฌ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด ์‚ฌ์ด์ฆˆ์— ๋”ฐ๋ผ ๋ฐ˜์‘ํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค. ์ •ํ™•ํžˆ 768px์— ๋ฐ”๋€Œ๋Š”์ง€ ๋ณด๋ ค๊ณ  ํ˜„์žฌ ํ™”๋ฉด์˜ ๋„ˆ๋น„๋ฅผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์— ๋„์›Œ์ฃผ๋ ค๊ณ  ํ•œ๋‹ค. 1. resize ์ด๋ฒคํŠธ resize ์ด๋ฒคํŠธ๋Š” document view์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค width state์— ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ˆ๋น„๊ฐ€ ์ €์žฅ๋˜๋„๋ก ํ–ˆ๋‹ค. useEffect๋ฅผ ์ด์šฉํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. const [width, setWidth] = useState(window.innerWidth); const handleResize = () => { setWidth(window.innerWidth); }; useEffect(() => { windo..
๊ต์–‘์œผ๋กœ ์›น๋””์ž์ธ ์ˆ˜์—…์„ ๋“ค์€ ํ›„์— ์š”๊ธดํ•˜๊ฒŒ ์“ฐ๋Š” ๋ช‡ ์•ˆ๋˜๋Š” ๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜. ๊ทธ ๋•Œ๋Š” ํฌํ† ์ƒต์œผ๋กœ ์ผ์ผํžˆ ํ”ฝ์…€ ์žฌ๊ฐ€๋ฉด์„œ ๊ทธ๋ฆฌ๋“œ ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ํ”ผ๊ทธ๋งˆ์—์„  ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Antd์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ทธ๋ฆฌ๋“œ ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐ˜์‘ํ˜• ์›น์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. Grid - Ant Design Child elements depending on the value of the start,center, end,space-between, space-around, which are defined in its parent node typesetting mode. ant.design antd์—์„œ Row์™€ Col ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•œ๋‹ค. ; Col ์ปดํฌ๋„ŒํŠธ๋“ค์€ Row ์ปดํฌ๋„ŒํŠธ์˜ ์ž์‹์ด ๋œ๋‹ค..
์ด์ „์— ํ˜ผ์ž ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊นƒ์— ์˜ฌ๋ฆด ๋•Œ, ํด๋ผ์ด์–ธํŠธ ๋””๋ ‰ํ† ๋ฆฌ์™€ ์„œ๋ฒ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ•˜๋‚˜์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๋ชจ์•„์„œ ์˜ฌ๋ ธ๋‹ค. ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ณด๊ธฐ์— ์กฐ๊ธˆ ๋ถˆํŽธํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ์—ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ๊ฐ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ๋ถ„๋ฆฌ๋ฅผ ํ•ด์„œ ๋”ฐ๋กœ ์ €์žฅํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ž„์˜๋กœ ์ด๋ฆ„์„ ์ง€์–ด์„œ ์“ฐ์ž๋ฉด, project โ”œโ”€โ”€ client โ”œโ”€โ”€ server ๋กœ ๋œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ๊ฐ project-client โ”œโ”€โ”€ .... project-server โ”œโ”€โ”€ .... ๋‘ ๊ฐœ์˜ ๋ณ„๋„์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ๋ถ„๋ฆฌ๋ฅผ ํ•  ์˜ˆ์ •. 1. ๊ฐ๊ฐ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋‚˜์˜ ๊ฒฝ์šฐ์—” topster-frontend, topster-backend ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. 2. git subtree split ๋ถ„๋ฆฌํ•  ํ”„๋กœ์ ํŠธ..
Node.js Express ์„œ๋ฒ„๋ฅผ AWS EC2 ์ƒ์— ๋ฐฐํฌ๋ฅผ ํ•ด๋ณด์ž. EC2์— git, npm, node.js ์„ค์น˜ ๋“ฑ์˜ ์‚ฌ์ „ ์„ธํŒ…์€ ์ƒ๋žตํ•˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค. Node.js ํŒŒ์ผ๋“ค๊ณผ ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋‘ ๋‚ด๋ ค๋ฐ›์€ ํ›„์— ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆด ์ˆ˜๋Š” ์žˆ๋‹ค. node index.js ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‚ด ์„œ๋ฒ„์˜ api๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ๋”๋‹ˆ, ๋ฆฌ์•กํŠธ ํ”„๋ก ํŠธ๊ฐ€ ๋ฐฐํฌ๋œ url์—๋Š” HTTPS ๋ณด์•ˆ์ด ๋˜์–ด ์žˆ์ง€๋งŒ, ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋‚ด ์„œ๋ฒ„์˜ url์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๋ฐ˜๋“œ์‹œ HTTPS ๊ฑธ๋ฆฐ ์ฃผ์†Œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. [Nginx] ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ, HTTPS ์ ์šฉ (Let's Encrypt) ์ฐธ๊ณ 1 1. ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ ์ด์ „์— ๊ฐ€๋น„์•„์—์„œ ๊ตฌ๋งค๋ฅผ ํ•ด๋†“๊ณ  ์•ˆ์“ฐ๋Š” ๋„๋ฉ”์ธ์ด ์žˆ์–ด์„œ, ๊ทธ ๋„๋ฉ”์ธ์— ๋‚ด IP๋ฅผ ์—ฐ๊ฒฐํ–ˆ๋‹ค. 10๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ..
AWS EC2 ์ƒ์— Nginx๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ–ˆ๋˜ ๊ฒฝํ—˜ ์ •๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ธ€. ์ด์ „์— ์„œ๋ธŒ ๋„๋ฉ”์ธ์— SSL ์ธ์ฆ๊นŒ์ง€ ๋งˆ์ณค๋‹ค. ๊ทธ๊ฑธ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค. [Nginx] ์„œ๋ธŒ ๋„๋ฉ”์ธ ์„ค์ •, HTTPS ์ ์šฉ ์ฐธ๊ณ 1 ์ฐธ๊ณ 2 'dev.9yujin.shop' ๊ทธ๋ฆฌ๊ณ  'prod.9yujin.shop' ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐœ์˜ ์„œ๋ธŒ ๋„๋ฉ”์ธ์„ ๋งŒ๋“ค์–ด๋ณด์ž. 1. ๊ฐ€๋น„์•„ DNS ๋ ˆ์ฝ”๋“œ ์ˆ˜์ • ๊ฐ€๋น„์•„์—์„œ ๋จผ์ € CNAME์œผ๋กœ ์„œ๋ฒ„ ๋„๋ฉ”์ธ์„ ๋“ฑ๋กํ•ด์ค€๋‹ค. dev์™€ prod ๋‘๊ฐœ๋ฅผ ์ƒ์„ฑ. 9yujin.tistory.com React ํŒŒ์ผ ๋นŒ๋“œ, ์„œ๋ฒ„ ์—…๋กœ๋“œ yarn ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ๋นŒ๋“œํ•ด์ค€๋‹ค. yarn build ํŒŒ์ผ์งˆ๋ผ๋ฅผ ์ด์šฉํ•ด EC2์— ๋นŒ๋“œํ•œ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ–ˆ๋‹ค. ๊ฒฝ๋กœ๋Š” /home/ubuntu/test/..
ํ•œ๊ทœ์ง„
'๐Ÿง‘‍๐Ÿ’ป ์งง์€ํ˜ธํก/~ 2021' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก