Type something to search...

05. AboutMe.jsx — 소개 섹션

이번 단계에서 할 일

학력, 자격사항, 인적사항을 보여주는 소개 섹션을 만듭니다. 재사용 컴포넌트를 만드는 방법을 배웁니다.


피그마 디자인 분석

1
│ ─── ABOUT ME ──────────────────────────────────── │
2
│ 끈기와 열정으로 성장하는 오성의입니다. │
3
│ │
4
│ ┌──────────────────────┬──────────────────────┐ │
5
│ │ 학력 및 교육사항 │ 인적사항 │ │
6
│ │ 22.10-22.10 | 수료 │ 이름 : 오성의 │ │
7
│ │ 20.02-22.10 | 졸업 │ 나이 : 1996.05. │ │
8
│ │ │ 거주지 : 서울시 서초구 │ │
9
│ │ 자격사항 │ 휴대폰 : 010.xxxx │ │
10
│ │ 21.07 | 컴활 2급 │ 이메일 : xxx@xxx │ │
11
│ └──────────────────────┴──────────────────────┘ │

새로운 개념: props (속성)

컴포넌트에 데이터를 전달하는 방법입니다. HTML 태그의 속성처럼 씁니다.

1
// 데이터 전달 (부모)
2
<SectionTitle title="ABOUT ME" subtitle="끈기와 열정으로..." />
3
4
// 데이터 받기 (자식)
5
const SectionTitle = ({ title, subtitle }) => {
6
return <h2>{title}</h2> // "ABOUT ME"
7
}

STEP 1 — SectionTitle 컴포넌트 만들기

섹션 제목은 About Me, Projects, Contacts 에서 반복 사용됩니다. 한 번 만들어두면 어디서든 가져다 쓸 수 있습니다.

src/components/SectionTitle.jsx
1
const SectionTitle = ({ title, subtitle }) => {
2
return (
3
<div className="section-title">
4
{/* 세로 라인 + 큰 제목 */}
5
<div className="section-title__row">
6
<div className="section-title__line" />
7
<h2 className="section-title__text">{title}</h2>
8
</div>
9
{/* 작은 부제목 */}
10
<p className="section-title__sub">{subtitle}</p>
11
</div>
12
)
13
}
14
15
export default SectionTitle

사용 예시:

1
// AboutMe 섹션 제목
2
<SectionTitle title="ABOUT ME" subtitle="끈기와 열정으로 성장하는 오성의입니다." />
3
4
// Projects 섹션 제목
5
<SectionTitle title="Projects" subtitle="끈기와 열정으로 성장하는 오성의입니다." />

STEP 2 — AboutMe.jsx 작성

src/components/AboutMe.jsx
1
import SectionTitle from './SectionTitle'
2
3
/* ─── 인적사항 한 줄 컴포넌트 ─── */
4
// label과 value를 받아서 "이름 : 오성의" 형태로 출력
5
const InfoRow = ({ label, value }) => {
6
return (
7
<div className="info-row">
8
<span className="info-row__label">{label} :</span>
9
<span className="info-row__value">{value}</span>
10
</div>
11
)
12
}
13
14
/* ─── AboutMe 메인 컴포넌트 ─── */
15
const AboutMe = () => {
16
return (
17
<section className="about" id="aboutme">
18
19
{/* 섹션 제목 */}
20
<SectionTitle
21
title="ABOUT ME"
22
subtitle="끈기와 열정으로 성장하는 오성의입니다."
23
/>
24
25
{/* 2단 그리드 레이아웃 */}
26
<div className="about-grid">
27
28
{/* 왼쪽: 학력 + 자격사항 */}
29
<div className="about-left">
30
31
{/* 학력 블록 */}
32
<div className="about-block">
33
<h3 className="about-block__title">학력 및 교육사항</h3>
34
<div className="about-block__item">
35
<span className="about-block__date">22.10 - 22.10</span>
36
<span>UI/UX 반응형 웹디자인 & 웹퍼블리셔 양성과정 수료</span>
37
</div>
38
<div className="about-block__item">
39
<span className="about-block__date">20.02 - 22.10</span>
40
<span>경기대학교 식품생물공학과 졸업</span>
41
</div>
42
</div>
43
44
{/* 자격사항 블록 */}
45
<div className="about-block">
46
<h3 className="about-block__title">자격사항</h3>
47
<div className="about-block__item">
48
<span className="about-block__date">21.07</span>
49
<span>컴퓨터 활용능력 2급</span>
50
</div>
51
</div>
52
53
</div>
54
55
{/* 오른쪽: 인적사항 */}
56
<div className="about-right">
57
<h3 className="about-block__title">인적사항</h3>
58
59
{/* InfoRow 컴포넌트 반복 사용 */}
60
<InfoRow label="이름" value="오성의" />
61
<InfoRow label="나이" value="1996.05." />
62
<InfoRow label="거주지" value="서울시 서초구" />
63
<InfoRow label="휴대폰" value="010.9589.5603" />
64
<InfoRow label="이메일" value="34715603@naver.com" />
65
</div>
66
67
</div>
68
</section>
69
)
70
}
71
72
export default AboutMe

코드 설명

InfoRow 컴포넌트를 따로 만드는 이유

인적사항 항목이 5개나 됩니다. 패턴이 반복됩니다.

1
// 컴포넌트 없이 작성하면 (반복이 많음)
2
<div className="info-row">
3
<span className="info-row__label">이름 :</span>
4
<span className="info-row__value">오성의</span>
5
</div>
6
<div className="info-row">
7
<span className="info-row__label">나이 :</span>
8
<span className="info-row__value">1996.05.</span>
9
</div>
10
// ... 5번 반복
11
12
// 컴포넌트로 만들면 (간결함)
13
<InfoRow label="이름" value="오성의" />
14
<InfoRow label="나이" value="1996.05." />
15
// ... 훨씬 짧고 읽기 쉬움

JSX 주석 {/* */}

JSX 안에서 주석을 쓸 때는 {/* */} 를 사용합니다.

1
// JavaScript 주석 (JSX 밖에서)
2
const x = 1
3
4
return (
5
<div>
6
{/* JSX 주석 (JSX 안에서) */}
7
<p>내용</p>
8
</div>
9
)

STEP 3 — CSS 추가

1
/* src/index.css 에 추가 */
2
3
/* ── 섹션 공통 제목 ──────────────────────── */
4
5
.section-title {
6
margin-bottom: 48px;
7
}
8
9
.section-title__row {
10
display: flex;
11
align-items: center;
12
gap: 16px;
13
margin-bottom: 8px;
14
}
15
16
/* 세로 검정 라인 */
17
.section-title__line {
18
width: 2px;
19
height: 36px;
20
background-color: #000;
21
}
22
23
.section-title__text {
24
font-size: 48px;
25
font-weight: 700;
26
color: #000;
27
}
28
29
.section-title__sub {
30
font-size: 16px;
31
color: #555555;
32
padding-left: 18px; /* 세로 라인 너비만큼 들여쓰기 */
33
}
34
35
/* ── About Me ────────────────────────────── */
36
37
.about {
38
padding: 80px 24px;
39
}
40
41
/* 2단 그리드 */
42
.about-grid {
43
display: grid;
44
grid-template-columns: 1fr 1fr; /* 왼쪽 50% : 오른쪽 50% */
45
gap: 40px;
46
}
47
48
.about-block {
49
margin-bottom: 32px;
50
}
51
52
/* 블록 소제목 */
53
.about-block__title {
54
font-size: 18px;
55
font-weight: 600;
56
color: #333333;
57
margin-bottom: 16px;
58
padding-bottom: 8px;
59
border-bottom: 1px solid #eeeeee;
60
}
61
62
/* 항목 한 줄 */
63
.about-block__item {
64
display: flex;
65
gap: 16px;
66
padding: 12px 0;
67
font-size: 16px;
68
color: #747474;
69
border-bottom: 1px solid #f5f5f5;
70
}
71
72
/* 날짜 부분 */
73
.about-block__date {
74
color: #555555;
75
white-space: nowrap; /* 날짜가 줄바꿈되지 않게 */
76
min-width: 100px;
77
}
78
79
/* ── 인적사항 행 ──────────────────────────── */
80
81
.info-row {
82
display: flex;
83
gap: 16px;
84
padding: 8px 0;
85
font-size: 16px;
86
border-bottom: 1px solid #f5f5f5;
87
}
88
89
.info-row__label {
90
width: 70px;
91
color: #3a3a3a;
92
}
93
94
.info-row__value {
95
color: #727272;
96
}

브라우저 확인

저장 후 브라우저에서:

  • “ABOUT ME” 큰 제목 옆에 세로 라인이 있습니다
  • 학력/자격사항이 왼쪽, 인적사항이 오른쪽에 2단으로 배치됩니다
  • 각 항목마다 얇은 구분선이 있습니다

정리

개념사용 목적
props컴포넌트에 데이터 전달
SectionTitle섹션 제목 재사용 컴포넌트
InfoRow반복되는 행 재사용 컴포넌트
grid-template-columns: 1fr 1fr2단 레이아웃