이번에는 RequestParameter 와 Header 정보를 이용하여 버전관리를 해보려고 한다.
② RequestParameter 를 이용한 버전관리
기존에 URI를 통해 버전관리를 한 설정들을 삭제해주고 새로운 GetMapping 을 추가해준다.
@GetMapping(value = "/users/{id}/", params = "version=1")
GetMapping에 두가지 정보가 올때에는 value라는 값을 이용하여 URI를 추가해주면된다.
parameter를 전달해주기 위해서 URI 마지막에 /를 넣어야 한다는 점 기억해 놓으면 좋을 것 같다.
// GET /admin/users/1 -> /admin/v1/users/1
// @GetMapping("/v1/users/{id}")
@GetMapping(value = "/users/{id}/", params = "version=1")
public MappingJacksonValue retrieveUserV1(@PathVariable int id){
User user = service.findOne(id);
if(user == null){
throw new UserNotFoundException(String.format("ID[%s] not found",id));
}
SimpleBeanPropertyFilter filter
= SimpleBeanPropertyFilter
.filterOutAllExcept("id","name","joinDate","ssn");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo",filter);
MappingJacksonValue mapping = new MappingJacksonValue(user);
mapping.setFilters(filters);
return mapping;
}
// GET /admin/users/1 -> /admin/v2/users/1
// @GetMapping("/v2/users/{id}")
@GetMapping(value = "/users/{id}/", params = "version=2")
public MappingJacksonValue retrieveUserV2(@PathVariable int id){
User user = service.findOne(id);
if(user == null){
throw new UserNotFoundException(String.format("ID[%s] not found",id));
}
//User -> User2
UserV2 userV2 = new UserV2();
BeanUtils.copyProperties(user, userV2); //id, name, joinDate, password, ssn
userV2.setGrade("VIP");
SimpleBeanPropertyFilter filter
= SimpleBeanPropertyFilter
.filterOutAllExcept("id","name","joinDate","grade");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfoV2",filter);
MappingJacksonValue mapping = new MappingJacksonValue(userV2);
mapping.setFilters(filters);
return mapping;
}
서버를 재기동 시킨 후
포스트맨에서 조회해보면 값이 나오는 것을 알 수 있다.
파라미터를 전송하는 것이기 때문에 " ?version=1 "이라고 입력해줘야 한다.
② Header값을 이용한 버전관리
마찬가지로 이전의 어노테이션은 주석처리해주고 새로 설정해준다.
@GetMapping(value = "/users/{id}", headers = "X-API-VERSION=1")
@GetMapping(value = "/users/{id}", headers = "X-API-VERSION=1")
public MappingJacksonValue retrieveUserV1(@PathVariable int id){
User user = service.findOne(id);
if(user == null){
throw new UserNotFoundException(String.format("ID[%s] not found",id));
}
SimpleBeanPropertyFilter filter
= SimpleBeanPropertyFilter
.filterOutAllExcept("id","name","joinDate","ssn");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo",filter);
MappingJacksonValue mapping = new MappingJacksonValue(user);
mapping.setFilters(filters);
return mapping;
}
// GET /admin/users/1 -> /admin/v2/users/1
@GetMapping(value = "/users/{id}", headers = "X-API-VERSION=2")
public MappingJacksonValue retrieveUserV2(@PathVariable int id){
User user = service.findOne(id);
if(user == null){
throw new UserNotFoundException(String.format("ID[%s] not found",id));
}
//User -> User2
UserV2 userV2 = new UserV2();
BeanUtils.copyProperties(user, userV2); //id, name, joinDate, password, ssn
userV2.setGrade("VIP");
SimpleBeanPropertyFilter filter
= SimpleBeanPropertyFilter
.filterOutAllExcept("id","name","joinDate","grade");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfoV2",filter);
MappingJacksonValue mapping = new MappingJacksonValue(userV2);
mapping.setFilters(filters);
return mapping;
}
코드를 수정 후 서버 재기동 -> 포스트맨 확인
Header값에 key값과 value값을 제대로 넣어보면 해당 버전에 맞는 데이터가 나오는 것을 볼 수 있다.
④ MIME 타입을 이용한 버전관리
MIME 란 ? = Multipurpose Internet Mail Extensions
이메일과 함께 전송되는 메일을 텍스트 문자로 전환해 이메일 서버에 전달하기 위한 방법이다.
이전에는 이메일을 통해 많은 정보가 전송되었지만 최근에는 웹을 통해 많은 정보가 전달되기 때문에 파일의 형식이라고 생각하면 될 것 같다.
마찬가지로 기존의 설정을 주석처리하고 해당하는 설정을 해준다.
@GetMapping(value = "/users/{id}", produces = "application/vnd.company.appv1+json")
이 방법도 사용하려면 header값에 값을 넣어 포스트맨에서 실행시켜보면 된다.
이렇게 Accept : application/vnd.company.appv1+json을 header에 담아 전송하면 해당 데이터가 처리되는것을 볼 수 있다.
버전관리라는 것은 단순히 사용자에게 보여주는 항목을 제어하는 것이 아닌 REST API 설계가 변경되거나 구조가 바뀔 때에도 버전을 변경해줘야 한다.
사용자에겐 어떠한 API를 사용해야하는지 적절한 가이드를 명시해줘야되기도 한다.
너무 지나치게 지저분한 URI 나 Header 는 피하는것이 좋고 캐시도 지워주고 새롭게 반영하는 것이 좋다.
'프로그래밍 > SPRING BOOT' 카테고리의 다른 글
[인프런 : spring-boot] Swagger 사용 (0) | 2022.09.02 |
---|---|
[인프런 : spring-boot] HATEOAS 적용 (0) | 2022.09.02 |
[인프런 : spring-boot] REST API Version 관리 (1) (1) | 2022.09.01 |
[인프런 : spring-boot] 프로그래밍으로 제어하는 Filtering (1) | 2022.09.01 |
[인프런 : spring-boot] XML format / 데이터 제어 Filtering (0) | 2022.09.01 |