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

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
56 Node.js로 ES6 코드 실행하기 (Babel) file 황제낙엽 2023.01.07 370
55 자바스크립트 CommonJS 모듈 내보내기/불러오기 (require) file 황제낙엽 2023.01.07 331
54 Node.js에서 ES 모듈(import/export) 사용하기 file 황제낙엽 2023.01.07 600
53 CommonJS 와 ES 의 Module 시스템 황제낙엽 2023.01.07 337
52 [session] 기본 - Express-session 기반 로그인 세션 관리 황제낙엽 2022.01.03 308
51 [session] 기본 - 2 file 황제낙엽 2022.01.03 327
50 [session] 기본 - 1 황제낙엽 2022.01.03 326
49 [T아카데미] Node.js 프로그램 기초부터 응용까지 강좌 모음 황제낙엽 2021.03.15 235
48 Node.js 에서 Bulk INSERT 를 하는 방법 (multi insert) 황제낙엽 2021.02.02 1363
47 mysql, mysql2 모듈 버전 비교 황제낙엽 2021.01.31 595
46 [T아카데미/Node.js 프로그래밍] 프로그램 흐름 제어 (콜백지옥, Async, Promise) file 황제낙엽 2021.01.27 349
45 ORM 툴 Sequelize file 황제낙엽 2021.01.27 334
44 [connection과 pool-05] pool 생성이 너무 많은 경우의 database에서의 에러 - Too many connections file 황제낙엽 2021.01.27 483
43 [connection과 pool-04] connection pool 에서의 Transaction을 이용한 commit 과 rollback 황제낙엽 2021.01.27 341
42 [connection과 pool-03] mysql.createPool 과 connection.query 황제낙엽 2021.01.27 940
41 [connection과 pool-02] mysql.createPool 과 pool.query 황제낙엽 2021.01.27 460
40 [connection과 pool-01] mysql.createConnection 과 connection.query 황제낙엽 2021.01.27 388
39 [T아카데미/Node.js 프로그래밍/MySQL] createPool, getConnection 의 간단한 예제 (강의 예제) 황제낙엽 2021.01.27 379
38 여러 개의 데이터 베이스 연결을 동시에 관리하는 PoolCluster 황제낙엽 2021.01.16 2698
37 connetion pooling 과 connection leak 황제낙엽 2021.01.16 359