05 AboutMe
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// 데이터 받기 (자식)5const SectionTitle = ({ title, subtitle }) => {6 return <h2>{title}</h2> // "ABOUT ME"7}STEP 1 — SectionTitle 컴포넌트 만들기
섹션 제목은 About Me, Projects, Contacts 에서 반복 사용됩니다. 한 번 만들어두면 어디서든 가져다 쓸 수 있습니다.
1const 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
15export default SectionTitle사용 예시:
1// AboutMe 섹션 제목2<SectionTitle title="ABOUT ME" subtitle="끈기와 열정으로 성장하는 오성의입니다." />3
4// Projects 섹션 제목5<SectionTitle title="Projects" subtitle="끈기와 열정으로 성장하는 오성의입니다." />STEP 2 — AboutMe.jsx 작성
1import SectionTitle from './SectionTitle'2
3/* ─── 인적사항 한 줄 컴포넌트 ─── */4// label과 value를 받아서 "이름 : 오성의" 형태로 출력5const 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 메인 컴포넌트 ─── */15const AboutMe = () => {16 return (17 <section className="about" id="aboutme">18
19 {/* 섹션 제목 */}20 <SectionTitle21 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
72export 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 밖에서)2const x = 13
4return (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 1fr | 2단 레이아웃 |