프론트엔드-백엔드 분리 및 API 설계 가이드

프론트엔드와 백엔드 분리 방법

역할 분리

  • 프론트엔드와 백엔드는 비동기 API를 통해만 상호작용
  • 각 팀이 독립적인 개발 프로세스, 빌드 도구, 테스트 스위트 보유
  • 관심사 분리로 인해 두 팀이 상대적으로 독립적이고 느슨하게 결합됨

개발 프로세스

  • 백엔드 개발자가 API 문서 작성 및 유지관리, API 변경 시 문서 업데이트
  • 백엔드 팀이 API 문서 기반으로 인터페이스 개발
  • 프론트엔드 팀이 API 문서 기반으로 개발 + 모킹 플랫폼 활용
  • 개발 완료 후 통합 테스트 및 제출

모킹 서버는 API 문서를 기반으로 자동으로 모킹 데이터를 생성하며, 이는 API 문서가 곧 API가 되는 것을 의미합니다.

API 설계 규격

규격 원칙

  • API 응답 데이터는 화면에 직접 표시될 수 있도록 구성: 프론트엔드는 렌더링 로직만 처리
  • 렌더링 로직이 여러 API 호출에 걸쳐서는 안 됨
  • 프론트엔드는 인터랙션과 렌더링 로직에 집중하며, 비즈니스 로직 처리는 최소화
  • 요청-응답 데이터 형식: JSON, JSON 데이터는 간단하고 가볍게 유지, 다중 계층 JSON 방지

기본 형식 예시

아래는 프론트엔드와 백엔드 간 데이터 교환의 기본 예시입니다. 실제 구현 시 비즈니스 요구사항이나 코딩 습관에 따라 적절히 조정할 수 있으며, 아래 예시에 얽매이지 마십시오.

요청 기본 형식

모든 요청 데이터는 JSON 형식으로 포장됩니다.

GET 요청:

xxx/login?body={"userId":"admin","userPass":"123456","captchaCode":"scda","autoLogin":1}

POST 요청:

POST 요청 예시는 기본적으로 동일한 JSON 형식을 따릅니다.

응답 기본 형식


{
  status:200,
  response:{
  	message:"success"
  }
}

status: 요청 처리 상태를 나타내며, 예시 값은 다음과 같습니다:

  • 200: 요청 처리 성공
  • 500: 요청 처리 실패
  • 401: 인증되지 않은 요청, 로그인 페이지로 이동
  • 406: 인증되지 않은 권한, 권한 없음 페이지로 이동

response.message: 요청 처리 메시지:

  • status=200 이고 response.message="success": 요청 처리 성공
  • status=200 이고 response.message!="success": 요청 처리 성공, 일반 메시지 표시: message 내용
  • status=500: 요청 처리 실패, 경고 메시지 표시: message 내용

응답 엔티티 형식


{
  status:200,
  response:{
  	message:"success",
    payload:{
    	userID:1,
      userName:"madder",
      "userAge":28,
      "userGender":2
    }
  }
}

response.payload: 응답으로 반환되는 엔티티 데이터

응답 목록 형식


{
  status:200,
  response:{
  	message:"success",
    items:[
      {
        "userID":1,
        "userName":"tony",
        "userAge":28,
        "userGender":1
      },
      {
        "userID":2,
        "userName":"Jerry",
        "userAge":30,
        "userGender":2
      }
    ]
  }
}

response.items: 응답으로 반환되는 목록 데이터

응답 페이징 형식


{
  status:200,
  response:{
    currentRecordCount:2,
  	message:"success",
    totalRecordCount:2,
    currentPageNo:1,
    pageSize:10,
    items:[
      {
        "userID":1,
        "userName":"tony",
        "userAge":28,
        "userGender":1
      },
      {
        "userID":2,
        "userName":"jerry",
        "userAge":30,
        "userGender":2
      },
     {
        "userID":3,
        "userName":"pines",
        "userAge":35,
        "userGender":1
      }
    ],
    totalPages:1
  }
}

response.currentRecordCount: 현재 페이지의 레코드 수

response.totalRecordCount: 전체 레코드 수

response.currentPageNo: 현재 페이지 번호

response.pageSize: 페이지 크기

response.totalPages: 전체 페이지 수

특수 콘텐츠 규격

드롭다운, 체크박스, 라디오 버튼

선택 여부는 백엔드 인터페이스에서 통합 로직으로 판단하고, isSelected로 선택 여부를 표시합니다. 예시는 다음과 같습니다:


{
  status:200,
  response:{
  	message:"success",
    items:[
      {
        "userID":1,
        "userName":"madder",
        "userAge":28,
        "userGender":2,
        "isSelected":1
      },
      {
        "userID":2,
        "userName":"pines",
        "userAge":30,
        "userGender":1,
         "isSelected":0
      }
    ]
  }
}

드롭다운, 체크박스, 라디오 버튼의 선택 로직은 프론트엔드에서 처리하지 않고, 백엔드 로직으로 통합하여 선택 여부를 판단한 후 프론트엔드에 표시하도록 전달해야 합니다.

Boolean 타입

Boolean 타입은 JSON 데이터 전송 시 1/0으로 표시하며, 1은 참(True)/예, 0은 거짓(False)/아니오를 의미합니다.

날짜 타입

날짜 타입은 JSON 데이터 전송 시 문자열로 통일하며, 구체적인 날짜 형식은 비즈니스 요구사항에 따라 결정됩니다.

태그: API설계 프론트엔드-백엔드분리 RESTfulAPI JSON데이터포맷 웹개발표준

5월 22일 23:33에 게시됨