프로젝트/그랩 마켓 만들기

그랩마켓 만들기 4탄_Antd

반기반개퐝퐝 2025. 3. 17. 22:07

📌오늘의 커밋

  • 상품 업로드 페이지 작성
  • Antd 사용하기
  • Antd <Form>, <Input>

지난 글에 이어서 진행합니다.

2025.03.13 - [프로젝트/게시판 만들기] - 그랩 마켓 3탄.

 

그랩 마켓 3탄.

📌오늘의 커밋products 상세 페이지 작성& useEffect, useState 사용App.js에 header와 footer 넣기상세 페이지 CSS 작성지난 글에 이어서 진행합니다.2025.03.11 - [프로젝트/그랩 마켓 만들기] - 그랩 마켓 만들

haruharu-trybest.tistory.com

 

저희 프로젝트는 인프런의 강의를 기반으로 진행됩니다.

- 강의명 : 비전공자를 위한 진짜 입문 올인원 개발 부트캠프

https://www.inflearn.com/course/%EC%98%AC%EC%9D%B8%EC%9B%90-%EA%B0%9C%EB%B0%9C%ED%81%B4%EB%9E%98%EC%8A%A4/dashboard

 

비전공자를 위한 진짜 입문 올인원 개발 부트캠프 강의 | 그랩 - 인프런

그랩 | , [사진] 쉽고 다양하게 활용되는 Javascript 로 공부해요! Javascript(자바스크립트)는 웹을 시작으로 서버, 모바일, 머신러닝, 블록체인 등 다양한 분야에서 사용되는 프로그래밍 언어예요. 상

www.inflearn.com

 

 

시작합니다!

 


[1] 파일 트리

이전 파일 트리와 동일하기 때문에 이번에는 스킵합니다.

 

[2] 소스코드

 

upload/index.js

import { upload } from "@testing-library/user-event/dist/upload";
import { Button, Divider, Form, Input, InputNumber } from "antd";
import "./index.css";

function UploadPage() {
    const onSubmit = (values) => {};
    return (
        <div id="upload-container">
            <Form name="상품 업로드" onFinish={onSubmit}>
                <Form.Item
                    name={upload}
                    label={<div className="upload-label">상품 사진</div>}
                >
                    <div id="upload-img-placeholder">
                        <img src="/images/icons/camera.png" />
                        <span>이미지를 업로드해 주세요.</span>
                    </div>
                </Form.Item>
                <Divider />
                <Form.Item
                    label={<div className="upload-label">판매자명</div>}
                    name="seller"
                    rules={[
                        {
                            required: true,
                            message: "판매자 이름을 입력해 주세요.",
                        },
                    ]}
                >
                    <Input
                        className="upload-name"
                        size="large"
                        placeholder="이름을 입력해 주세요."
                    ></Input>
                </Form.Item>
                <Divider />
                <Form.Item
                    name="name"
                    label={<div className="upload-label">상품 이름</div>}
                    rules={[{ required: true, message: "상품 이름을 입력해 주세요." }]}
                >
                    <Input
                        className="upload-name"
                        size="large"
                        placeholder="상품 이름을 입력해 주세요."
                    />
                </Form.Item>
                <Divider />
                <Form.Item
                    name="price"
                    label={<div className="upload-label">상품 가격</div>}
                    rules={[{ required: true, message: "상품 가격을 입력해 주세요." }]}
                >
                    <InputNumber defaultValue={0} className="upload-price" size="large" />
                </Form.Item>
                <Divider />
                <Form.Item
                    name="description"
                    label={<div className="upload-label">상품 소개</div>}
                    rules={[{ required: true, message: "상품 소개를 입력해 주세요." }]}
                >
                    <Input.TextArea
                        size="large"
                        id="product-description"
                        showCount
                        maxLength={300}
                        placeholder="상품 소개를 적어주세요."
                    />
                </Form.Item>
                <Form.Item>
                    <Button id="submit-button" size="large" htmlType="submit">
                        상품 등록하기
                    </Button>
                </Form.Item>
            </Form>
        </div>
    );
}

export default UploadPage;

 

upload/index.css

#upload-container {
    padding-top: 36px;
}

#upload-img-placeholder {
    width: 200px;
    height: 200px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    border: 1px solid rgb(230, 230, 230);
    background: rgb(250, 250, 253);
    margin-left: 16px;
}

#upload-img-placeholder > img {
    width: 50px;
    height: 50px;
}

#upload-img-placeholder > span {
    font-size: 14px;
    color: rgb(195, 194, 204);
}

.upload-name {
    width: 300px;
}

.upload-label {
    font-size: 18px;
    width: 80px;
}

#product-description {
    height: 150px;
}

#submit-button {
    float: right;
    background-color: rgb(30, 120, 255);
    color: white;
    margin-top: 16px;
}

[3] 공부하기

📌 Ant Design (antd)란?

**Ant Design(antd)**는 React를 위한 UI 컴포넌트 라이브러리입니다.
📌 깔끔하고 현대적인 디자인을 쉽게 구현할 수 있도록 다양한 UI 컴포넌트를 제공합니다.
📌 버튼, 폼, 테이블, 모달, 아이콘 등 다양한 기능이 포함되어 있음
📌 기업용 대시보드, 관리 시스템 등에 자주 사용됨


🔹 1. Ant Design 설치하기

npm 사용

npm install antd
 

yarn 사용

 
yarn add antd
 

설치 후, 필요한 컴포넌트를 import해서 사용하면 됩니다.


🔹 2. Ant Design의 기본 사용법

1) 버튼 사용 예제

import React from "react";
import { Button } from "antd";

function App() {
  return (
    <div>
      <Button type="primary">Primary 버튼</Button>
      <Button>Default 버튼</Button>
      <Button type="dashed">Dashed 버튼</Button>
      <Button type="link">Link 버튼</Button>
    </div>
  );
}

export default App;
 

🧐 설명

  • Button 컴포넌트를 가져와서 사용.
  • type 속성을 변경하여 다양한 버튼 스타일 적용 가능.
    • primary → 주 버튼
    • default → 일반 버튼
    • dashed → 점선 버튼
    • link → 링크 스타일 버튼

🔹 3. Ant Design의 주요 컴포넌트

Ant Design에는 다양한 UI 컴포넌트가 포함되어 있습니다.

1) 아이콘 사용하기

import { HomeOutlined, SettingFilled } from "@ant-design/icons";

function App() {
  return (
    <div>
      <HomeOutlined style={{ fontSize: "24px", color: "blue" }} />
      <SettingFilled style={{ fontSize: "24px", color: "red" }} />
    </div>
  );
}

export default App;

📌 @ant-design/icons 패키지를 자동으로 설치하여 사용 가능
📌 다양한 아이콘을 제공하며, 스타일을 쉽게 조정할 수 있음.


2) 입력 폼 (Form, Input, Button)

import { Form, Input, Button } from "antd";

function LoginForm() {
  const onFinish = (values) => {
    console.log("폼 데이터:", values);
  };

  return (
    <Form onFinish={onFinish}>
      <Form.Item name="username" label="사용자명" rules={[{ required: true }]}>
        <Input placeholder="사용자명을 입력하세요" />
      </Form.Item>
      <Form.Item name="password" label="비밀번호" rules={[{ required: true }]}>
        <Input.Password placeholder="비밀번호를 입력하세요" />
      </Form.Item>
      <Form.Item>
        <Button type="primary" htmlType="submit">로그인</Button>
      </Form.Item>
    </Form>
  );
}

export default LoginForm;

📌 Form 컴포넌트를 활용하면 자동으로 유효성 검사 가능!
📌 rules={[{ required: true }]}를 사용하면 필수 입력값으로 설정 가능.


3) 테이블 (Table)

import { Table } from "antd";

const columns = [
  { title: "이름", dataIndex: "name", key: "name" },
  { title: "나이", dataIndex: "age", key: "age" },
  { title: "주소", dataIndex: "address", key: "address" },
];

const data = [
  { key: "1", name: "홍길동", age: 25, address: "서울" },
  { key: "2", name: "이순신", age: 30, address: "부산" },
];

function UserTable() {
  return <Table columns={columns} dataSource={data} />;
}

export default UserTable;

📌 테이블을 쉽게 구현할 수 있으며, 정렬, 검색, 필터 기능도 추가 가능!


4) 모달 (Modal)

import { useState } from "react";
import { Button, Modal } from "antd";

function App() {
  const [visible, setVisible] = useState(false);

  return (
    <div>
      <Button type="primary" onClick={() => setVisible(true)}>모달 열기</Button>
      <Modal
        title="안녕하세요!"
        visible={visible}
        onOk={() => setVisible(false)}
        onCancel={() => setVisible(false)}
      >
        <p>이것은 Ant Design 모달입니다.</p>
      </Modal>
    </div>
  );
}

export default App;

📌 모달을 쉽게 띄울 수 있으며, onOk와 onCancel 이벤트도 설정 가능!


5) 메시지 알림 (message, notification)

1) message 사용

import { Button, message } from "antd";

function App() {
  const showMessage = () => {
    message.success("성공 메시지!");
  };

  return <Button onClick={showMessage}>메시지 표시</Button>;
}

export default App;

📌 버튼을 클릭하면 메시지가 나타남!
📌 message.success(), message.error(), message.warning() 등 다양한 스타일 제공.


2) notification 사용

import { Button, notification } from "antd";

function App() {
  const showNotification = () => {
    notification.info({
      message: "알림 제목",
      description: "이것은 Ant Design 알림입니다.",
    });
  };

  return <Button onClick={showNotification}>알림 표시</Button>;
}

export default App;

📌 사용자에게 중요한 정보를 표시할 때 사용!
📌 notification.success(), notification.error(), notification.warning() 등 제공.


🔹 4. Ant Design을 사용할 때 주의할 점

  1. CSS 스타일 충돌 가능성
    • antd의 기본 CSS가 기존 프로젝트와 충돌할 수 있음.
    • 특정 스타일을 덮어쓰려면 override해야 함.
  2. 전체 CSS 불러오지 않기
    • 필요한 컴포넌트만 불러오는 것이 성능에 좋음.
    • 전체 CSS를 불러오면 용량이 커질 수 있음.
    • 권장 방식
       
  3. 커스텀 스타일 적용
    • antd 기본 스타일을 변경하고 싶다면 styled-components 또는 CSS-in-JS 사용 가능.
import "antd/dist/reset.css"; // 최신 버전에서는 필요 없음

🔹 5. Ant Design을 언제 사용할까?

빠르게 UI를 구축해야 할 때 (예: 대시보드, 관리 시스템)
일관된 디자인 시스템을 유지하고 싶을 때
복잡한 UI 컴포넌트(테이블, 폼, 모달 등)를 쉽게 구현하고 싶을 때


🔹 6. 정리

🚀 Ant Design(antd)은 React에서 빠르고 깔끔한 UI를 만들 수 있는 강력한 라이브러리!
✅ 다양한 UI 컴포넌트 제공 (버튼, 폼, 테이블, 모달, 아이콘 등)
✅ 복잡한 기능도 쉽게 구현 가능 (메시지, 알림, 드롭다운 등)
✅ 기업용 웹사이트, 대시보드, 관리 시스템 등에 적합

👉 Ant Design을 활용하면 개발 속도를 높이고, UI 디자인을 깔끔하게 정리할 수 있습니다! 😊 🚀

'프로젝트 > 그랩 마켓 만들기' 카테고리의 다른 글

그랩 마켓 만들기 5탄_Express  (0) 2025.03.22
그랩 마켓 3탄.  (0) 2025.03.13
그랩 마켓 만들기 2탄.  (1) 2025.03.11
그랩 마켓 만들기 1탄.  (1) 2025.03.10