• 회원가입 - POST /signup
  • 로그인 - POST /signin
  • 회원 개별 조회 - GET /users/:id
  • 회원 개별 탈퇴 - DELETE /users/:id

회원가입 : POST

app.post('/signup', (req, res) => {
  if (req.body == {}) {
    res.status(400).json({
      message: '입력 값을 다시 확인해주세요.'
    })
  } else {
    db.set(id++, req.body)

    res.status(201).json({
      message: `${db.get(id-1).name}님 환영합니다.`
    })
  }
})

요청 바디에는 id, pwd, name 등이 올 수 있다.

요청 바디로 들어온 회원 정보를 db에 저장하고, 성공했다는 응답 코드를 돌려준다.

id++ 을 하는 이유는 자동으로 1을 올려주기 위함 (하나의 객체를 유니크하게 구별하기 위함)

아직 db랑 연결을 안 하고 설계하는 과정이라 수동으로 하고 있다 . ㅎㅎ


회원 개별 조회 : GET

app.get('/users/:id', (req, res) => {
  const id = parseInt(req.params.id)
  const user = db.get(id)

  if (user == undefined) {
    res.status(404).json({
      message: "회원 정보가 없습니다."
    })
  } else {
    res.status(200).json({
      userId: user.userId,
      name: user.name,
    })
  }
})

 

조회하고 싶은 회원의 id를 params로 받는다.

params는 모두 문자열로 들어오기 때문에 parseInt로 정수로 변환한다.

회원의 id를 db에서 찾고,

존재하지 않는다면 상태코드 404와 회원정보가 없다는 메세지를 보냄

존재한다면 상태코드 200과, id와 일치하는 회원 정보를 응답으로 넘겨준다.


회원 개별 탈퇴

// 회원 개별 탈퇴
app.delete('/users/:id', (req, res) => {
  const id = parseInt(req.params.id)
  const user = db.get(id)

  if (user == undefined) {
    res.status(404).json({
      message: "회원 정보가 없습니다."
    })
  } else {
    db.delete(id)
    res.status(200).json({
      message: `${user.name}님, 다음에 또 뵙겠습니다.`
    })
  }
})

 

회원 개별 조회와 거의 비슷하다.

params로 회원의 id를 받고 있다면 db에서 삭제, 없다면 상태코드 404와 에러 메세지 반환


route를 활용한 코드 리팩토링 - 회원 개별 조회 / 회원 개별 탈퇴

개별조회와 개별탈퇴는 http method만 다르고 url이 같다.

route를 이용해 중복 코드를 줄일 수 있다.

app
  .route('/users/:id')
  .get()
  .delete()

 

중복되는 url을 묶고, 아래 메서드들로 분리 할 수 있다.

각 메서드 괄호 안에는 해당 요청이 들어왔을 때의 실행할 콜백 함수만 넣어주면 된다.

app
  .route('/users/:id')
  // 회원 개별 조회
  .get((req, res) => {
    const id = parseInt(req.params.id)
    const user = db.get(id)
  
    if (user == undefined) {
      res.status(404).json({
        message: "회원 정보가 없습니다."
      })
    } else {
      res.status(200).json({
        userId: user.userId,
        name: user.name,
      })
    }
  })
  // 회원 개별 탈퇴
  .delete((req, res) => {
    const id = parseInt(req.params.id)
    const user = db.get(id)
  
    if (user == undefined) {
      res.status(404).json({
        message: "회원 정보가 없습니다."
      })
    } else {
      db.delete(id)
      res.status(200).json({
        message: `${user.name}님, 다음에 또 뵙겠습니다.`
      })
    }
  })

로그인

1. db를 순회하면서, 요청받은 userId가 db에 있는지 확인

2. 있다면 해당 객체의 정보를 loginUser에 담는다. (없으면 loginUser는 빈 값이 됨)

3. loginUser가 빈 값인지 확인하고, (빈 값이 아니면 > userId가 일치한다는 것)

4. 요청받은 pwd가 해당 userId의 pwd와 같은지 확인

// 로그인
app.post('/signin', (req, res) => {
  var loginUser = {}
  const { userId, password } = req.body

  // userId가 db에 저장된 회원인지 확인
  db.forEach((user, idx)=>{ // data, idx, totalData
    if (user.userId === userId) { // 요청데이터 userId와 db에 있는 userId가 같은지 확인
      loginUser = user 
    }
  })
  
  // userId 값을 못 찾았으면
  if(isExisted(loginUser)) {
    // pwd도 맞는지 비교
    if (loginUser.password === password) {
      console.log('비번도 같아')
    } else {
      console.log('틀렸다.')
    }
  } else {
    console.log('없는 아이디입니다.') 
  }
})

 

 

Object.keys(obj)의 길이가 0이라면, 비어있는 것 (속성 이름이 하나도 존재하지 않는다는 것이기 때문)

Object.keys() > 객체의 속성 이름을 배열로 얻을 수 있는 메서드

// 객체가 비었는지 확인하는 함수
function isExisted(obj) {
  if (Object.keys(obj).length) {
    return true
  } else {
    return false
  }
}

'졸업작품 > Node.js' 카테고리의 다른 글

Express - params, query(쿼리 문자열)  (0) 2024.04.18
RESTful API 및 HTTP 프로토콜 기본 개념  (0) 2024.04.17

Params : 동적인 URL 경로 처리

app.get(`/products/:n`, function(req, res) {
  res.json({
    num: req.params.n
  })
})

클라이언트에서 /products 뒤에 입력한 값을 req.params로 받을 수 있음.

/products/:n 경로에 접속하면 :n자리에 오는 값이 req.params.n에 저장되어 해당 값을 JSON 형식으로 반환.

n에 200 전달 > req.params.n으로 받을 수 있음.


쿼리 문자열

  • 쿼리 문자열은 URL의 끝에 '?'를 사용하여 추가적인 데이터를 전달하는 데 사용
  • 쿼리 문자열은 'key=value' 쌍으로 이루어져 있음
  • '&'를 사용하여 여러 개의 쌍을 연결할 수 있음
  • Express에서는 req.query를 통해 이러한 쿼리 문자열을 읽어올 수 있다.
// https://www.youtube.com/watch?v=2KheQK5srCc&t=2339s
app.get(`/watch`, function(req, res) {
  const query = req.query
  res.json({
    video: query.v,
    timeline: query.t
  })
})

/watch?v=2KheQK5srCc&t==2339s 에 접속하면

watch경로 뒤에 오는 쿼리문자열을 req.query로 받을 수 있다.

현재 v=value / t=value 형태로 두 쌍이 존재하며, 이 두 쌍을 JSON 형태로 반환할 수 있다.

더 깊이 접근하고 싶다면, req.query.v / req.query.t > 객체 표기법으로 각 키의 값에도 직접 접근할 수 있다.


+ TIP! 자바스크립트 객체, 배열 비구조화 할당

코드를 간결하고 가독성 있게 사용할 수 있음.

객체

  • 객체 비구조화 할당에서는 변수의 이름과, 객체의 속성명이 반드시 같아야 한다.
  • 변수의 이름이 객체의 속성명과 일치하지 않으면 값이 할당되지 않는다.

배열

  • 배열은 속성명이 따로 존재하지 않기 때문에, 배열의 순서대로 할당된다.
  • 선언된 변수의 순서와, 배열의 요소 순서가 일치해야 한다.
  • 중간에 필요없는 값이 끼여있다면 , ,로 생략 처리를 해주어야 한다.

'졸업작품 > Node.js' 카테고리의 다른 글

[Node.js] 회원 API 기초 설계  (0) 2024.04.19
RESTful API 및 HTTP 프로토콜 기본 개념  (0) 2024.04.17

클라이언트와 서버 간의 약속, 프로토콜(Protocol)

서로 정보를 주고 받을 때 지켜야 하는 약속이 존재한다.

반드시 이 약속을 지켜서 통신해야 하며, 우리는 이 약속을 프로토콜이라 부른다.

 

인터넷으로 연결된 클라이언트와 서버는 웹 프로토콜인 HTTP를 사용하여 데이터를 주고 받는다.

웹(=인터넷망 속 가상 공간) 개발자 > 인터넷을 돌아다니기 위한 규약을 지켜야만 함 > HTTP를 지켜야만 한다.

 

HTTP 형식을 엄격하게 준수하지 않아도 통신을 가능하다. 하지만 규약 따르면 효율이 극대화!


RESTful API : HTTP 규약을 매우 잘 따른 API, REST의 원칙을 완벽하게 준수하는 API

RESTful API 쓰는 이유

  • 웹에서 일반적으로 사용하는 표준 프로토콜 활용 > 다양한 플랫폼 및 언어에서 API를 손쉽게 사용하고 통합할 수 있다.
  • API 사용이 직관적 > GET, POST, PUT, DELETE < 명확한 의미를 가지고 있어 이해하고 사용하기가 쉽다.
  • 자원 중심적으로 URL을 통해 고유하게 식별할 수 있다. 일반적으로 CRUD 작업 지원(Create, Read, Update, Delete)

HTTP 에 담아 보내야하는 것들

인터넷 상에서 공유/전달하고 싶은 모든 것들은 다 http에 넣어서 보내야 한다

HTTP 요청과 응답은 Head / Body 로 나누어져있음.

 

Header(헤더)

  • 통신 상태가 어떤지 알려주는 HTTP code(상태 코드, 200, 404, 500 등)
  • 응답이 어떤 형태인지.

Body(바디)

  • 응답의 본문 데이터(요청 성공, 요청 실패에 대한 정보 등)
  • post, put의 경우, 전달하려는 데이터

HTTP 에 담아보내는 나의 목적 = HTTP method

  • 생성(=등록) : POST
  • 조회 : GET
  • 수정 : PUT(덮어쓰기) / PATCH(일부 변경)
  • 삭제 : DELETE

REST API URL 규칙

  • 대문자 X, 소문자 O
  • 언더바(_) X, 하이픈(-) O
  • 마지막에 / 포함 X
  • 목적을 포함하지 않음 X
  • 복수형 O

URL + HTTP method (API 설계)

http://localhost:8888 : 내 컴퓨터 주소(local host)

 

잘못된 예

http://localhost:8888 상품 "등록"=> /post_product

http://localhost:8888 전체상품 "조회" => /select_all_products

http://localhost:8888 전체 상품 "삭제" => /DeleteAllProducts

 

올바른 예

http://localhost:8888 상품 "등록"=> "POST" /product

http://localhost:8888 전체 상품 "삭제" => "DELETE" /products

http://localhost:8888 전체 상품 "조회" => "GET" /products

 

http://localhost:8888 상품 " 개별 조회" => "GET" /products/{id}

http://localhost:8888/products/1
http://localhost:8888
/products/2
http://localhost:8888
/products/3

'졸업작품 > Node.js' 카테고리의 다른 글

[Node.js] 회원 API 기초 설계  (0) 2024.04.19
Express - params, query(쿼리 문자열)  (0) 2024.04.18

+ Recent posts