๋ฌธ์ ์ ๋ฐ๊ฒฌ
๊ธฐํ ์ฝ๋ํ์ ์๊ฐ๋ฝ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค ํ๋ค. ๊ฐ๋ฐ ์ค ์ฝ๋์ ํจ์จ์ฑ, ์ง๊ด์ฑ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ํ์ ํ๋ค. ํ์ฌ ๊ธฐํ ์ฝ๋ ๋ฐ์ดํฐ ํ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด์๋ค.
type Barre = {
from_string: number; // ๋ฐ๋ ์์ ์ค
to_string: number; // ๋ฐ๋ ๋ ์ค
};
type Fret = {
string: number; // ๊ธฐํ ์ค ๋ฒํธ
fret: number; // ํ๋ ๋ฒํธ
finger: number | null; // ์๊ฐ๋ฝ ๋ฒํธ (null์ ์๊ฐ๋ฝ ์ฌ์ฉ ์ ํจ)
barre?: Barre; // ๋ฐ๋ ์ฝ๋ ์ ๋ณด (optional)
};
type Chord = {
name: string; // ์ฝ๋ ์ด๋ฆ
frets: Fret[]; // ์ด์ง ์ ๋ณด ๋ฐฐ์ด
description: string; // ์ฝ๋ ์ค๋ช
omit_strings?: number[]; // ์ฐ์ฃผํ์ง ์๋ ์ค ๋ฐฐ์ด (optional)
open_strings?: number[]; // ๊ฐ๋ฐฉํ ๋ฐฐ์ด (optional)
};
type ChordData = {
chords: Chord[]; // ๋ชจ๋ ์ฝ๋ ๋ฐ์ดํฐ ๋ฐฐ์ด
};์ง๊ธ ๋น์ฅ์ผ๋ก์๋ ๋ฌธ์ ๋ ๊ฒ์ด ์ ํ ์๋ค. ์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ๋ ์ ๋ณด๋ก๋ ์๋์ ๊ฐ์ด ์ ์ถ๋ ฅ๋๋ค.

ํ์ง๋ง ์ฌ์ง์ A ์ฝ๋ ๋ 4ํ๋ ๊น์ง ์ถ๋ ฅ ๋ ์ด์ ๊ฐ ์๋ค.
3๊ฐ ํ๋ ์ผ๋ก ํํ์ด ์ถฉ๋ถํ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ 3๊ฐ ํ๋ ๋ง ์ถ๋ ฅํ๋๋ก ๊ธฐ๋ฅ์ ์์ ํ๋ ค ํ๋ค.
๋ง์ฝ 2๋ฒ ํ๋ ์ 2, 3, 4๋ฒ ์ค์ด ์๋๋ผ, 5๋ฒ ํ๋ ์ 2, 3, 4๋ฒ ํ๋ ์ ์ด์งํ๋ค๋ฉด ์ด๋จ๊น? ์๋ง 5, 6, 7, 8๋ฒ ํ๋ ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค. **์ผ๋ฐ์ ์ธ ์ฝ๋ ์ด์งํ๋ 4, 5, 6๋ฒ ํ๋ ์ ์ถ๋ ฅํ์ฌ 5๋ฒ ํ๋ ์ ๊ฐ์ด๋ฐ์ ์์นํ๋๋ก ํ ๊ฒ์ด๋ค. **
์ด๋ฅผ ์์ ํ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ถ ๋ฐ๊ฟ์ผ ํ๋ค. ์ด๋ป๊ฒ ํ๋ ค๋ฉด ํ ์์ผ ์๊ฒ ์ง๋ง.. ๊ต์ฅํ ๋นํจ์จ์ ์ด๊ณ ์ง๊ด์ ์ด์ง ๋ชปํ ๊ฒ์ด๋ผ ์๊ฐํ๋ค. ํฅํ ์ ์ง๋ณด์์๋ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋ ๋ถ๋ถ์ด๋ค.
๊ฒฐ๊ตญ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋ฉด์ ํ๋์ฝ๋ฉ ๋์ด์๋ ๊ธฐํ ์ฝ๋ ํ์ ์ขํ๋ ์์ ํ๊ธฐ๋ก ํ๋ค.
// ๋ชจ๋ ์ฝ๋ ๋ฐ์ดํฐ ๋ฐฐ์ด
type ChordData = {
chords: Chord[];
};
// ์ฝ๋ ๋ฐ์ดํฐ ํ์
type Chord = {
renderingInfo: renderingInfo;
stringInfo: stringInfo;
chordInfo: chordInfo;
};
// ์ด๊ธฐ ๋ ๋๋ง์ ํ์ํ ์ ๋ณด
type renderingInfo = {
usingFret: number; // ์ฌ์ฉํ๋ ํ๋ ์ ๊ฐฏ์ (๋ ๋๋ง ์ ์ต์ํ์ผ๋ก ๋ณด์ฌ์ค ํ๋ ๊ฐฏ์, 3 ๋๋ 4๋ก ์์๋จ)
startingFret: number; // ์์ ํ๋ ๋ฒํธ
};
// open string, omit string ํ์ ์ ๋ณด [optional]
type stringInfo = {
openStrings?: number[]; // ๊ฐ๋ฐฉํ ๋ฐฐ์ด
omitStrings?: number[]; // ์ฐ์ฃผํ์ง ์๋ ์ค ๋ฐฐ์ด
};
// ์ฝ๋ ์ ๋ณด
type chordInfo = {
name: string; // ์ฝ๋ ์ด๋ฆ
description: string; // ์ฝ๋ ์ค๋ช
frets: Fret[]; // ์ด์ง ์ ๋ณด ๋ฐฐ์ด
};
// ์ด์ง ์ ๋ณด
type Fret = {
string: number; // ๊ธฐํ ์ค ๋ฒํธ
fret: number; // ํ๋ ๋ฒํธ
finger: number; // ์๊ฐ๋ฝ ๋ฒํธ
barre?: Barre; // ๋ฐ๋ ์ฝ๋ ์ ๋ณด (optional)
};
// ๋ฐ๋ ์ฝ๋ ์ ๋ณด
type Barre = {
from_string: number; // ๋ฐ๋ ์์ ์ค
to_string: number; // ๋ฐ๋ ๋ ์ค
};
}์ด๊ธฐ ๋ ๋๋ง์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์๋ค.
๊ธฐํ ์ฝ๋ ์์ฑ ๋ฐฉ๋ฒ์ ์ ๋ฐ์ ์ผ๋ก ๋ฐ๊พธ์๋ค. svg ํ์ผ์ ์ขํ๋ฅผ ๋์ ์ผ๋ก ์์ ํ๋ค. ์ฌ์ฉ์๊ฐ ์ํ๋ ๋๋ก ๊ธฐํ ์ฝ๋์ ๋๋น, ํฐํธ ํฌ๊ธฐ ๋ฑ์ ๋ฐ๊ฟ ์ ์๋ค.
๋ง์ ๋ง๋ค๊ณ ๋ณด๋ ๋ ๋ค๋ฅธ ๊ฑฑ์ ์ด ์๊ฒผ๋ค. ์ปค์คํ ํ ์ ์๋ ๊ฒ์ ์ข์ง๋ง.. ์ฌ์ฉ์๊ฐ ์ด ๊ธฐ๋ฅ์ ๊ผญ ํ์๋ก ํ ๊น? ์ค์ ํ ์ ์๋ ํญ๋ชฉ์ด ๋๋ฌด ๋ง์ผ๋ ์คํ๋ ค ์ด๋ ค์ํ์ง ์์๊น?
์ผ๋จ ์ด ๋ฌธ์ ๋ ์ฒ์ฒํ ์๊ฐํด๋ณด๊ธฐ๋ก ํ๋ค. ์ค์ ์๋น์ค์ ์ ์ฉํ์ง ๋ชปํ๋๋ผ๋ ๋ณธ์ธ ์ค์ค๋ก๊ฐ ์์ ํ๊ธฐ์(์ ์ง๋ณด์ํ๊ธฐ์) ํธํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋๊น์ง ๊ฐ๋ฐํ ๊ฒ๋ค ์ค์์ ๋ช ๊ฐ์ง ๋ฒ๊ทธ๋ฅผ ๊ณ ์ณ์ผ ํ๋ค.
- svg ์์์ ์ขํ๊ฐ ๊ธฐ์ค์ด ์ข์๋จ์ด๋ค. ์ฆ, ์ข์ธก ์ต์๋จ์ (0, 0)์ผ๋ก ์์ํ๋ค. ์ด ๋๋ฌธ์ height ๊ฐ์ด ๋ฎ์์ง์๋ก ๋์ ์์น์ ํํ๋๋ค.
- ์๊ฐ๋ฝ ๋ฒํธ๋ฅผ ์ด์ง ํ์ ์์ ์ถ๋ ฅํ๋ ์ฝ๋๊ฐ ์์ง ์์ฑ๋์ง ์์๋ค.
<mask>ํ๊ทธ์ ๋ํ ์ถ๊ฐ์ ์ธ ํ์ต์ด ํ์ํ๋ค. - ๋ฐฐ๊ฒฝ์ ์์ ์ ํฐํธ๊ฐ ๊นจ์ง๋ค.

์๊ฐ๋ฝ ์ด์ง ์ ๋ณด๋ฅผ ํ์ํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค.
<mask> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๋ช
ํ ์ซ์ ๊ตฌ๋ฉ์ด ์๊ธฐ๋๋ก ๋ง๋ค์์ง๋งโฆ
๊ธฐํ ํ๋ซ๊ณผ ์ค์ ๋ํ๋ด๋ ํ๋ฅผ ๋ฏธ์ฒ ์๊ฐํ์ง ๋ชปํ๋ค.
์ฐจ๋ผ๋ฆฌ ๊ทธ๋ฅ ์์ผ๋ก ์น ํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋๋ ํน์ ๋ชจ๋ฅด๋ ์ผ๋จ์ ์ฃผ์์ฒ๋ฆฌ๋ฅผ ํด ๋์๋ค.

์์ ์๊ฐ๋ฝ ๋ฒํธ์ ๋ํ ๋ด์ฉ์ ์์ ํ๊ณ ๋ฐ๋ ์ฝ๋์ ๋ฒํธ ํ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. ์ฝ๋์ ์์ธํ ๋ด์ฉ์ ์์ ํ๋ ๋ถ๋ถ์ ์ถํ ์ ์ง๋ณด์๋ฅผ ์ํด ๋จ๊ฒจ๋๋ ์ฌ์ฉ์๋ค์ ์ด์ฉ ๋ถ๊ฐ๋ฅํ๊ฒ ํด๋๊ธฐ๋ก ํ๋ค. UI๋ฅผ ์์ ํ๊ณ ๋๋ฉด firebase๋ฅผ ํตํด ๋ฐฐํฌ, ๋ถ์์ ํ๋ ค๊ณ ํ๋ค.
ํ์ฌ ๊ธฐ๋ฅ์ด
- ์ํ๋ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ฉด
- ์ฝ๋ ์ด์งํ๋ก ์ถ๋ ฅํด์ค๋ค. ๋ฑ ๋๊ฐ ๋ฐ์ ์๋ค. UI๋ฅผ ๊พธ๋ฏธ๊ธฐ์๋ ๋๋ฌด ๊ธฐ๋ฅ์ด ์๋๊ฐ ์ถ๊ธฐ๋ ํ๋ค. ํ์ง๋ง ์ผ๋จ ๋ฐฐํฌํ๊ณ ์ฌ์ฉ์๋ค์ ๋ฐ์์ด ์ค๋ฉด ์ถํ์ ๊ธฐ๋ฅ์ ์ ์ ์ถ๊ฐํ ๊ฒ์ด๋ค. ์ฒ์๋ถํฐ ๋ง์ ๊ธฐ๋ฅ๊ณผ ์์ UI์ ์ ๊ฒฝ์ฐ๊ธฐ ๋ณด๋ค, MVP ๊ฐ๋ฐ ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ํธ์ด ๋ ์ข์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค. ํ์ค์ ์ด์ฌํ ๊ฐ๋ฐํ๋๋ฐ ์ฌ์ฉ์๊ฐ 0์ด๋ฉด ์๋ฌด๋ฐ ์๋ฏธ๊ฐ ์์ง ์์๊ฐ. ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ ๋จผ์ ๊ตฌํํ๊ณ ์ฌ์ฉ์๋ค์ ํผ๋๋ฐฑ์ ๋ฐ์๊ฐ๋ฉฐ ์ด์ ๋ง์ถฐ ๊ฐ๋ฐํ ์์ ์ด๋ค.
์์ ๊ธฐ๋ฅ(์ํ๋ ์ฝ๋ ์ถ๋ ฅ)์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐํฌ๋ฅผ ๋ง์ณค๋ค. firebase์ supabase ์ค ๊ณ ๋ฏผํ๋๋ฐ, ์ฌ์ฉ์ ๋ถ์๊ณผ ๊ด๊ณ ๊ธฐ๋ฅ์ ์ํด์ firebase๋ฅผ ์ ํํ๋ค. ์ง๊ธ ๋น์ฅ์ ์ฌ์ฉ์ ๋ถ์์ด๋ผ ํ ๊ฒ์ด ์๊ธฐ์(์ถ๊ฐ ํ ์ด๋ฒคํธ๋ผ๊ณ ๋ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ์ธ์๋ ์๋ค) analytics ์ค์ ์ ๋ฐ๋ก ํ์ง ์์๋ค.
๋ค์์ผ๋ก ๊ตฌํ ํ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ์ฌ ๊ฒ์ ๊ธฐ๋ฅ
- ๊ฒ์ํ ๊ฐ์ฌ๋ฅผ ์ฌ์ฉํด ์ ๋ณด ์์ฑ
- Navigation bar ๊ตฌํ: ์ฝ๋ ๊ฒ์ ๊ธฐ๋ฅ๊ณผ ์ ๋ณด ์์ฑ ๊ธฐ๋ฅ ๋ถ๋ฆฌ
๊ฐ์ฌ ๊ฒ์ ๊ธฐ๋ฅ์ ์ํด API๋ฅผ ๊ฒ์ํด๋ดค๋๋ฐ.. ์์ธ๋ก ์ฐพ๊ธฐ ์ด๋ ค์ ๋ค. ๋ช ๊ฐ์ ๋น๊ณต์ API๊ฐ ์กด์ฌํ๊ธด ํ์ผ๋ ์ธ๊ตญ ๊ณก์ ๊ฒ์๋ง ์ง์ํ๋ค. ์๋ฌด๋๋ Playwright ๋ฑ์ ์ด์ฉํด ์ง์ ๊ตฌํํด์ผ๊ฒ ๋ค.
ํ์ฌ ๊ธฐ๋ฅ์ ๋ฐํ์ผ๋ก ๋ฐฐํฌ๋ฅผ ํ์ง๋ง ๊ตฌ๊ธ ๊ฒ์์ ํตํด ํ์ด์ง๊ฐ ๋
ธ์ถ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
SEO(Search Engine optimizing) ์์
์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
html์ <meta> ํ๊ทธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ๋ค.
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keyword" content="guitar chord, fingerings, guitar diagram, guitar app, guitar chord download, guitar diagram download"/>
<meta name="description" content="Search & Download guitar chord diagrams for free ๐" />
<meta name="author" content="Yoon Keum Jae" />robots.txt ํ์ผ๋ ์ถ๊ฐํ์ง๋ง ์ฌ์ ํ ๊ฒ์ ์์ง์ ๋
ธ์ถ๋์ง๋ ์์๋ค.
Google pagespeed insights๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์์ ํด๋ณด๋ robots.txt์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋ค.

vite ์ฑ์ ๊ฒฝ์ฐ root ๋๋ ํ ๋ฆฌ๊ฐ ์๋๋ผ public ๋ด์ robots.txt ํ์ผ์ด ์์ด์ผ ํ๋ค.
์ด๋ฅผ ์์ ํ๊ณ ๋ค์ ๊ฒ์ฌ๋ฅผ ํด๋ณด๋ ๋ชจ๋ 100์ ์ ๋ฐ์ ์ ์์๋ค.

google search console์๋ ์ฑ ๋ฑ๋ก์ ๋ง์ณค๊ณ , ๋ฉฐ์น ํ์ ๊ฒ์์ด ์ ๋๋์ง ํ์ธ์ ํ๋ฉด ๋๋ค.