<< 학습 목표 >>
1. RestfulAPI의 URL과 요청 방식을 적절하게 지정할 수 있다.
2. @PathVariable 애너테이션을 사용할 수 있다.
RestfulAPI를 만들 때 지켜야하는 첫 번째 약속은?
일관되게 API를 구현해야함
( 바로 윗 줄을 마우스로 드래그하시면 보입니다 )
이를 위해서는?
- 모든 리소스는 고유의 URI를 가져야함
- 클라이언트는 상황에 맞는 올바른 방식으로 요청해야함
- 서버는 요청 방식에 맞는 처리를 제공해야함
( 윗 줄을 마우스로 드래그하시면 보입니다 )
회원가입, 회원 정보 조회, 회원 정보 수정, 회원 탈퇴 API를 구현한다고 하자
모두 회원과 관련된 API이므로 URI에 member 가 들어가면 좋음
서버는 http://localhost:8080/ 이고 이 서버에서 동작하는 프로젝트명은 study 라고 할 때
회원가입 API의 URL은 http://localhost:8080/study/member 으로 하고 요청 방식은 POST로 하면 RestfulAPI로 설계했다고 볼 수 있음
어느정도 경력이 있는 개발자라면 대부분 위 URL과 요청 방식을 보고 "회원 가입 API군" 할 것
가령 회원가입 API의 URL을 http://localhost:8080/study/computer 으로 하고 요청 방식을 GET으로 하면 경력이 아무리 많다고 해도 "회원 가입 API군" 이라고 생각할 수 없을 것
또한 회원가입 API의 URL을 http://localhost:8080/study/member/join 또는 http://localhost:8080/study/memberJoin 또는 http://localhost:study/member_join 등으로 지정하는 것도 좋지 못함
http://localhost:8080/study/member/join 이 좋지 못한 이유
-> 요청 방식은 당연히 POST가 될 것이므로 POST 자체가 리소스 생성을 의미하는 요청 방식이기 때문에 URI의 join과 요청 방식의 POST가 똑같은 의미를 지니기 때문
마치 역 전 앞 과 같음, 요즘에는 자주 쓰는 말은 하니지만 역 전 앞이란 역 앞을 뜻함
예전에는 "부평역 전 앞에서 만나" 이런 말을 사용했는데 의미는 "부평역 앞에서 만나" 임
그러나 부평역 전 앞에서 전(前)은 한자로 앞을 뜻함
"부평역 전 앞에서 만나" 를 해석해보면 "부평역 앞 앞에서 만나"가 됨
똑같은 말이 반복되므로 겹말이라고 하고 잘못된 표현이므로 역 앞이라고 올바르게 고쳐써야함
이것처럼 요청 방식은 POST 로 하고 URL은 http://localhost:8080/study/member/join 은 의미가 중첩되므로 좋지 못한 URL임
혹시... 그럼 요청 방식을 다른걸로 바꾸면 되는거아닌가? 싶은 분은 없을 것이라 생각함
http://localhost:8080/study/memberJoin 이 좋지 못한 이유
-> 위에서 설명한 이유 + RestfulAPI의 URL은 소문자로만 이루어져야함
그렇다고 URL을 http://localhost:8080/study/memberjoin 으로 하면 URI 가독성이 떨어지므로 좋지 못함
http://localhost:study/member_join 이 좋지 못한 이유
-> 위에서 설명한 이유 + RestfulAPI의 URL은 _ ( 밑 줄 / 언더 바 ) 대신 - ( 하이픈 ) 을 사용할 것을 권장함
그 이유는 특정 폰트나 기기에서 _ 가 가려지는 현상이 빈번하게 발생해 URL 가독성을 위해 - 을 사용해야함
그래서 회원 가입 API의 URL은 http://localhost:8080/study/member 로 요청 방식은 POST가 가장 최선임
회원 정보 조회 API의 URL은 http://localhost:8080/study/member 로 요청 방식은 GET으로 할 수 있음
닉네임 또는 연락처 등으로 특정 회원의 정보를 조회한다면 위 URL과 요청 방식에 파라미터를 담아 요청하면 됨
또는 모든 회원 정보 조회 API와 닉네임으로 회원 정보 조회 API를 만든다고 할 때 모든 회원 정보 조회 API의 URL은 http://localhost:8080/study/member/list 으로 요청 방식은 GET으로 할 수 있음
닉네임으로 회원 정보 조회 API의 URL은 http://localhost:8080/study/member/조회할회원의닉네임 으로 지정하고 요청 방식은 GET으로 할 수 있음
닉네임이 홍길동인 회원의 정보를 조회한다면 http://localhost:8080/study/member/홍길동 이 될 것임
어느 정도 경력이 있는 개발자라면 http://localhost:8080/study/member, GET 방식 API를 보고 대부분 "회원 정보 조회 API군" 할 것
또 http://localhost:8080/study/member/list, GET 방식 API를 보고 대부분 "회원들의 정보를 조회하는 API군" 할 것
또 http://localhost:8080/study/member/홍길동, GET 방식 API를 보고 대부분 "홍길동 회원의 정보를 조회하는 API군" 할 것
회원 가입, 회원 정보 조회 API와 마찬가지로 회원 정보 수정, 회원 탈퇴 API도 URL과 요청 방식만 잘 지정해주면 대부분의 개발자들이 URL과 요청 방식만 보고서 어떤 API인지 유추 할 수 있음
< 회원 정보 수정 URL과 요청 방식의 몇 가지 예 >
1. http://localhost:8080/study/member, PUT 방식
2. http://localhost:8080/study/member/수정할회원의번호, PUT 방식
ex) 회원 번호가 3번인 회원의 정보를 수정한다면 http://localhost:8080/study/member/3, PUT 방식으로 요청할 것
수정할 정보는 요청 Body에 담아 보내면 됨
< 회원 탈퇴 URL과 요청 방식의 몇 가지 예 >
1. http://localhost:8080/study/member, DELETE 방식
2. http://localhost:8080/study/member/탈퇴할회원의번호, DELETE 방식
이렇게 RestfulAPI는 URL과 요청 방식을 활용해 호출하는 쪽인 클라이언트가 "이 API를 호출 했을 때 어떤 동작을 하겠다" 를 유추할 수 있게 하는 개발 방식임
여기서 회원 정보 조회, 회원 정보 수정, 회원 탈퇴 등 API의 URL을 보자
1. 닉네임으로 회원 정보 조회 : http://localhost:8080/study/member/조회할회원의닉네임
2. 회원 정보 수정 : http://localhost:8080/study/member/수정할회원의번호
3. 회원 탈퇴 : http://localhost:8080/study/member/탈퇴할회원의번호
이와 같이 URL을 지정한다면 서버에 필요한 데이터가 URL에 포함되있음
이렇게 URL에 포함된 데이터를 API가 꺼내 사용하고 싶다면 @PathVariable 애너테이션을 사용함
API(컨트롤러)에서 @PathVariable 애너테이션을 사용해보자
프로젝트 -> com.study.chapter02 -> PathVariableController 를 추가하고 아래 코드를 추가하자
package com.study.chapter02;
import java.time.LocalDateTime;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Controller
public class PathVariableController {
@GetMapping("/chapter02/pv/{parameter}")
public void sample1(@PathVariable(name = "parameter") String parameter) {
System.out.println("sample1 컨트롤러 호출 / " + LocalDateTime.now());
System.out.println("parameter => " + parameter);
}
@GetMapping("/chapter02/pv/depth1/{parameter}/depth2")
public void sample2(@PathVariable(name = "parameter") String parameter) {
System.out.println("sample2 컨트롤러 호출 / " + LocalDateTime.now());
System.out.println("parameter => " + parameter);
}
}
<< 코드 설명 >>
(1). GET 방식으로 http://localhost:8080/chapter02/pv/어떤값 URL에 접근하면 이 컨트롤러가 동작함
예) http://localhost:8080/chapter02/pv/a , http://localhost:8080/chapter02/pv/b , http://localhost:8080/chapter02/pv/홍길동 , http://localhost:8080/chapter02/pv/honggildong , ...
(2). GET 방식으로 http://localhost:8080/chapter02/depth1/어떤값/depth2 URL에 접근하면 이 컨트롤러가 동작함
GET 방식으로 http://localhgost:8080/chapter02/pv/depth1 URL에 접근하면 어떤 컨트롤러가 동작할까?
(1) 컨트롤러
이유는? (1) 컨트롤러는 GET 방식으로 http://localhost:8080/chapter02/pv/어떤값 이므로
여기서는 GET 방식만 예를 들었지만 POST, PUT, DELETE 모두 같은 방법으로 @PathVariable 애너테이션을 사용할 수 있음
URL에 지정한 PathVariable의 이름과 매개변수명이 같다면 (1)
@PathVariable 애너테이션의 name 속성 (2) 을 생략해도 됨
마지막으로 PathVariable은 다음과 같이 여러 개를 지정할 수 있음
그러나 경험상 PathVariable이 많으면 오히려 URL을 보고 API를 예측하기 어려워지므로 PathVariable은 최소한으로 사용하는게 좋음
PathVariable의 적정 개수가 정해지진 않았지만 어떤 것이든 너무 과하면 좋지 못하니 다양하게 경험을 쌓으면서 상황에 맞게 적절히 사용하자
'Spring + Boot > Boot-Chapter02' 카테고리의 다른 글
Chapter02. Spring Boot - Restful실습 / RestfulAPI 답게 응답하기 (0) | 2023.06.02 |
---|---|
Chapter02. Spring Boot - RestfulAPI 실습, PUT, DELETE 방식 요청 받기 (0) | 2023.05.31 |
Chapter02. Spring Boot - Restful API 이론 (0) | 2023.05.31 |
Chapter02. Spring Boot - Validator 유연하게 생성하기 (0) | 2023.04.12 |
Chapter02. Spring Boot - 커맨드 객체 검증 하기 (0) | 2023.04.11 |