Home > CS > 2024 > ๐Ÿ’พ [CS] API ์„ค๊ณ„, ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜, ํŠธ๋žœ์žญ์…˜, ์—”ํ‹ฐํ‹ฐ(Entity), ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์˜ ์ฐจ์ด์ .

๐Ÿ’พ [CS] API ์„ค๊ณ„, ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜, ํŠธ๋žœ์žญ์…˜, ์—”ํ‹ฐํ‹ฐ(Entity), ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์˜ ์ฐจ์ด์ .
CS

๐Ÿ’พ [CS] API ์„ค๊ณ„, ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜, ํŠธ๋žœ์žญ์…˜, ์—”ํ‹ฐํ‹ฐ(Entity), ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์˜ ์ฐจ์ด์ .

1๏ธโƒฃ API ์„ค๊ณ„.

  • API ์„ค๊ณ„ ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค(์ฆ‰, API)๋ฅผ ์ •์˜ํ•˜๊ณ  ์„ค๊ณ„ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
  • API๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ, API ์„ค๊ณ„๋Š” ์ด๋Ÿฌํ•œ ์ƒํ˜ธ์ž‘์šฉ์ด ํšจ์œจ์ ์ด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠนํžˆ RESTful API์™€ ๊ฐ™์€ ์›น API๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์„ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

1. API ์„ค๊ณ„์˜ ํ•ต์‹ฌ ์š”์†Œ.

API ์„ค๊ณ„๋Š” ์‚ฌ์šฉ์ž์™€ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ช…ํ™•ํ•˜๊ณ  ์ผ๊ด€๋œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์š”์†Œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1. ์—”๋“œํฌ์ธํŠธ(Endpoint) ์ •์˜.

  • API ์—”๋“œํฌ์ธํŠธ๋Š” API๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž์›(๋ฆฌ์†Œ์Šค)์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ URL ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด /users ๋‚˜ /product/123๋Š” ๊ฐ๊ฐ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ œํ’ˆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ช…ํ™•ํ•˜๊ณ  ์ง๊ด€์ ์ธ URL ๊ฒฝ๋กœ ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
    • URL์€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์ž˜ ํ‘œํ˜„ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ
  • GET /users
    • ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ด.
  • POST /users
    • ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ƒ์„ฑ.
  • GET /users/{id}
    • ํŠน์ • ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ.
  • PUT /users/{id}
    • ์‚ฌ์šฉ์ž ์ •๋ณด ์ˆ˜์ •.
  • DELETE /users/{id}
    • ์‚ฌ์šฉ์ž ์‚ญ์ œ.

2. HTTP ๋ฉ”์„œ๋“œ.

  • HTTP ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ• ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ
      • GET : ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • POST : ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • PUT : ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • DELETE : ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • PATCH : ๋ฆฌ์†Œ์Šค์˜ ์ผ๋ถ€๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์—”๋“œํฌ์ธํŠธ์™€ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ API์˜ ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

3. ๋ฐ์ดํ„ฐ ํ˜•์‹.

  • API๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ JSON ์ด๋‚˜ XML ๊ณผ ๊ฐ™์€ ํ˜•์‹์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€ API๋Š” ๊ฐ€๋ฒผ์šด JSON ํ˜•์‹์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์‘๋‹ต์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‰ฝ๊ฒŒ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ์ •์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ(JSON ๋ฐ์ดํ„ฐ)

{
    "id": 123,
    "name": "Kobe",
    "email": "kobe@example.com"
}

4. ์š”์ฒญ ๋ฐ ์‘๋‹ต ๊ตฌ์กฐ.

  • ์š”์ฒญ(Request) ์€ API๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • ์š”์ฒญ ๋ณธ๋ฌธ์—๋Š” JSON ๋˜๋Š” ํผ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ URL ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‘๋‹ต(Response) ์€ ์š”์ฒญ์— ๋Œ€ํ•œ ์„œ๋ฒ„์˜ ์‘๋‹ต์œผ๋กœ, ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ(Request)

POST /users
Content-Type: application/json

{
    "name": "kobe",
    "email": "kobe@example.com"
}

์‘๋‹ต(Response)

HTTP/1.1 201 Created
Content-Type: application/json

{
    "id": 123,
    "name": "Kobe",
    "email": "kobe@example.com"
}

5. ์ƒํƒœ ์ฝ”๋“œ.

  • HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, API ์„ค๊ณ„์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ์˜ค๋ฅ˜๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • 200 OK : ์š”์ฒญ ์„ฑ๊ณต.
    • 201 Created : ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต.
    • 400 Bad Request : ์ž˜๋ชป๋œ ์š”์ฒญ.
    • 401 Unauthorized : ์ธ์ฆ ์‹คํŒจ.
    • 403 Forbidden : ๊ถŒํ•œ ๋ถ€์กฑ.
    • 404 Not Found : ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ.
    • 500 Internal Server Error : ์„œ๋ฒ„ ์˜ค๋ฅ˜.

์‘๋‹ต ์˜ˆ์‹œ.

HTTP/1.1 404 Not Found

6. ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ.

  • API์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ URL ํŒŒ๋ผ๋ฏธํ„ฐ, ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง, ์š”์ฒญ ๋ณธ๋ฌธ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฒฝ๋กœ ๋ณ€์ˆ˜(Path Variable) : URL ๊ฒฝ๋กœ์— ํฌํ•จ๋œ ๋ณ€์ˆ˜(/users/{id})
    • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ(Query Parameter) : URL ๋’ค์— ๋ถ™๋Š” ?key=value ํ˜•์‹์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(/users?sort=name)
    • ์š”์ฒญ ๋ณธ๋ฌธ(Request Body) : POST๋‚˜ PUT ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ๋ณธ๋ฌธ์— JSON์ด๋‚˜ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ.

7. ๋ณด์•ˆ.

  • API๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • OAuth 2.0, JWT(Json Web Token)์™€ ๊ฐ™์€ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTPS๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ๊ฒƒ๋„ ํ•„์ˆ˜์ ์ธ ๋ณด์•ˆ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

8. ๋ฒ„์ „ ๊ด€๋ฆฌ.

  • API๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
    • API ๋ฒ„์ „์€ URL์— ํฌํ•จํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ.

  • /v1/users : ๋ฒ„์ „ 1์˜ API
  • /v2/users : ๋ฒ„์ „ 2์˜ API

9. ์—๋Ÿฌ ์ฒ˜๋ฆฌ.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ์ž˜๋ชป ๋ณด๋ƒˆ๊ฑฐ๋‚˜ ์„œ๋ฒ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ ์ ˆํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์™€ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

์—๋Ÿฌ ์‘๋‹ต ์˜ˆ์‹œ.

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
    "error": "Invalid input data",
    "message": "The email field is required"
}

10. ๋ฌธ์„œํ™”.

  • API๋Š” ๋ช…ํ™•ํ•œ ๋ฌธ์„œํ™”๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ API๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์—”๋“œํฌ์ธํŠธ, ์š”์ฒญ ๋ฐฉ๋ฒ•, ํŒŒ๋ผ๋ฏธํ„ฐ, ์‘๋‹ต ํ˜•์‹ ๋“ฑ์„ ์ƒ์„ธํžˆ ๊ธฐ์ˆ ํ•œ ๋ฌธ์„œ๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ API ๋ฌธ์„œํ™” ๋„๊ตฌ๋กœ๋Š” Swagger(OpenAPI)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2. API ์„ค๊ณ„ ์›์น™.

  • 1. ์ผ๊ด€์„ฑ
    • ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ์™€ HTTP ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์— ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์€ ํ•ญ์ƒ POST ๋ฉ”์„œ๋“œ๋ฅผ, ์กฐํšŒ๋Š” GET ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 2. RESTful ๋””์ž์ธ
    • RESTful API ์›์น™์— ๋”ฐ๋ผ ๋ฆฌ์†Œ์Šค๋ฅผ URL๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , HTTP ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ํ–‰๋™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • 3. ํ™•์žฅ์„ฑ
    • API๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๊ธฐ์กด ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 4. ์‚ฌ์šฉ์ž ์นœํ™”์ 
    • API๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ง๊ด€์ ์ธ ์—”๋“œํฌ์ธํŠธ ๊ตฌ์กฐ์™€ ์ ์ ˆํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. API ์„ค๊ณ„ ๋„๊ตฌ.

  • 1. Postman
    • API ํ…Œ์ŠคํŠธ ๋ฐ ์š”์ฒญ/์‘๋‹ต ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋„๊ตฌ.
    • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์†์‰ฝ๊ฒŒ ๋ณด๋‚ด๋ณด๊ณ  ์‘๋‹ต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 2. Swagger(OpenAPI)
    • API ๋ฌธ์„œํ™”์™€ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋„๊ตฌ.
    • API๋ฅผ ์ •์˜ํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.
  • 3. Insomnia
    • Postman๊ณผ ๋น„์Šทํ•œ API ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋กœ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

4. ์š”์•ฝ.

  • API ์„ค๊ณ„๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹  ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ, ์—”๋“œํฌ์ธํŠธ, HTTP ๋ฉ”์„œ๋“œ, ๋ฐ์ดํ„ฐ ํ˜•์‹, ๋ณด์•ˆ, ์ƒํƒœ ์ฝ”๋“œ ๋“ฑ์˜ ์š”์†Œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • RESTful API ์›์น™์— ๋”ฐ๋ผ ์„ค๊ณ„๋˜๋ฉฐ, ์ง๊ด€์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ, ๋ช…ํ™•ํ•œ ๋ฌธ์„œํ™”๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด API์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(Layered Architecture)

  • ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(Layered Architecture) ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„์–ด ์„ค๊ณ„ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • ์ด ํŒจํ„ด์€ ๊ฐ๊ฐ์˜ ๊ณ„์ธต์ด ํŠน์ •ํ•œ ์ฑ…์ž„์„ ๊ฐ€์ง€๋ฉฐ, ๊ฐ ๊ณ„์ธต์€ ์ž์‹ ์ด ๋งก์€ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ๊ณ„์ธต์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ ๊ทธ๋ฆฌ๊ณ  ํ™•์žฅ์„ฑ ์„ ๋†’์ด๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ํŠนํžˆ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

1. ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ํŠน์ง•.

1. ์ฑ…์ž„ ๋ถ„๋ฆฌ(Separation of Concerns).

  • ๊ฐ ๊ณ„์ธต์€ ๊ณ ์œ ํ•œ ์ฑ…์ž„์„ ๊ฐ€์ง€๋ฉฐ, ๋‹ค๋ฅธ ๊ณ„์ธต๊ณผ๋Š” ํŠน์ •ํ•œ ๋ฐฉ์‹๋งŒ์œผ๋กœ๋งŒ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๊ณ , ๊ฐ ๊ณ„์ธต์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๊ณ„์ธต ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ.

  • ๊ฐ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต๊ณผ๋งŒ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, UI ๊ณ„์ธต์€ ์„œ๋น„์Šค ๊ณ„์ธต๊ณผ๋งŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ, ์„œ๋น„์Šค ๊ณ„์ธต์€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต๊ณผ๋งŒ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ์ƒํ˜ธ์ž‘์šฉ ๊ทœ์น™์€ ๊ณ„์ธต ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ์‹œ์Šคํ…œ์„ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

3. ์œ ์ง€๋ณด์ˆ˜์„ฑ.

  • ๊ณ„์ธต ๊ฐ„์˜ ์ฑ…์ž„์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜๋ฏ€๋กœ, ํŠน์ • ๊ณ„์ธต์˜ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ณ„์ธต์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

4. ํ™•์žฅ์„ฑ.

  • ๊ฐ ๊ณ„์ธต์€ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ๊ณ„์ธต์˜ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜์–ด๋„ ๋‹ค๋ฅธ ๊ณ„์ธต์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

2. ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ๊ณ„์ธต.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์ธต๋“ค๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค.

1. ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต(Presentation Layer)

  • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €, ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ์—์„œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ฃผ๋กœ Controller๊ฐ€ ์ด ๊ณ„์ธต์— ํ•ด๋‹นํ•˜๋ฉฐ, HTTP ์š”์ฒญ์„ ๋ฐ›์•„์„œ Service ๊ณ„์ธต์— ์ „๋‹ฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2. ์„œ๋น„์Šค ๊ณ„์ธต(Service Layer)

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต์œผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต์—์„œ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์— ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ณ„์ธต์—์„œ๋Š” ์ฃผ๋กœ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋ฐ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

3. ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ณ„์ธต(Domain Layer)

  • ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํฌํ•จ๋œ ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.
  • ์ด ๊ณ„์ธต์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๊ฐœ๋…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—”ํ‹ฐํ‹ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ณ„์ธต์€ ๋‹ค๋ฅธ ๊ณ„์ธต์˜ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•˜๋ฉฐ, ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„ ๋ฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

4. ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต(Data Access Layer)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ Repository ๋˜๋Š” DAO(Data Access Object) ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค CRUD(Create, Read, Update, Delete) ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋กœ์ง์€ ์ด ๊ณ„์ธต์— ์ง‘์ค‘๋˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์™ธ๋ถ€ ์‹œ์Šคํ…œ ๊ณ„์ธต(External Layer) (์„ ํƒ์ )

  • ์™ธ๋ถ€ API๋‚˜ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ์„œ๋น„์Šค๋‚˜ API์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์ด ๊ณ„์ธต์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

3. ๊ณ„์ธต ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ.

  • ๊ฐ ๊ณ„์ธต์€ ์ž์‹ ์˜ ์ƒ์œ„ ๊ณ„์ธต๊ณผ ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต์€ ์„œ๋น„์Šค ๊ณ„์ธต์— ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ณ , ์„œ๋น„์Šค ๊ณ„์ธต์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

4. ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ์˜ˆ์‹œ.

๋‹ค์Œ์€ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

// Presentation Layer(Controller)

@RestController
@RequestMapping("/users")
public class UserController {
    
    private final UserService userService;
    
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    
    @GetMapping("/{id}")
    public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
        UserDTO user = userService.getUserById(id);
        return ResponseEntity.ok(user);
    }
}

// Service Layer
@Service
public class UserService {
    
    private final UserRepository userRepository;
    
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    public UserDTO getUserById(Long id) {
        User user = userRepository.findById(id)
            .orElseThrow(() -> new UserNotFoundException("User not found"));
        return new UserDTO(user);
    }
}

// Domain Layer
@Entity
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    
    // getters and setters
}

// Data Access Layer (Repository)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

5. ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ์žฅ์ .

  • 1. ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
    • ๊ฐ ๊ณ„์ธต์€ ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ๊ฐ€์ง€๋ฏ€๋กœ, ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ณ„์ธต๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ๋‹ค๋ฅธ ๊ณ„์ธต์—๋Š” ์ตœ์†Œํ•œ์˜ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • 2. ๋ชจ๋“ˆํ™”
    • ๊ณ„์ธต๋ณ„๋กœ ๊ธฐ๋Šฅ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ ๊ณ„์ธต์˜ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ณ„์ธต์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋‚˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  • 3. ํ™•์žฅ์„ฑ
    • ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋Š” ํ™•์žฅํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
    • ํŠน์ • ๊ณ„์ธต์˜ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ณ„์ธต์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋‚˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  • 4. ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ
    • ๊ฐ ๊ณ„์ธต์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด, ๊ณ„์ธต๋ณ„๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋น„์Šค ๊ณ„์ธต์˜ ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ํ•„์š” ์—†์ด Mock ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ๋‹จ์ .

  • 1. ๋ณต์žก์„ฑ ์ฆ๊ฐ€
    • ๊ฐ ๊ณ„์ธต์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•œ ๊ตฌ์กฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 2. ์„ฑ๋Šฅ ์ €ํ•˜
    • ๊ณ„์ธต ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ๋นˆ๋ฒˆํ•  ๊ฒฝ์šฐ, ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐ ๊ณ„์ธต์„ ๊ฑฐ์ณ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‘๋‹ต ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 3. ์ถ”๊ฐ€ ์ž‘์—… ํ•„์š”
    • ๊ณ„์ธต๋ณ„๋กœ ์ฑ…์ž„์„ ๋‚˜๋ˆ„์–ด ์„ค๊ณ„ํ•˜๋‹ค ๋ณด๋‹ˆ, ์ฝ”๋“œ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์ถ”๊ฐ€์ ์ธ ๊ฐœ๋ฐœ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7. ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ํ™œ์šฉ ์‚ฌ๋ก€

  • 1. ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
    • ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • 2. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
    • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ์ค‘์š”ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค,
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ „์ž ์ƒ๊ฑฐ๋ž˜ ์‚ฌ์ดํŠธ๋‚˜ CRM ์‹œ์Šคํ…œ ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

7. ์š”์•ฝ.

  • ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„์–ด, ๊ฐ ๊ณ„์ธต์ด ํŠน์ •ํ•œ ์ฑ…์ž„์„ ๊ฐ€์ง€๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์  ํ…Œ์ด์…˜, ์„œ๋น„์Šค, ๋„๋ฉ”์ธ, ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋“ฑ์˜ ๊ณ„์ธต์ด ์žˆ์œผ๋ฉฐ, ๊ฐ ๊ณ„์ธต์€ ์ƒ์œ„/ํ•˜์œ„ ๊ณ„์ธต๊ณผ๋งŒ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๋ชจ๋“ˆ์„ฑ, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๋“ฑ์˜ ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ณต์žก์„ฑ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•œ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค.

3๏ธโƒฃ ํŠธ๋žœ์ ์…˜(Transaction)

  • ํŠธ๋žœ์ ์…˜(Transaction) ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ์‹œ์Šคํ…œ์—์„œ ํ•˜๋‚˜์˜ ์ž‘์€ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋งํ•˜๋ฉฐ, ์ผ๋ จ์˜ ์ž‘์—…๋“ค์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ๋ชจ๋‘ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ๋ฌถ์Œ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ, ์ด ์ž‘์—…๋“ค์„ ๋ชจ๋‘ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค

1. ํŠธ๋žœ์ ์…˜์˜ ํŠน์ง•(ACID ํŠน์„ฑ)

ํŠธ๋žœ์ ์…˜์€ ACID๋ผ๋Š” ๋„ค ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์†์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • 1. ์›์ž์„ฑ(Atomicity)
    • ํŠธ๋žœ์ ์…˜ ๋‚ด์˜ ์ž‘์—…์€ ๋ชจ๋‘ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜, ์ „ํ˜€ ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ํŠธ๋žœ์ ์…˜ ๋‚ด์˜ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด, ์ „์ฒด ํŠธ๋ Œ์ ์…˜์€ ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ด์ „์˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
  • 2. ์ผ๊ด€์„ฑ(Consistency)
    • ํŠธ๋žœ์ ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ํ›„์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•ญ์ƒ ์ผ๊ด€๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ฆ‰, ํŠธ๋žœ์žญ์…˜์˜ ์‹คํ–‰ ์ „๊ณผ ์‹คํ–‰ ํ›„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ชจ๋“  ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 3. ๊ณ ๋ฆฝ์„ฑ(Isolation)
    • ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๊ณ ๋ฆฝ๋œ ์ƒํƒœ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ํŠธ๋žœ์žญ์…˜์ด ๊ทธ ์ค‘๊ฐ„์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ํŠธ๋žœ์žญ์…˜๋“ค์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ผ๊ด€์„ฑ ์—†๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 4. ์ง€์†์„ฑ(Durability)
    • ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ํ›„, ๊ทธ ๊ฒฐ๊ณผ๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹œ์Šคํ…œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ํŠธ๋žœ์žญ์…˜ ๊ฒฐ๊ณผ๋Š” ์†์‹ค๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ํŠธ๋žœ์žญ์…˜์˜ ์ž‘์—… ํ๋ฆ„.

ํŠธ๋žœ์žญ์…˜์˜ ์ž‘์—…์€ ์ฃผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ช…๋ น์–ด๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

  • 1. COMMIT
    • ํŠธ๋žœ์žญ์…˜ ๋‚ด์˜ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด, COMMIT์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
  • 2. ROLLBACK
    • ํŠธ๋žœ์žญ์…˜ ๋‚ด์˜ ์ž‘์—…์ด ์ค‘๊ฐ„์— ์‹คํŒจํ•˜๋ฉด, ROLLBACK์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋ฉฐ, ์ด๋•Œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.

3. ํŠธ๋žœ์žญ์…˜์˜ ์˜ˆ์‹œ.

์€ํ–‰ ๊ณ„์ขŒ ์ด์ฒด

์€ํ–‰์—์„œ A ๊ณ„์ขŒ์—์„œ B ๊ณ„์ขŒ๋กœ 100๋‹ฌ๋Ÿฌ๋ฅผ ์ด์ฒดํ•˜๋Š” ๊ณผ์ •์„ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด์ง€๋ฉฐ, ์ด๋“ค ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค.

  • 1. A ๊ณ„์ขŒ์—์„œ 100 ๋‹ฌ๋Ÿฌ ์ธ์ถœ
  • 2. B ๊ณ„์ขŒ์—์„œ 100๋‹ฌ๋Ÿฌ ์ž…๊ธˆ

์ด๋•Œ ๋‘ ์ž‘์—…์€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ : ๋‘ ๋‹จ๊ณ„๊ฐ€ ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด COMMIT๋˜์–ด ๊ณ„์ขŒ ์ƒํƒœ๊ฐ€ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.
  • ์‹คํŒจํ•œ ๊ฒฝ์šฐ : A ๊ณ„์ขŒ์—์„œ 100๋‹ฌ๋Ÿฌ๋ฅผ ์ธ์ถœํ–ˆ์ง€๋งŒ, B ๊ณ„์ขŒ๋กœ ์ž…๊ธˆํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์€ ROLLBACK๋˜์–ด A ๊ณ„์ขŒ์˜ ์ƒํƒœ๋„ ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์‹œ์Šคํ…œ์€ ์ผ๊ด€๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ ์˜ˆ์ œ(SQL)

BEGIN TRANSACTION;

UPDATE accounts
SET balance = balance - 100
WHERE account_id = 'A';

UPDATE accounts
SET balance = balance + 100
WHERE account_id = 'B';

COMMIT;
  • ์œ„ SQL ์˜ˆ์ œ๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋‘ ๊ฐœ์˜ UPDATE ๋ฌธ์ด ์‹คํ–‰๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰ COMMIT ๋ช…๋ น์ด ์‹คํ–‰๋˜๋ฉฐ ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ROLLBACK์„ ํ†ตํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ทจ์†Œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. Java์™€ Spring์—์„œ์˜ ํŠธ๋žœ์žญ์…˜.

Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠธ๋žœ์žญ์…˜์€ ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
Spring Framework๋Š” @Transactional ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ: @Transactional ์‚ฌ์šฉ

@Service
public class BankService {
    
    @Autowired
    private AccountRepository accountRepository;
    
    @Transactional
    public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) {
        Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow();
        Account toAccount = accountRepository.findById(toAccountId).orElseThrow();
        
        fromAccount.debit(amount);
        toAccount.credit(amount);
        
        accountRepository.save(fromAccount);
        accountRepository.save(toAccount);
    }
}
  • @Transactional
    • ์ด ๋ฉ”์„œ๋“œ๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ROLLBACK ๋ฉ๋‹ˆ๋‹ค.
    • ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด COMMIT๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

5. ํŠธ๋žœ์žญ์…˜์˜ ์ค‘์š”์„ฑ.

1. ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ.

  • ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ์›๋ž˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋ฏ€๋กœ, ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ.

  • ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ํŠนํžˆ ๊ธˆ์œต ๊ฑฐ๋ž˜๋‚˜ ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ž‘์—…์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์•ˆ์ „ํ•˜๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋™์‹œ์„ฑ ์ œ์–ด

  • ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜์„ ํ†ตํ•ด ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ๋ฆฝ์„ฑ์„ ํ†ตํ•ด ์„œ๋กœ ๊ฐ„์„ญ ์—†์ด ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

6. ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

ํŠธ๋žœ์žญ์…˜์˜ ๊ณ ๋ฆฝ์„ฑ(Isolation) ์€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์„œ๋กœ์—๊ฒŒ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ œ์–ดํ•˜๋Š” ์ˆ˜์ค€์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 1. READ UNCOMMITED
    • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์•„์ง COMMIT๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ฉฐ, ์ผ๊ด€์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 2. READ COMMITED
    • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด COMMITํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์ธ ์ˆ˜์ค€์˜ ๊ฒฉ๋ฆฌ์ด๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 3. REPEATABLE READ
    • ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ์–ด๋„ ํ•ญ์ƒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ฝ๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 4. SERIALIZABLE
    • ๊ฐ€์žฅ ๋†’์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ, ํŠธ๋žœ์žญ์…˜์ด ์ง๋ ฌํ™”๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7. ์š”์•ฝ.

  • ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๋ จ์˜ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋ชจ๋“  ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๋ฉด COMMIT, ์‹คํŒจํ•˜๋ฉด ROLLBACK์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ACID ์›์น™์— ๋”ฐ๋ผ ํŠธ๋žœ์žญ์…˜์€ ์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๊ณ ๋ฆฝ์„ฑ, ์ง€์†์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์€ ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์ค‘์š”ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • Java์™€ Spring์—์„œ๋Š” @Transactional ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ์—”ํ‹ฐํ‹ฐ(Entity)

  • ์—”ํ‹ฐํ‹ฐ(Entity) ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด ๋˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • ์—”ํ‹ฐํ‹ฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐœ๋…์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ด๋ธ”๊ณผ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

1. ์—”ํ‹ฐํ‹ฐ์˜ ํŠน์ง•.

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘.

  • ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ(row)์™€ 1:1๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, User ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ user ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜์–ด ์‚ฌ์šฉ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ, ๊ฐ ์—”ํ‹ฐํ‹ฐ์˜ ์ธ์Šคํ„ด์Šค๋Š” ํ…Œ์ด๋ธ”์˜ ํ–‰(row)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

2. ์ƒํƒœ(ํ•„๋“œ)๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด.

  • ์—”ํ‹ฐํ‹ฐ๋Š” ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ(ํ•„๋“œ)์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•„๋“œ๋Š” ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ(Column, ์—ด)์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

3. ๊ณ ์œ ํ•œ ์‹๋ณ„์ž(Primary Key)

  • ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„๋  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„์ž(Primary Key) ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹๋ณ„์ž๋Š” ๊ฐ ์—”ํ‹ฐํ‹ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์œ ์ผํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

4. ์˜์†์„ฑ(Persistence)

  • ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ์˜์†์ ์ธ ์ €์žฅ์†Œ์— ์ €์žฅ๋˜๋ฉฐ, ์ด ์ €์žฅ์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์—”ํ‹ฐํ‹ฐ์˜ ์˜ˆ์‹œ.

1. Java์—์„œ์˜ ์—”ํ‹ฐํ‹ฐ.

  • Spring Data JPA๋‚˜ Hibernate ๊ฐ™์€ ORM(Object-Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์—”ํ‹ฐํ‹ฐ๋Š” ์ฃผ๋กœ ํด๋ž˜์Šค์— @Entity ์• ๋„ˆํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ์ง์ ‘์ ์œผ๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // Primary Key
    
    private String name;
    private String email;
    
    // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
    public User() {}
    
    // Getter and Setter
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = idl
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name
    }
    
    public String getEmail() {
        return email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
}

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘

์œ„ User ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    email VARCHAR(255)
)
  • @Entity
    • ์ด ํด๋ž˜์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์—”ํ‹ฐํ‹ฐ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ์ด ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘์ด๋ฉ๋‹ˆ๋‹ค.
  • @Id
    • ์ด ํ•„๋“œ๊ฐ€ ์—”ํ‹ฐํ‹ฐ์˜ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž์ธ Primary Key ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • @GeneratedValue
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ’์ž„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • GenerationType.IDENTITY๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ID ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3. ์—”ํ‹ฐํ‹ฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ.

1. ์‹๋ณ„์ž(Primary Key)

  • ์—”ํ‹ฐํ‹ฐ๋Š” ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, User ์—”ํ‹ฐํ‹ฐ์˜ id ํ•„๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Primary Key์— ํ•ด๋‹นํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ์‚ฌ์šฉ์ž๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์†์„ฑ(Attributes)

  • ์—”ํ‹ฐํ‹ฐ๋Š” ์—ฌ๋Ÿฌ ์†์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ์†์„ฑ์€ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋กœ ์ •์˜๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์— ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด User ์—”ํ‹ฐํ‹ฐ์˜ name ๊ณผ email ํ•„๋“œ๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.

3. ์—ฐ๊ด€๊ด€๊ณ„(Relationships)

  • ์—”ํ‹ฐํ‹ฐ ๊ฐ„์—๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, User ์™€ Order๋ผ๋Š” ๋‘ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ์„ ๋•Œ, ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฃผ๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ๊ด€๊ณ„๋Š” JPA์—์„œ @OneToMany, @ManyToOne, @OneToOne, @ManyToMany ๋“ฑ์˜ ์• ๋„ˆํ…Œ์ด์…˜์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž์™€ ์ฃผ๋ฌธ์˜ ๊ด€๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@OneToMany(mappedBy = "user")
private List<Order> ordersl

4. ์ƒํƒœ ๋ฐ ๋™์ž‘.

  • ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, User ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ƒํƒœ(ํ™œ์„ฑํ™” ์—ฌ๋ถ€ ๋“ฑ)๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ํŠน์ • ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์—”ํ‹ฐํ‹ฐ์™€ DTO์˜ ์ฐจ์ด์ .

  • ์—”ํ‹ฐํ‹ฐ(Entity)
    • ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋œ ๊ฐ์ฒด๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ(์ €์žฅ, ์กฐํšŒ, ์—…๋ฐ์ดํŠธ ๋“ฑ)์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ•„๋“œ์™€ 1:1๋กœ ๋งคํ•‘๋˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • DTO(Data Transfer Object)
    • DTO๋Š” ์ฃผ๋กœ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ๊ฐ์ฒด๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ง์ ‘์ ์ธ ์—ฐ๊ด€์ด ์—†์Šต๋‹ˆ๋‹ค.
    • DTO๋Š” ์ „์†ก์— ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ํฌํ•จํ•˜๊ณ , ์—”ํ‹ฐํ‹ฐ์™€๋Š” ๋ณ„๋„์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Š” ์ฃผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ DTO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์˜ค๊ณ , ์ด๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์—”ํ‹ฐํ‹ฐ์˜ ์—ญํ• .

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ.

  • ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ๋งคํ•‘ ๊ฐ์ฒด๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

2. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํฌํ•จ.

  • ์—”ํ‹ฐํ‹ฐ๋Š” ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, User ์—”ํ‹ฐํ‹ฐ๋Š” ์ด๋ฉ”์ผ ํ˜•์‹์„ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž๋ฅผ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ.

  • ์—”ํ‹ฐํ‹ฐ๋Š” JPA์™€ ๊ฐ™์€ ORM(Object-Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ์—”ํ‹ฐํ‹ฐ์˜ ์ƒํƒœ๋Š” ํŠธ๋žœ์žญ์…˜ ๋™์•ˆ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ์ถ”์ ๋˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ ํ•ด๋‹น ์ƒํƒœ๋Š” ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

6. ์—”ํ‹ฐํ‹ฐ์™€ ORM(Object-Relational Mapping)

  • ์—”ํ‹ฐํ‹ฐ๋Š” ORM์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ORM์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, ์—”ํ‹ฐํ‹ฐ๋Š” ORM์— ์˜ํ•ด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

Sping Data JPA๋‚˜ Hibernate ๊ฐ™์€ ORM ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7. ์š”์•ฝ.

  • ์—”ํ‹ฐํ‹ฐ(Entity) ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ์ฒด๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์—”ํ‹ฐํ‹ฐ๋Š” ๊ณ ์œ ํ•œ ์‹๋ณ„์ž(Primary Key) ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์œ ์ผํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜๋ฉฐ, ์†์„ฑ๊ณผ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ์—”ํ‹ฐํ‹ฐ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
  • ORM ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋งคํ•‘๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ ์—†์ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5๏ธโƒฃ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์˜ ์ฐจ์ด์ .

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด์ด๋ฉฐ, ๋‘˜ ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜์ง€๋งŒ, ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์ด ๋‘˜์˜ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๋ฉด ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„๋ฅผ ๋”์šฑ ์ฒด๊ณ„์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Business Logic)

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํฌํ•จํ•œ ๊ตฌ์ฒด์ ์ธ ์ž‘์—…๋“ค์„ ๋งํ•˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋…ผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ

  • ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—….
  • ๊ณ„์ขŒ ์ด์ฒด ๊ธฐ๋Šฅ์—์„œ, ํŠน์ • ๊ณ„์ขŒ์—์„œ ๋ˆ์„ ๋นผ๊ณ , ๋‹ค๋ฅธ ๊ณ„์ขŒ์— ๋ˆ์„ ๋„ฃ๋Š” ๊ณผ์ •์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณ„์‚ฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ.
  • ์žฌ๊ณ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ์ œํ’ˆ์ด ์ถœ๊ณ ๋˜๋ฉด ์žฌ๊ณ  ์ˆ˜๋Ÿ‰์„ ์ค„์ด๊ณ , ์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋‚ด๋Š” ๋กœ์ง.

ํŠน์ง•.

  • ํ”„๋กœ์„ธ์Šค ์ค‘์‹ฌ : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ์ „์ฒด ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ : ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์–ด๋–ค ์ˆœ์„œ๋กœ ์ž‘์—…์ด ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๋“ฑ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ(๊ณ„์ขŒ ์ด์ฒด)

public void transfer(Account fromAccount, Account toAccount, BigDecimal amount) {
    if (fromAccount.getBalnce().compareTo(amount) < 0) {
        throw new InsufficientFundsException("์ž”์•ก์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.");
    }
    
    fromAccount.debit(amount);
    toAccount.credit(amount);
    
    accountRepository(fromAccount);
    accountRepository(toAccount);
}
  • ์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๊ณ„์ขŒ ๊ฐ„์˜ ๊ธˆ์•ก ์ด์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด ๋กœ์ง์€ ๊ตฌ์ฒด์ ์ธ ํ”„๋กœ์„ธ์Šค(์ž”์•ก ํ™•์ธ, ๊ณ„์ขŒ ์ฐจ๊ฐ ๋ฐ ์ž…๊ธˆ, ๋ฐ์ดํ„ฐ ์ €์žฅ)๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

2. ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™(Business Rule)

๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์ง€์ผœ์•ผ ํ•  ๊ทœ์น™์ด๋‚˜ ์ œ์•ฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๊ณ  ๋ฌด์—‡์„ ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค์  ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ํšŒ์‚ฌ์˜ ์šด์˜ ์ •์ฑ…, ๋ฒ•์  ๊ทœ์ œ, ๊ณ„์•ฝ ์กฐ๊ฑด, ์—…๊ณ„ ํ‘œ์ค€ ๋“ฑ์—์„œ ๋„์ถœ๋œ ๊ทœ์ •๋“ค๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋„๋ฉ”์ธ(์—…๋ฌด)์—์„œ ์–ด๋–ค ์ž‘์—…์ด ํ—ˆ์šฉ๋˜๊ณ  ๊ธˆ์ง€๋˜๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ.

  • ๊ณ„์ขŒ ์ด์ฒด ์‹œ ์ž”๊ณ ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์ด์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ์‹œ๊ฐ„๋Œ€์—๋งŒ ์ฃผ๋ฌธ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 18์„ธ ๋ฏธ๋งŒ์€ ์„ฑ์ธ์šฉ ์ œํ’ˆ์„ ๊ตฌ๋งคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŠน์ง•.

  • ์ •์ฑ… ์ค‘์‹ฌ
    • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ์ƒํ™ฉ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ๋™์ž‘๊ณผ ๊ธˆ์ง€๋˜๋Š” ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ
    • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ํŒ€์ด ๊ฒฐ์ •ํ•˜๋ฉฐ, ์‹œ์Šคํ…œ ์„ค๊ณ„์ž๊ฐ€ ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ์ž์ฒด์—์„œ ๋„์ถœ๋œ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • ๋…๋ฆฝ์ 
    • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ์ˆ ์ ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊ณผ๋Š” ๊ด€๊ณ„์—†์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ(์ž”์•ก ๋ถ€์กฑ ํ™•์ธ)

public class Account {
    public boolean hasSufficientFunds(BigDecimal amount) {
        return this.balance.compareTo(amount) >= 0;
    }
}
  • ์ด ์ฝ”๋“œ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ธ โ€œ์ž”์•ก์ด ๋ถ€์กฑํ•˜๋ฉด ์ด์ฒด๋ฅผ ํ•  ์ˆ˜ ์—†๋‹คโ€๋Š” ๊ทœ์น™์„ ๊ตฌํ˜„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์ด ๊ทœ์น™์„ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์ œ๋กœ ์ž”์•ก์ด ๋ถ€์กฑํ•œ์ง€ ํ™•์ธํ•˜๊ณ , ํ•„์š”ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค.

3. ์ฐจ์ด์  ์š”์•ฝ.

๊ตฌ๋ถ„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Business Logic) ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™(Business Rule)
์ •์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌํ˜„. ์‹œ์Šคํ…œ์ด ์ง€์ผœ์•ผ ํ•  ๋น„์ฆˆ๋‹ˆ์Šค์  ์ œ์•ฝ๊ณผ ์š”๊ตฌ ์‚ฌํ•ญ.
ํฌ์ปค์Šค ๊ธฐ๋Šฅ๊ณผ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰ ๋ฐฉ์‹. ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์ • ๋ฐ ์ œ์•ฝ.
์ฃผ์ฒด ์ฃผ๋กœ ๊ฐœ๋ฐœ์ž๋‚˜ ์‹œ์Šคํ…œ ์„ค๊ณ„์ž๊ฐ€ ๊ตฌํ˜„. ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋‹ด๋‹น์ž์— ์˜ํ•ด ์ •์˜.
์˜ˆ์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ, ๊ณ„์‚ฐ ์ฒ˜๋ฆฌ, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ ๋‚˜์ด ์ œํ•œ, ๊ฑฐ๋ž˜ ๊ฐ€๋Šฅ ์‹œ๊ฐ„, ์‹ ์šฉ ํ•œ๋„ ์ดˆ๊ณผ ๋“ฑ
๊ธฐ์ˆ ์  ๊ด€์  ๊ธฐ์ˆ ์ , ๊ตฌํ˜„์  ์ธก๋ฉด์—์„œ ๋‹ค๋ฆ„. ๊ธฐ์ˆ  ๊ตฌํ˜„๊ณผ ๋…๋ฆฝ์ , ๋น„์ฆˆ๋‹ˆ์Šค์  ๊ทœ์น™์„ ๋‚˜ํƒ€๋ƒ„.
์˜ํ–ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์ž‘์„ ์ •์˜. ๋™์ž‘์„ ์ œ์•ฝํ•˜๊ฑฐ๋‚˜ ํ—ˆ์šฉํ•จ.

4. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์˜ ๊ด€๊ณ„.

  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ†ตํ•ด ์‹คํ˜„๋ฉ๋‹ˆ๋‹ค.
    • ์ฆ‰, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ˆ˜ํ–‰๋  ๋•Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์‹œ์Šคํ…œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ํ•ด๋‹น ๋กœ์ง์ด ๋™์ž‘ํ•  ๋•Œ ์ง€์ผœ์•ผ ํ•˜๋Š” ์ œ์•ฝ๊ณผ ์กฐ๊ฑด์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๊ณ ์ •๋œ ์ •์ฑ…์ด๋‚˜ ๊ทœ์ •์ด์ง€๋งŒ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ด๋ฅผ ์ ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ทœ์น™์˜ ์˜ˆ์‹œ

  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ : ๊ณ„์ขŒ ์ž”์•ก์ด ๋ถ€์กฑํ•˜๋ฉด ์ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ž‘ : ๊ณ„์ขŒ ์ธ์ถœ ๊ณผ์ •์—์„œ ์ž”์•ก ํ™•์ธ, ๊ธˆ์•ก ์ธ์ถœ, ๊ธฐ๋ก ์ €์žฅ ๋“ฑ์˜ ๊ตฌ์ฒด์ ์ธ ์ ˆ์ฐจ๋ฅผ ์ฒ˜๋ฆฌ.

5. ์š”์•ฝ.

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ตฌ์ฒด์ ์ธ ์ž‘์—…์ด๋ฉฐ, ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๋น„์ฆˆ๋‹ˆ์Šค ์šด์˜์—์„œ ์ง€์ผœ์•ผ ํ•  ๊ทœ์ •๊ณผ ์ œ์•ฝ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์‹œ์Šคํ…œ์— ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋ฉด์„œ ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋‘˜์€ ์ƒํ˜ธ ๋ณด์™„์ ์ธ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.