Skip to content

๐Ÿงฉ Component โ€‹

๐Ÿ“Ž React - Component

์ปดํฌ๋„ŒํŠธ๋ž€, UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…๋ฆฝ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ธ”๋ก์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ (Component Driven Development, CDD)

UI๋ฅผ ๋…๋ฆฝ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ ์ƒํƒœ์™€ ๋กœ์ง, ์Šคํƒ€์ผ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด ๊ตฌ์กฐํ™”๋œ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ๊ธฐ์ค€ โ€‹

์žฌ์‚ฌ์šฉ์„ฑ (Reusability) โ€‹

  • ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ณตํ†ต UI๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ธ๋‹ค.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP: Single Responsibility Principle) โ€‹

  • ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ดํ•ด๋„์™€ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ธ๋‹ค.

๊ฐ€๋…์„ฑ (Readability) โ€‹

  • ํฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ  ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€,

๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ (Separation of Concerns):
๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์Šคํƒ€์ผ๋ง, ๋ทฐ ๋กœ์ง์ด ํ•œ ์ปดํผ๋„ŒํŠธ์— ์„ž์ด์ง€ ์•Š๋„๋ก ๋‚˜๋ˆˆ๋‹ค.

ํŒŒ์ผ ํฌ๊ธฐ์™€ ๊นŠ์ด ์ œํ•œ:
ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๊ธธ๊ฑฐ๋‚˜ ์ค‘์ฒฉ ๊ตฌ์กฐ๊ฐ€ ๊นŠ์–ด์งˆ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ์‹œ์ ์„ ๊ณ ๋ คํ•œ๋‹ค.

์˜๋„ ๊ธฐ๋ฐ˜ ๋ถ„๋ฆฌ:
ํ™”๋ฉด์ƒ์˜ ์œ„์น˜๋ณด๋‹ค๋Š”, โ€œ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€โ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.


์ปดํฌ๋„ŒํŠธ ์ข…๋ฅ˜ โ€‹

React์—๋Š” ๋‘ ์ข…๋ฅ˜์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๊ถŒ์žฅ โ€‹

jsx
function Greeting({ name }) {
  return <h1>์•ˆ๋…•ํ•˜์„ธ์š”, {name}!</h1>;
}

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ โ€‹

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ES6์˜ class ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

jsx
class Greeting extends React.Component {
  render() {
    return <h1>์•ˆ๋…•ํ•˜์„ธ์š”, {this.props.name}!</h1>;
  }
}
Class๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ‹€
  • ๐Ÿชน ๋ถ•๋นตํ‹€: ํด๋ž˜์Šค (Class)
  • ๐Ÿฅš ๋ถ•์–ด๋นต: ๊ฐ์ฒด (Instance)

๊ธฐ๋ณธ ํด๋ž˜์Šค ์˜ˆ์‹œ

js
class Person {
  constructor(name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
  greet() {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ${this.name}์ž…๋‹ˆ๋‹ค.`);
  }
}

ํด๋ž˜์Šค ์ƒ์† ์˜ˆ์‹œ

js
class Student extends Person {
  constructor(name, age, sex, grade) {
    super(name, age, sex); // ๋ถ€๋ชจ(Person)์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
    this.grade = grade;
  }

  // greet ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ (์žฌ์ •์˜, greet ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์”€)
  greet() {
    console.log(`${this.name}: ํƒœ์ •ํƒœ์„ธ๋ฌธ๋‹จ์„ธ`);
  }
  // Student๋งŒ์˜ ๊ณ ์œ  ๋ฉ”์„œ๋“œ
  study() {
    console.log(`${this.name}: ๊ณต๋ถ€์ค‘์ธ์ฒ™`);
  }
}

์‚ฌ์šฉ ์˜ˆ์‹œ

js
const student1 = new Student("์งฑ๊ตฌ", 10, "๋‚จ์„ฑ", 1);

student1.greet(); // ์งฑ๊ตฌ: ํƒœ์ •ํƒœ์„ธ๋ฌธ๋‹จ์„ธ
student1.study(); // ์งฑ๊ตฌ: ๊ณต๋ถ€์ค‘์ธ์ฒ™


์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ• โ€‹

๐Ÿ’ก React ๊ณต์‹ ๊ฐ€์ด๋“œ

๐Ÿ“Ž React docs
We recommend defining components as functions instead of classes.

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Hook์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•œ๋‹ค.

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ถŒ์žฅํ•˜๋Š” ์ด์œ  โ€‹

  • ์ž‘์„ฑ์ด ๊ฐ„๋‹จํ•˜๊ณ , ์ฝ”๋“œ๊ฐ€ ์ง๊ด€์ ์ด๋‹ค.
  • React Hook์„ ํ™œ์šฉํ•˜์—ฌ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
  • ์ตœ์ ํ™”์™€ ์„ฑ๋Šฅ ๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋‹ค.