React Design Pattern ๐ŸŽจ

์ดํฌ์ œยท2021๋…„ 3์›” 2์ผ
143

๋ฆฌ์•กํŠธ์—์„œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. Presentational and Container Component Pattern

โžก๏ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ์„ ๋ถ„๋ฆฌํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

โœ๏ธ Container Components : how things work

  • ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ฃผ๋กœ ๋ฐ์ดํ„ฐ fetch๊ฐ€ ์ด๋ฃจ์–ด ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    • Redux๋ฅผ ์ด์šฉํ•ด ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด dispatch ๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฐ๊ด€์ด ์žˆ๋Š” ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

  • DOM Markup ์ด๋‚˜ ์Šคํƒ€์ผ(css)๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • Presentational ๋˜๋Š” Container Components ์— callback ํ•จ์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • statefulํ•œ ๊ฒฝํ–ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.


โœ๏ธ Presentational Components (FC) : how things look

โžก๏ธ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ๋งŒ์„ ๋‹ด๋‹นํ•˜๋Š” Components ์ž…๋‹ˆ๋‹ค.

  • DOM markup ๊ณผ style(css)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • props๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋‚˜ callbacks ๋ฐ›์•„ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ทฐ์— ํ•„์š”ํ•œ state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • state, lifecycle, Performance optimization์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด Functional component๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • statelessํ•œ ๊ฒฝํ–ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.


โœ๏ธ ์˜ˆ์‹œ

  • Container Component
    โžก๏ธ ๋ฐ์ดํ„ฐ๋ฅผ Presenter Component์— ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.
// CommentListContainer.js
import React from "react";
import CommentList from "./CommentList";

class CommentListContainer extends React.Component {
  constructor() {
    super();
    this.state = { comments: [] };
  }

  componentDidMount() {
    fetch("/my-comments.json")
      .then(res => res.json())
      .then(comments => this.setState({ comments }));
  }

  render() {
    return <CommentList comments={this.state.comments} />;
  }
}
  • Presenter Component
    โžก๏ธ Container Component์—์„œ ๋ฐ›์€
// CommentListPresenter.js
import React from "react";

const Commentlist = comments => (
  <ul>
    {comments.map(({ body, author }) => (
      <li>
        {body}-{author}
      </li>
    ))}
  </ul>

โœ๏ธ ์žฅ์ 

  1. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ํŒจํ„ด ๋ฐฉ์‹์œผ๋กœ Component ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž‘์—…์„ ํ•˜๋Š” ์•ฑ ๊ณผ UI ๋ฅผ ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์žฌ ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ์˜จ ์—ฌ๋Ÿฌ ์ƒํƒœ(state) ๋ผ ํ• ์ง€๋ผ๋„, ์ด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ™์€ Presentational Component ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋•Œ, ๊ฐ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Container Component ๋ฅผ ๋งŒ๋“ค์–ด ์ด๋ฅผ ๋˜ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Markup ์ž‘์—…์ด ํŽธํ•˜๋‹ค.

์ด ํŒจํ„ด์„ ์ œ๋Œ€๋กœ ์ ์šฉํ•˜๋ ค๋ฉด Layout Component ๋ฅผ ๋ณ„๋„๋กœ ์ถ”์ถœํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ Layout Component ๋ฅผ ์ถ”์ถœํ•˜๊ฒŒ ๋˜๋ฉด ๋˜‘๊ฐ™์€ Layout ๋งˆํฌ์—…์„ ์—ฌ๋Ÿฌ Container Component ์— ์ž‘์„ฑํ•˜๋Š” ์ž‘์—…์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



2. Atomic Design Pattern

โžก๏ธ ๋””์ž์ธ ์š”์†Œ๋“ค์„ ๋‚˜๋ˆ„์–ด ํŒŒ์•…ํ•˜๊ณ  ์ด ์š”์†Œ๋“ค์ด ์กฐํ•ฉ๋˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด์„œ ๋””์ž์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Atomic Design ์—์„œ๋Š” 5๊ฐœ์˜ ๊ตฌ๋ถ„๋œ ๋‹จ๊ณ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • Atoms
  • Molecules
  • Organisms
  • Templates
  • Pages

๊ฐ๊ฐ ๊ฐœ๋ณ„์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿง

โš›๏ธ Atoms

โžก๏ธ ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ์š”์†Œ. ๋ณธ์ธ ์ž์ฒด์˜ ์Šคํƒ€์ผ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ๊ณณ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์Šคํƒ€์ผ์€ ์ ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์›์ž๋Š” form labels, inputs, buttons์™€ ๊ฐ™์€ basic hmtl elements๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ)

// src/components/atoms/button/index.js

const Button = ({ type = 'button', children = '' }) => (
  <button type={type}>{children}</button>   // ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” html ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.
)


โš›๏ธ Molecules

โžก๏ธ Atoms๊ฐ€ ๋ชจ์—ฌ์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ์š”์†Œ

Atom ๋‹จ์œ„์ธ input label, input, buttoms๋ฅผ ํ•ฉ์ณ ์ƒˆ๋กœ์šด ์˜๋ฏธ์žˆ๋Š” ๋‹จ์œ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฌด์–ธ๊ฐ€ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


โš›๏ธ Organisms: ๋ถ„์ž๋“ค์˜ ๋ชจ์Œ

โžก๏ธ Organisms(์œ ๊ธฐ์ฒด)๋Š” ๋ถ„์ž๋“ค์˜ ๋ชจ์Œ์œผ๋กœ ๋น„๊ต์  ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Organisms(์œ ๊ธฐ์ฒด)๋Š” ์„œ๋กœ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ molecules(๋ถ„์ž)๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ๊ธฐ์ฒด๋Š” ๋กœ๊ณ , ๋ฉ”์ธ ๋‚ด๋น„๊ฒŒ์ด์…˜, ๊ฒ€์ƒ‰, ์†Œ์…œ ๋ฏธ๋””์–ด ์ฑ„๋„๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ(molecules)๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โš›๏ธ Templates: ์œ ๊ธฐ์ฒด๋“ค์„ ๋ชจ์•„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ƒ์„ฑ, ์Šคํƒ€์ผ๋ง์— ์ง‘์ค‘ํ•œ ๋‹จ์œ„

โžก๏ธ Templates์˜ ์ค‘์š”ํ•œ ํŠน์„ฑ์€ ํŽ˜์ด์ง€์˜ ์ตœ์ข… ๋‚ด์šฉ๋ณด๋‹ค๋Š” ํŽ˜์ด์ง€์˜ ๊ธฐ๋ณธ ๋‚ด์šฉ ๊ตฌ์กฐ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


โš›๏ธ Pages: ์‹ค์ œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑ

โžก๏ธ ํŽ˜์ด์ง€๋Š” ์‹ค์ œ ๋Œ€ํ‘œ์ ์ธ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐฐ์น˜๋œ UI์˜ ๋ชจ์Šต์„ ๋ณด์—ฌ์ฃผ๋Š” ํ…œํ”Œ๋ฆฟ์˜ ํŠน์ • ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.

Pages ๋‹จ์œ„์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ๊ด€๋ฆฌ(๋ฆฌ๋•์Šค, ๋ชจ๋ฒก์Šค ๋“ฑ๋“ฑ)๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ถ„์ž, ์œ ๊ธฐ์ฒด, ํ…œํ”Œ๋ฆฟ ๋‹จ์œ„์—์„œ ์ปดํฌ๋„Œํ‹‘๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๊ฑด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. (input๊ณผ onChange๋ฅผ useState๋กœ ๊ด€๋ฆฌํ•˜๋Š”๋“ฑ์˜ ์ƒํƒœ๊ด€๋ฆฌ)


3. ๋””์ž์ธ ํŒจํ„ด ์ ์šฉํ•ด๋ณด๊ธฐ โŒจ๏ธ

๐ŸŽจ Presentational and Container Component Pattern

โžก๏ธ Class 101 ์‚ฌ์ดํŠธ์˜ Class ์ƒ์„ธ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. => ์ฐธ๊ณ  ๋งํฌ

ํŽ˜์ด์ง€ ๋‚ด์—์„œ ํ›„๊ธฐ, ํด๋ž˜์Šค ์†Œ๊ฐœ, ์ปฌ๋ฆฌํ˜๋Ÿผ, ํ‚คํŠธ ์†Œ๊ฐœ, ํฌ๋ฆฌ์—์ดํ„ฐ, ์ปค๋ฎค๋‹ˆํ‹ฐ, ํ™˜๋ถˆ ์ •์ฑ…, ์ถ”์ฒœ ํ•ญ๋ชฉ ๋ณ„๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.

๊ฐ ์ปดํฌ๋„ŒํŠธ ๋ณ„๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์—๋Š” ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” Container์™€ ํ™”๋ฉด์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” Presenter, ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ€์ผ ํŒŒ์ผ๋กœ ๋‚˜๋ˆ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ ์ „์ฒด ์Šคํƒ€์ผ๋ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์€ globalStyle ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” store ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์— reducers, sagas ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ์žก์•˜์Šต๋‹ˆ๋‹ค.

Presentational and Container Component Pattern์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค๊ณ„ํ•จ์œผ๋กœ์จ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํฐ ์žฅ์ ์ด๋ผ๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.


.
โ””โ”€โ”€ src
    โ”œโ”€โ”€ @types  // ํƒ€์ž…์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ณณ
    โ”‚   โ”œโ”€โ”€ dataTypes.ts
    โ”‚   โ””โ”€โ”€ handlerTypes.ts
    โ”œโ”€โ”€ App.tsx
    โ”œโ”€โ”€ Modal
    โ”‚	โ”œโ”€โ”€ ModalContainer.tsx
    โ”‚	โ”œโ”€โ”€ ModalPresenter.tsx
    โ”‚	โ””โ”€โ”€ Modal.style.ts
    โ”‚	
    โ”œโ”€โ”€ components 
    โ”‚   โ”œโ”€โ”€ ClassInformation
    โ”‚   โ”‚   โ”œโ”€โ”€ ClassInformation.style.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ ClassInformationContainer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ ClassInformationPresenter.tsx
    โ”‚   โ”œโ”€โ”€ Common
    โ”‚   โ”‚   โ”œโ”€โ”€ Footer
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Footer.style.ts
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Footer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ Header
    โ”‚   โ”‚       โ”œโ”€โ”€ Header.style.ts
    โ”‚   โ”‚       โ””โ”€โ”€ Header.tsx
    โ”‚   โ”œโ”€โ”€ Community
    โ”‚   โ”‚   โ”œโ”€โ”€ Community.style.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ CommunityContainer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ ContainerPresenter.tsx
    โ”‚   โ”œโ”€โ”€ Creator
    โ”‚   โ”‚   โ”œโ”€โ”€ Creator.style.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ CreatorContainer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ CreatorPresenter.tsx
    โ”‚   โ”œโ”€โ”€ Curriculum
    โ”‚   โ”‚   โ”œโ”€โ”€ Curriculum.style.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ CurriculumContainer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ CurriculumPresenter.tsx
    โ”‚   โ”œโ”€โ”€ Kit
    โ”‚   โ”‚   โ”œโ”€โ”€ Kit.style.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ KitContainer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ KitPresenter.tsx
    โ”‚   โ”œโ”€โ”€ Recommend
    โ”‚   โ”‚   โ”œโ”€โ”€ Recommend.style.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ RecommendCotainer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ RecommnedPresenter.tsx
    โ”‚   โ”œโ”€โ”€ RefundPolicy
    โ”‚   โ”‚   โ”œโ”€โ”€ RefundPolicy.style.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ RefundPolicyContainer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ RefundPolicyPresenter.tsx
    โ”‚   โ”œโ”€โ”€ Review
    โ”‚   โ”‚   โ”œโ”€โ”€ Review.style.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ ReviewContainer.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ ReviewPresenter.tsx
    โ”‚   โ””โ”€โ”€ SideNavigationBar
    โ”‚       โ”œโ”€โ”€ SideNavigationBar.style.ts
    โ”‚       โ”œโ”€โ”€ SideNavigationBarContainer.tsx
    โ”‚       โ””โ”€โ”€ SideNavigationBarPresenter.tsx
    โ”œโ”€โ”€ api
    โ”‚   โ””โ”€โ”€ classInformation.ts
    โ”œโ”€โ”€ assets  // ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ ๊ด€๋ฆฌ
    โ”œโ”€โ”€ data
    โ”‚   โ””โ”€โ”€ classInformation.json
    โ”œโ”€โ”€ globalStyle
    โ”‚   โ””โ”€โ”€ globalStyle.ts
    โ”œโ”€โ”€ index.tsx
    โ”œโ”€โ”€ react-app-env.d.ts
    โ””โ”€โ”€ store
        โ”œโ”€โ”€ reducers
        โ”‚   โ”œโ”€โ”€ ClassInformation.ts
        โ”‚   โ””โ”€โ”€ index.ts
        โ””โ”€โ”€ sagas
            โ”œโ”€โ”€ ClassInformation.ts
            โ””โ”€โ”€ index.ts

๐ŸŽจ Atomic Design Pattern

โžก๏ธ ๋™์ผํ•˜๊ฒŒ Class 101 ์‚ฌ์ดํŠธ์—์„œ์˜ ํด๋ž˜์Šค ์ƒ์„ธ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

atomic design pattern์œผ๋กœ ํ”„๋กœ์ ํŠธ ์„ค๊ณ„๋ฅผ ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. atomic design pattern์—์„œ๋Š” ์ตœ์†Œ ๋‹จ์œ„์ธ atoms๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ์„ ํ•ด์•ผ๋  ์ง€๋„ ๊ณ ๋ คํ•ด๋ด์•ผ ํ•˜๊ณ  ๊ฐ ๊ตฌ์กฐ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ธ์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ๊ด€๋ฆฌ์— ๊ด€ํ•˜์—ฌ ๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์œผ๋กœ๋Š” ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ oraganisms์—์„œ ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

์ตœ์ƒ์œ„ ๊ตฌ์กฐ์ธ pages์—์„œ ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด props๋ฅผ ํ†ตํ•ด์„œ ํ•˜์œ„ ๊ตฌ์กฐ์— ๊ณ„์† ๋‚ด๋ ค์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ํ”„๋กœ์ ํŠธ ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํšŒ์‚ฌ์˜ ํŒ€๋งˆ๋‹ค ์œ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


.
โ””โ”€โ”€ src
    โ”œโ”€โ”€ @types
    โ”‚   โ”œโ”€โ”€ dataTypes.ts
    โ”‚   โ””โ”€โ”€ handlerTypes.ts
    โ”œโ”€โ”€ App.tsx
    โ”œโ”€โ”€ Modal
    โ”‚   โ”œโ”€โ”€ atoms
    โ”‚   โ”œโ”€โ”€ molecules
    โ”‚   โ”œโ”€โ”€ organisms
    โ”‚   โ””โ”€โ”€ templates
    โ”œโ”€โ”€ _components
    โ”‚   โ”œโ”€โ”€ UI
    โ”‚   โ”‚   โ”œโ”€โ”€ atoms
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Button
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Button.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Icon
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Icon.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Image
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Image.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Input
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Input.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Text
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Test.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.ts
    โ”‚   โ”‚   โ”œโ”€โ”€ molecules
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Banner
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Banner.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ClassIntroduceContent
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ClassIntroduceContent.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ClassIntroduceTitle
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ClassIntroduceTitle.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ClassSimpleInforrmation
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ClassSimpleInformation.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CommentInput
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CommentInput.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CommunityTitle
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CommunityTitle.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CurriculumContentList
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CurriculumContentList.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CurriculumTitle
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CurriculumTitle.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ FooterInformation
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ FooterInformation.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ KitIntroduceContent
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ KitIntroduceContent.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ KitIntroduceTitle
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ KitIntroduceTitle.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RecommendInformation
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RecommendInformation.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RecommendPrice
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RecommendPrice.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ReviewGrid
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ReviewGrid.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ReviewList
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ReviewList.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SearchInput
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SearchInput.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SectionNavBar
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SectionNavBar.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SideNavBarButton
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SideNavBarButton.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SideNavBarOption
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SideNavBarOption.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SideNavBarPrice
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SideNavBarPrice.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SideNavbarTitle
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SideNavbarTitle.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ UserInformation
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ UserInformation.style.ts
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.ts
    โ”‚   โ”‚   โ””โ”€โ”€ organisms
    โ”‚   โ”‚       โ”œโ”€โ”€ ClassIntroduceSection
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ ClassIntroduceSection.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ”œโ”€โ”€ ClassKitIntroduceSection
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ ClassKitIntroductSection.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ”œโ”€โ”€ CommentSection
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ CommentSection.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ”œโ”€โ”€ CommunitySection
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ CommunitySection.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ”œโ”€โ”€ CurriculumSection
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ CurriculumSection.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ”œโ”€โ”€ Footer
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ Footer.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ”œโ”€โ”€ Header
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ Header.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ”œโ”€โ”€ RecommendSection
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ RecommendSection.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ”œโ”€โ”€ SideNavBarSection
    โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ SideNavNarSection.style.ts
    โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚       โ””โ”€โ”€ index.ts
    โ”‚   โ”œโ”€โ”€ pages
    โ”‚   โ”‚   โ”œโ”€โ”€ ClassDetail
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ClassDetail.style.ts
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚   โ””โ”€โ”€ templates
    โ”‚       โ”œโ”€โ”€ ClassInformation
    โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚       โ”œโ”€โ”€ Community
    โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚       โ”œโ”€โ”€ SideNavBar
    โ”‚       โ”‚   โ””โ”€โ”€ index.tsx
    โ”‚       โ””โ”€โ”€ index.ts
    โ”œโ”€โ”€ api
    โ”‚   โ””โ”€โ”€ classInformation.ts
    โ”œโ”€โ”€ assets
    โ”œโ”€โ”€ data
    โ”‚   โ””โ”€โ”€ classInformation.json
    โ”œโ”€โ”€ globalStyle
    โ”‚   โ””โ”€โ”€ globalStyle.ts
    โ”œโ”€โ”€ index.tsx
    โ”œโ”€โ”€ react-app-env.d.ts
    โ””โ”€โ”€ store
        โ”œโ”€โ”€ reducers
        โ”‚   โ”œโ”€โ”€ ClassInformation.ts
        โ”‚   โ””โ”€โ”€ index.ts
        โ””โ”€โ”€ sagas
            โ”œโ”€โ”€ ClassInformation.ts
            โ””โ”€โ”€ index.ts

Reference

Atomic Design

profile
์˜ค๋Š˜๋งŒ ์—ด์‹ฌํžˆ ์‚ด๊ณ  ๋ชจ๋“  ๊ฑธ ๋‚จ๊ธฐ๋˜ ํ›„ํšŒ๋Š” ๋‚จ๊ธฐ์ง€ ๋ง์ž

15๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 3์›” 14์ผ

๋””์ž์ธ ํŒจํ„ด์ด๋ผ๋Š” ์ œ๋ชฉ๋•Œ๋งค ๋””์ž์ธ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๊ธฐ๋Œ€ํ–ˆ๋Š”๋ฐ ์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๊ณ„๋ผ ๋‹นํ™ฉํ–ˆ๋„ค์š” ใ…Žใ…Ž
์ž™ ์ผ์—ˆ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 3์›” 14์ผ

์•„ํ† ๋ฏน ํŒจํ„ด์€ ์ง„์งœ ์„ค๊ณ„ํ•˜๊ธฐ ์–ด๋ ต๋”๋ผ๊ตฌ์š”..ใ…œใ…œ ๊ทธ๋ž˜๋„ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์จ๋ณผ๋งŒํ•œ ํŒจํ„ด์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 3์›” 16์ผ

ํ™€๋ฆผ๋‹˜ ์ž˜๋ดค์Šต๋‹ˆ๋‹ค ใ…Žใ…Žใ…Ž

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 3์›” 18์ผ

๋””์ž์ธ ํŒจํ„ด์— ๊ด€ํ•ด ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค! ์ข‹์€ ๊ธ€ ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 3์›” 20์ผ

์ €๋„ ๊ต‰์žฅํžˆ ๊ด€์‹ฌ์ด ๋งŽ์€๊ฒŒ atomic design pattern์ด๊ณ  ์‹ค์ œ๋กœ ์ ์šฉ์„ ํ•ด๋ดค์„๋•Œ ๋งŒ์กฑ์Šค๋Ÿฝ๋”๋ผ๊ตฌ์š”. molecules๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ• ์ง€๊ฐ€ ๊ฝค ์–ด๋ ค์šด๊ฒƒ๊ฐ™์•„์š” ใ…‹ใ…‹ ๊ทธ๋ž˜๋„ ๋งˆ์น˜ ๋ ˆ๊ณ ์กฐ๊ฐ์ฒ˜๋Ÿผ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ์žฅ์ ์€ ๊ฐ•๋ ฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ์• ์ดˆ์— page๋‹จ์œ„๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” next js์—๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 3์›” 26์ผ

Atomic design pattern์€ ๋””์ž์ธ ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ ๋””์ž์ด๋„ˆ์™€ ํ•จ๊ป˜ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ๊ณผ ํก์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””์ž์ธ ์‹œ์Šคํ…œ์ด ์ž˜ ๊ฐ–์ถฐ์ง„๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์ˆ˜์›”ํ•ด์ง‘๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2021๋…„ 4์›” 5์ผ

์žฌ๋ฐŒ๊ฒŒ ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค :)
์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2021๋…„ 5์›” 27์ผ

์„ฑ๋Œ€๋ฅผ ์กธ์—…ํ•˜๊ณ  ์›น์ชฝ์„ ๋‹ค๋ค„์•ผ๋˜๋Š” ์ผ์ด ์žˆ์–ด ๊ด€๋ จ ๊ธ€๋“ค์„ ์ฐพ๋‹ค๊ฐ€ ์ด๊ณณ์— ์˜ค๊ฒŒ ๋๋„ค์š”
์ข‹์€ ์ •๋ณด ๊ฐ์‚ฌํ•ด์š”

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2021๋…„ 6์›” 18์ผ

์•„๋ž˜์ชฝ ์•„ํ† ๋ฏน์—์„œ index๊ฐ€ ๊ผญ ํ•„์š”ํ• ๊นŒ์š”?

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2022๋…„ 8์›” 8์ผ

์ข‹์€๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค:)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ