์ํํธ์จ์ด ๊ฐ๋ฐ ๊ณผ์ ์์ ์ฝ๋๋ฅผ ์ฝ๋ ์๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์๊ฐ๋ณด๋ค ์๋์ ์ผ๋ก ๊ธธ๋ค. ๋ฐ๋ผ์ ๋ณ์๋ ํจ์์ ์ด๋ฆ์ ์ฝ๋์ ์๋๋ฅผ ํ์
ํ ์ ์๊ฒ ํด์ฃผ๋ ์ค์ํ ๋จ์๊ฐ ๋๋ค.
์ผ๊ด๋ ๋ค์ด๋ฐ ์ปจ๋ฒค์
์ ์ฌ์ฉํ๋ฉด ํ ๋ด ์์ฌ์ํต ๋น์ฉ์ ์ค์ผ ์ ์์ผ๋ฉฐ ์์คํ
์ ๋ฐ์ ํ์
ํจ์จ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๋ ๋ฐ ๋์์ด ๋๋ค.
๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ฃผ์ ๋ค์ด๋ฐ ์คํ์ผ์ ๋ํด ์์๋ณด์.
๋ค์ด๋ฐ ์ปจ๋ฒค์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ํ๊ธฐ ๋ฐฉ์์ด ์กด์ฌํ๋ค. ๊ฐ ์คํ์ผ์ ์ฌ์ฉ ๋ชฉ์ ๊ณผ ํ๊ฒฝ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์ ํ๋๋ฉฐ ๋ํ์ ์ธ ์ด๋ฆ ํ๊ธฐ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ชจ๋ ๋จ์ด์ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ํ๊ธฐํ๋ ๋ฐฉ์
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์์ ํด๋์ค, ์ธํฐํ์ด์ค, ๊ตฌ์กฐ์ฒด ๋ช
๋ช
์ ์ฌ์ฉ๋๋ค. Java, C#, TypeScript ๋ฑ ๋๋ถ๋ถ์ ์ธ์ด์์ ํ์
์ ์ ์ํ ๋ ํ์ค์ผ๋ก ์ฌ์ฉ๋๋ค.
์์) UserAccount, PaymentService, OrderRepository
์ฒซ ๋ฒ์งธ ๋จ์ด๋ ์๋ฌธ์๋ก ์์ํ๊ณ ๋ ๋ฒ์งธ ๋จ์ด๋ถํฐ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ํ๊ธฐํ๋ ๋ฐฉ์
๋ณ์, ํจ์/๋ฉ์๋ ๋ช
๋ช
์ ์ฌ์ฉ๋๋ค. Java, JavaScript์ ํต์ฌ ํ์ค ๋ฐฉ์์ด๋ค.
์์) userId, calculateTotal(), isAvailable
๋ชจ๋ ๋ฌธ์๋ฅผ ๋๋ฌธ์๋ก ํ๊ธฐํ๋ฉฐ ๋จ์ด ์ฌ์ด๋ฅผ ์ธ๋๋ฐ(_)๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์
์์(Constant) ์ ์์ ์ฌ์ฉ๋๋ค. ํ๋ก๊ทธ๋จ ์คํ ์ค ๊ฐ์ด ๋ณํ์ง ์๋ ๊ณ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ธ๋ค. ๋๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ด์์ ์ผ๋ฐ ๋ณ์์ ์์๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
์์) MAX_LIMIT, API_KEY, DEFAULT_TIMEOUT
๋ชจ๋ ๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ํ๊ธฐํ๋ฉฐ ๋จ์ด ์ฌ์ด๋ฅผ ์ธ๋๋ฐ(_)๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์
Python, Ruby, C ์ธ์ด์ ๋ณ์ ๋ฐ ํจ์๋ช
, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปฌ๋ผ๋ช
, JSON ํค๊ฐ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค. ๊ณต๋ฐฑ์ ํ์ฉํ์ง ์๋ ์์คํ
ํ๊ฒฝ์์ ๊ฐ๋
์ฑ์ ํ๋ณดํ๊ธฐ ์ํ ํ์ค์ด๋ค.
์์) user_id, created_at, get_data()
๋ชจ๋ ๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ํ๊ธฐํ๋ฉฐ ๋จ์ด ์ฌ์ด๋ฅผ ํ์ดํ(-)์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์
HTML ํ๊ทธ์ ID/Class, CSS ์์ฑ๋ช
, URL ๊ฒฝ๋ก์ ์ฌ์ฉ๋๋ค. ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ํ๊ฒฝ์์ ๋จ์ด๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ต์ ์ ๋ฐฉ์์ด๋ค. ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ณ์๋ช
์ผ๋ก๋ ํ์ดํ์ด ๋ง์ด๋์ค(-) ์ฐ์ฐ์๋ก ์ธ์๋์ด ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์์) main-container, background-color, /api/user-profile
๋จ์ํ ํ๊ธฐ๋ฒ ์ธ์๋ ์ค์ ์ฝ๋ ์์ฑ ์์๋ ๋ช ๊ฐ์ง ์ค์ํ ๋ค์ด๋ฐ ์์น์ ๊ณ ๋ คํด์ผ ํ๋ค. ์ข์ ์ด๋ฆ์ ์ฝ๋์ ์๋๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฌํ๋ฉฐ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ธ๋ค.
isAvailable, hasToken, canExecute, shouldRedirect getHTTPRequest ํน์ getHttpRequest getUserData(), inputValidator(), sendEmail() ์์ ์๊ฐํ ๋ค์ด๋ฐ ์คํ์ผ์ ์ค์ ์ฝ๋์ ์ ์ฉํด ๋ณด์.
// ๋์ ์
class user_service {}
const defaultTimeout = 5000
function Find_active_members(p, ps)
// ์ข์ ์
class UserService {}
const DEFAULT_TIMEOUT_MS = 5000
function findActiveMembers(page, pageSize)
๋ค์ด๋ฐ์ ์ ๋์ ์ธ ์ ๋ต์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์์๋ ๋ชจ๋ ๋๋ฌธ์(UPPER_SNAKE_CASE)๋ก ์์ฑํ๊ณ ๋ณ์์ ํจ์ ์ด๋ฆ์ ๋ถํ์ํ ์ถ์ฝ์ ํผํ๊ณ ๊ฐ๋ฅํ ํ ๋ช ํํ ์๋ฏธ๋ฅผ ์ ๋ฌํ๋๋ก ์์ฑํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ํ์ ์ ์ ๋ฆฌํ๋ค.
// ๋์ ์
src/
EmployeeList/
employee_list.tsx
componentsShared/
my-button.tsx
// ์ข์ ์
src/
employee-list/
EmployeeList.tsx
EmployeeRow.tsx
shared-components/
Button.tsx
ํ๋ก์ ํธ ๊ตฌ์กฐ์์๋ ์ผ๊ด๋ ๋ค์ด๋ฐ ์ปจ๋ฒค์ ์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋๋ ํฐ๋ฆฌ์ ํ์ผ ์ด๋ฆ์๋ kebab-case๊ฐ ๋ง์ด ์ฌ์ฉ๋๋ค.
// ๋์ ์
GET /api/v1/getMemberList
POST /api/v1/deactivateMember?id=42
// ์ข์ ์
GET /api/v1/members?page=1&pageSize=20
PATCH /api/v1/members/42 { "isActive": false }
HTTP API์์๋ ๋ฆฌ์์ค ์ค์ฌ์ URL ์ค๊ณ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. URL์ /api/v1๊ณผ ๊ฐ์ ๋ฒ์ ์ ๋ณด๋ฅผ ๋ช
์ํ๋ฉด ํฅํ API ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋ค.
๋ํ ๋ฆฌ์์ค ๊ฒฝ๋ก๋ ๋ช
์ฌ ํํ์ ๋ณต์ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ kebab-case๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง๋ค. ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ ์ผ๋ฐ์ ์ผ๋ก camelCase๋ฅผ ์ฌ์ฉํ๋ค.
๋ํ URL์์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ ๋์ HTTP ๋ฉ์๋(GET, POST, PATCH ๋ฑ) ์์ฒด๋ก ๋์์ ํํํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
-- ์ข์ ์
CREATE TABLE member (
id BIGINT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
is_active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL
);
CREATE UNIQUE INDEX uq_member__email ON member(email);
CREATE INDEX ix_member__created_at ON member(created_at);
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ํ
์ด๋ธ๊ณผ ์ปฌ๋ผ ์ด๋ฆ์ lower_snake_case๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
์ด ๋ฐฉ์์ SQL ํค์๋์ ์๊ฐ์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ ์ฝ๊ณ ๋์๋ฌธ์ ๊ตฌ๋ถ์ด ์๋ RDBMS ํ๊ฒฝ์์๋ ํธํ์ฑ์ด ๋๋ค๋ ์ฅ์ ์ด ์๋ค.
