요청 응답을 어떻게 보내야할까1 -MySQL

codeing999·2022년 8월 8일
0

CRUD BACKEND 구현

목록 보기
1/10
post-thumbnail

CRUD를 구현하면서 응답을 어떻게 보낼지 고민이 많이 된다.

회원가입

일단 회원가입의 경우에 다음과 같이 응답을 구현하였다.

    try {

        const userDto = await Joi.object({
            nickname: Joi.string().min(2).max(15).required(),
            password: Joi.string().min(4).max(20).required(),
            confirm: Joi.string().min(4).max(20).required()
        }).validateAsync( {...req.body} );

        return authService.join(userDto, res);
        
    } catch (err) {
        return res.status(400).json(err.message);
    }

joi 패키지를 썼다.

password와 confirm이 일치하지 않는 경우 :
"Duplicate entry 'id7' for key 'user.nickname'"
닉네임이 너무 짧은 경우 :
"\"nickname\" length must be at least 2 characters long"
닉네임을 입력하지 않은 경우 :
"\"nickname\" is not allowed to be empty"
닉네임, 패스워드, 컨펌 외의 것이 바디에 들어가 있는 경우 :
"\"userid\" is not allowed"

위와 같은 경우 등에는 joi가 알아서 message를 보내준다.

status code까지 적어 보냈다. 저거는 header에 실려가서 body에는 따로 안보인다.

if (userDto.password !== userDto.confirm) {
  return res.status(400).json({
    erroMessage: "패스워드와 패스워드 확인이 일치하지 않습니다."
  });
};

password와 confirm이 일치하지 않는 경우는 직접 if문으로 다뤄줬다.

[
  ResultSetHeader {
    fieldCount: 0,
    affectedRows: 1,
    insertId: 46,
    info: '',
    serverStatus: 3,
    warningStatus: 0
  },
  undefined
]

회원가입 성공시 이런 쿼리결과로 이런게 반환되는데
affectedRows 가 1인지가 중요하고.
insertId는 내부적으로 오토인크리트로 만든 user_id와 일치하는 값이다.

if (user) 
  return res.status(201).json({success : true, message: "회원가입에 성공하였습니다.", result: { nickname: userDto.nickname } })
else 
  return res.status(400).json({ success : false, message: "회원가입에 실패하였습니다.", result: {} })

성공할 경우에는

{
  "success": true,
  "message": "회원가입에 성공하였습니다.",
  "result": {
    "nickname": "id8"
  }
}

이와 같이 success 여부와 메시지와 응답해줄 내용까지 3개로 작성했다.
성공 응답으로는 id를 넣어줬다. 의미가 있을진 모르겠다.

저 else문에 어떤 경우가 걸릴지 모르겠어서 걸리게 해보지는 못했지만
아마 쿼리가 실패한다면 affectedRows 가 0인채로 반환하지 않을까 싶다.

로그인

[
  [ { nickname: 'id7' } ],
  [
    ColumnDefinition {
      _buf: <Buffer 01 00 00 01 01 3b 00 00 02 03 64 65 66 0d 6e 6f 64 65 5f 68 6f 6d 65 77 6f 72 6b 04 75 73 65 72 04 75 73 65 72 08 6e 69 63 6b 6e 61 6d 65 08 6e 69 63 ... 44 more bytes>,
      _clientEncoding: 'utf8',
      _catalogLength: 3,
      _catalogStart: 10,
      _schemaLength: 13,
      _schemaStart: 14,
      _tableLength: 4,
      _tableStart: 28,
      _orgTableLength: 4,
      _orgTableStart: 33,
      _orgNameLength: 8,
      _orgNameStart: 47,
      characterSet: 224,
      encoding: 'utf8',
      name: 'nickname',
      columnLength: 60,
      columnType: 253,
      flags: 20485,
      decimals: 0
    }
  ]
]

로그인의 경우 쿼리문이 성공하면 user에 위와 같이 뭔가 긴걸 반환해주는데
user[0] 를 응답에 넣어주면 nickname만 응답에 딱 넣어줄 수가 있다.
로그인 실패시엔 이게 []라서 (SELECT * ~~로 해도 같음)
user[0].length가 0인지 아닌지 여부로 로그인 실패여부를 판단하면 될 것 같다.

if (user[0].length) 
  return res.status(200).json({success : true, message: "로그인에 성공하였습니다.", result: user[0] })
else 
  return res.status(400).json({ success : false, message: "로그인에 실패하였습니다.", result: user[0] })

이와 같이 구현하였다.

리뷰

일단 막 구현하다보니까 응답에 통일성이 없는데
성공여부/ 메세지/ 결과
이렇게 통일 해야겠다.
joi가 왠만한건 다해줘서 편리하긴한데 저거 외에 예외처리할 경우가 뭐 있을까.
jwt 토큰하고 패스워드를 bcrypt로 암호화하는 것도 당연히 추가할 예정.

status code

그리고 status code도 정확히 쓰려고 알아봤다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Status
200 OK
요청이 성공적으로 되었습니다. 성공의 의미는 HTTP 메소드에 따라 달라집니다:
GET: 리소스를 불러와서 메시지 바디에 전송되었습니다.
HEAD: 개체 해더가 메시지 바디에 있습니다.
PUT 또는 POST: 수행 결과에 대한 리소스가 메시지 바디에 전송되었습니다.
TRACE: 메시지 바디는 서버에서 수신한 요청 메시지를 포함하고 있습니다.

201 Created
요청이 성공적이었으며 그 결과로 새로운 리소스가 생성되었습니다. 이 응답은 일반적으로 POST 요청 또는 일부 PUT 요청 이후에 따라옵니다.

400 Bad Request
이 응답은 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음을 의미합니다.

401 Unauthorized
비록 HTTP 표준에서는 "미승인(unauthorized)"를 명확히 하고 있지만, 의미상 이 응답은 "비인증(unauthenticated)"을 의미합니다. 클라이언트는 요청한 응답을 받기 위해서는 반드시 스스로를 인증해야 합니다.

403 Forbidden
클라이언트는 콘텐츠에 접근할 권리를 가지고 있지 않습니다. 예를들어 그들은 미승인이어서 서버는 거절을 위한 적절한 응답을 보냅니다. 401과 다른 점은 서버가 클라이언트가 누구인지 알고 있습니다.

404 Not Found
서버는 요청받은 리소스를 찾을 수 없습니다. 브라우저에서는 알려지지 않은 URL을 의미합니다. 이것은 API에서 종점은 적절하지만 리소스 자체는 존재하지 않음을 의미할 수도 있습니다. 서버들은 인증받지 않은 클라이언트로부터 리소스를 숨기기 위하여 이 응답을 403 대신에 전송할 수도 있습니다. 이 응답 코드는 웹에서 반복적으로 발생하기 때문에 가장 유명할지도 모릅니다.

일단은 이정도만 알아도 되지않을까 싶다.

profile
코딩 공부 ing..

0개의 댓글