06 블로그 기획하고 API 만들기

hyHA·2023년 12월 15일
0
post-thumbnail

API와 REST API

참고 - API, RST API, 라이브러리, 프레임워크

API는 클라이언트의 요청을 서버에게 전달하고, 서버의 결과물을 클라이언트에게 돌려주는 역할.

REST API는 URL 주소와 메서드만 보고 요청의 내용을 파악할 수 있다는 강력한 장점이 있다. 그리고 상태가 없다는 특징이 있어서 클라이언트와 서버의 역할이 명확하게 분리된다. 그리고 HTTP 표준을 사용하는 모든 플랫폼에서 사용할 수 있다.

프로젝트 준비하기

아래 파일들을 준비한다.

build.gradle : 라이브러리 의존성을 관리하는 파일
application.yml : 애플리케이션의 구성(configuration)을 정의하고, 데이터베이스 연결 정보, 서버 포트, 보안 설정, 외부 서비스 연동 등과 같은 다양한 설정을 포함

# 서버 포트
server:
  port: 8080

# DB연결정보
spring:   
  datasource:  
    url: jdbc:mysql://localhost:3306/mydatabase
    username: myuser
    password: mypassword

# 로그 설정
logging:
  level:
    root: INFO
    com.example: DEBUG

엔티티

코드를 반복해 입력하지 않고 가독성을 위해 아래의 롬복의 애너테이션들을 사용할 수 있다

애너테이션기능
@Builder이 애너테이션을 생성자 위에 입력하면 빌더 패턴 방식으로 객체를 생성할 수 있다.
@NoArgsConstructor접근 제어자가 protected인 기본 생성자를 생성해준다.
@Getter모든 필드에 대한 접근자 메서드를 만들어준다.

빌더 패턴

객체를 유연하고 직관적으로 생성할 수 있다. 즉, 어느 필드에 어떤 값이 들어가는지 명시적으로 파악할 수 있다.

리포지터리

JPA리포지토리를 상속으면 JPA에서 제공하는 여러 메서드를 사용할 수 있다.
이때 엔티티 클래스와 PK타입을 인수로 넣어주어야 한다.

public interface BlogRepository extends JPARepository<Article, Long>{}

API 구현

DTO

DTO(서비스 계층에서 요청을 받고 응답을 보낼 객체)를 생성한다

DTO vs DAO

DTO는 계층끼리 데이터를 교환하기 위해 사용하는 객체
DAO는 데이터베이스와 연결되고 데이터를 조회하고 수정하는데 사용하는 객체라 데이터 수정과 관련된 로직이 포함되지만,
DTO는 단순히 데이터를 옮기기 위해 사용하는 전달자 역할이므로 비즈니스 로직을 포함하지 않는다.

스트림

여러 데이터가 모여있는 컬렉션을 간편하게 처리하기 위해 자바 8에서 추가된 기능
get 요청이 오면 모든 데이터를 조회하는 findAll() 메서드를 호출한 다음, stream을 이용하여 응답용 객체로 파싱해 body에 담아 클라이언트에 정송.

서비스

서비스 클래스에 아래 애너테이션을 사용할 수 있다.

애너테이션기능
@Service해당 클래스를 빈으로 서블릿 컨테이너에 등록해줌
@RequiredArgsConstructorfinal 키워드나 @NotNull이 붙은 필드의 생성자를 만들어줌.
@Transactional매칭한 메서드를 하나의 트랜잭션으로 묶는 역할

메서드는 JPA 리포지토리에서 지원하는 메서드를 사용하자

메서드기능
생성save()로 DTO 클래스에 저장된 값들을 DB에 저장
전체 조회findAll()을 호출하여 테이블에 저장된 모든 데이터를 조회
엔티티 1개 조회findbyId() 메서드를 사용해 엔티티를 조회
엔티티가 없으면 IllegalArgumentException예외를 발생시킨다.
삭제delete()메서드로 db에서 데이터 삭제
수정update()

컨트롤러

URL에 매핑하기 위한 컨트롤러 메서드를 구현하자.

클래스 애너테이션

클래스에는 아래 애너테이션 등을 사용한다.

애너테이션기능
@RestController@ResponseBody + @Controller
HTTP Response Body에 객체 데이터를 JSON 형식으로 반환하는 컨트롤러
HTTP 응답으로 객체 데이터를 JSON 형식으로 반환한다.
@RequiredArgsConstructorfinal 키워드나 @NotNull이 붙은 필드의 생성자를 만들어줌.

메서드 애너테이션

메서드에는 아래 애너테이션을 사용한다.

애너테이션기능
@PostMapping컨트롤러 메서드에는 URL 매핑 애너테이션(@GetMapping 등)을 사용한다.
POST 요청이 오면 @PostMapping을 이용해 요청을 매핑
@RequestBody메서드 매개변수에 사용. HTTP 요청의 body 해당하는 값을 해당 애너테이션을 붙은 객체에 매핑한다.
@PathVariable@GetMapping의 URL변수를 받는다.

ResponseEntity

객체를 반환할 때 사용한다.
ResponseEntity.status().body()를 통해 응답코드와 테이블에 저장된 객체를 반환한다.

return ResponseEntity.status(HttpStatus.CERATED).body(savedArticle);

H2 콘솔로 API 테스트

테스트 절차

  1. 속성 파일 수정
    application.yml 파일을 수정한다.
    • datasource에 h2 db 연결
    • h2 부분의 enabled 속성을 true로 변경해준다.
  2. 스프링 부트 서버 실행
  3. 포스트맨 실행하여 서버에 post 요청 날리기.
  4. h2 db에 접속하여 데이터 확인

data.sql 파일

테스트를 쉽게 하기 위해 data.sql 파일을 생성할 수 있다
resources 디렉터리에 data.sql 파일을 만들어 코드를 작성한다.
이후,포스트맨에서 get 요청을 하면 sql쿼리를 보낸 결과를 확인할 수 있다.

테스트 코드

h2 콘솔에 접속해 쿼리를 입력하고, 데이터가 저장되는지 매번 확인하기 번거로우므로, 이런 작업을 줄여줄 테스트 코드를 작성하자.

애너테이션

애너테이션기능
@SpringBootTest테스트용 애플리케이션 컨텍스트
@AutoConfigureMockMvcMockMvc 생성 및 자동 구성

ObjectMapper

직렬화, 역직렬화를 위한 클래스
ObjectMapper 클래스로 만든 객체는 자바 객체를 JSON 데이터로 직렬화하고, 반대로 JSON 데이터를 자바에서 사용하기 위해 자바 객체로 역직렬화해준다.
ObjectMapper 클래스는 Jackson 라이브러리에서 제공한다.

자주 사용하는 메서드

코드설명
assertThat(a).isEqualTo(b)a가 b와 일치한다
assertThat(a).isGreaterThan(b)a는 b보다 크다
assertThat(a).isLessThan(b)a는 b보다 작다
assertThat(a).isZero(b)a는 0이다
assertThat(a).isNotEmpty()a는 비어있지 않다
assertThat(a).contains(b)a는 b를 포함한다

참고
https://namu.wiki/w/API
https://brunch.co.kr/@jhw28/31

profile
룰루랄라

0개의 댓글