Deepen [TDD/REST-6강] 사용자 API 개발

황제낙엽 2020.12.03 06:56 조회 수 : 29

sitelink1 https://tacademy.skplanet.com/live/playe...mp;seq=134 
sitelink2 https://youtu.be/Mt2rgPyQrPs 
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

1. GET /users/:id

  1) SUCCESS

    - id가 1인 유저 객체를 반환한다

 

index.spec.js

const assert = require('assert')

const should = require('should')

const request = require('supertest')

const app = require('./index')

 

describe('GET /users', () => {

})

 

describe('GET /users/:id', () => {

    describe('성공', () => {

        it('유저 객체를 반환한다', done => {

           request(app)

            .get('/users/1')

            .end((err, res) => {

              res.body.should.have.property('id', 1)

              done()

            })

        })

    })

    describe('실패', () => {

    })

})

 

index.js

const express = require('express')

const logger = require('morgan')

const app = express()

const users = [

    {id:1, name:'Alice'},

    {id:2, name:'Bek'},

    {id:3, name:'Chris'}

]

 

app.get('/', (req, res) => res.send('Hello World!'))

app.get('/users', (req, res) => {

})

app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다

    // id 값을 얻어낸다

    const id = parsetInt(req.params.id, 10)   //url 에 포함된 id 파라미터 값을 추출한다

    

    // users 배열 조회

    const user = users.filter(user => user.id === id)[0]

 

    // 응답 : res

    res.json(user)

})

module.exports = app

 

 

 

  2) ERROR

    - id가 숫자가 아닐 경우 400으로 응답한다

    - id로 유저를 찾을 수 없을 경우 404로 응답한다

 

index.spec.js

const assert = require('assert')

const should = require('should')

const request = require('supertest')

const app = require('./index')

 

describe('GET /users', () => {

})

 

describe('GET /users/:id', () => {

    describe('성공', () => {

        it('유저 객체를 반환한다', done => {

           request(app)

            .get('/users/1')

            .end((err, res) => {

              res.body.should.have.property('id', 1)

              done()

            })

        })

    })

    describe('실패', () => {

        it('id가 숫자가 아닐 경우 400 응답', (done) => { //done 파라미터 값에 유의

            request(app)

              .get('users/one')

              .expect(400)

              .end(done)  //done 파라미터 값에 유의

        })

        it('찾을 수 없는 id일 경우 404 응답', (done) => {

            request(app)

              .get('users/9')

              .expect(404)

              .end(done)

        })

    })

})

 

index.js

const express = require('express')

const logger = require('morgan')

const app = express()

const users = [

    {id:1, name:'Alice'},

    {id:2, name:'Bek'},

    {id:3, name:'Chris'}

]

 

app.get('/', (req, res) => res.send('Hello World!'))

app.get('/users', (req, res) => {

})

app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다

    // id 값을 얻어낸다

    const id = parsetInt(req.params.id, 10)   //url 에 포함된 id 파라미터 값을 추출한다

 

    //400에러 예외처리

    if (Number.isNaN(id)) {

        res.status(400).end()

        return //예외 처리후 프로그램을 종료해야 한다

    }

    

    // users 배열 조회

    const user = users.filter(user => user.id === id)[0]

 

    //404에러 예외처리

    if (!user) {

        res.status(404).end

        return //예외 처리후 프로그램을 종료해야 한다

    }

 

    // 응답 : res

    res.json(user)

})

 

module.exports = app

 

 

 

 

 

2. DELETE /users/:id

  1) SUCCESS

    - 204를 응답한다

 

index.spec.js

const assert = require('assert')

const should = require('should')

const request = require('supertest')

const app = require('./index')

 

describe('GET /users', () => {

})

 

describe('GET /users/:id', () => {

})

 

describe('DELETE /users/:id', () => {

    describe('성공', () => {

        it('204 응답', done => {

           request(app)

            .delete('/users/3')

            .expect(204)

            .end(done)

            })

        })

    })

 

    describe('실패', () => {

        it('id가 숫자가 아닐 경우 400', done => {

           request(app)

            .delete('/users/three')

            .expect(400)

            .end(done)

            })

        })

    })

})

 

index.js

const express = require('express')

const logger = require('morgan')

const app = express()

let users = [ //let 키워드로 users를 변수로 해야한다 (const로 선언하면 상수이기 때문에 변경이 불가)

    {id:1, name:'Alice'},

    {id:2, name:'Bek'},

    {id:3, name:'Chris'}

 

app.get('/', (req, res) => res.send('Hello World!'))

app.get('/users', (req, res) => {

})

//획득 라우팅

app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다

})

//삭제 라우팅

app.delete('/users/:id', (req, res) => {

    const id = parsetInt(req.params.id, 10)

 

    //id가 숫자가 아닐 경우 400

    if (Number.isNaN(id)) {

        return res.status(400).end()

    }

 

    //선택한 id의 사용자를 삭제한다

    users = users.filter(user => user.id !== id)

    res.status(204).end()

})

 

module.exports = app

 

 

 

  2) ERROR

    - id가 숫자가 아닐 경우 400으로 응답한다

 

index.spec.js

const assert = require('assert')

const should = require('should')

const request = require('supertest')

const app = require('./index')

 

describe('GET /users', () => {

})

 

describe('GET /users/:id', () => {

})

 

describe('DELETE /users/:id', () => {

    describe('성공', () => {

        it('204 응답', done => {

           request(app)

            .delete('/users/3')

            .expect(204)

            .end(done)

            })

        })

    })

 

    describe('실패', () => {

        it('id가 숫자가 아닐 경우 400', done => {

           request(app)

            .delete('/users/three')

            .expect(400)

            .end(done)

            })

        })

    })

})

 

index.js

const express = require('express')

const logger = require('morgan')

const app = express()

let users = [ //let 키워드로 users를 변수로 해야한다 (const로 선언하면 상수이기 때문에 변경이 불가)

    {id:1, name:'Alice'},

    {id:2, name:'Bek'},

    {id:3, name:'Chris'}

 

app.get('/', (req, res) => res.send('Hello World!'))

app.get('/users', (req, res) => {

})

//획득 라우팅

app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다

})

//삭제 라우팅

app.delete('/users/:id', (req, res) => {

    const id = parsetInt(req.params.id, 10)

 

    //id가 숫자가 아닐 경우 400

    if (Number.isNaN(id)) {

        return res.status(400).end()

    }

 

    //선택한 id의 사용자를 삭제한다

    users = users.filter(user => user.id !== id)

    res.status(204).end()

})

 

module.exports = app

 

 

 

3. POST /users

  1) SUCCESS

    - 201 상태 코드를 반환한다

    - 생성된 유저 객체를 반환한다

    - 입력한 name을 반환한다

 

index.spec.js

const assert = require('assert')

const should = require('should')

const request = require('supertest')

const app = require('./index')

 

describe('GET /users', () => {

})

 

describe('GET /users/:id', () => {

})

 

describe('DELETE /users/:id', () => {

})

 

describe('POST /users', () => {

    describe('성공', () => {

        it('201 응답', done => {

           request(app)

            .post('/users') //post로 데이터를 전달한다

            .send({name: 'Daniel'})  //post의 body를 전송

            .expect(201)

            .end(done)

            })

        })

        it('생성한 유저 객체를 반환한다', done => {

           request(app)

            .post('/users') //post로 데이터를 전달한다

            .send({name: 'Daniel'})  //post의 body를 전송

            .expect(201)

            .end((err, res) => {

                res.body.should.have.property('name', 'Daniel')

                done()

            })

        })

    })

 

    describe('실패', () => {

        it('', done => {

           request(app)

 

            })

        })

        it('', done => {

           request(app)

 

            })

        })

    })

})

 

index.js

const express = require('express')

const logger = require('morgan')

const bodyParsert = require('body-parser')

const app = express()

let users = [ //let 키워드로 users를 변수로 해야한다 (const로 선언하면 상수이기 때문에 변경이 불가)

    {id:1, name:'Alice'},

    {id:2, name:'Bek'},

    {id:3, name:'Chris'}

 

//morgan 사용 선언

app.use(logger('dev'))

 

//body-parser 사용 선언

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({extended:true}));

 

app.get('/', (req, res) => res.send('Hello World!'))

app.get('/users', (req, res) => {

})

//획득 라우팅

app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다

})

//삭제 라우팅

app.delete('/users/:id', (req, res) => {

})

 

//app.post() : express 의 post함수를 통해 처리한다

//req.body : request의 body를 추출하여 처리

//body-parser : body는 express에서 제공하지 않는 속성이다 그래서 body-parser라는 써드파티 라이브러리를 사용한다

app.post('/users', (req, res) => {

    const name = req.body.name //bodyParser가 body에 접근 할 수 있게 해준다

    const id = Date.now() //id는 임의로 생성 (timestamp)

    const user = {id, name}

    users.push(user) //생성한 사용자 객체를 추가

    res.status(201).json(user) //생성한 사용자와 수행 결과를 응답해 준다

})

 

module.exports = app

 

 

 

  2) ERROR

    - name 파라미터 누락시 400을 반환한다

    - name이 중복일 경우 409를 반환한다

 

index.spec.js

const assert = require('assert')

const should = require('should')

const request = require('supertest')

const app = require('./index')

 

describe('GET /users', () => {

})

 

describe('GET /users/:id', () => {

})

 

describe('DELETE /users/:id', () => {

})

 

describe('POST /users', () => {

    describe('성공', () => {

    })

 

    describe('실패', () => {

        it('', done => {

            request(app)

              .post('/users').send({})

              .expect(400).end(done)

            })

        })

        it('', done => {

            request(app)

              .post('/users').send({name: 'Alice'})

              .expect(409).end(done)

            })

        })

    })

})

 

index.js

const express = require('express')

const logger = require('morgan')

const bodyParsert = require('body-parser')

const app = express()

let users = [ //let 키워드로 users를 변수로 해야한다 (const로 선언하면 상수이기 때문에 변경이 불가)

    {id:1, name:'Alice'},

    {id:2, name:'Bek'},

    {id:3, name:'Chris'}

 

//morgan 사용 선언

app.use(logger('dev'))

 

//body-parser 사용 선언

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({extended:true}));

 

app.get('/', (req, res) => res.send('Hello World!'))

app.get('/users', (req, res) => {

})

//획득 라우팅

app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다

})

//삭제 라우팅

app.delete('/users/:id', (req, res) => {

})

 

//app.post() : express 의 post함수를 통해 처리한다

//req.body : request의 body를 추출하여 처리

//body-parser : body는 express에서 제공하지 않는 속성이다 그래서 body-parser라는 써드파티 라이브러리를 사용한다

app.post('/users', (req, res) => {

    const name = req.body.name //bodyParser가 body에 접근 할 수 있게 해준다

 

    if (!name) { //입력값이 있는지 검사

        return res.status(400).end()

    }

    

    const found = users.filter(user => user.name === name).length //이름이 같은 유저들의 객체를 리턴하는지 검사

    if(found) {

        return res.status(409).end()

    }

 

    const id = Date.now() //id는 임의로 생성 (timestamp)

    const user = {id, name}

    users.push(user) //생성한 사용자 객체를 추가

    res.status(201).json(user) //생성한 사용자와 수행 결과를 응답해 준다

})

 

module.exports = app

 

 

 

4. PUT /users/:id

 

  1) SUCCESS

    - 변경된 name을 응답한다

 

index.spec.js

index.js

 

  2) ERROR

    - 정수가 아닌 id일 경우 400 응답

    - name이 없을 경우 400 응답

    - 존재하지 않는 유저일 경우 404 응답

    - 이름이 중복일 경우 409 응답

 

index.spec.js

index.js