์ „์ฒด ๊ธ€

์ „์ฒด ๊ธ€

    [Vite] aws-sdk๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ์‹คํŒจ ('request' is not exported...)

    [Vite] aws-sdk๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ์‹คํŒจ ('request' is not exported...)

    ์˜ค๋ฅ˜ 'request' is not exported by __vite-browser-external, imported by node_modules/@aws-sdk/xxxxx/node_modules/@aws-sdk/credential-provider-imds/dist/es/remoteProvider/httpRequest.js React viteJS๋กœ ์ž‘์—…ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œ ์‹œ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. AWS Amplify ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ด์Šˆ๋กœ ๋ณด์—ฌ์ง„๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• // vite.config.js import { defineConfig } from "vite"; export default defineConfig({ resolve: { alias: { "./runtimeConfig": "./runti..

    [CSS] transfrom ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ž์‹์š”์†Œ์—์„œ position: fixed๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ 

    position: fixed ์™€ transform transfrom ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ž์‹์š”์†Œ์—์„œ position: fixed๋ฅผ ์ ์šฉ์‹œํ‚ค๋ฉด ์˜๋„ํ•œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต ๋ทฐํฌํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์š”์†Œ๋ฅผ ์œ„์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด fixed๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, transfrom์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ๋‚ด๋ถ€์—์„œ๋Š” transfrom ์š”์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์น˜๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค. ์ด์œ ๋ฅผ w3 ๊ณต์‹๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. For elements whose layout is governed by the CSS box model, any value other than none for the transform property also causes the element to establish a containing block for..

    [Next.js] Dynamic Imports

    Next.js์—์„œ์˜ Lazy Loading Lazy Loading์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์š”๊ตฌ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œํ•ด์„œ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ „๋žต์ด๋‹ค. Next.js ์—์„œ Lazy Loading ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. 1. Dynamic Imports 2. React.lazy()์™€ Suspense React.lazy()์™€ Suspense React.lazy()๋Š” React์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ํ•„์š”ํ•œ ์‹œ์ ์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด์™€ ํ•จ๊ป˜ Suspense๋Š” lazy ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒดํ•ด์„œ ๋ณด์—ฌ์ค„ ์š”์†Œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. React ํ”„๋กœ์ ํŠธ ์‹œ React Router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€ ์ „ํ™˜ ๋กœ๋”ฉ..

    [Next.js] import ๊ฒฝ๋กœ์— @๋ณ„์นญ ์‚ฌ์šฉํ•˜๊ธฐ

    [Next.js] import ๊ฒฝ๋กœ์— @๋ณ„์นญ ์‚ฌ์šฉํ•˜๊ธฐ

    import ์ ˆ๋Œ€ ๊ฒฝ๋กœ & ๊ฒฝ๋กœ ๋ณ„์นญ next.js ํ”„๋กœ์ ํŠธ ์‹œ tsconfig.json ์˜ต์…˜์„ ํ†ตํ•ด ๊ฒฝ๋กœ๋ฅผ ๋ณ„์นญ์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. import ์ ˆ๋Œ€ ๊ฒฝ๋กœ // tsconfig.json / jsconfig.json { "compilerOptions": { "baseUrl": "./src" } } tsconfig.json ๋˜๋Š” jsconfig.json ํŒŒ์ผ์—์„œ baseUrl ์˜ต์…˜์— ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ๊ฐ€์ ธ์˜ฌ ๊ฒฝ๋กœ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. [ic]"baseUrl":"./src"[/ic] ์ž‘์„ฑ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด import ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. import ๊ฒฝ๋กœ ๋ณ„์นญ // tsconfig.json / jsconfig.json { "compilerOptions": { "paths": { "@/*": ["./sr..

    AWS S3๋กœ CRA ๋ฐฐํฌ + GitHub Actions๋กœ ์ž๋™ํ™” (2)

    AWS S3๋กœ CRA ๋ฐฐํฌ + GitHub Actions๋กœ ์ž๋™ํ™” (2)

    ๐Ÿ GitHub Actions๋กœ ๋ฐฐํฌ ์ž๋™ํ™” ํ”„๋กœ์ ํŠธ์— CICD.yml ํŒŒ์ผ ์ƒ์„ฑ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— .github/workflows ํด๋”๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ•ด๋‹น ๊ฒฝ๋กœ์— CICD.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์›๊ฒฉ์— ์—…๋กœ๋“œํ•œ๋‹ค. name: CI/CD on: push: branches: - main workflow_dispatch: jobs: cicd: runs-on: ubuntu-latest steps: - uses: actions/checkout@main - run: npm ci - run: npm run build - name: deploy to s3 uses: jakejarvis/s3-sync-action@master with: args: --delete env: AWS_S3_BUCKET: ${{ secrets.A..

    AWS S3๋กœ CRA ๋ฐฐํฌ + GitHub Actions๋กœ ์ž๋™ํ™” (1)

    AWS S3๋กœ CRA ๋ฐฐํฌ + GitHub Actions๋กœ ์ž๋™ํ™” (1)

    ๐Ÿ ์ •์  ์›น ์‚ฌ์ดํŠธ ๋ฐฐํฌ AWS ์ฝ˜์†”์—์„œ S3 ์„œ๋น„์Šค ์‚ฌ์šฉ AWS ์ฝ˜์†”๋กœ ์ด๋™ํ•œ๋‹ค. https://us-east-1.console.aws.amazon.com/console/home https://us-east-1.console.aws.amazon.com/console/home us-east-1.console.aws.amazon.com ๊ฒ€์ƒ‰์„ ํ†ตํ•ด S3 ์„œ๋น„์Šค๋กœ ์ด๋™ํ•œ๋‹ค. ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ ์ขŒ์ธก ๋ฉ”๋‰ด์—์„œ ๋ฒ„ํ‚ท ํƒญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฒ„ํ‚ท์€ ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ ๊ตฌํš์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ๋ฅผ ํ†ตํ•ด ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•œ๋‹ค. ๋ฒ„ํ‚ท ์ด๋ฆ„์™€ AWS ๋ฆฌ์ „ ์„ธํŒ…ํ•œ๋‹ค. ๊ฐ์ฒด ์†Œ์œ ๊ถŒ์€ ๊ถŒ์žฅํ•˜๋Š” ์„ธํŒ…์ธ ACL ๋น„ํ™œ์„ฑ์œผ๋กœ ๋‘”๋‹ค. ๋ฒ„ํ‚ท์˜ ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ ์„ค์ •์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์ฐจ๋‹จ์„ ํ•ด์ œํ•œ๋‹ค. ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ๋ฅผ ํ†ตํ•ด ..

    [์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์ธํ„ด์‹ญ] ์ˆ์—์„ธ์ด

    [์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์ธํ„ด์‹ญ] ์ˆ์—์„ธ์ด

    ์ง€์›ํ•˜๊ณ  ์‹ถ์€ ์ฐธ๊ฐ€๊ธฐ์—…์€ ์–ด๋””์ธ์ง€ ์ง€์›ํ•˜๊ณ  ์‹ถ์€ ์ฐธ๊ฐ€ ๊ธฐ์—…์€ ์Šค์œ„์น˜์›์ด๋‹ค. ๋น„๋Œ€๋ฉด ์˜จ๋ผ์ธ ํ™˜์ „ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํšŒ์‚ฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์ฑ„์šฉ ์ค‘์ด์—ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ ์ด ์ข‹์•˜๊ณ , ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ง€ํ–ฅํ•˜๊ณ  ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฌธํ™”๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์ ์ด ๊ธฐ๋Œ€๋œ๋‹ค. ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์ธํ„ด์‹ญ์—์„œ ๋ณธ์ธ์ด ์–ป๊ณ  ์‹ถ์€ ๊ฒƒ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„, CS ์Šคํ„ฐ๋””, ๋ฆฌ์•กํŠธ ์‹ฌํ™” ๋ฌธ๋ฒ• ๊ณต๋ถ€ ๋“ฑ ์ทจ์—… ์ „์— ํ•„์š”ํ•œ ๋ถ€๋ถ„๋“ค์„ ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ํฌ๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ์ธ ๊ฒƒ ๊ฐ™์•„์„œ ์ง€์›ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋˜ํ•œ ๊ฐ™์€ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ฐ€์ง„ ๋™๋ฃŒ๋“ค๊ณผ ์ธ์—ฐ์„ ๋งบ๊ณ  ํ•จ๊ป˜ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ทจ์—… ์ค€๋น„๋ฅผ ํ•˜๋Š” ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋‹ค. ์ตœ์ข…ํ•ฉ๊ฒฉ๊นŒ์ง€ ๋ช‡ ๊ฐœ ์ด์ƒ์˜ ์ด๋ ฅ์„œ ์ž‘์„ฑ ๋ฐ ์ œ์ถœํ•  ๊ฑด์ง€ ๊ฐ์˜ค ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์ธํ„ด์‹ญ..

    Node.js๋กœ CRA ์‹œ ๊ธฐ๋ณธ ํŒŒ์ผ๊ณผ ํด๋” ํ•œ ๋ฒˆ์— ์„ธํŒ…ํ•˜๊ธฐ

    Node.js๋กœ CRA ์‹œ ๊ธฐ๋ณธ ํŒŒ์ผ๊ณผ ํด๋” ํ•œ ๋ฒˆ์— ์„ธํŒ…ํ•˜๊ธฐ

    ๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ CRA ๋•Œ๋งˆ๋‹ค ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ธฐ๋ณธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํด๋”๋ง ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„์ด ์•„๊น๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋งค ๋ฒˆ component ๊ตฌ์กฐ๋‚˜ ํŒŒ์ผ์ด ๋ฐ”๋€Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ์„ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋„ ์• ๋งคํ–ˆ๋Š”๋ฐ, ์ด ์ž‘์—…๋“ค์„ Node.js์˜ file system์„ ์ด์šฉํ•ด์„œ ์ž๋™ํ™”๋ฅผ ํ•ด๋ณด์•˜๋‹ค. file system ๋ชจ๋“ˆ import Node.js์— ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” ํŒŒ์ผ์‹œ์Šคํ…œ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. const fs = require('fs'); ๋””๋ ‰ํ† ๋ฆฌ ์„ธํŒ… ์ƒ์„ฑํ•  ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ array์— ๋‹ด์•„ ์ž‘์„ฑํ•ด์ค€๋‹ค. const arrDirectory = [ 'src/apis', 'src/components/Shared/BtnLike', 'src/components/Shared/NotFound', 'src/components..

    [Deep Dive] 42์žฅ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

    [Deep Dive] 42์žฅ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

    ๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํƒœ์Šคํฌ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํƒœ์Šคํฌ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋ธ”๋กœํ‚น(์ž‘์—… ์ค‘๋‹จ)์ด ๋ฐœ์ƒํ•œ๋‹ค. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์— ์‹คํ–‰๋  ํƒœ์Šคํฌ๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ์‹์„ ๋™๊ธฐ ์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค. setTimeout ํ•จ์ˆ˜๋Š” ์ผ์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•œ ์ดํ›„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ setTimeout ์ดํ›„์˜ ํƒœ์Šคํฌ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ณ  ๊ณง๋ฐ”๋กœ ์‹คํ–‰ํ•œ๋‹ค. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ํ•ด๋„ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ๊ณง๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค. setTimeout๊ณผ setInterval, HTTP์š”์ฒญ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ..

    [Deep Dive] 22์žฅ this

    this ํ‚ค์›Œ๋“œ this๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜๋‹ค. this๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ arguments ๊ฐ์ฒด์™€ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ๋œ๋‹ค. ๋‹จ, this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’, ์ฆ‰ this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ์˜ํ•ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค. // ์ „์—ญ์—์„œ this → ์ „์—ญ ๊ฐ์ฒด window๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. console.log(this); //window // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this → ์ „์—ญ ๊ฐ์ฒด window๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. function test() { console.log(this); // window } // stric mode๊ฐ€ ์ ์šฉ๋œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ..