REST API์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์๋ฆฌ๋ฅผ ๋ฐ๋์ ๊ตฌ๊ธ๋งํ์ฌ ์ตํ ๋ค์ Route๋ฅผ ๊ตฌ์ฑํ์.
src
: ๋ฉ์ธ ๋ก์งsrc
์๋ ๋๋ฉ์ธ ๋ณ๋ก ํจํค์ง๋ฅผ ๊ตฌ์ฑํ๋๋ก ํ๋ค. ๋๋ฉ์ธ์ด๋ ํ์(User), ๊ฒ์๊ธ(Post), ๋๊ธ(Comment), ์ฃผ๋ฌธ(Order) ๋ฑ ์ํํธ์จ์ด์ ๋ํ ์๊ตฌ์ฌํญ ํน์ ๋ฌธ์ ์์ญ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๊ฐ์ ์ค๊ณํ APP์ ๋ถ์ํ๊ณ ํ์ํ ๋๋ฉ์ธ์ ๋์ถํ์ฌsrc
ํด๋๋ฅผ ๊ตฌ์ฑํ์.config
๋ฐutil
ํด๋: ๋ฉ์ธ ๋ก์ง์ ์๋์ง๋งsrc
์์ ํ์ํ ๋ถ์ฐจ์ ์ธ ํ์ผ๋ค์ ๋ชจ์๋์ ํด๋- ๋๋ฉ์ธ ํด๋ ๊ตฌ์กฐ
Route - Controller - Provider/Service - DAO
-
Route: Request์์ ๋ณด๋ธ ๋ผ์ฐํ ์ฒ๋ฆฌ
-
Controller: Request๋ฅผ ์ฒ๋ฆฌํ๊ณ Response ํด์ฃผ๋ ๊ณณ. (Provider/Service์ ๋๊ฒจ์ฃผ๊ณ ๋ค์ ๋ฐ์์จ ๊ฒฐ๊ณผ๊ฐ์ ํ์ํ), ํ์์ Validation
-
Provider/Service: ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ, ์๋ฏธ์ Validation
-
DAO: Data Access Object์ ์ค์๋ง. Query๊ฐ ์์ฑ๋์ด ์๋ ๊ณณ.
-
๋ฉ์๋ ๋ค์ด๋ฐ๋ฃฐ ์ด ํ ํ๋ฆฟ์์๋ ์ฌ์ฉ๋๋ ๋ฉ์๋ ๋ช ๋ช ๊ท์น์ User ๋๋ฉ์ธ์ ์ฐธ๊ณ ํ์. ํญ์ ์ด ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋ ๊ฒ์ ์๋์ง๋ง, ๋ค์ด๋ฐ์ ํต์ผ์ฑ ์๊ฒ ํด์ฃผ๋ ๊ฒ ์ข๋ค.
3๊ฐ ํ ํ๋ฆฟ ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ด Request์ ๋ํด DB ๋จ๊น์ง ๊ฑฐ์น ๋ค, ๋ค์ Controller๋ก ๋์์ Response ํด์ฃผ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค. ๊ตฌ์กฐ๋ฅผ ๋จผ์ ์ดํดํ๊ณ ํ ํ๋ฆฟ์ ์ฌ์ฉํ์.
Request
-> Route -> Controller -> Service/Provider -> DAO -> DB
DB -> DAO -> Service/Provider -> Controller -> Route ->
Response
๋ค์์ ๊ฐ ํ ํ๋ฆฟ ๋ณ ์ฐจ์ด์ ์ ๋น๊ต ๊ธฐ์ ํด ๋์ ๊ฒ์ด๋ค.
Request(์์) / Response(๋) โ Router (index.php) โ Controller โ Service (CUD) / Provider (R) โ PDO (DB)
Request(์์) / Response(๋) โ Router (*Route.js) โ Controller (*Controller.js) โ Service (CUD) / Provider (R) โ DAO (DB)
Request(์์) / Response(๋) โ Controller(= Router + Controller) โ Service (CUD) / Provider (R) โ DAO (DB)
์๋ฒ API ๊ตฌ์ฑ์ ๊ธฐ๋ณธ์ Validation์ ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค. ์ธ๋ถ์์ ์ด๋ค ๊ฐ์ ๋ ๋ฆฌ๋ Validation์ ์ ์ฒ๋ฆฌํ์ฌ ์๋ฒ๊ฐ ํฐ์ง๋ ์ผ์ด ์๋๋ก ์ ์ํ์. ๊ฐ, ํ์, ๊ธธ์ด ๋ฑ์ ํ์์ Validation์ Controller์์, DB์์ ๊ฒ์ฆํด์ผ ํ๋ ์๋ฏธ์ Validation์ Provider ํน์ Service์์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
์์ (*)์ด ๋ถ์ด์๋ ํ์ผ(or ํด๋)์ ์ถ๊ฐ์ ์ธ ๊ณผ์ ์ดํ์ ์์ฑ๋๋ค.
api-server-spring-boot
> * build
> gradle
> * logs
| app.log // warn, error ๋ ๋ฒจ์ ํด๋นํ๋ ๋ก๊ทธ๊ฐ ์์ฑ ๋๋ ํ์ผ
| app-%d{yyyy-MM-dd}.%i.gz
| error.log // error ๋ ๋ฒจ์ ํด๋นํ๋ ๋ก๊ทธ๊ฐ ์์ฑ ๋๋ ํ์ผ
| error-%d{yyyy-MM-dd}.%i.gz
> src.main.java.com.example.demo
> config
> secret
| Secret.java // git์ ์ถ์ ๋์ง ์์์ผ ํ ์ํฌ๋ฆฟ ํค ๊ฐ๋ค์ด ์์ฑ๋์ด์ผ ํ๋ ๊ณณ
| BaseException.java // Controller, Service, Provider ์์ Response ์ฉ์ผ๋ก ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ ๋ ์ต์
์
ํด๋์ค
| BaseResponse.java // Controller ์์ Response ์ฉ์ผ๋ก ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ตฌ์กฐ๋ฅผ ์ํ ๋ชจ๋ธ ํด๋์ค
| BaseResponseStatus.java // Controller, Service, Provider ์์ ์ฌ์ฉ ํ Response Status ๊ด๋ฆฌ ํด๋์ค
| Constant.java // ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋ ์์ ๊ฐ๋ค์ ๊ด๋ฆฌํ๋ ๊ณณ
> src
> test
| TestController.java // logger๋ฅผ ์ด๋ป๊ฒ ์จ์ผํ๋์ง ๋ณด์ฌ์ฃผ๋ ํ
์คํธ ํด๋์ค
> user
> models
| GetUserRes.java
| PostUserReq.java
| PostUserRes.java
| UserController.java
| UserProvider.java
| UserService.java
| UserDao.java
| WebSecurityConfig.java // spring-boot-starter-security, jwt ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํด๋์ค
> utils
| AES128.java // ์ํธํ ๊ด๋ จ ํด๋์ค
| JwtService.java // jwt ๊ด๋ จ ํด๋์ค
| ValidateRegex.java // ์ ๊ทํํ์ ๊ด๋ จ ํด๋
| DemoApplication // SpringBootApplication ์๋ฒ ์์ ์ง์
> resources
| application.yml // Database ์ฐ๋์ ์ํ ์ค์ ๊ฐ ์ธํ
๋ฐ Port ์ ์ ํ์ผ
| logback-spring.xml // logger ์ฌ์ฉ์ console, file ์ค์ ๊ฐ ์ ์ ํ์ผ
build.gradle // gradle ๋น๋์์ ํ์ํ dependency ์ค์ ํ๋ ๊ณณ
.gitignore // git ์ ํฌํจ๋์ง ์์์ผ ํ๋ ํด๋, ํ์ผ๋ค์ ์์ฑ ํด๋๋ ๊ณณ
์คํ๋ง ๋ถํธ๋ ์ด๋
ธํ
์ด์
์ ๋ค์ํ๊ฒ ์๋ ๊ฒ์ด ์ค์ํ๋ค. SpringBoot์ ์์์ ์ ์๋ฆฌ๋ @SpringBootApplication
์ด๋
ธํ
์ด์
๋ฟ๋ง ์๋๋ผ ์คํ๋ง ๋ถํธ ์ด๋
ธํ
์ด์
๋ฑ์ ํค์๋๋ก ๊ตฌ๊ธ๋ง ํด์ ์คํ๋ง ๋ถํธ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ค์ํ ์ด๋
ธํ
์ด์
์ ์ดํดํ๊ณ ์ธ์๋์.
Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ๋ณต๋๋ getter, setter, toString ๋ฑ์ ๋ฉ์๋ ์์ฑ ์ฝ๋๋ฅผ ์ค์ฌ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ๋๋ฉ์ธ์ model ํด๋ ๋ด์ ์์ฑํ๋ ํด๋์ค์ lombok์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์งค ์ ์๋๋ก ๊ตฌ์ฑํ๋ค. ์์ธํ ๋ด์ฉ์ ๊ตฌ๊ธ๋ง๊ณผ model > PostUser, User๋ฅผ ํตํด ์ดํดํ์.
ํ ํ๋ฆฟ์ ํฌ๊ฒ log ํด๋์ src ํด๋๋ก ๋๋๋ค. log๋ ํต์ ์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ค์ ๊ธฐ๋กํ๋ ๊ณณ์ด๋ค. ์ค์ ๋ฉ์ธ ์ฝ๋๋ src์ ๋ด๊ฒจ์๋ค. src > main > resources๋ฅผ ๋จผ์ ์ดํด๋ณด์.
application.yml
์์ ํฌํธ ๋ฒํธ๋ฅผ ์ ์ํ๊ณ DataBase ์ฐ๋์ ์ํ ๊ฐ์ ์ค์ ํ๋ค.
logback-spring.xml
logs ํด๋์ ๋ก๊ทธ ๊ธฐ๋ก์ ์ด๋ค ํ์์ผ๋ก ๋จ๊ธธ ๊ฒ์ธ์ง ์ค์ ํ๋ค. logs ํด๋์ ์ด๋ป๊ฒ ๊ธฐ๋ก์ด ๋จ๊ฒจ์ ธ ์๋์ง ํ์ธํด๋ณด์๋ผ. (์ปค์คํ
ํ์ง ์์๋ ๋๋ค๋ฉดlogback-spring.xml
๋ฅผ ์์ ํ ํ์๋ ์๋ค.)
com.example.demo
ํจํค์ง์๋ ํฌ๊ฒ config
ํด๋, src
ํด๋์ ์ด ํ๋ก์ ํธ์ ์์์ ์ธ DemoApplication.java
๊ฐ ์๋ค.
DemoApplication.java
์ ์คํ๋ง ๋ถํธ ํ๋ก์ ํธ์ ์์์ ์๋ฆฌ๋ @SpringBootApplication
์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๊ณ ์๋ค. (๊ตฌ๊ธ๋ง ํตํด @SpringBootApplication
์ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ ์ดํด๋ณด์.)
src
ํด๋์๋ ์ค์ API๊ฐ ๋์ํ๋ ํ๋ก์ธ์ค๋ฅผ ๋ด์๊ณ config
ํด๋์๋ src
์์ ํ์ํ Secret key, Base ํด๋์ค, ์์ ํด๋์ค๋ฅผ, util
ํด๋์๋ JWT, ์ํธํ, ์ ๊ทํํ์ ๋ฑ์ ํด๋์ค๋ฅผ ๋ชจ์๋จ๋ค.
src
๋ฅผ ์์ธํ๊ฒ ์ดํด๋ณด์. src
๋ ๊ฐ ๋๋ฉ์ธ๋ณ๋ก ํจํค์ง๋ฅผ ๊ตฌ๋ถํด ๋๋๋ค. ํ์ฌ๋ user
๋๋ฉ์ธ๊ณผ test
๋๋ฉ์ธ์ด ์๋ค. ๋๋ฉ์ธ์ด๋ ๊ฒ์๊ธ, ๋๊ธ, ํ์, ์ ์ฐ, ๊ฒฐ์ ๋ฑ ์ํํธ์จ์ด์ ๋ํ ์๊ตฌ์ฌํญ ํน์ ๋ฌธ์ ์์ญ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ด ๋๋ฉ์ธ๋ค์ API ํต์ ์์ ์ด๋ค ํ๋ก์ธ์ค๋ก ์ฒ๋ฆฌ๋๋๊ฐ? API ํต์ ์ ๊ธฐ๋ณธ์ Request โ Response์ด๋ค. ์คํ๋ง ๋ถํธ์์ ์ด๋ป๊ฒ Request๋ฅผ ๋ฐ์์, ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๊ณ , ์ด๋ป๊ฒ Response ํ๋์ง๋ฅผ ์ค์ ์ ์ผ๋ก ์ดํด๋ณด์. ์ ๋ฐ์ ์ธ API ํต์ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
Request โ
XXXController.java
(=Router+Controller) โService
(CUD) /Provider
(R) (=Business Logic) โDao
(DB) โ Response
- API ํต์ ์ Routing ์ฒ๋ฆฌ
- Request๋ฅผ ๋ค๋ฅธ ๊ณ์ธต์ ๋๊ธฐ๊ณ ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ ๊ฐ์ Response ํด์ฃผ๋ ๋ก์ง
- Request์ ํ์์ Validation ์ฒ๋ฆฌ (DB๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ ๊ฒ์ฌํ ์ ์๋)
1) @Autowired
UserController์ ์์ฑ์์ @Autowired
์ด๋
ธํ
์ด์
์ด ๋ถ์ด์๋ค. ์ด๋ ์์กด์ฑ ์ฃผ์
์ ์ํ ๊ฒ์ผ๋ก, UserController
๋ฟ๋ง ์๋๋ผ ๋ค์์ ์ดํด๋ณผ UserService
, UserProvider
์ ์์ฑ์์๋ ๊ฐ๊ฐ ๋ถ์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ฐ๋จํ ์์ฝํ๋ฉด ๊ฐ์ฒด ์์ฑ์ ์๋์ผ๋ก ํด์ฃผ๋ ์ญํ ์ด๋ค. ์์ธํ ํ๋ก์ธ์ค๋ ๊ตฌ๊ธ๋ง์ ํตํด ์ดํด๋ณด์.
๋๋จธ์ง ์ด๋ ธํ ์ด์ ๋ค ์ญ์ ๊ตฌ๊ธ๋ง์ ํตํด ์ดํดํ์.
2) BaseResponse
Responseํ ๋, ๊ณตํต ๋ถ๋ถ์ ๋ฌถ๊ณ ๋ค๋ฅธ ๋ถ๋ถ์ ์ ๋ค๋ฆญ์ ํตํด ๊ตฌํํจ์ผ๋ก์จ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ค์ฌ์ค๋ค. (BaseResponse.java
์ฝ๋ ์ดํด ๋ณผ ๊ฒ. ์ฌ๊ธฐ์ ์ฐ์ด๋BaseResponseStatus
๋ enum
์ ํตํด Status ๊ฐ์ ๊ด๋ฆฌํ๊ณ ์๋ค.)
3) ๋ฉ์๋ ๋ค์ด๋ฐ๋ฃฐ
์ด ํ ํ๋ฆฟ์์๋ ์ฌ์ฉ๋๋ ๋ฉ์๋ ๋ช ๋ช ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
HTTP Method + ํต์ฌ URI
- GET
/users
๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ช โ getUsers - PATCH
/users
๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ช โpatchUsers
ํญ์ ์ด ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋ ๊ฒ์ ์๋์ง๋ง, ๋ค์ด๋ฐ์ ํต์ผ์ฑ ์๊ฒ ํด์ฃผ๋ ๊ฒ ์ข๋ค.
4) Res, Req ๋ค์ด๋ฐ๋ฃฐ
๊ฐ ๋ฉ์๋์์ ์ฌ์ฉ๋๋ Res, Req ๋ชจ๋ธ์ ๋ช ๋ช ๊ท์น๋ ๋ฉ์๋ ๋ช ๊ณผ ๋น์ทํ๋ค.
HTTP Method + ํต์ฌ URI +Res/Req
Patch /users/:userId
โ PatchUserRes / PatchUserReq
์ด Res, Req ๋ชจ๋ธ์ (๋๋ฉ์ธ๋ช
) / models
ํด๋์ ๋ง๋ค๋ฉด ๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ค๋ฃจ๋ ๊ณณ (DB ์ ๊ทผ[CRUD], DB์์ ๋ฐ์์จ ๊ฒ ํ์ํ)
- Request์ ์๋ฏธ์ Validation ์ฒ๋ฆฌ (DB๋ฅผ ๊ฑฐ์ณ์ผ ๊ฒ์ฌํ ์ ์๋)
Service
์ Provider
๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋ค๋ฃจ๋ ๊ณณ์ด๋ค. CRUD ์ค R(Read) ์ ํด๋นํ๋ ์ฝ๋๊ฐ ๊ธด ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ R(Read) ๋ง ๋ฐ๋ก ๋ถ๋ฆฌํด Service
๋ CUD(Create, Update, Delete) ๋ฅผ, Provider
๋ R(Read) ๋ฅผ ๋ค๋ฃจ๋๋ก ํ๋ค. ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํด์ง๋ค.
Provider
R(Read) ์ ๊ด๋ จ๋ ๊ณณ์ด๋ค. DB์์ select ํด์ ์ป์ด์จ ๊ฐ์ ๊ฐ๊ณตํด์ ๋ฑ์ด์ค๋ค.
Service
CUD(Create, Update, Delete) ์ ๊ด๋ จ๋ ๊ณณ์ด๋ค. CUD์์ R์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ๊ทธ๋ด ๋๋
Provider
์ ๊ตฌ์ฑ๋์ด ์๋ ๊ฒ์Service
์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
1) ๋ฉ์๋๋ช
๋ฉ์๋์ prefix๋ก ๋ค์ ๊ท์น์ ๋ฐ๋ฅด๊ณ ์๋ค.
C โ createXXX createInfo
R โ retrieveXXX retrieveInfoList
U โ updateXXX updateInfo
D โ deleteXXX deleteInfo
2) BaseException
BaseException
์ ํตํด Service
๋ Provider
์์ Controller
์ Exception์ ๋์ง๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Status ๊ฐ์ BaseResponseStatus
์ enum
์ ํตํด ๊ด๋ฆฌํ๋ค.
JdbcTemplate์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ๋์ด ์๋ค. ์์ธํ ๋ด์ฉ์ ์ด๊ณณ ๊ณต์ ๋ฌธ์ ์ ํ ํ๋ฆฟ์ ๊ธฐ๋ณธ ์์ ๋ฅผ ์ฐธ๊ณ ํ์.
๋ก์ปฌ์์ DemoApplication์ ์คํ์ํจ๋ค. (๋ก์ปฌ ์๋ฒ ๊ตฌ๋ ์)
[DB ์ฐ๊ฒฐ ์์ด TEST]
- src > test > TestController.java์ ๊ตฌ์ฑ๋์ด ์๋ API๋ฅผ ํ ์คํธํด๋ณด์.
- ํฌ์คํธ๋งจ์ ํตํด GET localhost:9000/test/log๋ก ํ ์คํธ๊ฐ ์ ๋๋์ง ํ์ธํ๋ค.
[DB ์ฐ๊ฒฐ ์ดํ TEST]
- resources > application.yml์์ ๋ณธ์ธ์ DB ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ค.
- DB์ TEST๋ฅผ ์ํ ๊ฐ๋จํ ํ ์ด๋ธ์ ํ๋ ๋ง๋ ๋ค.
- UserController.java, UserProvider.java, UserService.java, UserDao.java๋ฅผ ๊ตฌ์ฑํ์ฌ ํด๋น ํ ์ด๋ธ์ ๊ฐ๋ค์ ๋ถ๋ฌ์ค๋ ๋ก์ง์ ๋ง๋ ๋ค.
- ํฌ์คํธ๋งจ์ ํตํด ๋ณธ์ธ์ด ๋ง๋ API ํ ์คํธ๊ฐ ์ ๋๋์ง ํ์ธํ๋ค.
๋ฌด์ค๋จ ์๋น์ค๋ฅผ ์ํด nohup์ ์ฌ์ฉํ๋ค. ์์ธํ ๋ด์ฉ์ ํ๊ฒฝ ๊ตฌ์ถ ์ค์ต ์์์ ์ฐธ๊ณ ํ์.
์๋ฒ Error๋ฅผ ๋ง์ฃผํ๋ค๋ฉด, ์์ธ์ ํ์ ํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ ํตํด ๋ฌธ์ ์์ธ์ ์ฐพ์.
- ์ปดํ์ผ ์๋ฌ ํ์ธ
- log ํด๋ ํ์ธ
- ๊ทธ ์ธ ๋ฐฉ๋ฒ๋ค
- ๋ณธ ํ ํ๋ฆฟ์ ์์ ๊ถ์ ์ํํธ์คํ์ด๋์ ์์ต๋๋ค. ๋ณธ ์๋ฃ์ ๋ํ ์์ ์ ์ด์ฉ ๋ฐ ๋ฌด๋จ ๋ณต์ , ๋ฐฐํฌ ๋ฐ ๋ณ๊ฒฝ์ ์์น์ ์ผ๋ก ๊ธ์งํ๋ฉฐ ์ด๋ฅผ ์๋ฐํ ๋์๋ ํ์ฌ์ฒ๋ฒ์ ๋ฐ์ ์ ์์ต๋๋ค.