REST API 설계 (2) (feat. express.js)

hsmiK·2024년 3월 22일

공부기록

목록 보기
5/8

이전 학습 내용

이전 API 설계는 GET method 기능 구현까지 진행을 완료했다
이번 설계에서는 PostDelete 기능을 추가하여 진행할 계획이다

💻 API 설계 - Post

Post Method는 새로운 리소스를 생성할 때 주로 사용한다

그러나 GET Method와 달리 URL로 POST 로 요청한 리소스 값이 잘 입력되었는지 확인하는 것이 불가능하다

예를 들어 유저 ID와 PW를 입력받고 로그인이 진행되는 상황을 가정해보자
개인정보를 조회하고자 할 때 URL 주소에 개인 정보를 직접적으로 유출시키고 해당 페이지에 접속한다면 개인 정보 유출이라는 큰 문제가 발생할 수 있다

따라서 Post Method는 URL을 통해서 데이터를 입력받지 않고 내부 Body를 통해 데이터를 입력받는다

따라서 Post Method가 Body에 잘 입력되었는지 확인하기 위해서는 다른 API 테스트 도구가 필요하다

✅ Postman

postman은 API 테스트에 사용되는 도구이다
다음 링크를 통해 다운이 가능하다

다운로드

다운로드 후 실행하면 다음과 같은 화면을 만나볼 수 있다

이 화면에서와 같이 HTTP Method를 직접 클릭하고 URL을 입력하여 Postman을 활용할 수 있다

Postman을 통해 이전에 설계한 API에서 GET Method을 실행해보자

  • 아이템 전체 조회 (localhost:1234/items)

  • 3번 아이템 개별 조회 (localhost:1234/items/3)

✅ Post 기능 추가

// 새로운 아이템 정보 받는 기능 구현
app.use(express.json()); // http 외 모듈 '미들웨어' : json 설정
app.post('/items', (req,res) => {
  // 새로 등록하는 아이템 map에 입력
  db.set(id++,req.body);
  // 아이템 등록 시 문구 출력
  res.json({
    message : `${db.get(id-1).name} 아이템 등록이 정상적으로 완료되었습니다`
  });
  res.json(req.body);
})

URL 주소는 변경하지 않고 map에 새로 Body에 입력되는 리소스를 추가하도록 구현했다
그리고 아이템이 등록되면 잘 등록되었음을 확인하기 위해 message를 추가했다

Postman을 통해 확인하면 다음과 같다

다음 전체 조회를 하면 6번 아이템도 정상적으로 출력된다

✅ 추가 변경 사항

  • Post 기능을 구현하기 위해 새로 등록되는 아이템 인덱스 넘버를 추가했다
// 기본 데이터 생성
let db = new Map();
let id = 1;

// 객체 db 에 삽입
db.set(id++,item1);
db.set(id++,item2);
db.set(id++,item3);
db.set(id++,item4);
db.set(id++,item5);

다음과 같이 map에 아이템을 입력할 때 id 기본 값을 1로 설정한 후에 ++ 연산자를 통해 아이템을 추가할 때마다 1씩 증가하도록 하여 인덱스 값을 설정해주었다

다음 기능을 통해 몇 번째 아이템이 등록되었는지 확인할 수 있게 되었다

💻 API 설계 - Delete

이번에는 Delete Method 기능을 추가해보자
개별 아이템 삭제 기능과 전체 아이템 삭제 기능을 따로 다음과 같이 구현했다

개별 아이템 삭제의 경우 해당 ID의 URL을 받아온 후에 삭제를 진행한다

// 아이템 정보 개별 삭제 기능 구현
app.delete('/items/:id', (req,res) => {
  let {id} = req.params;
  id = parseInt(id);
  let items = db.get(id);

  // 해당하는 id가 없는 경우 error 메세지 출력
  if(items==undefined){
    res.json({
      message : `요청하신 ${id}번 아이템이 존재하지 않습니다`
    });
  } else {
    const name = items.name;
    db.delete(id);
    // 아이템 삭제 시 문구 출력
    res.json({
      message : `${name} 아이템이 정상적으로 삭제되었습니다`
    });
  }  
});

입력받은 아이템의 아이디가 존재하지 않는 경우 삭제하고자 하는 아이템이 없기 때문에 메세지를 출력한다

삭제하고자 하는 아이템이 존재한다면 삭제를 진행하고 아이템이 정상적으로 삭제되었다는 메세지를 출력한다

//아이템 정보 전체 삭제 기능 구현
app.delete('/items', (req,res) => {
  var msg = '';
  //db 값이 1개 이상이면 전체 삭제
  if(db.size>=1){
    db.clear();
    msg = '전체 아이템 삭제가 완료되었습니다'
  } // db 값이 존재하지 않으면 삭제하지 않음
  else {
    msg = `삭제할 아이템이 없습니다`
  };
  res.json({
    message : msg
  });
});

전체 삭제 기능의 경우 map에 아이템이 남아있다면 전체 삭제를 진행하고 메세지를 출력한다

그러나 아이템이 하나도 남아있지 않다면 삭제할 아이템이 존재하지 않는다는 메세지를 출력한다

✅ 추가 변경 사항

  • 아이템 조회 시 아이템에 아무런 데이터가 저장되어있지 않은 경우 아이템에 존재하지 않는다는 문구를 출력할 수 있도록 기능을 추가했다
// 전체 아이템 정보 조회 기능 구현
app.get('/items', (req,res) => {
  // db가 비어있다면 아이템 미출력
  if(db.size==0){
    res.json({
      message : '아이템이 존재하지 않습니다'
    });
  }
  // db에 아이템이 존재한다면 아이템 출력 
  else {
    let items={};
    db.forEach(function(value,key) {
      items[key]=value;
    })
    res.json(items);
  }
});

💻 추가 학습 사항

profile
반갑습니다

0개의 댓글