• ABOUT
  • POSTS
  • GUESTBOOK

ยฉ 2025 BlueCool12 All rights reserved.

2025.09.05Tips

๐Ÿค ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ๊ฐ€์ด๋“œ

๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์ด ์ค‘์š”ํ•œ ์ด์œ ? 

๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ํ•˜๋Š” ์ผ์€ ์‚ฌ์‹ค์ƒ ์ฝ”๋“œ ์ž‘์„ฑ๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์ผ์ด๋‹ค. ์ด๋•Œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‹จ์„œ์ด๋‹ค. ๋˜ํ•œ ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์€ ํŒ€ ์ „์ฒด์˜ ํ˜‘์—… ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค. 

๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋„ค์ด๋ฐ ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. 
 


์ด๋ฆ„ ํ‘œ๊ธฐ ๋ฐฉ์‹ (Case ์Šคํƒ€์ผ)

๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ‘œ๊ธฐ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ๊ฐ ์Šคํƒ€์ผ์€ ์“ฐ์ž„์ƒˆ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์„ ํƒ๋˜๋ฉฐ ์•„๋ž˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์ด๋ฆ„ ํ‘œ๊ธฐ๋ฒ•๋“ค๊ณผ ์„ค๋ช…์ด๋‹ค. 

PascalCase 
- ๊ฐ ๋‹จ์–ด์˜ ์ฒซ ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์—ฐ๊ฒฐ 

camelCase 
- ์ฒซ ๋‹จ์–ด๋Š” ์†Œ๋ฌธ์ž ์ดํ›„ ๋‹จ์–ด๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ 

UPPER_SNAKE_CASE 
- ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์“ฐ๊ณ  ๋‹จ์–ด๋Š” ๋ฐ‘์ค„(_)๋กœ ๊ตฌ๋ถ„ 

lower_snake_case 
- ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ์“ฐ๊ณ  ๋‹จ์–ด๋Š” ๋ฐ‘์ค„(_)๋กœ ๊ตฌ๋ถ„ 

kebab-case 
- ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ์“ฐ๊ณ  ๋‹จ์–ด๋Š” ํ•˜์ดํ”ˆ(-)์œผ๋กœ ๊ตฌ๋ถ„ 

BEM 
- block__element--modifier ํŒจํ„ด (CSS ํด๋ž˜์Šค ๋„ค์ด๋ฐ) 


๊ฐ๊ฐ์˜ ์ผ€์ด์Šค๋Š” ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋œ๋‹ค. 
 

  • ํด๋ž˜์Šค/ํƒ€์ž…/์ธํ„ฐํŽ˜์ด์Šค/์ปดํฌ๋„ŒํŠธ: PascalCase
  • ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ/๋ณ€์ˆ˜/์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ: camelCase
  • ์ƒ์ˆ˜/ํ™˜๊ฒฝ๋ณ€์ˆ˜/ํ”Œ๋ž˜๊ทธ/์—๋Ÿฌ ์ฝ”๋“œ ํ‚ค: UPPER_SNAKE_CASE
  • RDB ํ…Œ์ด๋ธ”/์ปฌ๋Ÿผ: lower_snake_case
  • ๋””๋ ‰ํ„ฐ๋ฆฌ/ํŒŒ์ผ/URL: kebab-case
  • CSS ํด๋ž˜์Šค: BEM 

 


์œ„์—์„œ ์†Œ๊ฐœํ•œ ๋„ค์ด๋ฐ ์Šคํƒ€์ผ์„ ์‹ค์ œ ์ฝ”๋“œ์— ์ ์šฉํ•ด ๋ณด์ž. 
 

javascript
// ๋‚˜์œ ์˜ˆ
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)๋กœ ์ž‘์„ฑํ•˜๊ณ  ๋ณ€์ˆ˜๋ช…๊ณผ ํ•จ์ˆ˜๋ช…์€ ์ถ•์•ฝ์„ ํ”ผํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ๋ช…ํ™•ํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์™€ ํ˜‘์—…์— ์œ ๋ฆฌํ•˜๋‹ค. 
 

typescript
// ๋‚˜์œ ์˜ˆ
src/
  EmployeeList/
    employee_list.tsx
  componentsShared/
    my-button.tsx
    
// ์ข‹์€ ์˜ˆ
src/
  employee-list/
    EmployeeList.tsx
    EmployeeRow.tsx
  shared-components/
    Button.tsx


ํด๋” ๋ฐ ํŒŒ์ผ ๋„ค์ด๋ฐ์—๋„ ์ผ๊ด€๋œ ์ปจ๋ฒค์…˜์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋””๋ ‰ํ„ฐ๋ฆฌ/ํŒŒ์ผ์€ kebab-case๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 
 

plaintext
// ๋‚˜์œ ์˜ˆ
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 ๋„ค์ด๋ฐ์˜ ๊ฒฝ์šฐ /api/v1์ฒ˜๋Ÿผ URL์— ๋ฒ„์ „์„ ๋ช…์‹œํ•˜๋ฉด ์ถ”ํ›„ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ๋Š” ๋ช…์‚ฌ ํ˜•ํƒœ์˜ ๋ณต์ˆ˜ํ˜•(+kebab-case)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹จ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฒฝ์šฐ camelCase๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.  

๋˜ํ•œ ๊ฐ€๊ธ‰์  ๋™์‚ฌ๋Š” ์ง€์–‘ํ•˜๊ณ  HTTP ๋ฉ”์„œ๋“œ ์ž์ฒด๋กœ ๋™์ž‘์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 
 

plaintext
-- ์ข‹์€ ์˜ˆ
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 ์—์„œ์˜ ํ˜ธํ™˜์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 
 



์œ„์™€ ๊ฐ™์€ ์Šคํƒ€์ผ์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ปจ๋ฒค์…˜์„ ์ •ํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ์„ ์œ ์˜ํ•˜๋ฉด ์ข‹๋‹ค. 

1) ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ผ๊ด€๋œ ๊ทœ์น™์„ ์ ์šฉํ•œ๋‹ค. 
2) ๊ฐœ์ธ ๊ธฐ์ค€์ด ์•„๋‹Œ ํŒ€ ์ „์ฒด์˜ ํ•ฉ์˜๋ฅผ ํ†ตํ•ด ์ปจ๋ฒค์…˜์„ ์ •์˜ํ•œ๋‹ค. (+๋ฌธ์„œํ™”)
3) usr, cnt, temp ๋“ฑ ์˜๋ฏธ๊ฐ€ ๋ชจํ˜ธํ•œ ์ถ•์•ฝ์€ ํ”ผํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค. 
4) ์˜๋ฏธ ์žˆ๋Š” ๋„ค์ด๋ฐ์„ ์‚ฌ์šฉํ•œ๋‹ค. 
5) ์‚ฌ์šฉ ์ค‘์ธ ์–ธ์–ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ปจ๋ฒค์…˜์„ ๊ณ ๋ คํ•œ๋‹ค. 

์ผ๊ด€๋œ ์ปจ๋ฒค์…˜์€ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ๋ฐฐ๋ ค์ด์ž ํ˜‘์—…์˜ ๊ธฐ๋ณธ์ด๋‹ค. ํŒ€๊ณผ ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ๋„ค์ด๋ฐ ๊ทœ์น™์„ ์ •ํ•˜๊ณ  ์ž˜ ์ง€์ผœ๋‚˜๊ฐ€์ž!

์ด์ „ ๊ธ€
๐ŸŽฎ Controlled์™€ Uncontrolled - ๋ฆฌ์•กํŠธ ํผ ์ปดํฌ๋„ŒํŠธ ์ดํ•ดํ•˜๊ธฐ
๋‹ค์Œ ๊ธ€
๐Ÿงฉ Spring Bean ๋“ฑ๋ก ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ: @Component๋ถ€ํ„ฐ @Mapper๊นŒ์ง€
์žฅ์‹์šฉ ๋กœ๊ณ