- GitHub Issue Template
- Git ์ ๋ต : Git Flow, GitHub Flow
- Code ์์ฑ ์ปจ๋ฒค์ : ๋ณ์, ํจ์, ํ์ผ, ํด๋ ๋ช ๋ช ๋ฒ
- docker ๋ฐ docker-compose ํ์ผ : ๋น ๋ฅด๊ณ ์ฌ์ด ๋ฐฐํฌ
- CI/CD (GitHub Actions) : ๊ฐ์ธ์๋ฒ ์ฉ CI/CD (SSH ์ด์ฉ), AWS ์ฉ CI/CD
- ๋ค์ํ ๊ธฐ๋ฅ์ ๋ํ preset : ๋ก๊ทธ์ธ, ์ฑํ , ๊ฒ์ํ
- .gitignore :
Windows,macOS,Linux,node,dotenv๊ธฐ์ค +config.json,*.pem
๋์ค์ ์ธ ๊ตฌ์กฐ๋ ์์ง๋ง, ์ธ๋ถ์ ์ธ ๋ถ๋ถ์ ๊ฐ๋ฐ์ ๊ฐ์ธ์ ์ทจํฅ์
๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ํ๋ก์ ํธ๋ ํด์ปคํค์์ ํ์ฉํ๊ธฐ ์ํด ์์ฑํ์๊ธฐ์,
์ ๊ฐ์ธ์ ์ทจํฅ์ ๋ง๊ฒ ์ ์ฉ๋์ด ์๊ณ , ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ง๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ๋ฐ๋๋ฉฐ
ํ
ํ๋ฆฟ์ ์์ ํ ์ ์์ต๋๋ค.
ํ
ํ๋ฆฟ์ ์ฌ๋ฌ๋ถ์ ์ทจํฅ์ ๋ง๊ฒ ์์ ํ์ฌ ์ฌ์ฉํด์ฃผ์๊ณ , ๋์์ด ๋์
จ๋ค๋ฉด โญ ํ๋ฒ๋ง ๋ถํ๋๋ฆฝ๋๋ค.
preset ์ฝ๋์ ๋ฒ๊ทธ๊ฐ ์์ ๊ฒฝ์ฐ issue ์์ฑํ์์ด ๋จ๊ฒจ์ฃผ์๋ฉด ํ์ธ ํ ๋ฐ์ํ๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
made and owned by @kyeoungwoon | Naver Blog
- ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค.
- ๋ธ๋์น ์ข ๋ฅ : main, develop, feature, release, hotfix
- main :
- develop :
- feature :
- release :
- hotfix :
- ๊ท๋ชจ๊ฐ ์๊ณ ์ฆ์ ๊ธฐ๋ฅ์์ ๊ณผ ๋ฐฐํฌ๊ฐ ์๋ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค.
- ๋ธ๋์น ์ข ๋ฅ : main, develop, feature
- Production ํ๊ฒฝ์ ์ธ์ ๋ฐฐํฌํด๋ ๋ฌธ์ ์๋ stable branch ์ ๋๋ค.
- ์ฅ์ ํน์ ๋ฒ๊ทธ ๋ฐ์ ์ main branch๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น ๋ฅด๊ฒ ์์ ํฉ๋๋ค.
- Initial commit์ ์ ์ธํ๊ณ , main branch์ commit์ด ์ง์ ์ ์ผ๋ก ๋ฐ์ํ๋ฉด ์๋ฉ๋๋ค.
- ์๋ก์ด feature๋ค์ ๊ฐ๋ฐํ ๊ฒฝ์ฐ main์ ๊ธฐ์ค์ผ๋ก develop branch๋ฅผ ์์ฑ ํฉ๋๋ค.
- feature branch๋ค์ merge ํ๋ ๊ณณ์ ๋๋ค.
- feature๋ค์ ๋ชจ๋ mergeํ ํ ๋ฐ์๋๋ bug fix๋ฅผ ๋ชจ๋ ๋ง์น ํ, main branch๋ก PR์ ์์ฑํฉ๋๋ค.
- ๋ค์ ํ๋ฒ ๊ฐ์กฐํ์ง๋ง, main branch๋ ๋ชจ๋ ์์ ์ ์์์ ์ด๋ฉฐ, ์ ๋์ ์ผ๋ก stable ํด์ผ ํฉ๋๋ค.
- ๋ถ์์ ํ ์ฌํญ๋ค์ develop branch ๋ด์์ ํด๊ฒฐ๋์ด์ผ ํฉ๋๋ค.
- develop branch๋ฅผ ๊ธฐ์ค์ผ๋ก, ์๋ก์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ branch ์ ๋๋ค.
- ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ bug fix๋ feature branch ๋ด์์ ๋ง์น ํ develop branch๋ก PR์ ์์ฑํด์ผ ํฉ๋๋ค.
feature/login branch๋ฅผ develop/user branch์ merge ํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
feature/loginbranch๋ฅผ push ํฉ๋๋ค.- GitHub ๋ ํฌ์งํ ๋ฆฌ ํ์ด์ง์์
Compare & Create Pull Request๋ฒํผ์ด ์์ฑ๋ฉ๋๋ค. - ํด๋น ๊ธฐ๋ฅ์ ํด๋ฆญํ ํ,
base์comparebranch๋ฅผ ๊ฐ๊ฐ ์๋์ ๊ฐ์ด ๋ณด์ด๊ฒ ์ค์ ํฉ๋๋ค. - base:
develop/user<- compare:featture/login๊ณผ ๊ฐ์ด ์ค์ ํ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
1๋ฒ๊ณผ ๋์ผํ ์ํฉ์ ๊ฐ์ ํฉ๋๋ค.
git switch develop/user๋ฅผ ํตํด ์ด๋ํ๊ณgit pull origin develop/user๋ฅผ ํตํด ์ต์ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํฉ๋๋ค.git merge feature/login์ ํตํด merge๋ฅผ ์๋ํฉ๋๋ค.- ์๋ ๋ณํฉ์ ์ฑ๊ณตํ๋ฉด ๊ทธ๋๋ก
Merge: branch 'feature/login'๊ณผ ๊ฐ์ด commit์ ๋จ๊ธฐ๊ณ push ํด์ฃผ์๋ฉด ๋ฉ๋๋ค. - ์๋ ๋ณํฉ์ ์คํจํ ๋ถ๋ถ์ ์๋์ผ๋ก conflict ํด๊ฒฐํด ์ฃผ์๊ณ ,
- ๊ฐ๋ฅํ๋ฉด ํด๊ฒฐํ ๋ถ๋ถ์ ์ฃผ์์ผ๋ก ์ด๋ค ๋ถ๋ถ์ conflict๊ฐ ๋ฐ์ํ์๊ณ , ์ด๋ค ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์๋์ง ์์ฑํด์ฃผ์๋ฉด ์ข์ต๋๋ค.
Git ์ ๋ต๋ค์ ๋ํด์ ๋ ์์๋ณด๊ณ ์ถ๋ค๋ฉด : ์ ์ ๋ฆฌํด๋์ผ์ ๋ถ์ด ์์ต๋๋ค
์ ๋ชฉ, ๋ณธ๋ฌธ, ๊ผฌ๋ฆฌ๋ง ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค.
๊ฐ ๋ถ๋ถ์ ๋น ์ค๋ก ๊ตฌ๋ถ๋์ด์ผ ํฉ๋๋ค.
- Tag์ ์ฒซ ๋ฌธ์๋ ๋๋ฌธ์๋ก ์์ฑํฉ๋๋ค.
- ์ฝ๋ก ์ Tag์ ๋ถ์ฌ์ ์์ฑํ๊ณ , ์ฝ๋ก ์ดํ 1์นธ ๋ค์ title์ ์์ฑํฉ๋๋ค.
- (X)
feat:titlefeat: titlefeat :titlefeat : titleFeat :titleFeat : title
- (O)
Feat: title
- (X)
Feat: ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ ๋Fix: ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ ๋Docs:README.md๋ ์ฃผ์ ๋ฑ ๋ฌธ์๋ฅผ ์์ ํ์์ ๋Style: ์ฝ๋ ๊ตฌ์กฐ์ ๋ณ๊ฒฝ ์์ด ๋ณ์๋ช ๋ฑ์ ์์ ํ์์ ๋Refactor: ์ฝ๋ ๋์ ๋ฐฉ์์ ์์ ํ์์ ๋, ๋๋ Style์ ๋๊ท๋ชจ๋ก ๋ณ๊ฒฝํ์์ ๋์๋ ํ์ฉ.Test: ํ ์คํธ ์ฝ๋๋ฅผ ์ถ๊ฐํ์์ ๋Chore:package.json์ ์์ ํ์๊ฑฐ๋dockerfile๋ฑ ๋ถ๋ฅํ๊ธฐ ์ ๋งคํ ์ํฉ์์ ์ฌ์ฉMerge: branch๋ฅผ mergeํ์์ ๋ ์ฌ์ฉํฉ๋๋ค.
- ๋ณธ๋ฌธ์ ํ ์ค ๋น 72์ ๋ด๋ก ์์ฑํด ์ฃผ์ธ์. (๋ค์ํ ํ๊ฒฝ์์์ ๊ฐ๋ ์ฑ์ ์ํ์ฌ)
- ๋ณธ๋ฌธ ๋ด์ฉ์ ์์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ต๋ํ ์์ธํ ์์ฑํด ์ฃผ์ธ์.
- ๋ณธ๋ฌธ ๋ด์ฉ์ ์ด๋ป๊ฒ ๋ณ๊ฒฝํ๋์ง ๋ณด๋จ, ๋ฌด์์ ๋ณ๊ฒฝํ๋์ง ๋๋ ์ ๋ณ๊ฒฝํ๋์ง๋ฅผ ์ค๋ช ํด ์ฃผ์ธ์.
- Footer๋ ํ์์ ์ด์ง ์์ต๋๋ค.
- ๋ค๋ง, issue์ ์ฐ๊ด๋์ด ์์ฑ๋ commit์ด๋ผ๋ฉด ๋ฃ์ด์ฃผ์๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
์ ๋ชฉ์ ์ธ ๋์ ํ์์ ๋์ผํฉ๋๋ค.- eg.
Fixes: something
- eg.
Fixes: ์ด์ ์์ ์ค (์์ง ํด๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ)Resolves: ์ด์๋ฅผ ํด๊ฒฐํ์ ๋ ์ฌ์ฉRef: ์ฐธ๊ณ ํ ์ด์๊ฐ ์์ ๋ ์ฌ์ฉRelated to: ํด๋น ์ปค๋ฐ์ ๊ด๋ จ๋ ์ด์๋ฒํธ (์์ง ํด๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ)
- Camel Case๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- eg.
getUserByUserId,getEventByDateAndUserId
- eg.
- ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋๋ผ๋ ๊ธฐ๋ฅ์ ๋ช ํํ๊ฒ ๋ช ์ํด ์ฃผ์ธ์.
- ํจ์๋ช
์ ๊ฒน์ณ๋ ๋ฉ๋๋ค.
- ํ๋จ์ import/export ๊ด๋ จ ์ปจ๋ฒค์ ์ค๋ช ์์ ๋ ์์ธํ ์ ์ ์์ง๋ง, ์๋์ ๊ฐ๋จํ ์์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
user.service.js์createNewUser๊ณผuser.repository.js์createNewUser์ด ๋์์ ์กด์ฌํ์ฌ๋ ๋ฉ๋๋ค.- service์์ ์ฌ์ฉ ์์๋
userRepository.createNewUser - controller์์ ์ฌ์ฉํ ๋๋
userController.createNewUser์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
- routes ํด๋์์
express.Router()๋ก ์ ์ํ๋ ๋ณ์๋ช ์ ํด๋น ํ์ผ๋ช ๊ณผ ์ผ์นํ์ฌ์ผ ํฉ๋๋ค.- eg.
auth.router.jsํ์ผ์ ๊ฒฝ์ฐ์๋const authRouter = express.Router();์ ๊ฐ์ด! authRouter.get("/", handleXX),userRouter.get("/", handleYY)
- eg.
- Snake Case๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- eg.
user_id,event_id
- eg.
- ํ์๊ฐ ํ์ ํ Camel Case ๋ํ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ์ค์ํ ๋ถ๋ถ์ ์ปจ๋ฒค์
์ ํต์ผ์
๋๋ค.
- ๋ค๋ง, Database์ ์ปฌ๋ผ๋ช ๋ค์ด Snake Case๋ก ์์ฑ๋์๊ธฐ ๋๋ฌธ์ Query๋ฌธ ์์ฑ ์ ์ ์๊ฐ ํ์ํฉ๋๋ค.
- JSON ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋,
{ user_id : user_id }(X){ user_id }(O) ์ ๊ฐ์ด ์์ฑํด์ฃผ์ธ์.- JSON ๊ฐ์ฒด ์์ฑ ์ ๋ณ์๋ช
๋ง ์
๋ ฅํ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋์ผ๋ก
{ ๋ณ์๋ช : ๋ณ์๊ฐ }ํํ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ ์ ์ด์ฉํฉ๋๋ค. (๊ฐ์ฒด ์ถ์ฝ ํ๊ธฐ๋ฒ)
- JSON ๊ฐ์ฒด ์์ฑ ์ ๋ณ์๋ช
๋ง ์
๋ ฅํ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋์ผ๋ก
- ์์๊ฐ์ ํด๋นํ๋ ๋ณ์๋ช
์ ์ ๋ถ ๋๋ฌธ์ ๋ฐ snake case๋ก ์์ฑ๋์ด์ผ ํฉ๋๋ค.
- ํ๊ฒฝ๋ณ์ ๋ฑ์ด ํด๋นํฉ๋๋ค. eg.
AWS_SECRET_KEY,API_KEY๋ฑ
- ํ๊ฒฝ๋ณ์ ๋ฑ์ด ํด๋นํฉ๋๋ค. eg.
- ์ ๋ถ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ์ ์ผ ํฉ๋๋ค.
- ์์ ํด๋๋ช ์ ํฌํจํ์ฌ ๊ธฐ๋ฅ์ ๋ช ์ํด์ผ ํฉ๋๋ค.
- ์ฌ๋ฌ ๋จ์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ . ์ผ๋ก ๋จ์ด๋ฅผ ๊ตฌ๋ถํฉ๋๋ค
- eg.
user.repository.js,chat.service.js
- ํด๋๋ช
์ ๊ธธ์ด์ง ๊ฒฝ์ฐ
-๋ฅผ ํ์ฉํ์ฌ ๊ตฌ๋ถํฉ๋๋ค. (kebab case) - eg.
my-page,user-info
class CustomError extends Error์ ๊ฐ์ด, JavaScript ๊ธฐ๋ณธ Error ๊ฐ์ฒด๋ฅผ extend ํ์ฌ Custom Error๋ฅผ ์์ฑํ์ฌ์ผ ํฉ๋๋ค.- Error๋ ์ธ๋ถํํ์ฌ ๊ฐ๊ฐ ์๋ฌ๋ฅผ ํ ๋นํ๋ ๊ฒ์ด ์๋, ๋๋ถ๋ฅ๋ก ๊ด๋ฆฌํ์ฌ reason์ผ๋ก ์ธ๋ถ์ฌํญ์ ์ ์ ์๋๋ก ํ์ฌ์ผ ํฉ๋๋ค.
- Error ๋ช
์ Pascal Case๋ก ์์ฑํ์ฌ์ผ ํฉ๋๋ค.
UserNotExistErrorUserAuthorizationErrorIdNotProvidedError๋ฑ๊ณผ ๊ฐ์ด ์ธ๋ถํ ๋ ๊ฒ์ด ์๋๋ผ,NotExistErrorInvalidInputError์ฒ๋ผ ์ต๋ํ ํฌ๊ด์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ์ผ ํฉ๋๋ค.- ์ธ๋ถํํ ํ์๊ฐ ์๊ธด๋ค๋ฉด,
UserIdNotExistUserNameNotExist์์ค์ผ๋ก ์ธ๋ถํ ํ๋ ๊ฒ์ด ์๋,InvalidUserDataInput๊ณผ ๊ฐ์ด ์นดํ ๊ณ ๋ฆฌ๊น์ง๋ง ํฌํจํ์ฌ์ผ ํฉ๋๋ค.
- ์์ ์ ์์ ์ด๋, ๋ค์๊ณผ ๊ฐ์ ์ฌํญ์ ํฌํจํ์ฌ์ผ ํฉ๋๋ค.
error codestring์ด์ฌ์ผ ํฉ๋๋ค.U001๊ณผ ๊ฐ์ด ๋ฐ๋ก ์ ์ํด๋์ ๋ ๋๊ณ ,ALREADY_EXIST์ ๊ฐ์ด ํ๋ ๋จ์ด ์ ๋๋ก ๊ฐ๋ตํ๊ฒ ์์ฑํด์ฃผ์ธ์.U001๊ณผ ๊ฐ์ด ์ฝ๋๊ฐ์ผ๋ก ๊ด๋ฆฌํ์ค ์์ ์ด๋ฉด, ๋ฌธ์ํ ํ์ฌ ํ์๋ค ์ฌ์ด์ ๊ณต์ ํด ์ค๋ณต๋ ์๋ฌ๊ฐ ์์ฑ๋์ง ์๋๋ก ์ ์ํด์ฃผ์ธ์.
status code- http status code ๊ฐ ์ ๋๋ค.
- ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ ์กํ status code๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.
reason- ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ ์ด์ ์ ๋๋ค.
- debug ์์ reason๋ง ๋ณด๊ณ ์ ์ ์๋๋ก ๊ฐ๊ฒฐํ๋, ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํ๋๋ก ์์ฑํด ์ฃผ์ธ์.
class AlreadyExistError extends Error {
errorCode = "ALREADY_EXIST";
statusCode = 409;
constructor(reason, data) {
super(reason);
this.reason = reason;
this.data = data;
}
}- ํ ์ด๋ธ๋ช ๊ณผ ์ปฌ๋ผ๋ช ๋ฑ ๋ชจ๋ ๋ณ์๋ช ์ ๋ฐ๋์ snake case๋ฅผ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
- PK๊ฐ์
{table๋ช }_id์ ๊ฐ์ ํ์์ด์ฌ์ผ ํฉ๋๋ค.- eg.
user_oauthํ ์ด๋ธ์ PK ์ปฌ๋ผ ๋ช ์user_oauth_id bigint์๋ฃํ์ ์ฌ์ฉํ๊ณ , auto increment์ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.- ๋ฐ์ ๊ทํ (๋น์ ๊ทํ, denormailzation)๋ก ์ธํด ํ ์ด๋ธ์ด ๋ถํ ๋ ๊ฒฝ์ฐ์๋, id๊ฐ์ ๋ฐ๋ก ์์ฑํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
- eg.
- ๋ชจ๋ ํ
์ด๋ธ์๋
created_at๊ณผupdated_at์ด ์์ด์ผ ํฉ๋๋ค.- DataType์ TIMESTAMP(6) ์ ๋๋ค.
created_at๊ณผupdated_at์default expression์current_timestamp(6)์ ์ ์ฉํด๋์ด์ผ ํฉ๋๋ค.updated_at์on_update์current_timestamp(6)์ด ์ ์ฉ๋์ด ์์ด์ผ ํฉ๋๋ค.
- ์ ๊ทํ ๊ท์น์ ๋๋๋ก์ด๋ฉด ๋ฐ๋ฅด๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
- ๊ฐ์ ๋ด์ฉ์ Query๋ฅผ ์ฌ๋ฌ๋ฒ ๋ ๋ฆฌ๋ ๊ฒ ๋ณด๋ค๋,
JOIN์ด๋BETWEEN๋ฑ์ผ๋ก ํ๋ฒ์ ๊ฐ์ ธ์์Node.js๋จ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ถํฉ๋๋ค. image๋ฑ ํ์ผ์url๋ง์ ์ ์ฅํด์ผ ํฉ๋๋ค.binary data๋ฅผ ์ง์ ์ ์ผ๋ก ์ ์ฅํ๋ ํ์๋ ์ง์ํด์ผ ํ 1์์ ์ ๋๋ค.
ES6์ commonJS ๋ชจ๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค.
default export์ ์ฌ์ฉ์ ์ง์ํ๊ณ ,named export์ ์ฌ์ฉ์ ์งํฅํฉ๋๋ค.
// ์ง์ : ํจ์๋ฅผ ์ง์ import ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ
import { createNewUser } from "./user.service";
const result = createNewUser();
// user.repository์๋ createNewUser ์กด์ฌํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ์, ์ถฉ๋ํ ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
// ์งํฅ : ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ตฌ์กฐํ ํฉ๋๋ค.
// eg. Java, C++
import userService from "./sample.service.js";
const result = userService.createNewUser();์ปจ๋ฒค์ ์ ๋ชจ๋ ์งํจ, router - controller - service - repository ๊ฐ์ ํธ์ถ๊ตฌ์กฐ ์์์ ๋๋ค.
// user.router.js
import userController from "./user.controller";
const userRouter = express.Router();
userRouter.get("/", userController.createNewUser);
// user.controller.js
import userService from "./user.service";
export const createNewUser = async (req, res, next) => {
const { id, password } = req.body;
// ์ด๋ ๊ฒ๋ ๋๊ณ
await userService.createNewUser({ id, password }); // RORO
// ์ด๋ ๊ฒ ํด๋ ๋ฉ๋๋ค.
const data = { id, password };
userService.createNewUser(data);
return res.status(200).success();
};
// user.service.js
import userRepository from "./user.repository";
export const createNewUser = async (data) => {
const result = await userRepository.createNewUser(data);
return { message: "OK", result };
};
// user.repository.js
export const createNewUser = async (data) => {
const result = await User.create(data);
return result;
};- ๊ฐ ์๋ํฌ์ธํธ์ ์๋ต์ ํธ๋ค๋งํฉ๋๋ค.
- service์ ์์กด์ ์ ๋๋ค.
controllers์์ ํ์ฉํ ๊ธฐ๋ฅ ๋ฑ์ ์ํ ํด๋์ ๋๋ค.- ์ ๋ ฅ๊ฐ validation์ด๋ error handling ๋ฑ์ ๋ด๋นํฉ๋๋ค.
- Database ์ ์ถ๋ ฅ์ ๋ด๋นํฉ๋๋ค.
- ํ ํจ์๋ ํ Query๋ง์ ๋ด๋นํด์ผ ํฉ๋๋ค.
try-catch๋ ๋๋๋ก ์ ์ฉํ์ง ์์ต๋๋ค.- request/response ํ์ ํต์ผ ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ฌ, error ๋ฐ์ ์ next(err) ๋ฑ์ผ๋ก middleware๊ฐ ์๋ฌ๋ฅผ ์บ์นํ๋ ๋ก์ง์ผ๋ก ๊ตฌํํ์ฌ์ผ ํ๋ฉฐ, DB ์ ์ ์ค๋ฅ๊ฐ ์๋ ์ด์
repositories๋จ์์ ์๋ฌ๊ฐ ๋์ง ์๋๋ก ์ถฉ๋ถํ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ํ์ ํธํํ์ฌ์ผ ํฉ๋๋ค.
- request/response ํ์ ํต์ผ ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ฌ, error ๋ฐ์ ์ next(err) ๋ฑ์ผ๋ก middleware๊ฐ ์๋ฌ๋ฅผ ์บ์นํ๋ ๋ก์ง์ผ๋ก ๊ตฌํํ์ฌ์ผ ํ๋ฉฐ, DB ์ ์ ์ค๋ฅ๊ฐ ์๋ ์ด์
sequelize์ ๊ฐ์ ORM์ ์ฌ์ฉํ ๋์๋ repositories์์ ๋ฆฌํด๊ฐ์ ๊ฐ๊ณตํ์ง ์๊ณ ,attributes์ค์ ๋ฑ์ผ๋ก query๋จ์์ ๊ฐ๊ณตํ์ฌ์ผ ํฉ๋๋ค.- eg.
const getUserIdByLoginId async (login_id) => { return await User.findOne({ where : { login_id : login_id }, attributes: ["user_id"] }) }
- ORM ์ฌ์ฉ ์ model ์ ์๋ฅผ ์ํ ํด๋์ ๋๋ค.
- sequelize ๊ธฐ์ค์ผ๋ก, sequelize.define์ด ์๋ class User Extends Model ๊ณผ ๊ฐ์ class ํ์์ผ๋ก ์์ฑํ์ฌ์ผ ํฉ๋๋ค.
class User extends Model {
static init(sequelize) {
5;
super.init(
{
user_id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
// ๊ธฐํ ์ปฌ๋ผ๋ค ...
created_at: {
type: DataTypes.DATE(6),
defaultValue: DataTypes.NOW,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE(6),
defaultValue: DataTypes.NOW,
allowNull: false,
},
},
{
sequelize,
tableName: "user",
timestamps: false,
}
);
}
static associate(models) {
// ๊ด๊ณํ ์ ์ ํ์
User.hasMany(models.Question, { foreignKey: "questioned_user_id" });
}
}- ์์ฃผ ์ฐ์ด๋ ๊ธฐ๋ฅ๋ค์ ๋ํ ์ฝ๋ preset ์ ๋๋ค.
- ์์ ๋กญ๊ฒ ๋ณํํด์ ์ฐ์๋ฉด ๋ฉ๋๋ค.