๐พ [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์ด๋ ํผ ๋ฐ์ดํฐ๋ฅผ ํฌํจ.
-
๊ฒฝ๋ก ๋ณ์(Path Variable) : URL ๊ฒฝ๋ก์ ํฌํจ๋ ๋ณ์(
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
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ก ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ฆฌ์์ค ์์ฑ์ ํญ์
- ๋ชจ๋ ์๋ํฌ์ธํธ์ HTTP ๋ฉ์๋ ์ฌ์ฉ์ ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
-
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. ์์ฝ.
- ๋น์ฆ๋์ค ๋ก์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง๋ฅผ ๋ค๋ฃจ๋ ๊ตฌ์ฒด์ ์ธ ์์ ์ด๋ฉฐ, ์์คํ ์ ๊ธฐ๋ฅ์ ์ ์ํฉ๋๋ค.
- ๋น์ฆ๋์ค ๊ท์น์ ๋น์ฆ๋์ค ์ด์์์ ์ง์ผ์ผ ํ ๊ท์ ๊ณผ ์ ์ฝ์ ์๋ฏธํ๋ฉฐ, ๋น์ฆ๋์ค์ ์๊ตฌ ์ฌํญ์ ์์คํ ์ ๋ฐ์ํ๊ธฐ ์ํ ๊ท์น์ ๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ ๋น์ฆ๋์ค ๊ท์น์ ์ค์ํ๋ฉด์ ์์คํ ์ด ์ด๋ป๊ฒ ๋์ํด์ผ ํ๋์ง๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก, ๋์ ์ํธ ๋ณด์์ ์ธ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋๋ค.