Post

๐ŸŒŒ React ์ž…๋ฌธ 05 - Component

๐ŸŒŒ React ์ž…๋ฌธ 05 - Component

๐Ÿ“˜ ใ€Ž์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Component๋ž€?

  • Component๋Š” props๋ฅผ ํ†ตํ•ด ์†์„ฑ์„ ์ž…๋ ฅํ•˜์—ฌ React Element๋ฅผ ์ถœ๋ ฅํ•˜๋Š” Javascript ํ•จ์ˆ˜๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ถ€ํ’ˆ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ Component๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Component๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Component๋กœ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๊ณ , ์ฝ”๋“œ ์–‘์„ ์ค„์ž„์œผ๋กœ์จ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๋ณด์ˆ˜ ์‹œ๊ฐ„์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

props๋ž€?

  • Component๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ด๋ฉฐ, props๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์— ํ•ด๋‹นํ•œ๋‹ค.
  • ๊ฐ€๋ น ์†์„ฑ๋งŒ ๋‹ค๋ฅธ React Element๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋™์ผ Component๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ props๋งŒ ๋‹ค๋ฅด๊ฒŒ ์ฃผ์ž…ํ•˜๋ฉด ๋œ๋‹ค.
  • props๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด์–ด์„œ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.
  • React Element๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋„์ค‘์— props๊ฐ€ ๋ฐ”๋€Œ์–ด ๋ฒ„๋ฆฌ๋ฉด React๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๋Š” ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค.
  • ๋™์ผ props์— ๋Œ€ํ•ด์„œ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ๋‹ค๋ฅธ props๋ฅผ ๊ฐ€์ง„ React Element๋ฅผ ๋ Œ๋”๋ง ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์„ Component์— ์ „๋‹ฌํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ React Element๊ฐ€ ๋ Œ๋”๋ง ๋œ๋‹ค.
1
2
3
4
5
6
7
8
9
function App(props) {
	return (
		<Profile
			name="brobro332"
			introduction="์•ˆ๋…•ํ•˜์„ธ์š”!"
			viewCount={20}
		/>
	);
}
  • Profile Component์— name, introduction, viewCount ์†์„ฑ์„ ์ „๋‹ฌํ•˜์—ฌ React Element๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.
  • ๋ฌธ์ž์—ด ์ด์™ธ์˜ ์ •์ˆ˜, ๋ณ€์ˆ˜, Component ๋“ฑ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ค‘๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.
  • ๋ฌธ์ž์—ด๋„ ์ค‘๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ๋„ ์ƒ๊ด€์—†๋‹ค.
  • ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Javascript ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

Component ์ข…๋ฅ˜

โœ… Class Component

1
2
3
4
5
class Welcome extends React.Component {
	render() {
		return <h1>์•ˆ๋…•, {this.name}</h1>;
	}
}
  • Class Component๋Š” Javascript ES6์˜ Class๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ํ˜•ํƒœ์ด๋‹ค.
  • React์˜ ๋ชจ๋“  Class Component๋Š” React.Component๋ฅผ ์ƒ์† ๋ฐ›์•„์„œ ๋งŒ๋“ ๋‹ค.

โœ… Functional Component

  • ์ดˆ๊ธฐ ๋ฒ„์ „์—๋Š” Class Component๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜ ๋ถˆํŽธํ•˜๋‹ค๋Š” ์˜๊ฒฌ์ด ๋‹ค์ˆ˜์˜€๋‹ค.
  • ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ Hook์ด๋ผ๋Š” ๊ฒƒ์ด ๊ฐœ๋ฐœ๋˜์—ˆ๋Š”๋ฐ React์˜ ์ฃผ๋ ฅ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ž์œผ๋กœ๋Š” ์ฃผ๋กœ Functional Component๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

Component ํŠน์ง•

โœ… Component ์ด๋ฆ„์€ ํ•ญ์ƒ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

  • React๋Š” ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” Component๋ฅผ DOM ํƒœ๊ทธ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด <div>๋Š” ๋‚ด์žฅ Component์ด๋ฉฐ "div" ๋ฌธ์ž์—ด๋กœ React.createElement()์— ์ „๋‹ฌ๋œ๋‹ค.
  • <Foo />์™€ ๊ฐ™์ด ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” "Foo" ๋ฌธ์ž์—ด๋กœ React.createElement()์— ์ „๋‹ฌ๋˜๋Š” ๊ฑด ๋™์ผํ•˜์ง€๋งŒ ๋‚ด์žฅ Component๊ฐ€ ์•„๋‹Œ Javascript ํŒŒ์ผ ๋‚ด์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ–ˆ๊ฑฐ๋‚˜ importํ•œ Component๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

โœ… Component ๋ Œ๋”๋ง

  • Element ๋ Œ๋”๋ง๊ณผ ๋™์ผํ•˜๊ฒŒ root.render()์— ์ธ์ž๋กœ Component๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค.

โœ… Component ํ•ฉ์„ฑ

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ Component๋ฅผ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ Component๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

โœ… Component ์ถ”์ถœ

  • ํฐ Component์—์„œ ์ผ๋ถ€๋ฅผ ์ถ”์ถœํ•ด์„œ ์ƒˆ๋กœ์šด Component๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
  • ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋‚˜์ค‘์— ๊ณง๋ฐ”๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • Component ๋‚ด์˜ ๋ฐ˜๋ณต๋˜๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์‹ค์Šต

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
const style = {
    wrapper: {
        display: 'flex',
        flexDirection: 'column',
        alignItems: 'center',
        gap: 20,
        padding: 20,
        backgroundColor: '#f4f4f9',
        minHeight: '100vh'
    },
    card: {
        width: 600,
        padding: '20px 30px',
        borderRadius: 20,
        boxShadow: '0 10px 20px rgba(0, 0, 0, 0.1)',
        backgroundColor: '#ffffff',
        transition: 'all 0.3s ease',
        cursor: 'default'
    },
    title: {
        margin: 0,
        fontSize: 20,
        fontWeight: 'bold',
        color: '#2c3e50'
    },
    description: {
        marginTop: 8,
        fontSize: 16,
        color: '#555'
    }
};

function Project(props) {
    return (
        <div style={style.card}>
            <h3 style={style.title}>โœ… {props.name}</h3>
            <h4 style={style.description}>{props.description}</h4>
        </div>
    );
}

const projects = [
    {
        name: "java-co-working project",
        description: "ํ˜‘์—… ์ž๋ฐ” ํ”„๋กœ์ ํŠธ"
    },
    {
        name: "java-schedule-project",
        description: "์Šค์ผ€์ฅด ์ž๋ฐ” ํ”„๋กœ์ ํŠธ"
    },
    {
        name: "python-ai-project",
        description: "AI ํŒŒ์ด์ฌ ํ”„๋กœ์ ํŠธ"
    }
];

function ProjectList() {
    return (
        <div style={style.wrapper}>
            {
	            projects.map((project) => (
	                <Project
	                    key={project.name}
	                    name={project.name}
	                    description={project.description}
	                />
	            ))
            }
        </div>
    );
}

export default ProjectList;
  • ProjectList Component ๋Š” Project Component ๋ฅผ ์ž์‹ Component ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

ํšŒ๊ณ 

  • React Component๋Š” ๋™์ผํ•œ props๋ฅผ ๋ฐ›์œผ๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ pureํ•˜๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.
  • ์ด๋Š” React์˜ Element๊ฐ€ ๋ถˆ๋ณ€ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋ฉฐ, ๋”ฐ๋ผ์„œ Component์˜ props๋„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.