[Spring Boot Tutorial] 11. REST API Versioning

2020. 3. 23. 17:01Spring/Spring Boot Tutorial

300x250
반응형

REST API Versioning

  1. api url 분리 및 package 분리
  2. api url spring security permitAll 설정
  3. 실행화면

api 와 view를 함께 제공하는 spring 웹 애플리케이션에서, 관리의 용이함과 기능적 편리함을 위해 api controller 패키지를 별도로 분리하는 것이 좋습니다.

또한, 추후 api의 대대적인 수정이 이뤄질 때, api 버전이 올라가는 것을 대비하여 api버전별로 설정해두는 것을 권장합니다.(Versioning)

75

이번 포스팅에서는 api 관련 컨트롤러를 controllers/api/v1 에 위치시키며, 각 api 컨트롤러의 url 공통적 prefix를 설정합니다.


1. api url 분리 및 package 분리

demo:
  api: /api/v1

프로퍼티에 rest api prefix를 설정합니다.

package me.jiniworld.demo.controllers.api.v1;

...

@RequestMapping(value = "${demo.api}/users")
@RequiredArgsConstructor
@RestController
public class UserController {
}

demo.api에 설정했던 url prefix를 ${} 를 이용하여 읽어옵니다.

클래스 내에 정의했던 모든 RequestMapping 요청들은 앞으로 /api/v1/users, /api/v1/users/1과 같이 prefix가 붙습니다.


2. api url spring security permitAll 설정

api는 관리자 로그인 없이 모두가 접근가능하도록 하기 위해 WebSecurityConfigurerAdapter 구현 클래스에 url설정을 추가합니다.

@RequiredArgsConstructor
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	...

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    	http.authorizeRequests()
    		.antMatchers("/", "/login", "/join", "/api/v1/**").permitAll()
    		.antMatchers("/v/users").hasRole("ADMIN")
    		.antMatchers("/v", "/v/**").hasRole("VIEW")
    		.anyRequest().authenticated()
    	.and()
    		.formLogin().loginPage("/login").defaultSuccessUrl("/v", true)
    		.usernameParameter("email").passwordParameter("password")
    	.and()
    		.logout().invalidateHttpSession(true).deleteCookies("JSESSIONID")
    	.and().exceptionHandling().accessDeniedHandler(webAccessDeniedHandler)		
    	.and()
    		.authenticationProvider(authenticationProvider())
    		.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}

ln 11 : /api/v1/** url의 경우 permitAll() 설정합니다.
ln 14 : 별도로 설정하지 않은 url은 인증된 사용자만 접근할 수 있도록 합니다.

ROLE_VIEW 권한을 가지고 있을 경우 접근할 수 있도록 설정하는 방법은 총 3가지 입니다.

  • .hasAuthority("ROLE_VIEW")
  • .access("hasRole('ROLE_VIEW')")
  • .hasRole("VIEW")

hasRole은 role_name의 prefix가 **ROLE_**일 경우 사용하는 메서드로, 자동으로 prefix를 붙여서 권한 보유 여부를 체크합니다.

3. 실행화면

74

api prefix를 붙여서 rest api get 메서드를 실행한 결과 입니다.
앞으로 api controller를 추가할 경우에도 마찬가지로 컨트롤러의 requestMapping에 ${demo.api}를 붙입니다.


추후, api가 크게 변경될 필요가 있을 때엔, 기존의 api를 그대로 두고 api/v2 prefix 설정한 api를 생성하면 됩니다.

76

GitHub에서 demo 프로젝트를 다운받아 볼 수 있습니다.

300x250
반응형