two-clock / backend

개발자를 위한 Github 계정 및 저장소 정보 공유 서비스
4 stars 0 forks source link

feat: Create bulletin board registration API #19

Closed jjangsky closed 3 months ago

jjangsky commented 3 months ago

관련 이슈

변경 사항


게시판 등록 API 요청 주소 : /api/v1/boards (post)

request

{
"title" : "제목",
"content" : "대충 내용",
"category" : "BD1"
}

response

{
"httpStatus": 200,
"message": "OK",
"data": null
}

체크 목록

jjangsky commented 3 months ago

@openmpy 쉬는 주말에도 빠른 리뷰 감사드립니다 👍 GPT보다 더 정확한 코드리뷰에 감탄을 했습니다 😃

피드백 주신 부분에 대해서 빠른 시일내로 수정하여 커밋하겠습니다~!

openmpy commented 3 months ago

@jjangsky 님~ 갑자기 의문이 들어서 코멘트 하나 남겨봅니다. 혹시 공통 response 의 의도는 무엇일까요? httpStatus 는 header 로 넘긴다 치고.. message 에는 어떤 내용들이 들어가나요? data 에는 반환 값이 들어가는건가요?

jjangsky commented 3 months ago

@openmpy message 필드에 대해서는 아직까지는 사용 계획은 없으나 추후 서버에서 사용자로부터 반환해야 할 message 정도를 넣기 위한 필드로 계획하여 작성하였습니다.

public RestResponse(Object resultData, String message) {
        super(HttpResponse.builder()
                .httpStatus(HttpStatus.OK.value())
                .message(message)
                .data(resultData)
                .build(), headers, HttpStatus.OK);
    }

이러한 형식으로도 사용이 가능할 것 같구여 지금은 단순하게 "OK" 라는 문자열만 임의로 넣어 놓은 형태입니다. 사용 계획이 없을것 같으면 지워도 문제가 없는 필드입니다 !

공통 Response의 의도는 단순하게 Controller 계층에서 ResponseDto Class를 조금 더 간편하게 반환하기 위한 의도이지 이게 기능적이나 성능적으로는 크게 의미가 있는 Class 자체는 아닙니다.

Data 필드에는 조회된 데이터나 필요하다면 등록이나 수정 작업 후 변경된 데이터를 등록하는 필드로 넣어놓았습니다.

openmpy commented 3 months ago

@openmpy

message 필드에 대해서는 아직까지는 사용 계획은 없으나

추후 서버에서 사용자로부터 반환해야 할 message 정도를 넣기 위한 필드로 계획하여 작성하였습니다.


public RestResponse(Object resultData, String message) {

        super(HttpResponse.builder()

                .httpStatus(HttpStatus.OK.value())

                .message(message)

                .data(resultData)

                .build(), headers, HttpStatus.OK);

    }

이러한 형식으로도 사용이 가능할 것 같구여

지금은 단순하게 "OK" 라는 문자열만 임의로 넣어 놓은 형태입니다.

사용 계획이 없을것 같으면 지워도 문제가 없는 필드입니다 !

공통 Response의 의도는 단순하게 Controller 계층에서 ResponseDto Class를 조금 더

간편하게 반환하기 위한 의도이지 이게 기능적이나 성능적으로는 크게 의미가 있는 Class 자체는 아닙니다.

Data 필드에는 조회된 데이터나 필요하다면 등록이나 수정 작업 후 변경된 데이터를 등록하는 필드로

넣어놓았습니다.

@jjangsky 님 디테일한 답변 감사합니다. message 에 대한 부분에서 의문이 좀 생겼었는데 해결 됐습니다. 혹시 현업 단계에선 어떤 식으로 공통 reaponse 값을 내려주나요? 예를 들어 어떤 필드들이 있으며 등등..

jjangsky commented 3 months ago

@openmpy 현업이라 하기에는 많이 부족하지만 저같은 경우에는 data 필드만 넘기고 있습니다. 그 외에도 ResponseClass에 정의한 message, status 필드 이렇게 3개 넘기고 있었지만 사실 사용하는것은 data필드만 받아서 사용하고 있습니다.

// 3. 응답 처리
if (response) {
if (response.status === 200) {

    // 모든 API 응답에 대해 token이 존재하는 경우 토큰을 갱신한다.
    // refresh 하는 경우도 있기 때문
    // jwt token 확인
    let token = comm.jwt.getTokenFromHeader(response.headers);
    if (token) {
        // set token
        comm.jwt.setToken(token);
    }

    // 3.1 정상 응답
    if (callback) {
        // json 이 아닌 경우도 존재함
        // response header 에서 content-type 을 확인해서
        // json인 경우 에만 json 으로 변환하여 callback
        const contentType = response.headers.get('Content-Type');
        const disposition = response.headers.get('Content-Disposition');
        if(contentType && contentType.indexOf('application/json') !== -1){
            const json = await response.json();
            callback(json);
        }
        // blob 인 경우
        else if (contentType && comm.api.isBlobType(contentType))
        {
            const blob = await response.blob();
            callback(blob, disposition);
        }
        else
        {
            const resultData = await response.text();
            callback(resultData,disposition);
        }
    }

} else {
    // 3.2 에러 응답
    if (comm.api._defaultHttpErrorHandle) {
        /**
            * @Reference : comm.api._defaultHttpErrorHandle
            * */
        const result = await response.json();
        //comm.api.httpErrorHandle(response, result, errorCallBack);
        // link 따라가기가 힘들어서 직접호출로 변경
        await comm.api._defaultHttpErrorHandle(response, result, errorCallBack);
    } else {
        comm.msg.alert('알 수 없는 오류가 발생 했습니다.');
    }
}
}

공통 JS 파일이 있어서 따로 뭐가 넘어오는지 신경 안쓰고 있었는데 보니까 헤더에서 추출한 status는 200 제외하고 다 에러로 처리하고 있네용

다음주 금요일에 회사 프론트 분들 접할 기회가 있어서 반환값에 대해서 한번 여쭤보겠습니다.

openmpy commented 3 months ago

@openmpy 현업이라 하기에는 많이 부족하지만 저같은 경우에는 data 필드만 넘기고 있습니다.

그 외에도 ResponseClass에 정의한 message, status 필드 이렇게 3개 넘기고 있었지만 사실 사용하는것은 data필드만 받아서

사용하고 있습니다.


// 3. 응답 처리

if (response) {

if (response.status === 200) {

  // 모든 API 응답에 대해 token이 존재하는 경우 토큰을 갱신한다.

  // refresh 하는 경우도 있기 때문

  // jwt token 확인

  let token = comm.jwt.getTokenFromHeader(response.headers);

  if (token) {

      // set token

      comm.jwt.setToken(token);

  }

  // 3.1 정상 응답

  if (callback) {

      // json 이 아닌 경우도 존재함

      // response header 에서 content-type 을 확인해서

      // json인 경우 에만 json 으로 변환하여 callback

      const contentType = response.headers.get('Content-Type');

      const disposition = response.headers.get('Content-Disposition');

      if(contentType && contentType.indexOf('application/json') !== -1){

          const json = await response.json();

          callback(json);

      }

      // blob 인 경우

      else if (contentType && comm.api.isBlobType(contentType))

      {

          const blob = await response.blob();

          callback(blob, disposition);

      }

      else

      {

          const resultData = await response.text();

          callback(resultData,disposition);

      }

  }

} else {

  // 3.2 에러 응답

  if (comm.api._defaultHttpErrorHandle) {

      /**

          * @Reference : comm.api._defaultHttpErrorHandle

          * */

      const result = await response.json();

      //comm.api.httpErrorHandle(response, result, errorCallBack);

      // link 따라가기가 힘들어서 직접호출로 변경

      await comm.api._defaultHttpErrorHandle(response, result, errorCallBack);

  } else {

      comm.msg.alert('알 수 없는 오류가 발생 했습니다.');

  }

}

}

공통 JS 파일이 있어서 따로 뭐가 넘어오는지 신경 안쓰고 있었는데

보니까 헤더에서 추출한 status는 200 제외하고 다 에러로 처리하고 있네용

다음주 금요일에 회사 프론트 분들 접할 기회가 있어서 반환값에 대해서 한번 여쭤보겠습니다.

@jjangsky 님 확인 했습니다. 감사합니다 ~ 👍

jjangsky commented 3 months ago

@openmpy PR Merge 처리 하겠습니다~ 피드백 주신 MethodArgumentNotValidException 관련 예외처리는 해당 PR과 목적이 달라서 따로 이슈로 등록하고 처리하겠습니다 👍