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) : 중급] 웹 개발 심화
'GD's IT Lectures : 기초부터 시리즈 > 스프링부트(Spring Boot) 기초부터 ~' 카테고리의 다른 글
[스프링 부트(SpringBoot) : 중급] 테스트 전략 및 심화 (0) | 2023.05.05 |
---|---|
[스프링 부트(SpringBoot) : 중급] 스프링 시큐리티를 활용한 보안 강화 (0) | 2023.05.05 |
[스프링 부트(SpringBoot) : 중급] 웹 개발 심화 (0) | 2023.05.05 |
[스프링 부트(SpringBoot) : 중급] 데이터베이스 연동 심화 (0) | 2023.05.05 |
[스프링 부트(SpringBoot) : 중급] 스프링 부트 고급 구성 (0) | 2023.05.05 |
댓글