Skip to content

[ Auth ] 사용자 API 계약 정리 (가입 전용 DTO, /users 구 경로 제거) #91

Closed

Description

@RosieOh

💚 어떤 기능인가요?

#80 에서 의도적으로 미룬 API 계약 정리 두 건이다. 동작에는 문제가 없고 계약이 지저분한 상태다.

1. 가입 요청 전용 DTO 분리

POST /auth/register 가 응답 DTO 인 UserDto 를 그대로 요청 본문으로 받는다.
role / provider / providerId / isActive / emailVerified / id / deletedAt 등
클라이언트가 정해서는 안 되는 필드가 전부 노출된다.

값이 무시된다는 사실은 UserService.createUser 가 보장하지만(#82),
Swagger 문서에는 여전히 설정 가능한 것처럼 보인다. 읽는 사람이 오해하기 쉽고,
"무시되니까 괜찮다"는 전제가 언젠가 깨진다.

  • SignUpRequest 를 만들어 등록 가능한 필드만 노출
  • 프런트 계약 영향 확인 후 적용

2. /users 구 경로 제거

#83 에서 호환을 위해 남겨둔 경로들이다. 본인 확인은 들어가 있으나 형태가 오해를 부른다
(경로에 남의 ID 를 넣을 수 있는 것처럼 보인다).

구 경로 대체
PUT /users/{userId}/location PUT /users/me/location
PUT /users/{userId}/profile-image PUT /users/me/profile-image
PUT /users/{userId}/deactivate PUT /users/me/deactivate
DELETE /users/{userId} DELETE /users/me

프런트에서 실제로 쓰는 것은 /users/{userId}/location 하나다.

  • 프런트를 /users/me/* 로 전환
  • 전환 확인 후 구 경로 제거
  • 접근제어 계약 테스트에서 해당 경로가 404 인지 확인

✅ To Dos

  • 가입 요청 전용 DTO 분리
  • 프런트 /users/me/* 전환
  • /users/{userId}/* 구 경로 제거

Activity

  1. added this to the API Stabilization milestone on Aug 22, 2026
  2. added theissue type on Aug 22, 2026
  3. RosieOh commented on Sep 22, 2026

    @RosieOh
    ContributorAuthor

    진행 상황

    구 경로 제거를 지금 할 수 없는 이유

    프런트가 실제로 쓰는 구 경로는 하나다.

    // CareCode_FE/src/apis/user.ts
    await CareCode.put(`/users/${userId}/location`, null, { params: { latitude, longitude } })

    이걸 /users/me/location 으로 바꾸려면 백엔드에 그 경로가 운영에 있어야 한다.
    그런데 운영 백엔드는 배포가 막혀(#94) #80 이전 코드 그대로라 /users/me/* 가 없다.
    프런트 저장소에는 배포 워크플로가 없어 배포 방식을 저장소에서 확인할 수 없으므로,
    독립적으로 나간다고 가정해야 한다. 지금 프런트를 바꾸면 운영에서 위치 갱신이 깨진다.

    순서

    1. [ Infra ] 운영 배포 파이프라인이 시크릿 미설정으로 계속 실패한다 #94 해결 → 백엔드 배포 (/users/me/location 이 운영에 생김)
    2. 프런트를 /users/me/location 으로 전환, 배포
    3. 백엔드에서 /users/{userId}/... 구 경로 제거
      • EndpointAuthorizationCoverageTest 가 매핑 전수를 보므로 제거 후에도 공개 경로가 새로 생기지 않는지 자동으로 확인된다
  4. RosieOh commented on Oct 24, 2026

    @RosieOh
    ContributorAuthor

    세 항목 모두 끝났다 — 닫는다

    To Do 어디서
    가입 요청 전용 DTO 분리 이미 적용돼 있었다. POST /auth/register 는 UserDto 가 아니라 SignUpRequest 를 받는다
    프런트 /users/me/* 전환 이슈 작성 시점 이후 프런트가 이미 전환돼 있었다 (#153 에서 확인)
    /users/{userId}/* 구 경로 제거 #153

    확인한 현재 상태 — UserController 에 남은 매핑은 /me/* 뿐이다:

    PUT    /users/me/profile-image
    PUT    /users/me/location
    PUT    /users/me/deactivate
    DELETE /users/me
    

    SignUpRequest 는 가입자가 정할 수 있는 값만 노출한다. role / provider / isActive /
    emailVerified 는 받을 필드 자체가 없어 요청에 넣어도 버려진다 — "서비스가 무시하니까 괜찮다" 가
    아니라 계약에서 사라졌다. 검증 어노테이션도 함께 들어가, 예전에 500 이 나던 입력(빈 이름,
    잘못된 성별 값)이 400 으로 끝난다.

    구 경로가 404 인지는 접근제어 계약 테스트가 지킨다. GET 이 아니라 실제 메서드(PUT/DELETE)로
    두드린다 — GET 으로 두드리면 매핑이 남아 있어도 405 가 나와 구분이 약해진다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions