Tech Blog of Pinomaker
전 게시글을 확인하고 읽어주시기 바랍니다:)
 

[Node JS] typescript + sequelize + passport로 유저 API 개발 - Sequelize 셋팅

해당 포스트는 Typescript가 셋팅 되어있어야 합니다. [Node JS] Node.js를 Typescript 프로젝트로 셋팅하기. 1. Node Project 초기화 작업할 폴더를 생성하고 아래의 명령어로 Node Project로 초기화를 해준다. n..

pinomaker.com

 

전에 열심히 셋팅한 Sequelize를 이용하여 이제 Local User를 생성하는 즉 로컬 회원가입을 개발해보자.

 

폴더 구조는 src에 api 폴더를 만들고, user api를 수행할 user 폴더 안에 라우팅을 처리할 index.ts와 비즈니스 로직을 처리할 user.service.ts를 만들어서 진행한다.

 

타 API를 개발하면 폴더를 추가로 생성하면 된다.

 

 

먼저 src/index.ts에 라우팅 처리를 해보자

 

app.use()를 사용하면, 어떤 Http Method가 들어오든 실행하게 되는 데, /api 경로에 들어온 모든 요청을 잡아서 src/api 폴더로 보내기 위해서 src/index.ts를 아래와 같이 수정한다.

// src/index.ts

import express, { Request, Response } from 'express'
import sequelize from './models'

const app = express()

app.use(express.json())
app.use(express.urlencoded({ extended: false }))

// /api에 Http 요청이 오면 api 폴더로 가게 함.
app.use('/api', require('./api'))

const port: number = 3000
app.listen(port, async () => {
  console.log(`SERVER ON! PORT : ${port}`)
  await sequelize
    .authenticate()
    .then(async () => {
      console.log('connection success')
    })
    .catch((e) => {
      console.log(e)
    })
})

 

그리고 api 폴더에 index.ts를 생성하여 /api에 요청이 들어올 때 또 라우팅 처리를 한 번 더 해준다.

 

src/index.ts에서 해준 것과 동일하게 router.use를 이용하여 /api/user에 어떤 Http Method가 들어오든 user 폴더로 보내는 처리를 해준다.

// src/api/index.ts

const router = require('express').Router()

// /api/user에 요청이 오면 user 폴더로 이동
router.use('/user', require('./user'))

module.exports = router
export {}

 

그리고 user 폴더에도 index.ts를 생성하여 이제 user의 api 요청을 라우팅 처리할 코드를 작성한다.

/api/user에 post가 들어오면 회원가입을 진행 할 것이다.

 

따라서 비즈니스 로직을 처리할 user.service.ts를 가져와서 API 요청에 맞는 로직을 매칭 시키는 역할을 해준다.

// src/api/user/index.ts

const router = require('express').Router()
const user = require('./user.service')

router.post('/', user.saveUser)

module.exports = router
export {}

 

이제 exports를 이용하여 비즈니스 로직을 담당할 함수들을 작성하여 밖에서 읽을 수 있게 해줄 것이다.

saveUser 함수는 src/api/user/index.ts에서 /api/user에 post 요청이 올 경우 매칭을 해주고 있다.

 

// src/api/user/user.service.ts

import { Response, Request } from 'express'
import { User } from '../../models/domain/User'
import * as bcrypt from 'bcrypt'
import { Provider } from '../../models/interface/User.interface'

exports.saveUser = async (req: Request, res: Response) => {
  try {
    // request body에서 eamil, password, name 추출
    const { email, password, name } = req.body
    
    // bcrypt를 이용하여, 비밀번호를 암호화
    const hash = await bcrypt.hash(password, 10)
    
    // sequelize를 이용하여 간단하게 DB에 컬럼 추가
    const saveUser = await User.create({
      email,
      password: hash,
      name,
      provider: Provider.LOCAL,
    })
    
    // 생성한 User를 리턴
    res.json({ result: true, user : saveUser })
  } catch (err) {
    console.log(err)
  }
}

 

일단 email, password, name을 req.body에서 추출하고 bcrypt를 이용하여 비밀번호를 암호화를 해준다.

 

그리고 sequelize의 메소드 중 DB에 컬럼을 추가하는 create를 사용하여 우리가 유저를 생성한다.

 

성공적으로 생성하면 리턴해주는 코드이며, async & await을 활용 했기에 try & catch문을 이용하여 에러를 잡아준다.

 

Postman으로 실행하면 제대로 작동한다!

profile

Tech Blog of Pinomaker

@pinomaker

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!