REST 는 Representational State Transfer의 줄임말로 자원을 이름으로 구분해 자원의 상태를 주고 받는 API 방식으로
REST API는 URL 설계 방식을 말함
REST API 사용 방법
1. URL에는 동사를 쓰지 말고, 자원을 표시해야 한다.
예시 | 세부 |
/students/1 | 자원만 표현 |
/get-students?student_id=1 | 자원 이외에 다른 표현을 포함함으로 부적절 |
2. 동사는 HTTP 메서드로
설명 | 적합한 HTTP 메서드와 URL |
id가 1인 블로그의 글을 조회하는 API | GET/articles/1 |
블로그에 글을 추가하는 API | POST/articles |
블로그에 글을 수정하는 API | PUT/articles/1 |
블로그에 글을 삭제하는 API | DELETE/articles/1 |
엔티티 구성
컬럼명 | 자료형 | null 허용 영부 | 키 | 설명 |
id | BIGINT | n | primary key | 기본키 |
title | varchar(255) | n | 제목 | |
content | varchar(255) | n | 내용 |
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false)
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "content", nullable = false)
private String content;
@Builder //빌더 패턴
public Article(String title, String content) {
this.title = title;
this.content = content;
}
public void update(String title, String content) {
this.title = title;
this.content = content;
}
레포지토리 생성
public interface BlogRepository extends JpaRepository<Article, Long> {
}
서비스 매서드 작성
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class AddArticleRequest {
private String title;
private String content;
public Article toEntity() {
return Article.builder()
.title(title)
.content(content)
.build();
}
}
서비스 생성
RequiredArgsConstructor
@Service
public class BlogService {
private final BlogRepository blogRepository;
public Article save(AddArticleRequest request) {
return blogRepository.save(request.toEntity());
}
public List<Article> findAll() {
return blogRepository.findAll();
}
public Article findById(long id) {
return blogRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("not found : " + id));
}
public void delete(long id) {
blogRepository.deleteById(id);
}
@Transactional
public Article update(long id, UpdateArticleRequest request) {
Article article = blogRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("not found : " + id));
article.update(request.getTitle(), request.getContent());
return article;
}
}
컨트롤러 작성
@RequiredArgsConstructor
@RestController
public class BlogApiController {
private final BlogService blogService;
@PostMapping("/api/articles")
public ResponseEntity<Article> addArticle(@RequestBody AddArticleRequest request) {
Article savedArticle = blogService.save(request);
return ResponseEntity.status(HttpStatus.CREATED)
.body(savedArticle);
}
@GetMapping("/api/articles")
public ResponseEntity<List<ArticleResponse>> findAllArticles() {
List<ArticleResponse> articles = blogService.findAll()
.stream()
.map(ArticleResponse::new)
.toList();
return ResponseEntity.ok()
.body(articles);
}
@GetMapping("/api/articles/{id}")
public ResponseEntity<ArticleResponse> findArticle(@PathVariable long id) {
Article article = blogService.findById(id);
return ResponseEntity.ok()
.body(new ArticleResponse(article));
}
@DeleteMapping("/api/articles/{id}")
public ResponseEntity<Void> deleteArticle(@PathVariable long id) {
blogService.delete(id);
return ResponseEntity.ok()
.build();
}
@PutMapping("/api/articles/{id}")
public ResponseEntity<Article> updateArticle(@PathVariable long id,
@RequestBody UpdateArticleRequest request) {
Article updatedArticle = blogService.update(id, request);
return ResponseEntity.ok()
.body(updatedArticle);
}
}
'Java' 카테고리의 다른 글
묘공단-스프링부트3 8장 (0) | 2023.10.23 |
---|---|
묘공단-스프링부트3 7장 (0) | 2023.10.23 |
묘공단-스프링부트3 5장 (0) | 2023.10.03 |
묘공단-스프링부트3 4장 (0) | 2023.09.30 |
묘공단-스프링부트3 3장 (0) | 2023.09.28 |