ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ฅผ ์ํ REST, GraphQL, RPC API ๋์์ธ ํจํด์ ๋ํ ํฌ๊ด์ ์ธ ๋น๊ต. ์ฌ์ฉ ์ฌ๋ก, ์ฅ์ , ๋จ์ ์ ๋ค๋ฃน๋๋ค.
ํ๋ก ํธ์๋ API ๋์์ธ: REST, GraphQL, RPC ํจํด
ํ๋ ์น ๊ฐ๋ฐ์์ ํ๋ก ํธ์๋๋ ์ฌ์ฉ์์ ๋ฐฑ์๋ ์๋น์ค ์ฌ์ด์ ์ค์ํ ์ธํฐํ์ด์ค ์ญํ ์ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ API ๋์์ธ ํจํด์ ์ ํํ๋ ๊ฒ์ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ๊ธ์์๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ธ ๊ฐ์ง API ๋์์ธ ํจํด์ธ REST, GraphQL, RPC(์๊ฒฉ ํ๋ก์์ ํธ์ถ)๋ฅผ ํฌ๊ด์ ์ผ๋ก ๋น๊ตํ๋ฉฐ ๊ฐ๊ฐ์ ๊ฐ์ , ์ฝ์ , ์ ํฉํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์กฐ๋ช ํฉ๋๋ค.
API ๋์์ธ ํจํด ์ดํดํ๊ธฐ
API(์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค) ๋์์ธ ํจํด์ ์๋ก ๋ค๋ฅธ ์ํํธ์จ์ด ์์คํ ๊ฐ์ ํต์ ์ ์ค๊ณํ๊ธฐ ์ํ ๊ตฌ์กฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์์ฒญ์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๊ณ , ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์กฐํ๋๋ฉฐ, ์๋ต์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง๋ฅผ ๊ท์ ํฉ๋๋ค. ํจํด์ ์ ํ์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๋ชจ๋์ ์ฑ๋ฅ, ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
1. REST (Representational State Transfer)
REST๋ ๋ฌด์์ธ๊ฐ?
REST๋ ์ผ๋ฐ์ ์ผ๋ก HTTP์ ๊ฐ์ ์ํ ๋น์ ์ฅ(stateless), ํด๋ผ์ด์ธํธ-์๋ฒ ํต์ ํ๋กํ ์ฝ์ ์์กดํ๋ ์ํคํ ์ฒ ์คํ์ผ์ ๋๋ค. ๋ฆฌ์์ค๋ URI(Uniform Resource Identifiers)๋ก ์๋ณ๋๋ฉฐ GET, POST, PUT, PATCH, DELETE์ ๊ฐ์ ํ์ค HTTP ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ์๋ฉ๋๋ค.
REST์ ํต์ฌ ์์น
- ์ํ ๋น์ ์ฅ(Stateless): ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ณด๋ด๋ ๊ฐ ์์ฒญ์ ์์ฒญ์ ์ดํดํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. ์๋ฒ๋ ์์ฒญ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ปจํ ์คํธ๋ฅผ ์ ์ฅํ์ง ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ-์๋ฒ: ํด๋ผ์ด์ธํธ(ํ๋ก ํธ์๋)์ ์๋ฒ(๋ฐฑ์๋) ๊ฐ์ ๋ช ํํ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
- ์บ์ ๊ฐ๋ฅ(Cacheable): ์๋ต์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํด ์บ์ํ ์ ์์ด์ผ ํฉ๋๋ค.
- ๊ณ์ธตํ๋ ์์คํ (Layered System): ํด๋ผ์ด์ธํธ๋ ์ต์ข ์๋ฒ์ ์ง์ ์ฐ๊ฒฐ๋์๋์ง ๋๋ ์ค๊ฐ ๋งค๊ฐ์ฒด์ ์ฐ๊ฒฐ๋์๋์ง ์ ์ ์์ด์ผ ํฉ๋๋ค.
- ํต์ผ๋ ์ธํฐํ์ด์ค(Uniform Interface): ์ด๊ฒ์ ๊ฐ์ฅ ์ค์ํ ์์น์ด๋ฉฐ ๋ค์์ ํฌํจํฉ๋๋ค:
- ๋ฆฌ์์ค ์๋ณ: ๋ฆฌ์์ค๋ URI๋ก ์๋ณ๋ฉ๋๋ค.
- ํํ์ ํตํ ๋ฆฌ์์ค ์กฐ์: ํด๋ผ์ด์ธํธ๋ ํํ(์: JSON, XML)์ ๊ตํํ์ฌ ๋ฆฌ์์ค๋ฅผ ์กฐ์ํฉ๋๋ค.
- ์๊ธฐ ์์ ์ ๋ฉ์์ง: ๋ฉ์์ง๋ ์ดํดํ๋ ๋ฐ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ์์ง์ผ๋ก์์ ํ์ดํผ๋ฏธ๋์ด(HATEOAS): ํด๋ผ์ด์ธํธ๋ ์๋ต์ ์ ๊ณต๋ ๋งํฌ๋ฅผ ๋ฐ๋ผ API๋ฅผ ํ์ํฉ๋๋ค.
REST์ ์ฅ์
- ๋จ์์ฑ๊ณผ ์น์ํจ: REST๋ ๋๋ฆฌ ์ฑํ๋์์ผ๋ฉฐ ๊ฐ๋ฐ์๋ค์๊ฒ ์ ์๋ ค์ ธ ์์ต๋๋ค. HTTP์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์์ ํ๊ธฐ ์ฝ์ต๋๋ค.
- ํ์ฅ์ฑ: REST์ ์ํ ๋น์ ์ฅ ํน์ฑ ๋๋ถ์ ๋ ๋ง์ ์๋ฒ๋ฅผ ์ถ๊ฐํ์ฌ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
- ์บ์ ๊ฐ๋ฅ์ฑ: RESTful API๋ HTTP ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ํ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ ์ฐ์ฑ: REST๋ ๋ค์ํ ๋ฐ์ดํฐ ํ์(์: JSON, XML)์ ์ ์ํ ์ ์์ผ๋ฉฐ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
- HATEOAS: ์ข ์ข ๊ฐ๊ณผ๋์ง๋ง, HATEOAS๋ API์ ๋ฐ๊ฒฌ ๊ฐ๋ฅ์ฑ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
REST์ ๋จ์
- ์ค๋ฒํ์นญ(Over-Fetching): REST ์๋ํฌ์ธํธ๋ ์ข ์ข ํด๋ผ์ด์ธํธ๊ฐ ์ค์ ๋ก ํ์ํ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ์ฌ ๋์ญํญ๊ณผ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๋ญ๋นํ๊ฒ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ฉด ๊ฐ๋จํ ํ๋กํ ํ์์ ํ์ํ์ง ์์ ์ฃผ์๋ ์ ํธ๋ ์ ๋ณด๊น์ง ๋ฐํ๋ ์ ์์ต๋๋ค.
- ์ธ๋ํ์นญ(Under-Fetching): ํด๋ผ์ด์ธํธ๋ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ธฐ ์ํด ์ฌ๋ฌ ์๋ํฌ์ธํธ์ ์ฌ๋ฌ ๋ฒ ์์ฒญํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋๊ธฐ ์๊ฐ๊ณผ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ์ ์ด๋ ค์: API ๋ฒ์ ๊ด๋ฆฌ๋ ๋ณต์กํ ์ ์์ผ๋ฉฐ, ์ข ์ข URI๋ ํค๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
REST ์์
๋์๊ด ๊ด๋ฆฌ๋ฅผ ์ํ REST API๋ฅผ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์์ ์๋ํฌ์ธํธ์ ๋๋ค:
GET /books: ๋ชจ๋ ์ฑ ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค.GET /books/{id}: ID๋ก ํน์ ์ฑ ์ ๊ฐ์ ธ์ต๋๋ค.POST /books: ์ ์ฑ ์ ์์ฑํฉ๋๋ค.PUT /books/{id}: ๊ธฐ์กด ์ฑ ์ ์ ๋ฐ์ดํธํฉ๋๋ค.DELETE /books/{id}: ์ฑ ์ ์ญ์ ํฉ๋๋ค.
๊ตญ์ ์ ์ฌ๋ก: ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ REST API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ง์ญ๊ณผ ์ธ์ด์ ๊ฑธ์ณ ์ ํ ์นดํ๋ก๊ทธ, ์ฌ์ฉ์ ๊ณ์ , ์ฃผ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๊ฐ ์ ํ์ ์์น์ ๋ฐ๋ผ ๋ค๋ฅธ ์ค๋ช ์ ๊ฐ์ง ์ ์์ต๋๋ค.
2. GraphQL
GraphQL์ด๋ ๋ฌด์์ธ๊ฐ?
GraphQL์ API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด์ด์ ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํ ์๋ฒ ์ธก ๋ฐํ์์ ๋๋ค. ํ์ด์ค๋ถ์์ ๊ฐ๋ฐํ์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ง ์ ํํ๊ฒ ์์ฒญํ ์ ์๊ฒ ํ์ฌ REST์ ์ค๋ฒํ์นญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
GraphQL์ ์ฃผ์ ํน์ง
- ์คํค๋ง ์ ์: GraphQL API๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ ์คํค๋ง์ ์ํด ์ ์๋ฉ๋๋ค.
- ์ฟผ๋ฆฌ ์ธ์ด: ํด๋ผ์ด์ธํธ๋ ์ ์ธ์ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ ๋ช ์ํฉ๋๋ค.
- ํ์ ์์คํ : GraphQL์ ๊ฐ๋ ฅํ ํ์ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ๊ฒ์ฆํ๊ณ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์ธํธ๋ก์คํ์ (Introspection): ํด๋ผ์ด์ธํธ๋ ์คํค๋ง ์์ฒด๋ฅผ ์ฟผ๋ฆฌํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ํ์ ์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
GraphQL์ ์ฅ์
- ์ค๋ฒํ์นญ ๋ฐ ์ธ๋ํ์นญ ๊ฐ์: ํด๋ผ์ด์ธํธ๋ ํ์ํ ๋ฐ์ดํฐ๋ง ์์ฒญํ์ฌ ๋์ญํญ ์ฌ์ฉ์ ์ต์ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๊ฐ๋ ฅํ ํ์ ์ ์คํค๋ง: ์คํค๋ง๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๊ณ์ฝ ์ญํ ์ ํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ์ค๋ฅ๋ฅผ ์ค์ ๋๋ค.
- API ์งํ: GraphQL์ ์คํค๋ง์ ์๋ก์ด ํ๋๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ API์ ๋ํ ๋นํ๊ดด์ ์ธ ๋ณ๊ฒฝ์ ํ์ฉํฉ๋๋ค.
- ๊ฐ๋ฐ์ ๊ฒฝํ: GraphiQL๊ณผ ๊ฐ์ ๋๊ตฌ๋ GraphQL API๋ฅผ ํ์ํ๊ณ ํ ์คํธํ๊ธฐ ์ํ ๋ํํ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
- ๋จ์ผ ์๋ํฌ์ธํธ: ์ผ๋ฐ์ ์ผ๋ก GraphQL API๋ ๋จ์ผ ์๋ํฌ์ธํธ(์:
/graphql)๋ฅผ ๋ ธ์ถํ์ฌ ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ์ ๋จ์ํํฉ๋๋ค.
GraphQL์ ๋จ์
- ๋ณต์ก์ฑ: GraphQL ์๋ฒ๋ฅผ ์ค์ ํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ REST API๋ณด๋ค ๋ ๋ณต์กํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ฌธ์ : ๋ณต์กํ ์ฟผ๋ฆฌ๋ ์ ๋๋ก ์ต์ ํ๋์ง ์์ผ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- ์บ์ฑ: ๋ชจ๋ ์์ฒญ์ด ๋์ผํ ์๋ํฌ์ธํธ๋ก ๊ฐ๊ธฐ ๋๋ฌธ์ HTTP ์บ์ฑ์ GraphQL์์ ๋ ํจ๊ณผ์ ์ ๋๋ค. ๋ ์ ๊ตํ ์บ์ฑ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค.
- ํ์ต ๊ณก์ : ๊ฐ๋ฐ์๋ ์๋ก์ด ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ๋ฐฐ์ฐ๊ณ GraphQL ์คํค๋ง๋ฅผ ์ดํดํด์ผ ํฉ๋๋ค.
GraphQL ์์
์์ ๋ฏธ๋์ด ํ๋ซํผ์ ์ํ GraphQL API๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ํ๋กํ ์ฌ์ง๋ง ์์ฒญํ ์ ์์ต๋๋ค:
query {
user(id: "123") {
name
profilePicture
}
}
์๋ฒ๋ ์์ฒญ๋ ๋ฐ์ดํฐ๋ง ๋ฐํํฉ๋๋ค:
{
"data": {
"user": {
"name": "John Doe",
"profilePicture": "https://example.com/john.jpg"
}
}
}
๊ตญ์ ์ ์ฌ๋ก: ๋ค๊ตญ์ ๋ด์ค ๊ธฐ๊ด์ GraphQL์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์์ค๋ก๋ถํฐ ์ฝํ ์ธ ๋ฅผ ์ง๊ณํ๊ณ ์ฌ๋ฌ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ๊ฐ์ธํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์๋ ํน์ ๊ตญ๊ฐ์ ๊ธฐ์ฌ๋ ํน์ ์ธ์ด๋ก ๋ ๊ธฐ์ฌ๋ฅผ ๋ณด๋๋ก ์ ํํ ์ ์์ต๋๋ค.
3. RPC (์๊ฒฉ ํ๋ก์์ ํธ์ถ)
RPC๋ ๋ฌด์์ธ๊ฐ?
RPC๋ ํ ์ปดํจํฐ์ ํ๋ก๊ทธ๋จ์ด ๋ค๋ฅธ ์ปดํจํฐ์ ํ๋ก์์ (๋๋ ํจ์)๋ฅผ ๋ง์น ๋ก์ปฌ์ ์๋ ๊ฒ์ฒ๋ผ ์คํํ ์ ์๊ฒ ํ๋ ํ๋กํ ์ฝ์ ๋๋ค. REST์ ๋ฌ๋ฆฌ ๋ฆฌ์์ค๊ฐ ์๋ ๋์์ ์ค์ ์ ๋ก๋๋ค.
RPC์ ์ฃผ์ ํน์ง
- ํ๋ก์์ ์งํฅ: RPC๋ ํ๋ก์์ ๋๋ ํจ์ ์ธก๋ฉด์์ ์์ ์ ์ ์ํฉ๋๋ค.
- ๊ฐํ ๊ฒฐํฉ๋: RPC๋ ์ข ์ข REST๋ GraphQL์ ๋นํด ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ ๊ฐํ ๊ฒฐํฉ์ ํฌํจํฉ๋๋ค.
- ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ: RPC ๊ตฌํ์ ์ข ์ข ํจ์จ์ ์ธ ํต์ ์ ์ํด gRPC์ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๋ ์์ฑ: RPC ํ๋ ์์ํฌ๋ ์ข ์ข ์๋น์ค ์ ์๋ก๋ถํฐ ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ ์คํ ์ ์์ฑํ๊ธฐ ์ํด ์ฝ๋ ์์ฑ์ ์ฌ์ฉํฉ๋๋ค.
RPC์ ์ฅ์
- ์ฑ๋ฅ: RPC๋ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ๊ณผ ์ต์ ํ๋ ํต์ ๋๋ถ์ ์๋นํ ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ํจ์จ์ฑ: gRPC์ ๊ฐ์ RPC ํ๋กํ ์ฝ์ ๊ณ ์ฑ๋ฅ, ์ ์ง์ฐ ํต์ ์ ์ํด ์ค๊ณ๋์์ต๋๋ค.
- ์ฝ๋ ์์ฑ: ์ฝ๋ ์์ฑ์ ๊ฐ๋ฐ์ ๋จ์ํํ๊ณ ์ค๋ฅ์ ์ํ์ ์ค์ ๋๋ค.
- ๊ณ์ฝ ๊ธฐ๋ฐ: RPC๋ ์ ์ ์๋ ์๋น์ค ๊ณ์ฝ์ ์์กดํ์ฌ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
RPC์ ๋จ์
- ๊ฐํ ๊ฒฐํฉ๋: ์๋น์ค ์ ์ ๋ณ๊ฒฝ ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
- ์ ํ๋ ์ํธ์ด์ฉ์ฑ: RPC๋ ํนํ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ ์ฌ์ฉํ ๋ REST๋ณด๋ค ์ํธ์ด์ฉ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
- ๊ฐํ๋ฅธ ํ์ต ๊ณก์ : gRPC์ ๊ฐ์ RPC ํ๋ ์์ํฌ๋ REST๋ณด๋ค ํ์ต ๊ณก์ ์ด ๋ ๊ฐํ๋ฅผ ์ ์์ต๋๋ค.
- ๋๋ฒ๊น ์ ๋ณต์ก์ฑ: ๋คํธ์ํฌ๋ฅผ ํตํ RPC ํธ์ถ์ ๋๋ฒ๊น ํ๋ ๊ฒ์ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
RPC ์์
๋ฐฐ์ก ๋น์ฉ์ ๊ณ์ฐํ๋ RPC ์๋น์ค๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋์ฐฉ์ง ์ฃผ์์ ์ํฌ ๋ฌด๊ฒ์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ CalculateShippingCost๋ผ๋ ์๊ฒฉ ํ๋ก์์ ๋ฅผ ํธ์ถํฉ๋๋ค:
// ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋ (gRPC ์ฌ์ฉ ์์ )
stub.calculateShippingCost(ShippingRequest.newBuilder()
.setDestinationAddress("123 Main St, Anytown, USA")
.setPackageWeight(5.0)
.build());
์๋ฒ๋ ํ๋ก์์ ๋ฅผ ์คํํ๊ณ ๋ฐฐ์ก ๋น์ฉ์ ๋ฐํํฉ๋๋ค:
// ์๋ฒ ์ธก ์ฝ๋ (gRPC ์ฌ์ฉ ์์ )
@Override
public void calculateShippingCost(ShippingRequest request, StreamObserver responseObserver) {
double shippingCost = calculateCost(request.getDestinationAddress(), request.getPackageWeight());
ShippingResponse response = ShippingResponse.newBuilder().setCost(shippingCost).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
๊ตญ์ ์ ์ฌ๋ก: ๊ธ๋ก๋ฒ ๋ฌผ๋ฅ ํ์ฌ๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ๋ด๋ถ ํต์ ์ ์ํด gRPC๋ฅผ ํ์ฉํ์ฌ ๋๋์ ๊ฑฐ๋๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ฌ๋ฌ ๊ตญ๊ฐ์ ๊ฑธ์น ํ๋ฌผ์ ์ค์๊ฐ ์ถ์ ์ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ธ๊ณ ๋ฌผ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด ๋ฎ์ ๋๊ธฐ ์๊ฐ๊ณผ ๋์ ํจ์จ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋น๊ตํ
๋ค์์ REST, GraphQL, RPC ๊ฐ์ ์ฃผ์ ์ฐจ์ด์ ์ ์์ฝํ ํ์ ๋๋ค:
| ํน์ง | REST | GraphQL | RPC |
|---|---|---|---|
| ํต์ ์คํ์ผ | ๋ฆฌ์์ค ์งํฅ | ์ฟผ๋ฆฌ ์งํฅ | ํ๋ก์์ ์งํฅ |
| ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ | ์ค๋ฒํ์นญ/์ธ๋ํ์นญ | ์ ํํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ | ํ๋ก์์ ์ ์ํด ์ ์๋จ |
| ์คํค๋ง | ๋์จํ๊ฒ ์ ์๋จ | ๊ฐ๋ ฅํ ํ์ | ๋ช ์์ ๊ณ์ฝ |
| ๊ฒฐํฉ๋ | ๋์จํจ | ๋์จํจ | ๊ฐํจ |
| ์ฑ๋ฅ | ์ข์ (์บ์ฑ ์ฌ์ฉ ์) | ์ ์ฌ์ ์ผ๋ก ๋ ์ข์ (์ต์ ํ ์) | ๋งค์ฐ ์ฐ์ํจ |
| ๋ณต์ก์ฑ | ๋ฎ์ | ์ค๊ฐ | ์ค๊ฐ์์ ๋์ |
| ์ํธ์ด์ฉ์ฑ | ๋์ | ๋์ | ๋ฎ์ (ํนํ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ ์ฌ์ฉ ์) |
| ์ฌ์ฉ ์ฌ๋ก | CRUD ์์ , ๊ฐ๋จํ API | ๋ณต์กํ ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ, ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ | ๋ง์ดํฌ๋ก์๋น์ค ํต์ , ๊ณ ์ฑ๋ฅ ์์คํ |
์ฌ๋ฐ๋ฅธ API ๋์์ธ ํจํด ์ ํํ๊ธฐ
API ๋์์ธ ํจํด์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ ๋ณต์ก์ฑ: ๋ณต์กํ ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ GraphQL์ด ์ข์ ์ ํ์ด ๋ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ์๊ตฌ: ๊ณ ์ฑ๋ฅ ์์คํ ์ ๊ฒฝ์ฐ RPC๊ฐ ๋ ์ ํฉํ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ ์๊ตฌ ์ฌํญ: REST๋ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
- ํ์ ์น์๋: ๊ฐ ํจํด์ ๋ํ ํ์ ๊ฒฝํ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ํธ์ด์ฉ์ฑ ์๊ตฌ ์ฌํญ: REST๋ ๊ฐ์ฅ ์ํธ์ด์ฉ์ฑ์ด ๋์ ํจํด์ ๋๋ค.
์์ ์๋๋ฆฌ์ค:
- ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ: REST API๋ ์ ํ, ์ฃผ๋ฌธ, ์ฌ์ฉ์ ๊ณ์ ๊ด๋ฆฌ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. GraphQL์ ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ์ถ์ ์ ํํ ์์ฑ์ ์ง์ ํ ์ ์๋๋ก ์ ํ ๊ฒ์ ๋ฐ ํํฐ๋ง์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๋ชจ๋ฐ์ผ ๋ฑ ํน ์ ํ๋ฆฌ์ผ์ด์ : GraphQL์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๊ณ์ ์ ๋ณด์ ๊ฑฐ๋ ๋ด์ญ์ ๊ฐ์ ธ์ ๋ฐ์ดํฐ ์ ์ก์ ์ต์ํํ๊ณ ๋ชจ๋ฐ์ผ ์ฅ์น์์์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ: RPC(์: gRPC)๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ํจ์จ์ ์ธ ํต์ ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ (CMS): ๊ฐ๋จํ ์์ ์๋ REST API๋ฅผ, ์ฝํ ์ธ ์์ ๊ฐ์ ๋ณต์กํ ๊ด๊ณ์๋ GraphQL์ ์ฌ์ฉํฉ๋๋ค.
- ์ฌ๋ฌผ ์ธํฐ๋ท(IoT) ํ๋ซํผ: ์ ์ง์ฐ ์ฅ์น ํต์ ์๋ RPC๋ฅผ, ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๋ณด๊ณ ์๋ REST๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ๋ก ํธ์๋ API ํตํฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ ํํ API ๋์์ธ ํจํด์ ๊ด๊ณ์์ด ์ํํ ํ๋ก ํธ์๋ ํตํฉ์ ์ํด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- ์ผ๊ด๋ API ํด๋ผ์ด์ธํธ ์ฌ์ฉ: ์ ๋ขฐํ ์ ์๋ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Axios, Fetch API)๋ฅผ ์ ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ผ๊ด๋๊ฒ ์ฌ์ฉํ์ญ์์ค.
- ์ฐ์ํ ์ค๋ฅ ์ฒ๋ฆฌ: API ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ฌ ์ฌ์ฉ์์๊ฒ ํ์ํ๋ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ์ญ์์ค.
- ๋ก๋ฉ ์ํ ๊ตฌํ: API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ญ์์ค.
- ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ต์ ํ: ๋ถํ์ํ API ํธ์ถ์ ์ค์ด๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์ ๋ฐ ์บ์ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ญ์์ค.
- API ํค ๋ณด์: ๋ฌด๋จ ์ ๊ทผ์ผ๋ก๋ถํฐ API ํค๋ฅผ ๋ณดํธํ์ญ์์ค.
- API ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ API ์ฑ๋ฅ์ ์ถ์ ํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ์ญ์์ค.
- ์๋ ์ ํ ๊ตฌํ: ๋จ์ผ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ์์ฒญ ์๋ฅผ ์ ํํ์ฌ ๋จ์ฉ์ ๋ฐฉ์งํ์ญ์์ค.
- API ์ฌ์ฉ ๋ฌธ์ํ: ํ๋ก ํธ์๋๊ฐ API์ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค.
๊ฒฐ๋ก
์ฌ๋ฐ๋ฅธ API ๋์์ธ ํจํด์ ์ ํํ๋ ๊ฒ์ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๊ณต์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์ค์ํ ๊ฒฐ์ ์ ๋๋ค. REST, GraphQL, RPC๋ ๊ฐ๊ฐ ๊ณ ์ ํ ์ฅ๋จ์ ์ ์ ๊ณตํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ๊ณผ ์ด ๊ธ์์ ๋ ผ์๋ ์์๋ค์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ, ํ์์ ๊ฐ์ฅ ์ ํฉํ ํจํด์ ์ ํํ๊ณ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ด๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ํ๋ก ํธ์๋๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
ํ๋ก ํธ์๋ API๋ฅผ ์ค๊ณํ ๋ ๋จ์์ฑ, ํ์ฅ์ฑ, ์ ์ง๋ณด์์ฑ์ ์ฐ์ ์ํ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ๊ธฐ์ ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ API ๋์์ธ์ ์ต์ ๋ํฅ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ ๋ณด๋ฅผ ์ง์์ ์ผ๋ก ํ์ ํ๋ ๊ฒ์ ๊ธ๋ก๋ฒ ์ปจํ ์คํธ์์ ์ฑ๊ณต์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค.