리소스 식별
그동안 내 코드를 보면 아래와 같은 방식으로 매핑을 해주고 있었다
// 회원 등록
@PostMapping("/users")
// 회원 목록 조회
@GetMapping("/list")
// 회원 조회
@RequestMapping("/profile/{userId}")
// 회원 수정
@GetMapping("/users/{userId}/form")
@PutMapping("/users/{userId}")
과연 이것이 좋은 URI 설계였을까? 언뜻 보기에는 대강 의미는 드러나니까 괜찮다고 생각했었다.
리소스의 의미는 뭘까?
- 회원을 등록,수정,조회하는게 리소스가 아니다
- 예) 미네랄을 캐라 -> "미네랄"이 리소스이다
- 즉, 회원이라는 users 개념 자체가 리소스이다
그럼 리소스는 어떻게 식별하는게 좋을까?
- 회원을 등록하고, 수정하고, 조회하는 것을 모두 배제하고 회원이라는 리소스만 식별하면 된다 -> 회원 리소스를 URI에 매핑한다.
무슨 소리냐?
- 회원 목록 조회 /members
- 회원 조회 /members/{id}
- 회원 등록 /members/{id}
- 회원 수정 /members/{id}
- 회원 삭제 /members/{id}
(참고로 계층 구조상 상위를 컬렉션으로 보고 복수형으로 사용하는 것을 권장한다 (member -> members)
그럼 이걸 어떻게 구분할 것인지 고민이 될 것이다.
URI는 리소스만 식별한다. 리소스와 해당 리소스를 대상으로 하는 행위를 분리한다.
- 리소스 : 회원
- 행위 : 조회, 등록, 삭제, 변경
- 리소스는 명사, 행위는 동사로 이루어져 있다
이걸 어떻게 나눌 것 인지는 HTTP 메서드로 구분하게 된다.
회원 조회 /members/{id}
회원 등록 /members/{id}
회원 수정 /members/{id}
회원 삭제 /members/{id}
요렇게 하는 것이 좋은 설계라는 것인가욤??