본문 바로가기
Java

묘공단-스프링부트3 6장

by 똘맹이14 2023. 10. 10.

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