#
PMP ๊ฐ์ด๋#
OAuthOAuth ๊ธฐ์ ์ ์ฐธ์ฌ์
Our Service ( example.com
), User(์ฌ์ฉ์), Their(Google, Facebook, Twitter ๋ฑ๋ฑ)
User์๊ฒ Their์ id
, pw
๋ฅผ ๊ทธ๋๋ก ์ ๋ฌ๋ฐ๋ ๋ฐฉ๋ฒ
User : ์ฒ์๋ณด๋ ์๋น์ค๋ฅผ ๋ฏฟ์ ์ ์๋ค.
Our Service : ์ ์ ์
id
,pw
๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํด์ผํ ์ฑ ์์ ์ง๋๊ฒ ๋๋ค.Their Service : ์ 3์์ ์๋น์ค๊ฐ ๋ณธ์ธ๋ค์
id
,pw
๋ฅผ ๊ฐ๊ณ ์๋ค๋ ๊ฒ์ ๋ถ๋ง์ด ์๊ธด๋ค.
Their๊ฐ accessToken
์ ๋ฐ๊ธํ๋ ๋ฐฉ๋ฒ
accessToken
์id
,pw
๊ฐ ์๋๋ค.Their Service๋ ์ ๊ณตํ๊ธฐ ์ํ๋ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ ์ ์๋ค.
#
์ฉ์ดClient(Our Service)
Resource Owner(User)
Resource Server(Their) + Authorization Server(์ธ์ฆ ์๋ฒ๋ฅผ ๋ฐ๋ก ๊ตฌ๋ถํ๊ธฐ๋ ํจ)
#
๋ฑ๋กClient ID : ์๋น์ค๋ฅผ ์๋ณํ๋ ์์ด๋
Client Secret : ์๋น์ค์ ๋ํ ๋น๋ฐ๋ฒํธ (์ ๋๋ก ๋ ธ์ถ์ด ๋์ด์ ์๋๋ค.)
Authorized redirect URIs : Resource Server๊ฐ ์ธ์ฆ ์ฝ๋๋ฅผ ์ ๊ณตํ ์๋น์ค์ URL
Scope : Resource Server์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ (ํ์ํ ๊ธฐ๋ฅ์ ๋ํ ์ธ์ฆ๋ง ์ ๊ณต ๊ฐ๋ฅ )
์์ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋ค์์ ๋งํฌ๊ฐ ๋ด๊ฒจ์๋ค.
http://{๋ฆฌ์์ค ์๋ฒ์ ์ฃผ์}/?{ํด๋ผ์ด์ธํธ ID=id}&{์ค์ฝํ=b,c}&{๋ฆฌ๋ค์ด๋ ํธ URL=url}
๋ฆฌ์์ค ์๋ฒ๋ ์ ์ ์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋ฐ๊ณ , ํด๋ผ์ด์ธํธ ์์ด๋์ ๋ฆฌ๋ค์ด๋ ํธ URL์ด ์ผ์นํ๋์ง ํ์ธํ๊ณ , ๊ถํ ํ์ฉ์ ๋ํ ์๋ด๋ฅผ ์ ์ ์๊ฒ ์ ๋ฌํ๊ณ , ์ ์ ๊ฐ ํ์ฉํ ๊ถํ์ด ๋ฌด์์ธ์ง์ ๋ํด ์ ์ฅํ๋ค.
๋ฆฌ์์ค ์๋ฒ๋ authorization code
๋ฅผ ๋ด์์ ๋ฆฌ๋ค์ด๋ ํธ URL๋ก ์ ์ ์ ๋ธ๋ผ์ฐ์ ๋ฅผ๋ฆฌ๋ค์ด๋ ํธ ์ํจ๋ค.
ํด๋ผ์ด์ธํธ๋ authorization code
๋ฅผ ์ ์ ์๊ฒ ๋ฐ๊ณ , ๋ฆฌ๋ค์ด๋ ํธ URL, ํด๋ผ์ด์ธํธ ID, ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ ๊ฐ๊ณ ๋ฆฌ์์ค ์๋ฒ์ ์์ฒญํ๋ค.
์ด ๊ณผ์ ์ด ์๋ฃ๋๋ฉด access token์ ๋ฐ๊ธํ๋ค.
access token์ Header: { Authorization : Bearer token }
์ ๋ด์ ๋ณด๋ผ ์ ์๋ค.
#
OAuth๋ฅผ ํ์ฉํด์ API ์ฌ์ฉํ๊ธฐUsing OAuth 2.0 to Access Google APIs | Google Identity
#
Database Naming Convention#
๋ณต์ํ vs ๋จ์ํํ ์ด๋ธ์ ์ํฐํฐ์ ์ธ์คํด์ค๋ค์ ํํํ๊ธฐ ๋๋ฌธ์ ์๋ฏธ์ ์ผ๋ก ๋ณต์ํ์ด ๋ ๋ง๋ค.
ํ ์ด๋ธ์ ๋จ์ํ์ ์ฌ์ฉํ์ ๋ SQL ๋ฌธ์์
SELECT activity.name
์ผ๋ก ํํํ ์์๋ ์ฅ์ ์ด ์๋ค.ํ์ง๋ง ๋ณต์ํ์ ์ฌ์ฉํ๋๋ผ๋ SQL alias๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๊ทน๋ณต ๊ฐ๋ฅํ๋ค.
SELECT id, name, description FROM products product WHERE product.name = โfooโ AND product.description = โbarโ
REST API์์ ์์์ ๋ํ ์์ฒญ ์ญ์ ํ ์ด๋ธ์ ๋ฐ๋ผ ๋ณต์ํ์ผ๋ก ํ๋ ๊ฒ์ด ์ข๋ค. ex)
GET /users/1
The table naming dilemma: singular vs. plural
#
camelCase vs snake_caseMySQL ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ ๋ด์ ๋๋ ํ ๋ฆฌ์ ํด๋นํ๊ณ , ํ ์ด๋ธ์ํ์ผ์ ํด๋นํ๋ค. ๋ฐ๋ผ์, ์ด์์ฒด์ ์ ๋์๋ฌธ์ ๊ตฌ๋ถ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ ์ด๋ธ ๋ฐ ํธ๋ฆฌ๊ฑฐ ์ด๋ฆ์ ๋์๋ฌธ์ ๊ตฌ๋ถ์ ์ํฅ์ ์ค๋ค.
Windows๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ง๋ง Unix๋ ๊ตฌ๋ถ, macOS๋ ๊ตฌ๋ถํ์ง ์๋ ํ์ผ์์คํ ์ ์ฌ์ฉํ์ง๋ง ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ๋ณผ๋ฅจ๋ ์ง์ํจ.
๋ฐ๋ผ์
snake_case
๊ฐ ์ด์์ฑ๊ณผ ์ฌ์ฉ ํธ์์ฑ ์ธก๋ฉด์์ ๊ฐ์ฅ ๊ถ์ฅ๋๋ค.ํ์ง๋ง
camelCase
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๊ณ , JS๊ฐcamelCase
๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์์ป์ ์ ์๋ ํธ์์ฑ์ด ์๋ค.๋ฌด์๋ณด๋ค ์ผ๊ด๋ ๊ท์น์ ์ฑํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๋ค.
MySQL :: MySQL 8.0 Reference Manual :: 9.2.3 Identifier Case Sensitivity
#
RESTful API#
์๋ฒ ์๋ต์ HTTP ์ํ ์ฝ๋๋ฅผ ์ฌ์ฉํด๋ผ์ค๋ฅ ๋ฐ์์ API ์ฌ์ฉ์์ ํผ๋์ ์์ ๊ธฐ ์ํด ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฐ์ํ ์ค๋ฅ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ HTTP ์๋ต ์ฝ๋๋ฅผ ๋ฐํํด์ผํฉ๋๋ค.ย ์ด๋ฅผ ํตํด API ๊ด๋ฆฌ์๋ ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ์ดํดํ ์์๋ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.ย ์ค๋ฅ๋ก ์ธํด ์์คํ ์ด์ค๋จ๋๋ ๊ฒ์ ์ํ์ง ์์ผ๋ฏ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ ์ฑ๋ก ๋ ์ ์์ต๋๋ค. ์ฆ, API ์๋น์๊ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ค๋ฅ HTTP ์ํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
400 ์๋ชป๋ ์์ฒญ โ ์ด๋ ํด๋ผ์ด์ธํธ ์ธก ์ ๋ ฅ์ด ์ ํจ์ฑ ๊ฒ์ฌ์ ์คํจ ํจ์ ์๋ฏธํฉ๋๋ค .
401 Unauthorized โ ์ฌ์ฉ์๊ฐ ๋ฆฌ์์ค์ ์ก์ธ์ค ํ ์์๋ ๊ถํ์ด ์์์ ์๋ฏธํฉ๋๋ค .ย ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋์ง ์์ ๊ฒฝ์ฐ ๋ฐํ๋ฉ๋๋ค.
403 ๊ธ์ง๋จ โ ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋์์ง๋ง ๋ฆฌ์์ค์ ์ก์ธ์ค ํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
404 Not Found โ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์์ ๋ํ๋ ๋๋ค.
500 ๋ด๋ถ ์๋ฒ ์ค๋ฅ โ ์ผ๋ฐ์ ์ธ ์๋ฒ ์ค๋ฅ์ ๋๋ค.ย ์๋ง๋ ๋ช ์ ์ ์ผ๋ก ๋์ ธ์๋ ์๋ฉ๋๋ค.
502ย Bad Gateway โ ์ ์คํธ๋ฆผ ์๋ฒ์ ์๋ชป๋ ์๋ต์ ๋ํ๋ ๋๋ค.
503 ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ โ ์๋ฒ ์ธก์์ ์๊ธฐ์น ์์ ์ผ์ด ๋ฐ์ํ์์ ๋ํ๋ ๋๋ค (์๋ฒ ๊ณผ๋ถํ, ์์คํ ์ ์ผ๋ถ ์ค๋ฅ ๋ฑ์ด ๋ ์ ์์).
Best practices for REST API design - Stack Overflow Blog
Best Practices for your REST API