예상 읽기 시간: 20~30분
Day 12는 백엔드 스터디의 마지막 글입니다.
이 시리즈의 목표는 진규가 Java와 Spring Boot를 백엔드 개발자처럼 처음부터 끝까지 손으로 외워 쓰게 만드는 것이 아니었습니다. 목표는 더 현실적이었습니다.
AI가 만든 Spring Boot 백엔드 코드를 읽고,
프론트엔드 개발자로서 협업에 필요한 질문을 할 수 있고,
위험한 부분을 발견할 수 있고,
필요하면 AI에게 더 정확히 수정 요청할 수 있게 되는 것.
프론트엔드 개발자는 백엔드를 몰라도 된다는 말이 있습니다. 절반만 맞습니다. 백엔드의 모든 내부 구현을 외울 필요는 없습니다. 하지만 API 계약, 인증 흐름, 데이터 구조, 에러 응답, 배포 환경을 전혀 모르면 실무에서 계속 막힙니다.
오늘은 지금까지의 내용을 하나의 협업 지도로 정리합니다.
프론트엔드는 사용자가 보는 화면을 만듭니다. 하지만 화면은 혼자 완성되지 않습니다.
사용자가 버튼을 누른다.
프론트엔드가 요청을 보낸다.
백엔드가 인증/검증/저장/조회 로직을 실행한다.
프론트엔드가 응답을 받아 상태를 바꾼다.
사용자는 성공/실패 결과를 본다.
사용자가 경험하는 기능은 이 전체 흐름입니다. 그래서 문제가 생겼을 때 “프론트 문제인지 백엔드 문제인지”를 나누려면 최소한 요청과 응답의 경계를 읽을 수 있어야 합니다.
예를 들어 로그인 버튼을 눌렀는데 실패했다고 해봅니다.
프론트엔드만 보면 이런 질문을 합니다.
입력값을 제대로 보냈나?
fetch URL이 맞나?
쿠키나 Authorization header가 붙었나?
응답을 제대로 파싱했나?
백엔드 경계까지 볼 수 있으면 질문이 늘어납니다.
백엔드는 어떤 에러 코드를 내려줬나?
401인가 400인가 500인가?
비밀번호 검증에서 실패했나, 사용자를 찾지 못했나?
성공 시 토큰/쿠키가 어떤 방식으로 내려오나?
CORS나 SameSite 설정이 막고 있나?
이 정도만 알아도 협업 속도가 크게 달라집니다. “안 돼요”가 아니라 “로그인 API가 200을 주지만 Set-Cookie가 없어서 다음 요청에서 인증이 유지되지 않습니다”라고 말할 수 있기 때문입니다.
프론트엔드에서는 화면 단위로 생각하기 쉽습니다.
회원가입 페이지
게시글 상세 페이지
마이페이지
관리자 대시보드
하지만 백엔드와 협업할 때는 화면을 요청 단위로 쪼개야 합니다.
예를 들어 게시글 상세 페이지는 하나의 화면이지만 실제 요청은 여러 개일 수 있습니다.
GET /api/posts/{postId} 게시글 본문
GET /api/posts/{postId}/comments 댓글 목록
POST /api/posts/{postId}/likes 좋아요
POST /api/comments 댓글 작성
DELETE /api/comments/{commentId} 댓글 삭제
협업 문서나 이슈를 만들 때는 아래처럼 정리하면 좋습니다.
Post Q&A
백엔드 스터디 Day 12: 프론트엔드 개발자를 위한 협업 지도 전체를 기준으로 질문과 피드백을 받아요.답을 본 뒤에는 이 내용을 댓글로 달아서 서징에게도 물어볼 수 있어요. 작성자가 직접 볼 수 있어요!
화면: 게시글 상세 페이지
필요한 요청:
1. 게시글 상세 조회
2. 댓글 목록 조회
3. 댓글 작성
4. 댓글 삭제
5. 좋아요 토글
그리고 각 요청마다 계약을 적습니다.
GET /api/posts/{postId}
성공: 200, PostDetailResponse
실패:
- 404 POST_NOT_FOUND
- 403 PRIVATE_POST
인증: 비공개 글이면 필요
이렇게 정리하면 프론트엔드와 백엔드가 같은 지도를 보게 됩니다.
API 계약은 단순히 URL 목록이 아닙니다. 프론트엔드가 구현을 시작할 수 있을 정도로 구체적이어야 합니다.
체크해야 할 항목은 아래입니다.
1. endpoint: URL과 method
2. auth: 인증 필요 여부
3. request: path/query/body/header
4. response: 성공 응답 구조
5. error: 실패 응답 구조와 code
6. state: 요청 후 프론트엔드 상태가 어떻게 바뀌는지
예를 들어 댓글 작성 API는 이렇게 협업할 수 있습니다.
POST /api/comments
인증: 필요
request body:
{
"postId": 10,
"content": "댓글 내용"
}
success 201:
{
"id": 100,
"postId": 10,
"authorNickname": "seojing",
"content": "댓글 내용",
"createdAt": "2026-06-12T09:30:00Z"
}
errors:
- 400 INVALID_COMMENT_CONTENT
- 401 UNAUTHENTICATED
- 404 POST_NOT_FOUND
이 정도가 있어야 프론트엔드는 낙관적 업데이트를 할지, 성공 후 목록을 다시 불러올지, 에러 메시지를 어디에 보여줄지 결정할 수 있습니다.
백엔드가 아직 완성되지 않았더라도 계약을 먼저 합의할 수 있습니다. 이때 프론트엔드는 mock data를 만들고, 백엔드는 계약에 맞춰 구현합니다. 계약이 없으면 양쪽이 각자 상상한 구조로 만들고 나중에 맞추느라 시간이 늘어납니다.
프론트엔드에서는 화면 상태를 생각합니다.
post: {
id: number;
title: string;
content: string;
authorName: string;
liked: boolean;
likeCount: number;
}
백엔드에서는 저장 구조를 생각합니다.
Post table
Member table
Like table
Comment table
이 둘은 다릅니다. UI가 원하는 데이터는 여러 테이블을 조합한 응답일 수 있고, DB Entity는 내부 저장을 위한 구조입니다.
그래서 협업할 때 중요한 질문은 “DB에 어떻게 저장돼?”보다 먼저 이것입니다.
이 화면을 그리기 위해 프론트엔드가 어떤 응답을 받아야 하는가?
예를 들어 게시글 목록에서는 본문 전체가 필요 없을 수 있습니다.
{
"id": 10,
"title": "스터디 후기",
"summary": "이번 주에 배운 내용은...",
"authorNickname": "seojing",
"commentCount": 3,
"createdAt": "2026-06-12T09:30:00Z"
}
반면 상세 페이지는 본문과 권한 정보가 필요할 수 있습니다.
{
"id": 10,
"title": "스터디 후기",
"content": "...",
"authorNickname": "seojing",
"editable": true,
"deletable": true,
"createdAt": "2026-06-12T09:30:00Z"
}
여기서 editable, deletable 같은 필드는 백엔드가 권한 판단을 도와주는 협업 포인트가 될 수 있습니다. 프론트엔드에서 버튼을 숨기는 것은 UX일 뿐이고, 실제 권한 검사는 백엔드에서 해야 합니다. 하지만 백엔드가 UI에 필요한 권한 힌트를 내려주면 프론트엔드는 더 안전하고 자연스럽게 화면을 만들 수 있습니다.
로그인 협업에서 자주 막히는 부분은 토큰 자체가 아니라 토큰이 어디에 저장되고, 다음 요청에 어떻게 붙는지입니다.
대표적인 방식은 두 가지입니다.
1. Authorization header에 Bearer token을 붙이는 방식
2. HttpOnly cookie로 세션/토큰을 주고받는 방식
Bearer token 방식은 보통 이런 요청이 됩니다.
Authorization: Bearer ***
문서나 예시에서는 실제처럼 보이는 토큰을 쓰지 말고 *** 같은 placeholder를 사용합니다.
Cookie 방식은 브라우저와 서버 설정이 중요합니다.
Set-Cookie
HttpOnly
Secure
SameSite
CORS credentials
프론트엔드에서 fetch를 쓸 때 쿠키 인증이면 이런 옵션이 필요할 수 있습니다.
fetch("/api/me", {
credentials: "include",
});
협업 질문은 아래처럼 정리할 수 있습니다.
로그인 성공 시 인증 정보는 header로 오나, cookie로 오나?
다음 요청에서 프론트엔드는 무엇을 붙여야 하나?
로그아웃은 서버 상태를 지우나, 클라이언트 저장소만 지우나?
토큰 만료 시 응답 code는 무엇인가?
새로고침 후 로그인 상태 복원 API가 있는가?
보안을 전부 깊게 알 필요는 없지만, 이 질문을 못 하면 로그인 관련 버그를 계속 “프론트인지 백인지 모르겠는 문제”로 남기게 됩니다.
실패 응답은 백엔드 내부 사정이 아니라 사용자 경험의 일부입니다.
예를 들어 회원가입에서 실패가 발생했을 때 프론트엔드는 서로 다른 UI를 보여줘야 합니다.
이메일 형식 오류 → 이메일 input 아래에 메시지
이미 가입된 이메일 → 이메일 input 아래에 중복 메시지
비밀번호 너무 짧음 → 비밀번호 input 아래에 메시지
서버 장애 → 상단 toast 또는 안내 문구
이 UI를 만들려면 백엔드 에러 응답이 구분되어야 합니다.
좋은 에러 계약은 아래처럼 프론트엔드 판단에 필요한 정보를 줍니다.
{
"code": "VALIDATION_FAILED",
"message": "입력값을 확인해주세요.",
"fieldErrors": [
{
"field": "email",
"message": "이메일 형식이 올바르지 않습니다."
}
]
}
반대로 모든 실패가 아래처럼 오면 UI가 어렵습니다.
{
"message": "error"
}
협업할 때는 아래 질문을 던집니다.
프론트엔드가 이 에러 응답만 보고 사용자에게 어떤 메시지를 보여줄지 결정할 수 있는가?
필드 에러와 전역 에러가 구분되는가?
재시도 가능한 오류와 사용자가 고쳐야 하는 오류가 구분되는가?
백엔드 테스트는 백엔드 개발자만을 위한 것이 아닙니다. API 계약이 테스트로 잠기면 프론트엔드도 안심하고 구현할 수 있습니다.
예를 들어 댓글 작성 API의 성공 응답 구조가 테스트로 검증되어 있으면, 백엔드가 나중에 필드명을 바꾸다가 테스트가 깨질 수 있습니다. 그러면 프론트엔드가 배포 후에야 알게 되는 문제를 미리 잡을 수 있습니다.
문서도 마찬가지입니다. Swagger/OpenAPI 같은 도구가 있으면 좋지만, 도구 자체보다 중요한 것은 최신성입니다.
협업 관점의 문서 체크리스트는 아래입니다.
API 문서가 실제 코드와 가까운 곳에서 유지되는가?
성공/실패 예시가 둘 다 있는가?
인증 필요 여부가 표시되어 있는가?
프론트엔드가 헷갈리는 enum/date/null 규칙이 적혀 있는가?
변경 시 누가 어떤 방식으로 알리는가?
AI가 문서를 만들 때도 “엔드포인트 목록만” 만들게 하면 부족합니다. 이렇게 요청하는 편이 좋습니다.
각 API마다 request, success response, error response, auth requirement, frontend state update note를 포함해서 문서화해줘. 특히 400/401/403/404/409 에러 code 예시를 넣어줘.
개발 서버에서 되던 기능이 운영에서 안 되는 경우가 많습니다.
프론트엔드와 백엔드 사이에서 운영 이슈는 이런 형태로 나타납니다.
로컬에서는 쿠키가 되는데 배포에서는 안 됨
CORS 에러가 남
API base URL이 환경별로 다름
파일 업로드 제한이 운영에서 다름
서버 시간대 때문에 날짜가 하루 밀림
응답이 느려서 로딩/타임아웃 처리가 필요함
그래서 협업 지도에는 운영 질문도 포함되어야 합니다.
dev/staging/prod API URL은 무엇인가?
CORS 허용 origin은 무엇인가?
인증 쿠키의 Secure/SameSite 설정은 배포 도메인에서 맞는가?
날짜는 UTC로 내려오는가, 로컬 시간으로 내려오는가?
파일 크기 제한과 timeout 기준은 무엇인가?
장애 시 프론트엔드는 어떤 메시지를 보여줘야 하는가?
이 질문들은 백엔드 내부 구현보다 실무에 더 직접적으로 중요할 때가 많습니다.
이제 Day 1~Day 11을 하나의 지도로 합치면 아래와 같습니다.
[1. 요청 흐름]
화면에서 어떤 요청이 나가고, Controller → Service → Repository → Response로 어떻게 돌아오는가?
[2. API 계약]
URL, method, request, response, error, auth requirement가 명확한가?
[3. 입력 검증]
형식 오류는 DTO/Bean Validation에서 막고, 비즈니스 규칙은 Service에서 확인하는가?
[4. 데이터 경계]
Entity는 내부 저장 구조로 숨기고, 외부에는 DTO를 내려주는가?
[5. 비즈니스 흐름]
Service가 유스케이스를 설명하고, 트랜잭션이 필요한 단위를 안전하게 묶는가?
[6. 인증/권한]
로그인 여부와 리소스 접근 권한이 분리되어 있고, 사용자 입력 ID를 신뢰하지 않는가?
[7. 테스트]
성공 케이스뿐 아니라 실패/권한/검증/중복 케이스가 API 응답까지 검증되는가?
[8. 문서]
프론트엔드가 구현을 시작할 수 있을 정도의 최신 계약 문서가 있는가?
[9. 배포/환경]
로컬, staging, production 설정이 분리되어 있고 비밀값이 코드에 들어가지 않는가?
[10. 관측 가능성]
문제가 났을 때 로그, requestId, 헬스체크, 메트릭으로 추적할 수 있는가?
이 지도를 다 외울 필요는 없습니다. 실제 코드를 볼 때 위에서 아래로 한 번씩 통과시키면 됩니다.
좋은 협업 질문은 막연하지 않습니다.
나쁜 질문은 이렇게 들립니다.
이 API 언제 돼요?
에러가 나요.
로그인이 이상해요.
응답이 이상한데요?
좋은 질문은 요청, 기대, 실제, 필요한 결정을 포함합니다.
POST /api/login에 email/password를 보내면 200은 오는데 Set-Cookie가 없습니다.
우리 프론트는 cookie 인증으로 구현해도 될까요, 아니면 Authorization header 방식인가요?
GET /api/posts/{postId} 응답에 editable 여부가 없어서 수정 버튼 노출을 프론트에서 authorId 비교로 처리해야 합니다.
권한 판단을 백엔드에서 해서 editable/deletable을 내려줄 수 있을까요?
회원가입 실패 시 모든 오류가 400 + message로만 옵니다.
필드별 오류를 input 아래에 보여주려면 fieldErrors 구조가 필요합니다.
VALIDATION_FAILED 응답 형식을 맞출 수 있을까요?
이런 질문은 상대가 바로 판단할 수 있게 만듭니다. “이상해요”가 아니라 “계약의 어느 부분이 비어 있는지”를 말하기 때문입니다.
진규가 앞으로 AI를 활용해서 백엔드를 만들거나 검토한다면, 한 번에 완성시키려 하기보다 단계별로 나누는 것이 좋습니다.
1. 화면/기능에서 필요한 API 목록 작성
2. API 계약 초안 작성
3. Entity/DTO/Service/Repository 구조 생성
4. 검증/에러/권한 기준 보강
5. 테스트 생성
6. 문서와 예시 응답 생성
7. 로그/환경/배포 설정 점검
8. 프론트엔드에서 실제 호출해보며 계약 수정
AI에게도 이 순서대로 시키면 결과가 좋아집니다.
처음부터 “전체 백엔드 만들어줘”라고 하면 AI는 많은 코드를 한 번에 만들고, 사람은 어디를 봐야 할지 어려워집니다. 반대로 “게시글 작성 API 계약부터 만들자”, “이제 DTO와 에러 응답을 맞추자”, “이제 권한 실패 테스트를 추가하자”처럼 나누면 리뷰 가능한 단위가 됩니다.
특히 진규에게 중요한 것은 코드 문법을 전부 외우는 것보다 아래 능력입니다.
AI가 만든 결과물의 경계를 읽고,
부족한 품질 기준을 발견하고,
다음 수정 요청을 정확히 쓰는 능력.
이 능력이 있으면 백엔드 전문성이 아직 깊지 않아도 협업에서 훨씬 안전해집니다.
백엔드 스터디는 여기서 한 번 닫습니다. 다음에 더 깊게 들어간다면 아래 순서가 좋습니다.
1. HTTP와 브라우저 네트워크 탭 깊게 보기
2. 인증 방식 비교: session, JWT, OAuth
3. DB 모델링과 인덱스 기본
4. 트랜잭션 격리 수준과 동시성 문제
5. Spring Security 구조
6. 테스트 전략: unit, slice, integration, contract test
7. 배포 파이프라인과 observability
하지만 지금 당장 모든 것을 공부할 필요는 없습니다. 프론트엔드 커리어 관점에서 먼저 중요한 것은 아래입니다.
API 계약을 읽고,
요청/응답을 디버깅하고,
인증/에러/상태 흐름을 설명하고,
AI가 만든 백엔드 코드의 위험한 부분을 리뷰할 수 있는 것.
이 정도가 되면 백엔드를 “남의 영역”으로만 보지 않고, 프론트엔드 작업의 중요한 협업 경계로 다룰 수 있습니다.
백엔드 스터디 12일 동안 본 내용을 한 문장으로 줄이면 이렇습니다.
프론트엔드 개발자가 백엔드를 배운다는 것은 Spring 문법을 모두 외우는 일이 아니라,
사용자 행동이 API 요청이 되고, 그 요청이 검증·권한·데이터·응답·운영 흐름을 거쳐 다시 UI 상태로 돌아오는 과정을 읽는 일이다.
마지막 체크리스트는 아래입니다.
나는 API 요청 하나를 끝까지 따라갈 수 있는가?
나는 성공/실패 응답 계약을 보고 UI 상태를 설계할 수 있는가?
나는 입력 검증, 권한, 트랜잭션, 테스트의 위험 신호를 알아볼 수 있는가?
나는 인증 방식과 배포 환경 때문에 생기는 프론트 이슈를 질문할 수 있는가?
나는 AI에게 “돌아가는 코드”가 아니라 “협업 가능한 백엔드”를 요청할 수 있는가?
이 질문에 조금씩 답할 수 있다면, 이 시리즈의 목적은 충분히 달성한 것입니다.
다음 스터디는 백엔드 문법을 더 파는 방향보다, AI 개발 환경과 에이전트 프레임워크를 “구조와 확장 지점” 중심으로 읽는 쪽이 더 잘 이어집니다. 백엔드에서 배운 요청 흐름, 계약, 상태, 관측 가능성은 그대로 AI agent harness와 tool orchestration을 읽는 기초가 됩니다.