본문 바로가기
Backend - Java Spring/Spring Boot 입문(완)

[SpringBoot3] Blog 기획하고 API 만들어보기

by VictorMeredith 2023. 10. 21.

1. REST API

- URL 설계 방식이다. 

- 동사를 쓰지 말고 자원을 표시해야 한다.

- 동사는 HTTP 메서드로 한다.

- Node/Express 하면서 지겹게 배웠던 내용이므로 나머지 생략

 

2. 엔티티 구성

컬럼명 자료형 null 허용 설명
id BIGINT N 기본키 일련번호, 기본키
title VARCHAR(255) N   게시물의 제목
content VARCHAR(255) N   내용

 

3. 단계별 작업

1) Domain의 Article class 

- Article class를 만든다

 

- Article.java

- @Builder : 롬복에서 지원하는 애너테이션, 빌더 패턴 방식으로 객체를 생성할 수 있도록 한다.

- 빌더패턴을 사용하지 않으면 new Article("abc","def") 이렇게 만들어야하는데

- 빌더패턴은 Article.builder().title("abc").content("def").build(); 이렇게 쓸 수 있다.

- lombok의 애너테이션을 통해 아래와 같이 간략하게 바꿀 수 있다.

게터와 Article() 메서드를 삭제하고 대신 @Getter, @NoArgsConstructor를 추가했다

2) Repository 만들기

- repository 디렉터리를 만들어 BlogRepository 인터페이스를 만든다.

- Article 엔티티와 PK의 타입 Long을 인수로 넣어준다.

- 이렇게 하면 이 Repository 사용 시 JpaRepository에서 제공하는 메서드를 사용할 수 있다.

 

4. API 구현하기

- 클라이언트 - 컨트롤러(BlogController) - 서비스(BlogService) - 리포지터리(BlogRepository) 의 구성을 따른다

 

1) 서비스 메서드 코드 작성

- dto 패키지를 만들어준다.

- dto(Data Transfer Object) 는 계층끼리 데이터를 교환하기 위해 사용하는 객체이다.

이렇게 요청을 한 파일 한 파일 분리하는건가?

- AddArticleRequest.java

 

- service/BlogService.java 를 만든다

- BlogService.java

- @RequiredArgsConstructor : 빈을 생성자로 생성하는 롬복에서 지원하는 애너테이션으로, final 키워드나 @NotNull이 붙은 필드로 생성자를 만들어준다.

- @Service : 해당 클래스를 빈으로 서블릿 컨테이너에 등록해준다.

- .save() : 이 메서드는 JpaRepository에서 지원하는 저장 메서드로, save()를 통해 AddArticleRequest 클래스에 저장된 값들을 article 데이터베이스에 저장한다.

 

2) 컨트롤러 메서드 작성하기

- @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 등을 사용할 수 있다.

- @PostMapping 을 이용해 요청을 매핑 -> 블로그 글을 생성하는 BlogService의 save() 를 호출 -> 생성된 블로그 글을 반환하는 addArticle() 메서드를 만든다

 

- controller 디렉터리를 구성한다

 

- BlogApiController.java

- @RestController 애너테이션을 클래스에 붙이면 HTTP 응답으로 객체 데이터를 JSON 형식으로 반환한다.

- 지금의 경우 @PostMapping() 을 통해 동일 메서드와 매핑한다. 지금의 경우 /api/articles는 addArticle() 메서드에 매핑한다.

- @RequestBody : 애너테이션 HTTP를 요청할 때 응답에 해당하는 값을 @RequestBody 애너테이션이 붙은 대상 객체인 AddArticleRequest에 매핑한다.

 

3) API 실행 테스트하기

- H2 콘솔을 활성화해야한다. (속성 파일을 수정해주어야 한다.)

- application.yml 파일을 수정한다.

- 이제 PostMan에서 Post요청을 해보자.

- POST 요청, Body - row - JSON으로 두고 적절한 JSON 내용을 Send한다.

 

- 이제 브라우저에서 localhost:8080/h2-console에 접속한다.

진짜 개처음보는 애들이다..

- JDBC URL을 application.yml에 적었던 jdbc:h2:mem:testdb 로 바꿔줘야한다.

- 접속한 후 SQL문 입력하는 곳에 SELECT * FROM ARTICLE 적어서 Run 누르면 아래에 정상적으로 작동해서 저장된 것을 확인할 수 있다.

 

5. 테스트코드 구현하기

- H2 콘솔에 들어가서 매번 확인하기 귀찮으니 테스트 코드를 작성해보자

- BlogApiController에서 Create Test를 누르면 테스트 생성 창이 열린다. 만들어보자.

- 직렬화 : 자바 Object -> JSON (자바 Object를 외부 데이터로 만듬)

- 역직렬화 : JSON -> 자바 Object (외부 데이터를 자바 Object로 만듬)

 

- Given : 블로그 글 추가에 필요한 요청 객체를 만든다.

- When : 블로그 글 추가 API에 요청을 보낸다. 이때 요청 타입은 JSON이며, given 에서 미리 만들어준 객체를 요청 본문으로 함께 보낸다.

- Then : 응답코드가 201인지 확인한다. Blog를 전체 조회해 크기가 1인지 확인하고, 실제로 저장된 데이터와 요청 값을 비교한다.

 

/api/articles 로 변경해야함

- writeValueAsString() 메서드를 사용해서 객체를 JSON으로 직렬화 한다.

- 이후에 MockMvc를 사용해 HTTP 메서드, URL, 요청 본문, 요청 타입 등을 설정한 뒤 설정 내용을 바탕으로 테스트 요청을 보낸다.

- contentType() 메서드는 메서드 요청을 보낼 때 JSON, XML 등 다양한 타입 중 하나를 골라 요청을 보낸다.(여기서는 JSON)

- assertThat() 메서드로 블로그 글의 개수가 1인지 확인한다.

이렇게 성공

 

 

- 생각보다 스프링부트가 어렵다. 자바 진영 프로그래밍에 익숙치 않아서 그런 것 같다. 왜 백엔드 준비하는 학생들이 시간을 많이 투자하는 지 알 것 같다. Express 처음 배울 때 이 정도는 아니었는데.. 프런트가 본업이라 JS/TS가 익숙해서 그랬던 것인지 함수형 프로그래밍만 배워대서 그랬던 것인지 예상보다 어려워서 책은 잠시 스톱하고 인강부터 듣고 다시 정독하고 와서 실습해야겠다!

댓글