인프런 커뮤니티 질문&답변
웹과 앱의 상태코드
작성
·
314
0
안녕하세요. 양질의 강의 잘 듣고 있습니다.
안드로이드와 스프링 쪽만 건드려봐서 저는 웹 쪽의 지식이 거의 없습니다. 스프링으로 API를 만들어서 웹이 아닌 애플리케이션클라리언트에게 데이터를 넘길 때도 지금 설명하시는 HTTP 상태코드 스펙(100번대 ~ 200번대)을 사용하나요?
지금 약간 혼동이 오는 게 제가 옛날에 교육 받은 곳에서는 아래와 같이 상태 코드를 직접 만들어서 클라이언트와 통신했거든요.. 그럼
안드로이드와 스프링 쪽만 건드려봐서 저는 웹 쪽의 지식이 거의 없습니다. 스프링으로 API를 만들어서 웹이 아닌 애플리케이션클라리언트에게 데이터를 넘길 때도 지금 설명하시는 HTTP 상태코드 스펙(100번대 ~ 200번대)을 사용하나요?
지금 약간 혼동이 오는 게 제가 옛날에 교육 받은 곳에서는 아래와 같이 상태 코드를 직접 만들어서 클라이언트와 통신했거든요.. 그럼
아래와 같은 방식으로 하는 건 업계에서 쓰이는 표준을 지키지 않은 건가요?
(아래 코드는 상태 코드와 요청에 대한 응답 예시입니다.)
package com.example.demo.config;
import lombok.Getter;
/**
* 에러 코드 관리
*/
@Getter
public enum BaseResponseStatus {
/**
* 1000 : 요청 성공
*/
SUCCESS(true, 1000, "요청에 성공하였습니다."),
/**
* 2000 : Request 오류
*/
// Common
REQUEST_ERROR(false, 2000, "입력값을 확인해주세요."),
EMPTY_JWT(false, 2001, "JWT를 입력해주세요."),
INVALID_JWT(false, 2002, "유효하지 않은 JWT입니다."),
INVALID_USER_JWT(false,2003,"권한이 없는 유저의 접근입니다."),
EMPTY_REQUEST_DATA(false, 2004, "요청한 값이 DB에 없습니다(empty)"),
// users
USERS_EMPTY_USER_ID(false, 2010, "유저 아이디 값을 확인해주세요."),
USERS_NO_LOGIN(false, 2011, "로그인을 해주세요"),
USERS_INVALID_USER(false, 2012, "존재하지 않거나 적절하지 않은 사용자입니다. 유저 상태를 확인해주세요."),
// [POST] /users
POST_USERS_EMPTY_EMAIL(false, 2015, "이메일을 입력해주세요."),
POST_USERS_INVALID_EMAIL(false, 2016, "이메일 형식을 확인해주세요."),
POST_USERS_EXISTS_EMAIL(false,2017,"중복된 이메일입니다."),
POST_USERS_INVALID_GENDER(false, 2018, "잘못된 성별입니다."),
POST_USERS_EXISTS_NICKNAME(false, 2019, "중복된 닉네임입니다."),
/**
* 3000 : Response 오류
*/
// Common
RESPONSE_ERROR(false, 3000, "값을 불러오는데 실패하였습니다."),
// [POST] /users
DUPLICATED_EMAIL(false, 3013, "중복된 이메일입니다."),
FAILED_TO_LOGIN(false,3014,"없는 아이디거나 비밀번호가 틀렸습니다."),
/**
* 4000 : Database, Server 오류
*/
DATABASE_ERROR(false, 4000, "데이터베이스 연결에 실패하였습니다."),
SERVER_ERROR(false, 4001, "서버와의 연결에 실패하였습니다."),
//[PATCH] /users/{userIdx}
MODIFY_FAIL_USERNAME(false,4014,"유저네임 수정 실패"),
PASSWORD_ENCRYPTION_ERROR(false, 4011, "비밀번호 암호화에 실패하였습니다."),
PASSWORD_DECRYPTION_ERROR(false, 4012, "비밀번호 복호화에 실패하였습니다."),
/*
* 5000: webtoons
* */
INTEREST_WEBTOON_STATUS_INVALID(false, 5001, "알람 설정을 하기 위해, 관심 웹툰으로 우선 등록을 해주세요"),
INVALID_EPISODE_IN_WEBTOON(false, 5002, "해당 웹툰에 속한 에피소드가 아닙니다."),
INVALID_STARSCORE_VALUE(false, 5003, "별점 값을 다시 확인해주세요"),
ALREADY_EXISTS_STARSCORE(false, 5004, "이미 별점이 존재합니다"),
WEBTOONS_INVALID_WEBTOON(false, 5005, "존재하지 않는 웹툰이거나 적절하지 않는 요청입니다. 값을 확인해주세요"),
EPISODES_INVALID_EPISODE(false, 5006, "존재하지 않는 에피소드이거나 적절하지 않는 요청입니다. 값을 확인해주세요"),
HISTORIES_INVALID_HISTORY(false, 5007, "요청하신 기록이 존재하지 않습니다. 다시 확인해주세요"),
NO_PAID_EPISODE(false, 5008, "구매가 필요한 에피소드입니다. 구매 후 이용해주세요");
// 6000 : 필요시 만들어서 쓰세요
private final boolean isSuccess;
private final int code;
private final String message;
private BaseResponseStatus(boolean isSuccess, int code, String message) {
this.isSuccess = isSuccess;
this.code = code;
this.message = message;
}
{
"isSuccess": true,
"code": 1000,
"message": "요청에 성공하였습니다.",
"result": {
"webtoonInfo": {
"webtoonIdx": 1,
"color": "#FF001D",
"webtoonProfileImageUrl": "https://imageUrl_신의탑_434×330",
"webtoonName": "신의탑",
"author": "SIU",
"synopsis": "자신의 모든 것이었던 소녀를 쫓아 탑에 들어온 소년 그리고 그런 소년을 시험하는 탑",
"genre": "판타지",
"age": "12세 이용가",
"day": "월요웹툰",
"totalInterestNum": 8,
"isInterested": null,
"alarm": null,
"paidEpisodeNum": 3
},
"episodeList": [
{
"episodeIdx": 6,
"thumbnailImageUrl": "https://image~~",
"title": "3부 75화",
"date": "16일 후 무료",
"avgStarScore": null,
"isWatched": null,
"isPaid": null,
"isLastWatchedEpisode": null,
"cookie": 2
},
{
"episodeIdx": 5,
"thumbnailImageUrl": "https://image~~",
"title": "3부 74화",
"date": "9일 후 무료",
"avgStarScore": null,
"isWatched": null,
"isPaid": null,
"isLastWatchedEpisode": null,
"cookie": 2
},
{
"episodeIdx": 4,
"thumbnailImageUrl": "https://image~~",
"title": "3부 73화",
"date": "2일 후 무료",
"avgStarScore": null,
"isWatched": null,
"isPaid": null,
"isLastWatchedEpisode": null,
"cookie": 2
},
{
"episodeIdx": 3,
"thumbnailImageUrl": "https://image~~",
"title": "3부 72화",
"date": "21.06.13",
"avgStarScore": "5.55",
"isWatched": null,
"isPaid": null,
"isLastWatchedEpisode": null,
"cookie": 0
},
{
"episodeIdx": 2,
"thumbnailImageUrl": "https://image~~",
"title": "3부 71화",
"date": "21.06.06",
"avgStarScore": "5.80",
"isWatched": null,
"isPaid": null,
"isLastWatchedEpisode": null,
"cookie": 0
},
{
"episodeIdx": 1,
"thumbnailImageUrl": "https://image~~",
"title": "3부 70화",
"date": "21.05.30",
"avgStarScore": "4.50",
"isWatched": null,
"isPaid": null,
"isLastWatchedEpisode": null,
"cookie": 0
}
]
}
}
답변 1
0
혹시 그렇다면 웹과 앱의 상태코드 전달 방식은 다른 건가요?
=> 응답헤더에 담아서 전송하는것은 동일합니다.
웹과 달리 앱은 상태 코드를 별도로 만들어서 사용하나요?
=> 필요에 따라 상태코드를 별도로 만들수는 있을 것 같습니다. 하지만 만들어져있는 것을 활용하되 특수한 경우에 따라 만들겠지요.
또한 안드로이드의 경우 사용하는 라이브러리가 구현한 동작에 맞춰서 개발을 해야 될 수도 있습니다.
참고






답변해주셔서 감사합니다! 이거 때문에 너무 혼란이 왔어요ㅜㅜ
혹시 그렇다면 웹과 앱의 상태코드 전달 방식은 다른 건가요? 물론 서버 개발자와 클라이언트 개발자 간에 약속으로 달라질 수 있겠지만 현업에서 '일반적으로' 웹과 달리 앱은 상태 코드를 별도로 만들어서 사용하나요?