반응형
오늘은 RESTful API의 기본 개념과 이를 기반으로 Spring Boot에서 REST 컨트롤러를 설계하는 방법을 학습합니다. RESTful API는 HTTP 프로토콜을 활용하여 자원을 CRUD(생성, 조회, 수정, 삭제)할 수 있는 표준적인 아키텍처 스타일입니다.
1. RESTful API란 무엇인가?
**REST(Representational State Transfer)**는 웹 서비스 설계 원칙을 기반으로 자원의 상태를 클라이언트와 서버 간에 주고받을 수 있는 구조를 제공합니다.
- 특징:
- Stateless(무상태성): 서버는 클라이언트 상태를 저장하지 않습니다.
- Resource 기반: 자원을 URL로 식별합니다.
- HTTP 메서드 활용: 자원 조작을 HTTP 메서드로 구분합니다.
- GET: 조회
- POST: 생성
- PUT: 수정
- DELETE: 삭제
2. Spring Boot에서 REST 컨트롤러 구현하기
(1) 데이터베이스 엔터티
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getter, Setter
}
(2) 레포지토리 인터페이스
Spring Data JPA의 기본 CRUD 메서드를 사용합니다.
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
(3) 서비스 클래스
서비스 클래스에서 비즈니스 로직을 처리합니다.
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
public Optional<User> getUserById(Long id) {
return userRepository.findById(id);
}
public User createUser(User user) {
return userRepository.save(user);
}
public User updateUser(Long id, User userDetails) {
return userRepository.findById(id)
.map(user -> {
user.setName(userDetails.getName());
user.setEmail(userDetails.getEmail());
return userRepository.save(user);
})
.orElseThrow(() -> new RuntimeException("User not found"));
}
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
(4) REST 컨트롤러
RESTful API의 각 HTTP 메서드를 매핑합니다.
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return userService.getUserById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User userDetails) {
return userService.updateUser(id, userDetails);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
3. API 테스트 방법
- GET /api/users
모든 사용자 목록을 반환합니다. - GET /api/users/{id}
특정 ID의 사용자 정보를 반환합니다.- 존재하지 않으면 404 응답을 반환합니다.
- POST /api/users
새로운 사용자를 생성합니다.- 요청 본문에 JSON 데이터를 포함해야 합니다.
{ "name": "John Doe", "email": "john@example.com" }
- 요청 본문에 JSON 데이터를 포함해야 합니다.
- PUT /api/users/{id}
기존 사용자의 정보를 수정합니다.- 요청 본문에 수정할 데이터를 포함합니다.
- DELETE /api/users/{id}
특정 사용자를 삭제합니다.
4. 주요 사항 및 주의점
- Validation: 데이터 유효성 검사를 추가하여 요청 데이터를 검증해야 합니다.
- 예외 처리: 커스텀 예외를 만들어 클라이언트에 더 명확한 에러 메시지를 전달합니다.
- RESTful 설계 규칙 준수: HTTP 메서드와 상태 코드를 일관되게 사용합니다.
반응형
'개발 > 전자정부프레임워크' 카테고리의 다른 글
Spring Security와 데이터베이스 연동하기 (0) | 2024.12.30 |
---|---|
Spring Security를 활용한 인증 및 권한 관리 기초 (0) | 2024.12.30 |
Spring Boot에서 Pagination(페이징)과 Sorting(정렬) 구현하기 (0) | 2024.12.29 |
Spring Boot에서 트랜잭션 관리(Transaction Management) 설정하기 (0) | 2024.12.29 |
Spring Boot에서 AOP(Aspect-Oriented Programming) 적용하기 (0) | 2024.12.29 |