참고 - 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>{}
DTO(서비스 계층에서 요청을 받고 응답을 보낼 객체)를 생성한다
DTO는 계층끼리 데이터를 교환하기 위해 사용하는 객체
DAO는 데이터베이스와 연결되고 데이터를 조회하고 수정하는데 사용하는 객체라 데이터 수정과 관련된 로직
이 포함되지만,
DTO는 단순히 데이터를 옮기기 위해 사용하는 전달자 역할이므로 비즈니스 로직을 포함하지 않는다
.
여러 데이터가 모여있는 컬렉션을 간편하게 처리하기 위해 자바 8에서 추가된 기능
get 요청이 오면 모든 데이터를 조회하는 findAll() 메서드를 호출한 다음, stream을 이용하여 응답용 객체로 파싱해 body에 담아 클라이언트에 정송.
서비스 클래스에 아래 애너테이션을 사용할 수 있다.
애너테이션 | 기능 |
---|---|
@Service | 해당 클래스를 빈으로 서블릿 컨테이너에 등록해줌 |
@RequiredArgsConstructor | final 키워드나 @NotNull이 붙은 필드의 생성자를 만들어줌. |
@Transactional | 매칭한 메서드를 하나의 트랜잭션으로 묶는 역할 |
메서드는 JPA 리포지토리에서 지원하는 메서드를 사용하자
메서드 | 기능 |
---|---|
생성 | save()로 DTO 클래스에 저장된 값들을 DB에 저장 |
전체 조회 | findAll()을 호출하여 테이블에 저장된 모든 데이터를 조회 |
엔티티 1개 조회 | findbyId() 메서드를 사용해 엔티티를 조회 |
엔티티가 없으면 IllegalArgumentException예외를 발생시킨다. | |
삭제 | delete()메서드로 db에서 데이터 삭제 |
수정 | update() |
URL에 매핑하기 위한 컨트롤러 메서드를 구현하자.
클래스에는 아래 애너테이션 등을 사용한다.
애너테이션 | 기능 |
---|---|
@RestController | @ResponseBody + @Controller |
HTTP Response Body에 객체 데이터를 JSON 형식으로 반환하는 컨트롤러 | |
HTTP 응답으로 객체 데이터를 JSON 형식으로 반환한다. | |
@RequiredArgsConstructor | final 키워드나 @NotNull이 붙은 필드의 생성자를 만들어줌. |
메서드에는 아래 애너테이션을 사용한다.
애너테이션 | 기능 |
---|---|
@PostMapping | 컨트롤러 메서드에는 URL 매핑 애너테이션(@GetMapping 등)을 사용한다. |
POST 요청이 오면 @PostMapping을 이용해 요청을 매핑 | |
@RequestBody | 메서드 매개변수에 사용. HTTP 요청의 body 해당하는 값을 해당 애너테이션을 붙은 객체에 매핑한다. |
@PathVariable | @GetMapping의 URL변수를 받는다. |
객체를 반환할 때 사용한다.
ResponseEntity.status().body()를 통해 응답코드와 테이블에 저장된 객체를 반환한다.
return ResponseEntity.status(HttpStatus.CERATED).body(savedArticle);
테스트를 쉽게 하기 위해 data.sql 파일을 생성할 수 있다
resources 디렉터리에 data.sql 파일을 만들어 코드를 작성한다.
이후,포스트맨에서 get 요청을 하면 sql쿼리를 보낸 결과를 확인할 수 있다.
h2 콘솔에 접속해 쿼리를 입력하고, 데이터가 저장되는지 매번 확인하기 번거로우므로, 이런 작업을 줄여줄 테스트 코드를 작성하자.
애너테이션 | 기능 |
---|---|
@SpringBootTest | 테스트용 애플리케이션 컨텍스트 |
@AutoConfigureMockMvc | MockMvc 생성 및 자동 구성 |
직렬화, 역직렬화를 위한 클래스
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를 포함한다 |