일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 트리 그래프 차이
- spring rest api 설정
- 린크드 리스트
- 로드 밸런서의 종류
- 인덱스의 장단점
- 트랜잭션의 acid 특성
- 트리 그래프 차이점
- 객체지향 프로그래밍
- Spring Boot
- join의 종류
- acid 특성
- rdbms와 nosql의 차이점
- Spring
- 정규화와 비정규화의 개념 및 장단점
- 인덱스의 역할과 사용 이유
- nat의 장단점
- rest와 soap의 차이점
- 샤딩(sharding)과 파티셔닝(partitioning)의 개념
- 파티셔닝의 종류
- 데이터 바인딩
- 함수형 객체지향형 차이점
- 데이터베이스 락(lock)의 종류와 동작 방식
- REST API
- nat(network address translation)의 역할과 사용 이유
- orm(object-relational mapping)의 장단점
- 인덱스의 역할
- 트리와 그래프
- Spring REST API
- nat의 작동 방식
- nat의 유형
- Today
- Total
♠개발자의 작은 서재♠
RESTful API의 기본 개념과 Spring에서 REST API 만드는 방법 ( 3 ) 본문
RESTful API의 기본 개념과 Spring에서 REST API 만드는 방법 ( 3 )
♠디지털 모험일지♠ 2024. 10. 21. 19:2521. RESTful API에서 버전 관리
API가 발전함에 따라 이전 버전과의 호환성을 유지하기 위해 API 버전 관리가 중요합니다. Spring에서는 다양한 방식으로 API 버전 관리를 구현할 수 있습니다. 가장 흔히 사용되는 방법은 URL을 통해 버전 정보를 전달하거나, 헤더에 버전 정보를 포함시키는 방식입니다.
예시: URL을 사용한 API 버전 관리
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class VersionedController {
@GetMapping("/api/v1/users")
public String getUsersV1() {
return "API Version 1 - User List";
}
@GetMapping("/api/v2/users")
public String getUsersV2() {
return "API Version 2 - User List";
}
}
위의 코드는 URL에 버전 정보를 포함하여 API 버전 관리를 하는 예시입니다. /api/v1/users
는 버전 1의 사용자 목록을 제공하고, /api/v2/users
는 버전 2의 사용자 목록을 제공합니다. 이렇게 URL을 통해 명시적으로 버전을 구분하면 클라이언트가 쉽게 각 버전에 맞는 엔드포인트를 호출할 수 있습니다.
예시: HTTP 헤더를 사용한 API 버전 관리
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HeaderVersionedController {
@GetMapping("/api/users")
public String getUsers(@RequestHeader(value = "X-API-Version", defaultValue = "1") String apiVersion) {
if (apiVersion.equals("2")) {
return "API Version 2 - User List";
}
return "API Version 1 - User List";
}
}
위의 코드는 HTTP 헤더에 API 버전 정보를 포함하여 버전 관리를 하는 예시입니다. 클라이언트는 X-API-Version
헤더에 버전 번호를 포함시켜 요청을 보낼 수 있습니다. 버전이 2
로 지정되면 버전 2의 응답이 반환되며, 그렇지 않으면 기본적으로 버전 1의 응답을 반환합니다.
예시: HTTP 헤더를 사용한 API 버전 관리
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HeaderVersionedController {
@GetMapping("/api/users")
public String getUsers(@RequestHeader(value = "X-API-Version", defaultValue = "1") String apiVersion) {
if (apiVersion.equals("2")) {
return "API Version 2 - User List";
}
return "API Version 1 - User List";
}
}
위 코드는 X-API-Version
이라는 HTTP 헤더를 통해 API의 버전을 관리하는 예시입니다. 이 방식에서는 클라이언트가 API 호출 시 요청 헤더에 X-API-Version
을 추가하여, 원하는 API 버전을 명시할 수 있습니다. 만약 헤더 값이 2
로 설정되었다면 버전 2에 해당하는 응답을, 그렇지 않으면 기본적으로 버전 1에 해당하는 응답을 반환합니다.
API 버전 관리를 HTTP 헤더로 처리하는 방식은 URL 경로를 깔끔하게 유지하면서도 클라이언트에게 유연성을 제공할 수 있는 방법 중 하나입니다.
22. RESTful API에서 메시지 브로커와 통합
대규모 시스템에서는 메시지 브로커(예: RabbitMQ, Kafka)를 통해 비동기적으로 데이터를 처리하거나 다른 시스템과 통합할 수 있습니다. Spring AMQP 또는 Spring Kafka를 사용하면 RESTful API와 메시지 브로커를 쉽게 통합할 수 있습니다.
예시: RabbitMQ와 통합
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MessageController {
private final RabbitTemplate rabbitTemplate;
@Autowired
public MessageController(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
@PostMapping("/send")
public String sendMessage(@RequestBody String message) {
rabbitTemplate.convertAndSend("exchange", "routingKey", message);
return "Message sent: " + message;
}
}
위의 코드는 RabbitTemplate
을 사용하여 메시지를 RabbitMQ로 전송하는 간단한 예시입니다. 클라이언트가 /send
엔드포인트로 메시지를 보내면, 해당 메시지가 RabbitMQ의 특정 exchange
와 routingKey
를 통해 전송됩니다. 이는 비동기적으로 다른 시스템과 데이터를 주고받는 데 유용합니다.
23. RESTful API와 WebSocket 통합
실시간 통신이 필요한 애플리케이션에서는 WebSocket을 사용하여 RESTful API와 통합할 수 있습니다. WebSocket은 양방향 통신을 지원하며, 클라이언트와 서버 간의 지속적인 연결을 통해 실시간 데이터를 주고받을 수 있습니다.
예시: WebSocket을 사용한 실시간 메시지 통신
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class WebSocketController {
@MessageMapping("/sendMessage")
@SendTo("/topic/messages")
public String sendMessage(String message) {
return "Received: " + message;
}
}
위의 코드는 WebSocket을 사용해 실시간 메시지 통신을 구현한 예시입니다. 클라이언트가 /sendMessage
로 메시지를 전송하면, 서버는 해당 메시지를 받아 /topic/messages
로 다시 브로드캐스트합니다. 이를 통해 다수의 클라이언트가 실시간으로 메시지를 주고받을 수 있습니다.
Spring에서는 @MessageMapping
과 @SendTo
어노테이션을 통해 WebSocket 통신을 쉽게 구현할 수 있으며, 이는 채팅 애플리케이션이나 실시간 알림 시스템에 유용하게 사용할 수 있습니다.
24. RESTful API에서 배치 작업 통합
배치 작업은 대량의 데이터를 처리하거나, 정기적으로 실행되어야 하는 작업에 유용합니다. Spring Batch는 이런 배치 작업을 쉽게 구성하고 관리할 수 있는 프레임워크를 제공합니다.
예시: Spring Batch를 사용한 배치 작업 구성
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BatchController {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@GetMapping("/runBatch")
public String runBatchJob() {
try {
JobExecution jobExecution = jobLauncher.run(job, new JobParameters());
return "Batch job has been invoked: " + jobExecution.getStatus();
} catch (Exception e) {
return "Error occurred while running batch job: " + e.getMessage();
}
}
}
위의 코드는 /runBatch
엔드포인트에서 배치 작업을 실행하는 예시입니다. JobLauncher
를 사용하여 Spring Batch에서 정의된 Job
을 실행하고, 그 결과를 클라이언트에게 반환합니다. 배치 작업은 대규모 데이터 처리나 정기적인 작업에 적합하며, REST API와 함께 유연하게 사용될 수 있습니다.
Spring Batch는 데이터베이스, 파일 시스템 등 다양한 소스와 연동하여 데이터를 처리할 수 있으며, 성공적으로 완료된 작업과 실패한 작업을 관리하는 기능도 제공합니다.
25. RESTful API에서 다국어 지원 (I18N)
글로벌 애플리케이션을 개발할 때는 여러 언어로 서비스를 제공하기 위해 다국어 지원(I18N, Internationalization)이 필요합니다. Spring에서는 간단하게 메시지 소스를 설정하여 다국어 지원을 구현할 수 있습니다.
예시: Spring에서 다국어 지원 설정하기
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
@Configuration
public class I18nConfig {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.ENGLISH); // 기본 로케일 설정
return localeResolver;
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8"); // 메시지 파일 인코딩 설정
return messageSource;
}
}
위의 코드는 MessageSource
와 LocaleResolver
를 설정하여 다국어 지원을 구현하는 예시입니다. 메시지 소스는 messages.properties
파일에 번역된 문구를 저장하고, LocaleResolver
는 사용자의 로케일을 결정합니다.
예시: 컨트롤러에서 다국어 메시지 반환
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import java.util.Locale;
@RestController
public class GreetingController {
@Autowired
private MessageSource messageSource;
@GetMapping("/greeting")
public String getGreeting(@RequestHeader(name = "Accept-Language", required = false) Locale locale) {
return messageSource.getMessage("greeting.message", null, locale);
}
}
위의 코드는 /greeting
엔드포인트에서 요청된 로케일에 맞는 인사 메시지를 반환하는 예시입니다. 클라이언트는 Accept-Language
헤더를 통해 원하는 언어를 요청할 수 있으며, 서버는 해당 로케일에 맞는 메시지를 반환합니다.
이를 통해 RESTful API에서 다국어 지원을 제공할 수 있으며, 다양한 언어로 서비스를 제공하는 글로벌 애플리케이션에서 유용하게 사용됩니다.
26. RESTful API와 파일 처리
RESTful API에서 파일 업로드 및 다운로드 처리를 위해 Spring은 MultipartFile
클래스와 ResponseEntity
를 통해 손쉽게 파일 작업을 처리할 수 있습니다.
예시: 파일 업로드 구현
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
public class FileUploadController {
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
String uploadDir = "/uploads/";
File saveFile = new File(uploadDir + file.getOriginalFilename());
file.transferTo(saveFile);
return "File uploaded successfully: " + file.getOriginalFilename();
}
}
위의 코드는 사용자가 /upload
엔드포인트로 파일을 업로드할 때 해당 파일을 서버의 특정 경로에 저장하는 예시입니다. MultipartFile
객체를 통해 파일 데이터를 처리하고, transferTo()
메서드를 사용해 파일을 지정된 경로에 저장할 수 있습니다.
예시: 파일 다운로드 구현
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
@RestController
public class FileDownloadController {
@GetMapping("/download/{filename}")
public ResponseEntity<Resource> downloadFile(@PathVariable String filename) {
File file = new File("/uploads/" + filename);
Resource resource = new FileSystemResource(file);
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename);
return new ResponseEntity<>(resource, headers, HttpStatus.OK);
}
}
위의 코드는 사용자가 /download/{filename}
엔드포인트로 파일을 요청할 때, 서버에 저장된 파일을 다운로드할 수 있도록 처리하는 예시입니다. FileSystemResource
를 사용해 파일을 읽어들이고, ResponseEntity
로 파일을 반환하며, HttpHeaders
를 통해 다운로드 응답 헤더를 설정할 수 있습니다.
이를 통해 파일 업로드 및 다운로드 기능을 RESTful API에서 손쉽게 구현할 수 있습니다.
27. RESTful API의 성능 최적화
대규모 애플리케이션에서 RESTful API의 성능을 최적화하기 위해 다양한 방법을 사용할 수 있습니다. 여기에는 데이터베이스 최적화, 캐싱, 비동기 처리, 압축, HTTP/2 프로토콜 사용 등이 포함됩니다.
예시: Gzip 압축을 통한 응답 성능 최적화
Spring Boot는 Gzip 압축을 지원하여 응답 크기를 줄이고 네트워크 대역폭을 절약할 수 있습니다. application.properties
파일에서 간단하게 설정할 수 있습니다.
server.compression.enabled=true
server.compression.min-response-size=1024
server.compression.mime-types=text/html,text/xml,text/plain,application/json
위의 설정은 Gzip 압축을 활성화하고, 응답 크기가 1024바이트 이상일 경우 압축을 적용하며, 특정 MIME 타입에 대해 압축을 적용하는 방식입니다. 이를 통해 API 응답 크기를 줄여 전송 속도를 높이고, 클라이언트의 응답 대기 시간을 단축할 수 있습니다.
예시: 데이터베이스 쿼리 최적화
Spring Data JPA를 사용할 때, 불필요한 쿼리 실행을 피하기 위해 N+1 문제를 방지하고, 필요한 데이터만을 쿼리하는 것이 중요합니다. @Query
어노테이션을 사용하여 최적화된 쿼리를 직접 작성할 수 있습니다.
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<User, Long> {
@Query("SELECT u FROM User u JOIN FETCH u.roles WHERE u.id = :id")
User findUserWithRoles(Long id);
}
위의 코드는 JOIN FETCH
를 사용하여 사용자와 그에 대한 역할을 한 번의 쿼리로 가져오는 방식입니다. 이를 통해 N+1 문제를 방지하고 데이터베이스 쿼리 성능을 최적화할 수 있습니다.
또한, 데이터베이스 인덱스를 적절히 설정하여 쿼리 성능을 개선하고, 비동기 처리 및 캐싱을 도입하여 애플리케이션 성능을 더욱 향상시킬 수 있습니다.
28. RESTful API 보안
API 보안은 매우 중요한 요소입니다. RESTful API에서 인증, 인가, 데이터 암호화, CSRF 방지 등의 보안 요소를 고려해야 합니다. Spring Security를 사용하여 이러한 보안 요구 사항을 쉽게 구현할 수 있습니다.
예시: Spring Security로 API 보안 설정
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable() // CSRF 비활성화 (예시, 필요에 따라 활성화 가능)
.authorizeRequests()
.antMatchers("/public/**").permitAll() // /public 경로는 인증 없이 접근 가능
.anyRequest().authenticated() // 그 외 경로는 인증 필요
.and()
.httpBasic(); // 기본 인증 방식 사용
return http.build();
}
}
위의 코드는 Spring Security를 사용하여 API 보안을 설정한 예시입니다. /public
경로는 누구나 접근할 수 있지만, 다른 모든 경로는 인증이 필요합니다. 기본적으로 HTTP Basic 인증 방식을 사용하며, 필요한 경우 JWT 인증 등으로 확장할 수 있습니다.
API 보안 설정은 다양한 방식으로 확장할 수 있으며, OAuth2 또는 OpenID Connect와 같은 인증 및 권한 부여 표준을 통해 더욱 강력한 보안을 구현할 수 있습니다.
29. RESTful API의 배포 및 스케일링
API의 배포와 스케일링은 대규모 시스템에서 중요한 요소입니다. Spring Boot 기반 RESTful API는 컨테이너화된 환경에서 쉽게 배포할 수 있으며, 도커(Docker) 및 쿠버네티스(Kubernetes)를 활용해 스케일링할 수 있습니다.
예시: Docker를 사용한 Spring Boot 애플리케이션 컨테이너화
# 베이스 이미지 설정
FROM openjdk:11-jre-slim
# 애플리케이션 JAR 파일 복사
COPY target/myapp.jar /app.jar
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app.jar"]
위의 `Dockerfile`은 Spring Boot 애플리케이션을 도커 컨테이너로 배포하기 위한 설정입니다. 컨테이너화를 통해 애플리케이션을 다양한 환경에서 일관되게 실행할 수 있으며, 자동 확장을 위한 쿠버네티스와도 쉽게 연동할 수 있습니다.
#### 예시: Kubernetes를 사용한 애플리케이션 스케일링
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:latest
ports:
- containerPort: 8080
위의 Kubernetes
설정 파일은 애플리케이션을 3개의 복제본으로 배포하고 관리하는 예시입니다. 쿠버네티스의 자동 스케일링 기능을 통해 트래픽 증가 시 애플리케이션 인스턴스를 동적으로 확장할 수 있으며, 고가용성 및 로드 밸런싱을 제공할 수 있습니다.
컨테이너화와 스케일링을 통해 RESTful API는 대규모 트래픽을 효율적으로 처리할 수 있으며, 여러 환경에 쉽게 배포할 수 있습니다.
30. RESTful API와 JWT (JSON Web Token)
JWT는 RESTful API에서 인증을 구현하는 데 매우 자주 사용되는 방식입니다. JWT를 사용하면 서버는 클라이언트에게 토큰을 발급하고, 이후 클라이언트가 모든 요청에 이 토큰을 포함해 인증을 수행할 수 있습니다.
예시: JWT 인증을 사용하는 RESTful API
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
public class AuthController {
private final AuthenticationManager authenticationManager;
public AuthController(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@PostMapping("/login")
public String authenticateUser(@RequestBody LoginRequest loginRequest) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
loginRequest.getUsername(),
loginRequest.getPassword()
)
);
SecurityContextHolder.getContext().setAuthentication(authentication);
// JWT 토큰 생성
String jwt = Jwts.builder()
.setSubject(loginRequest.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 1일 유효 기간
.signWith(SignatureAlgorithm.HS512, "SecretKey")
.compact();
return jwt;
}
}
위의 코드는 클라이언트가 /login
엔드포인트로 로그인 요청을 보낼 때, 인증이 성공하면 JWT 토큰을 생성하고 반환하는 방식입니다. 클라이언트는 이후 모든 요청에 이 토큰을 포함해 인증을 수행하며, 서버는 해당 토큰을 검증하여 클라이언트를 인증합니다.
31. RESTful API에서 캐싱 사용
RESTful API의 성능을 향상시키기 위해, 자주 요청되는 데이터를 캐시하는 방법을 사용할 수 있습니다. Spring에서 @Cacheable
어노테이션을 사용하면 간단하게 캐싱을 적용할 수 있습니다.
예시: 캐싱을 통한 성능 최적화
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Cacheable("users")
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
// 데이터베이스에서 사용자 정보를 조회하는 로직 (예시)
return userRepository.findById(id).orElse(null);
}
}
위의 코드는 @Cacheable
어노테이션을 사용하여 특정 사용자 정보를 캐시에 저장하고, 이후 동일한 요청이 들어오면 캐시에서 데이터를 반환하는 방식입니다. 이를 통해 데이터베이스 호출을 줄이고 API 응답 속도를 높일 수 있습니다.
32. RESTful API에서 HATEOAS (Hypermedia As The Engine Of Application State)
HATEOAS는 RESTful API에서 리소스 간의 관계를 명시적으로 표현하고, 클라이언트가 다음에 수행할 수 있는 동작을 안내하는 데 사용됩니다. Spring HATEOAS 라이브러리를 사용하면 쉽게 구현할 수 있습니다.
예시: HATEOAS를 사용한 링크 추가
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
import org.springframework.hateoas.EntityModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/users/{id}")
public EntityModel<User> getUserById(@PathVariable Long id) {
User user = userRepository.findById(id).orElseThrow(() -> new UserNotFoundException(id));
EntityModel<User> resource = EntityModel.of(user);
// 사용자 목록으로 돌아가는 링크 추가
resource.add(linkTo(methodOn(UserController.class).getAllUsers()).withRel("all-users"));
return resource;
}
@GetMapping("/users")
public List<User> getAllUsers() {
return userRepository.findAll();
}
}
위의 코드는 특정 사용자의 정보를 반환할 때, 해당 리소스에 다른 관련 리소스에 대한 링크를 추가하는 방식입니다. 여기서는 all-users
링크를 추가하여 클라이언트가 사용자 목록을 쉽게 조회할 수 있도록 합니다.
HATEOAS를 통해 RESTful API는 리소스 간의 관계를 더 명확하게 표현할 수 있으며, 클라이언트가 다음 동작을 수행할 수 있도록 안내하는 역할을 합니다.
'Spring MVC > 웹 애플리케이션 개발' 카테고리의 다른 글
데이터 바인딩과 폼 처리 (0) | 2024.10.21 |
---|---|
RESTful API의 기본 개념과 Spring에서 REST API 만드는 방법 ( 4 ) (1) | 2024.10.21 |
RESTful API의 기본 개념과 Spring에서 REST API 만드는 방법 ( 2 ) (1) | 2024.10.21 |
RESTful API의 기본 개념과 Spring에서 REST API 만드는 방법 ( 1 ) (0) | 2024.10.21 |
Spring MVC 웹 애플리케이션 개발 - RESTful API 구현 (1) | 2024.10.19 |