본문 바로가기
GD's IT Lectures : 기초부터 시리즈/스프링부트(Spring Boot) 기초부터 ~

[스프링 부트(SpringBoot) : 중급] RESTful API 개발 심화

by GDNGY 2023. 5. 5.

4. RESTful API 개발 심화

4.1. API 버전 관리

API 버전 관리는 API의 변경사항을 추적하고 호환성 문제를 최소화하기 위한 중요한 전략입니다. 사용자들이 서로 다른 버전의 API를 사용할 수 있게 하여 안정성을 높입니다. 주로 URL이나 헤더를 사용하여 버전 정보를 전달합니다.

 

예제 코드 (URL에 버전 정보 추가)

@RestController
@RequestMapping("/api/v1/users")
public class UserControllerV1 {
    // V1 버전의 사용자 관련 API 구현
}

@RestController
@RequestMapping("/api/v2/users")
public class UserControllerV2 {
    // V2 버전의 사용자 관련 API 구현
}

 

예제 코드 (헤더에 버전 정보 추가)

@RestController
public class UserController {

    @GetMapping(value = "/users", headers = "API-Version=1")
    public ResponseEntity<List<User>> getUsersV1() {
        // V1 버전의 사용자 목록 조회 API 구현
    }

    @GetMapping(value = "/users", headers = "API-Version=2")
    public ResponseEntity<List<User>> getUsersV2() {
        // V2 버전의 사용자 목록 조회 API 구현
    }
}

 

버전 관리 전략에는 세 가지 주요 접근 방식이 있습니다. 첫 번째는 URL에 버전 정보를 포함하는 것이고, 두 번째는 HTTP 헤더에 버전 정보를 포함하는 것입니다. 세 번째는 미디어 타입에 버전 정보를 포함하는 것입니다. 각 방법의 장단점을 비교하여 알맞은 방식을 선택하면 됩니다.

 

4.2. HATEOAS 적용

HATEOAS(Hypermedia As The Engine Of Application State)는 RESTful API에서 클라이언트가 서버의 리소스를 쉽게 탐색할 수 있도록 하이퍼미디어 링크를 제공하는 것입니다. 이를 통해 API의 결합도를 낮추고 유연성을 높일 수 있습니다.

 

예제 코드 (HATEOAS 적용)

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private EntityModelAssembler<User> assembler;

    @GetMapping("/{id}")
    public EntityModel<User> getUser(@PathVariable Long id) {
        User user = findUserById(id); // 사용자 조회 로직

        return assembler.toModel(user);
    }
}

 

HATEOAS를 적용하면 클라이언트는 리소스 간의 관계를 이해하고 동적으로 리소스를 탐색할 수 있습니다. 이를 통해 클라이언트와 서버 간의 결합도를 낮추고, 서버 측의 리소스 변경에 유연하게 대응할 수 있습니다.

 

4.3. API 인증 및 인가

API 인증은 요청에 대한 사용자를 확인하는 과정이며, 인가는 해당 사용자가 요청한 리소스에 대한 권한이 있는지 확인하는 과정입니다. 인증 및 인가 과정을 통해 API를 보호하고, 사용자별로 제한된 리소스에만 접근할 수 있도록 합니다.

 

예제 코드 (JWT를 사용한 API 인증 및 인가)

@RestController
@RequestMapping("/api/secure")
public class SecureController {

    @Autowired
    private JwtTokenProvider tokenProvider;

    @GetMapping("/authenticated")
    public ResponseEntity<?> authenticated(HttpServletRequest request) {
        String token = tokenProvider.resolveToken(request);
        if (token != null && tokenProvider.validateToken(token)) {
            Authentication authentication = tokenProvider.getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(authentication);
            return ResponseEntity.ok("Authenticated");
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Unauthorized");
        }
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @GetMapping("/authorized")
    public ResponseEntity<?> authorized() {
        return ResponseEntity.ok("Authorized");
    }
}

 

위 예제에서는 JWT(Json Web Token)를 사용하여 인증을 처리합니다. JWT는 자체 포함적인 토큰으로, 인증 정보를 암호화하여 클라이언트에 전달하고 서버에서 검증할 수 있습니다. 인가는 @PreAuthorize 어노테이션을 사용하여 처리할 수 있으며, 사용자의 권한을 확인하여 접근을 허용하거나 거부합니다.

 

 

2023.05.05 - [프로그래밍/스프링부트(Spring Boot) 기초부터 ~] - [스프링 부트(SpringBoot) : 중급] 웹 개발 심화

 

[스프링 부트(SpringBoot) : 중급] 웹 개발 심화

3. 웹 개발 심화 3.1. 예외 처리 스프링 부트에서는 예외 처리를 위해 @ExceptionHandler, @ControllerAdvice 및 @ResponseStatus 어노테이션을 사용할 수 있습니다. 이를 사용하면 애플리케이션 전체에서 발생하

gdngy.tistory.com

 

반응형

댓글