티스토리 뷰

Reference

이 프로젝트는 코딩애플 리액트 강의를 참고하여 제작되었습니다.

https://codingapple.com/course/react-basic/

 

React 리액트 기초부터 쇼핑몰 프로젝트까지!

  Next.js는 프론트엔드부터 서버까지 만들 수 있는 React기반 프레임워크입니다. 이것만 사용해도 풀스택 웹개발이 가능합니다.    Next.js 사용시 서버사이드 렌더링이 쉽기 때문에  React, Vue만 사

codingapple.com


Final build

https://stackblitz.com/edit/vitejs-vite-w8s3td76?file=src%2FApp.jsx

 

coding-apple-ecommerce-project - StackBlitz

Next generation frontend tooling. It's fast!

stackblitz.com


New project building

https://lshjju.tistory.com/104

 

StackBlitz web editor - 스택블리츠 웹 에디터

스택블리츠로 새 프로젝트 생성하기 https://stackblitz.com/ 로그인 방법 선택 대쉬보드에서 new project + 버튼 - 탭 모달 - frontend 탭 - 탭react javascript - 탭 바이트 리액트가 생성됩니다.프로젝트 생성 완

lshjju.tistory.com


Data

https://github.com/lshjju/data/blob/main/data2.json

 

data/data2.json at main · lshjju/data

Contribute to lshjju/data development by creating an account on GitHub.

github.com

 

이 프로젝트에서는 json파일을 데이터로 사용합니다.

프로젝트에 사용할 json 파일입니다.

이 파일을 본인의 깃허브에 업로드 하세요.


https://lshjju.tistory.com/178

 

github CDN json data raw file

깃허브에 json 데이터를 CDN으로 사용하는 방법입니다. 깃허브에 json 데이터 파일을 업로드 합니다. ex[ { "id" : 3, "title" : "Flowey", "content" : "only 5 inches", "price" : 120000 }, { "id" : 4, "title" : "Baby shoes", "cont

lshjju.tistory.com

 

데이터는 로우파일로 사용해야 합니다.

매뉴얼대로 로우파일을 세팅 합니다.


CDN img 

https://github.com/lshjju/cdn/tree/main/ca-shop

 

cdn/ca-shop at main · lshjju/cdn

Contribute to lshjju/cdn development by creating an account on GitHub.

github.com

 

이 프로젝트의 이미지 경로는 CDN을 사용할 것입니다.프로젝트에 사용할 img 파일입니다.

이 파일을 본인의 깃허브에 업로드 하세요.

압축파일 다운로드 방법

- https://github.com/lshjju/cdn/tree/main

이 패스로 가서 우측 코드 버튼 탭하면 압축파일 다운로드 버튼이 보입니다.

그걸 다운받아서 사용하면 편리 합니다.


https://lshjju.tistory.com/170

 

github CDN image absoute path

CDN 이미지를 깃허브에서 사용하고 싶다면 이렇게 하면 됩니다. 깃허브에 CDN 디렉토리를 하나 만듭니다.디렉토리에 이미지를 업로드 합니다.이미지를 엽니다.우클릭 - 새탭에서 이미지 열기우클

lshjju.tistory.com



Bootstarp install

https://lshjju.tistory.com/71

 

bootstrap install setting manual

Bootstrap? Bootstrap은 Twitter 개발자들이 만들었습니다.성능이 좋아서 현재도 지속적으로 관리되고 있는 오픈소스 프로젝트입니다. 프로젝트 진행 시 팀에 디자이너가 없는 경우에도 개발자가 괜찮

lshjju.tistory.com

 

유아이이 디자인 경험이 없는 개발자를 위해 본 프로젝트는 부트스트랩을 사용합니다.

부트스트랩만 있다면 유아이디자인 스트레스에서 자유로워 집니다.

위 매뉴얼에서

For React install 

부분을 보고 설치 합니다.

설치 후 펑션 앱에서 버튼 하나 만들어서 테스트 추천 합니다.

 

본 프로젝트는 모바일온리 유아이를 세팅 합니다.


Completion

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
      rel="stylesheet"
      integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB"
      crossorigin="anonymous"
    />
    <script
      src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"
      integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI"
      crossorigin="anonymous"
    ></script>
    <title>Vite + React</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>

 

root/index.html

 

 

import { useState } from 'react';
import reactLogo from './assets/react.svg';
import viteLogo from '/vite.svg';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.bundle.min.js';

function App() {
  return (
    <div className="container">
      <button className="btn btn-primary">클릭하세요</button>
    </div>
  );
}

export default App;

 

 

root/src/App.jsx


TEST 실행

버튼이 잘 출력 되는지 체크 합니다.

이 버튼이 잘 보인다면 부트스트랩이 설치에 성공한 것입니다.

축하 합니다!

 


React.js Router DOM

https://lshjju.tistory.com/135

 

React.js Router DOM - 리액트 라우터 돔

React Router DOM의 주요 기능 React는 '단일 페이지 애플리케이션(SPA)'을 만드는 데 주로 사용됩니다. SPA는 기본적으로 HTML 파일 하나만을 로드한 뒤, JavaScript를 통해 화면의 내용을 동적으로 바꾸는

lshjju.tistory.com

 

리액트에서 네브와 링크를 만들려면 라우터돔이 당연히 필요합니다.

맨 아래에 보면 터미널 설치 코드가 있습니다.

그 매뉴얼대로 리액트 라우터 돔 설치 합니다.


 


브라우저라우터와 네브 유아이 설치 합니다.


import { BrowserRouter } from "react-router-dom";

main.jsx

 

리액트라우터 돔 설치 합니다.

<StrictMode>

    <BrowserRouter>

        <App />

    </BrowserRouter>

</StrictMode>

 

앱을 브라우저라우터로 래핑합니다.

이제부터 앱은 브라우저라우터를 사용할 수 있습니다.


<div className="App">

     <button className="btn btn-primary">클릭하세요</button>

</div>

클래스 네임 변경 합니다.


import { Link } from "react-router-dom";

링크 임포트 합니다.


https://getbootstrap.com/docs/5.3/components/navbar/#nav

 

Navbar

Documentation and examples for Bootstrap’s powerful, responsive navigation header, the navbar. Includes support for branding, navigation, and more, including support for our collapse 

 

function App() {
  return (
    <div className="App">
      <nav class="navbar navbar-expand-lg bg-body-tertiary">
        <div class="container-fluid">
          <a class="navbar-brand" href="#">
            Navbar
          </a>
          <button
            class="navbar-toggler"
            type="button"
            data-bs-toggle="collapse"
            data-bs-target="#navbarNav"
            aria-controls="navbarNav"
            aria-expanded="false"
            aria-label="Toggle navigation"
          >
            <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav">
              <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="#">
                  Home
                </a>
              </li>
              <li class="nav-item">
                <a class="nav-link" href="#">
                  Features
                </a>
              </li>
              <li class="nav-item">
                <a class="nav-link" href="#">
                  Pricing
                </a>
              </li>
              <li class="nav-item">
                <a class="nav-link disabled" aria-disabled="true">
                  Disabled
                </a>
              </li>
            </ul>
          </div>
        </div>
      </nav>
    </div>
  );
}

 

이제부터 부트스트랩 유아이를 설치할 것입니다.

이 과정은 어렵지 않습니다.

하지만 약간 지루하고 복잡합니다.

케이참을성으로 설치해 보겠습니다.

위 유알엘에 있는 부트스트랩 네브를 위처럼 페이스트 합니다.


      <nav class="navbar navbar-expand-lg bg-body-tertiary">
        <div class="container-fluid">
          <a class="navbar-brand" href="#">
            Navbar
          </a>
          <button
            class="navbar-toggler"
            type="button"
            data-bs-toggle="collapse"
            data-bs-target="#navbarNavAltMarkup"
            aria-controls="navbarNavAltMarkup"
            aria-expanded="false"
            aria-label="Toggle navigation"
          >
            <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
            <div class="navbar-nav">
              <Link to="/" class="nav-link active" aria-current="page">
                Home
              </Link>
              <Link to="/" class="nav-link active" aria-current="page">
                Detail
              </Link>
              <Link to="/" class="nav-link active" aria-current="page">
                about
              </Link>
            </div>
          </div>
        </div>
      </nav>

 

페이스트 했다면 그 다음 해야 할 일은 이 프로젝트에 맞게 코드를 수정하는 일입니다.

코드를 프로젝트에 맞게 수정 합니다.

블로거가 작성한 위 코드를 참고해서 기존 페이스트 코드를 수정해 보겠습니다.


test

네브가 잘 설치되었는지 체크 합니다.

브라우저 넓이에 따라 다른 유아이가 출력 됩니다.


Completion

 

main.jsx

import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App.jsx';
import { BrowserRouter } from 'react-router-dom';

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>
);

 

 

 

App.jsx

import { useState } from 'react';
import reactLogo from './assets/react.svg';
import viteLogo from '/vite.svg';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.bundle.min.js';
import { Link } from "react-router-dom";

function App() {
  return (
    <div className="App">
      <nav class="navbar navbar-expand-lg bg-body-tertiary">
        <div class="container-fluid">
          <a class="navbar-brand" href="#">
            Navbar
          </a>
          <button
            class="navbar-toggler"
            type="button"
            data-bs-toggle="collapse"
            data-bs-target="#navbarNavAltMarkup"
            aria-controls="navbarNavAltMarkup"
            aria-expanded="false"
            aria-label="Toggle navigation"
          >
            <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
            <div class="navbar-nav">
              <Link to="/" class="nav-link active" aria-current="page">
                Home
              </Link>
              <Link to="/" class="nav-link active" aria-current="page">
                Detail
              </Link>
              <Link to="/" class="nav-link active" aria-current="page">
                about
              </Link>
            </div>
          </div>
        </div>
      </nav>
    </div>
  );
}

export default App;

 

 

 

 

 


메인/상품/푸터 유아이를 빌딩 합니다.

 

index.css 코드를 모두 삭제 합니다.

 

 

App.jsx

기본 코드 올 삭제 합니다.

위 코드 추가 합니다.

.App {
  font-family: sans-serif;
  text-align: center;
}
.main-bg {
  height: 300px;
  background-image: url("https://raw.githubusercontent.com/lshjju/cdn/refs/heads/main/ca-shop/s-main2.PNG");
  background-size: cover;
  background-position: center;
}

 

 

 

네브태그 아래에 메인 디브를 추가 합니다.

<div className="main-bg"></div>

 

 

https://getbootstrap.com/docs/5.3/utilities/flex/#direction

 

Flex

Quickly manage the layout, alignment, and sizing of grid columns, navigation, components, and more with a full suite of responsive flexbox utilities. For more complex implementations, custom CSS may be necessary.

 

 

 

메인 디브 아래에 부트스트랩 플렉스 박스를 설치 합니다.

<div class="d-flex flex-row mb-3">
  <div class="p-2">Flex item 1</div>
  <div class="p-2">Flex item 2</div>
  <div class="p-2">Flex item 3</div>
</div>

 

코드를 수정 합니다.

위에 타이틀도 살짝 추가 합니다.

	<h1 className="my-5">Nike shop</h1>

	<div className="d-flex flex-column mb-3">
        <div className="p-2">
          <img
            src="https://raw.githubusercontent.com/lshjju/cdn/refs/heads/main/ca-shop/s1.PNG"
            width="80%"
          />
          <h4 className="my-3">title</h4>
          <p>price</p>
        </div>
        <div className="p-2">
          <img
            src="https://raw.githubusercontent.com/lshjju/cdn/refs/heads/main/ca-shop/s2.PNG"
            width="80%"
          />
          <h4 className="my-3">title</h4>
          <p>price</p>
        </div>
        <div className="p-2">
          <img
            src="https://raw.githubusercontent.com/lshjju/cdn/refs/heads/main/ca-shop/s3.PNG"
            width="80%"
          />
          <h4 className="my-3">title</h4>
          <p>price</p>
        </div>
      </div>

 

 

 

 


https://getbootstrap.com/docs/5.3/components/card/#header-and-footer

 

Cards

Bootstrap’s cards provide a flexible and extensible content container with multiple variants and options.

 

 

<div class="card">
  <div class="card-header">
    Featured
  </div>
  <div class="card-body">
    <h5 class="card-title">Special title treatment</h5>
    <p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
    <a href="#" class="btn btn-primary">Go somewhere</a>
  </div>
</div>

 

상품 아래에 부트스트랩 푸터를 세팅 합니다.

 

 

      <div class="card m-5">
        <div class="card-header">Featured</div>
        <div class="card-body">
          <h5 class="card-title">Special title treatment</h5>
          <p class="card-text">
            With supporting text below as a natural lead-in to additional
            content.
          </p>
          <a href="#" class="btn btn-primary">
            Go somewhere
          </a>
        </div>
      </div>

 

코드를 수정 합니다.

마진도 좀 수정 합니다.

 


test

뷰를 체크 합니다.

 


Completion

 

App.css

.App {
  font-family: sans-serif;
  text-align: center;
}
.main-bg {
  height: 300px;
  background-image: url("https://raw.githubusercontent.com/lshjju/cdn/refs/heads/main/ca-shop/s-main2.PNG");
  background-size: cover;
  background-position: center;
}

 

 

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
      rel="stylesheet"
      integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB"
      crossorigin="anonymous"
    />
    <script
      src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"
      integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI"
      crossorigin="anonymous"
    ></script>
    <title>Vite + React</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>

 

 

main.jsx

import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App.jsx';
import { BrowserRouter } from 'react-router-dom';

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>
);

 

 

 

App.jsx

import { useState } from 'react';
import reactLogo from './assets/react.svg';
import viteLogo from '/vite.svg';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.bundle.min.js';
import { Link } from 'react-router-dom';

function App() {
  return (
    <div className="App">
      
      <nav class="navbar navbar-expand-lg bg-body-tertiary">
        <div class="container-fluid">
          <a class="navbar-brand" href="#">
            Navbar
          </a>
          <button
            class="navbar-toggler"
            type="button"
            data-bs-toggle="collapse"
            data-bs-target="#navbarNavAltMarkup"
            aria-controls="navbarNavAltMarkup"
            aria-expanded="false"
            aria-label="Toggle navigation"
          >
            <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
            <div class="navbar-nav">
              <Link to="/" class="nav-link active" aria-current="page">
                Home
              </Link>
              <Link to="/" class="nav-link active" aria-current="page">
                Detail
              </Link>
              <Link to="/" class="nav-link active" aria-current="page">
                about
              </Link>
            </div>
          </div>
        </div>
      </nav>

      <div className="main-bg"></div>
      
      <h1 className="my-5">Nike shop</h1>

      <div className="d-flex flex-column mb-3">
        <div className="p-2">
          <img
            src="https://raw.githubusercontent.com/lshjju/cdn/refs/heads/main/ca-shop/s1.PNG"
            width="80%"
          />
          <h4 className="my-3">title</h4>
          <p>price</p>
        </div>
        <div className="p-2">
          <img
            src="https://raw.githubusercontent.com/lshjju/cdn/refs/heads/main/ca-shop/s2.PNG"
            width="80%"
          />
          <h4 className="my-3">title</h4>
          <p>price</p>
        </div>
        <div className="p-2">
          <img
            src="https://raw.githubusercontent.com/lshjju/cdn/refs/heads/main/ca-shop/s3.PNG"
            width="80%"
          />
          <h4 className="my-3">title</h4>
          <p>price</p>
        </div>
      </div>

      <div class="card m-5">
        <div class="card-header">Featured</div>
        <div class="card-body">
          <h5 class="card-title">Special title treatment</h5>
          <p class="card-text">
            With supporting text below as a natural lead-in to additional
            content.
          </p>
          <a href="#" class="btn btn-primary">
            Go somewhere
          </a>
        </div>
      </div>

    </div>
  );
}

export default App;

 

 

 

참고사이트 : ca01

 

ca01

Reference이 프로젝트는 코딩애플 리액트 강의를 참고하여 제작되었습니다.https://codingapple.com/course/react-basic/ React 리액트 기초부터 쇼핑몰 프로젝트까지! Next.js는 프론트엔드부터 서버까지 만들 수

lshjju.tistory.com

 

'프로그래밍언어 > 리엑트' 카테고리의 다른 글

[React] Hash URL  (0) 2026.03.21
[React] 리액트 라우터 돔  (0) 2026.03.21
[React] 리덕스 툴킷  (0) 2026.03.08
[React] react-redux  (0) 2026.03.08
[React] useReducer  (0) 2026.03.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함