당신은 Java로 웹 애플리케이션이나 마이크로서비스를 만들고 싶은 적이 있습니까? 하지만 복잡성과 설정 때문에 압도당한 적이 있습니까? 그렇다면 당신만이 아닙니다. 많은 개발자들이 서버 설정, 종속성 관리, 데이터베이스 처리 등과 같은 웹 개발의 도전에 어려움을 겪고 있습니다.
그래서 Spring Boot는 게임 체인저입니다. Spring Boot는 Java로 웹 개발을 간소화하는 프레임워크입니다. 자동 구성, 내장 서버, 스타터 종속성 등의 기능을 제공합니다. Spring Boot를 사용하면 보일러플레이트 코드를 다루기보다는 비즈니스 로직 작성에 집중할 수 있습니다.
하지만 웹 애플리케이션이나 마이크로서비스를 만드는 것은 충분하지 않습니다. 또한 테스트해야 합니다. 테스트는 소프트웨어의 품질과 신뢰성을 보장하는 데 매우 중요합니다. 테스트는 버그를 찾고 수정하며 성능을 개선하고 오류를 예방하는 데 도움을 줍니다.
그것이 Apidog가 등장하는 이유입니다.
이 블로그 포스트에서는 Apidog로 Spring Boot API를 구축하고 테스트하는 방법을 배울 것입니다. Spring Boot로 간단한 RESTful API를 생성하고 Apidog로 테스트할 것입니다.
Spring Boot란 무엇이며 왜 사용하는가?
Spring Boot는 Spring 애플리케이션 개발을 간소화하는 프레임워크입니다. Spring 애플리케이션을 생성, 구성, 실행 및 배포하는 데 유용한 많은 기능과 규약을 제공합니다. Spring Boot를 사용할 때의 이점은 다음과 같습니다:
- 필요한 라이브러리와 버전을 자동으로 추가하는 스타터 종속성 관리 시스템이 있습니다.
- 추가 구성이나 설치 없이 애플리케이션을 실행할 수 있는 내장 웹 서버가 있습니다.
- 종속성과 환경에 따라 최적의 설정을 감지하고 적용하는 자동 구성 메커니즘이 있습니다.
- 헬스 체크, 메트릭, 로깅 및 보안과 같은 기능을 포함하는 생산 준비 완료 지원이 있습니다.
Spring Boot를 사용하면 비즈니스 로직 작성을 집중하고 프레임워크가 나머지를 처리하도록 할 수 있습니다.

Apidog란 무엇이며 API 테스트에 어떻게 도움을 줄 수 있는가?
Apidog는 API를 간단하고 직관적인 방법으로 테스트하도록 도와주는 도구입니다. API에 연결하고 엔드포인트를 탐색하며 API에 대한 테스트 사례를 생성하고 실행할 수 있습니다. APIdog의 몇 가지 기능은 다음과 같습니다:
- API와 상호작용하고 결과를 쉽게 볼 수 있는 그래픽 사용자 인터페이스가 있습니다.
- JavaScript 및 Chai 단언을 사용하여 테스트 사례를 작성하고 편집할 수 있는 코드 편집기가 있습니다.
- 테스트 사례를 실행하고 각 테스트의 상태, 출력 및 오류를 보여주는 테스트 러너가 있습니다.
- 테스트 결과의 포괄적이고 사용자 정의 가능한 보고서를 생성하는 보고서 생성기가 있습니다.
Apidog를 사용하면 API를 빠르고 신뢰할 수 있는 방법으로 테스트하고 품질과 기능을 보장할 수 있습니다.

프로젝트 설정하기
첫 번째 단계는 Spring Initializr로 Spring Boot 프로젝트를 만드는 것입니다. Spring Initializr는 사용자 선호도에 따라 기본 프로젝트 구조와 구성을 생성하는 웹 도구입니다. Spring Initializr를 사용하려면 다음 단계를 따르십시오:
https://start.spring.io/로 이동하여 프로젝트 세부 정보를 입력합니다. 이 예에서는 다음 설정을 사용할 것입니다:
- 프로젝트: Maven 프로젝트
- 언어: Java
- Spring Boot: 3.2.3
- 프로젝트 메타데이터:
- 그룹: com.example
- 아티팩트: apidog-demo
- 이름: apidog-demo
- 설명: Spring Boot용 데모 프로젝트
- 패키지 이름: com.example.apidog-demo
- 패키징: Jar
- Java: 17
- 종속성: Spring Web, Spring Data JPA, H2 Database

생성 버튼을 클릭하고 프로젝트의 zip 파일을 다운로드합니다.
zip 파일을 추출하여 선호하는 IDE에서 프로젝트를 엽니다.
Spring Web 및 Spring Data JPA에 대한 종속성 추가하기
다음 단계는 Spring Web 및 Spring Data JPA에 대한 종속성을 추가하는 것입니다. Spring Web은 Spring으로 RESTful API를 구축하는 데 필수적인 웹 지원을 제공하는 모듈입니다. Spring Data JPA는 JPA와 Hibernate를 사용하여 관계형 데이터베이스의 데이터에 대한 접근 및 조작을 간소화하는 모듈입니다.
이러한 종속성을 추가하려면 위에서 언급한 Spring Initializr를 사용하거나 프로젝트의 pom.xml 파일을 수동으로 편집하고 다음 종속성을 추가할 수 있습니다:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
애플리케이션 속성 구성하기
다음 단계는 애플리케이션 속성을 구성하는 것입니다. application.properties 파일은 애플리케이션의 동작 및 설정을 정의하는 키-값 쌍이 포함된 파일입니다. 이 예에서는 다음 속성을 사용할 것입니다:
# 데이터베이스에 접근하기 위한 H2 콘솔 활성화
spring.h2.console.enabled=true
# H2 콘솔의 경로 설정
spring.h2.console.path=/h2-console
# 데이터베이스의 URL 설정
spring.datasource.url=jdbc:h2:mem:testdb
# 데이터베이스 사용자 이름 설정
spring.datasource.username=sa
# 데이터베이스 비밀번호 설정
spring.datasource.password=
# 데이터베이스 방언 설정
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# 콘솔에 SQL 문 표시
spring.jpa.show-sql=true
# 엔티티 클래스에서 데이터베이스 스키마 생성
spring.jpa.hibernate.ddl-auto=update
# API 문서화를 위한 Swagger UI 활성화
springdoc.swagger-ui.enabled=true
# Swagger UI의 경로 설정
springdoc.swagger-ui.path=/swagger-ui.html
API 만들기
다음 단계는 API를 만드는 것입니다. API는 Book이라는 간단한 엔티티에 대한 도메인 모델, 리포지토리 및 컨트롤러로 구성됩니다. Book은 다음과 같은 속성을 가집니다: id, title, author, price.
간단한 엔티티에 대한 도메인 모델 및 리포지토리 생성
도메인 모델은 엔티티의 데이터 및 행동을 나타내는 클래스입니다. 리포지토리는 JpaRepository 인터페이스를 확장하며 엔티티의 데이터에 접근하고 조작하는 메소드를 제공합니다.
Book 엔티티에 대한 도메인 모델 및 리포지토리를 만들려면 다음 단계를 따르십시오:
- com.example.apidogdemo.model이라는 새 패키지를 생성하고 그 안에 Book.java라는 새 클래스를 만듭니다.
- 클래스를 @Entity로 주석을 달아 JPA 엔티티로 표시하고, @Table로 데이터베이스 테이블의 이름을 지정합니다.
- 클래스의 속성을 정의하고 각각 @Id, @GeneratedValue, @Column 및 @NotNull로 주석을 달아 기본 키, 생성 전략, 열 이름 및 유효성 제약 조건을 지정합니다.
- 생성자, getter 및 setter, toString 메소드를 생성합니다.
Book.java 클래스는 다음과 같아야 합니다:
package com.example.apidogdemo.model;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Entity
@Table(name = "books")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "title")
@NotNull
private String title;
@Column(name = "author")
@NotNull
private String author;
@Column(name = "price")
@NotNull
private BigDecimal price;
public Book() {
}
public Book(Long id, String title, String author, BigDecimal price) {
this.id = id;
this.title = title;
this.author = author;
this.price = price;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", title='" + title + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
- com.example.apidogdemo.repository라는 새 패키지를 생성하고 그 안에 BookRepository.java라는 새 인터페이스를 만듭니다.
- 인터페이스에 @Repository로 주석을 달아 Spring Data JPA 리포지토리로 표시합니다.
- JpaRepository 인터페이스를 확장하고 일반 파라미터로 엔티티 유형 및 기본 키 유형을 지정합니다.
- 선택적으로, 엔티티의 데이터 쿼리를 위한 사용자 정의 메소드를 정의할 수 있습니다.
BookRepository.java 인터페이스는 다음과 같아야 합니다:
package com.example.apidogdemo.repository;
import com.example.apidogdemo.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
// 사용자 정의 메소드를 여기에 정의할 수 있습니다.
}
컨트롤러 생성 및 CRUD 작업을 위한 엔드포인트 정의하기
컨트롤러는 API의 요청 및 응답을 처리하는 클래스입니다. 컨트롤러는 엔티티에 대한 CRUD 작업 (생성, 읽기, 업데이트, 삭제)을 위한 엔드포인트를 정의합니다.
Book 엔티티를 위한 컨트롤러를 생성하고 엔드포인트를 정의하려면 다음 단계를 따르십시오:
- com.example.apidogdemo.controller라는 새 패키지를 생성하고 그 안에 BookController.java라는 새 클래스를 만듭니다.
- 클래스를 @RestController로 주석을 달아 JSON 응답을 반환하는 Spring MVC 컨트롤러로 표시합니다.
- 클래스를 @RequestMapping로 주석을 달아 엔드포인트의 기본 경로를 지정합니다.
- BookRepository 인스턴스를 @Autowired 주석으로 주입합니다.
- CRUD 작업을 위한 엔드포인트를 @GetMapping, @PostMapping, @PutMapping 및 @DeleteMapping 주석을 사용하여 정의하고 각 엔드포인트의 경로 및 매개변수를 지정합니다.
- ResponseEntity 클래스를 사용하여 각 엔드포인트에 대한 응답 데이터와 상태 코드를 래핑합니다.
- 생성 및 업데이트 엔드포인트의 요청 본문을 검증하기 위해 @Valid 주석을 사용합니다.
- 예외를 처리하고 적절한 상태 코드 및 메시지를 반환하기 위해 @ExceptionHandler 및 @ResponseStatus 주석을 사용합니다.
BookController.java 클래스는 다음과 같아야 합니다:
package com.example.apidogdemo.controller;
import com.example.apidogdemo.model.Book;
import com.example.apidogdemo.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import javax.validation.Valid;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/api/books")
public class BookController {
@Autowired
private BookRepository bookRepository;
// 모든 도서 가져오기
@GetMapping
public ResponseEntity<List<Book>> getAllBooks() {
List<Book> books = bookRepository.findAll();
return new ResponseEntity<>(books, HttpStatus.OK);
}
// ID로 도서 가져오기
@GetMapping("/{id}")
public ResponseEntity<Book> getBookById(@PathVariable Long id) {
Optional<Book> book = bookRepository.findById(id);
if (book.isPresent()) {
return new ResponseEntity<>(book.get(), HttpStatus.OK);
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "도서를 찾을 수 없습니다");
}
}
// 도서 생성하기
@PostMapping
public ResponseEntity<Book> createBook(@Valid @RequestBody Book book) {
Book savedBook = bookRepository.save(book);
return new ResponseEntity<>(savedBook, HttpStatus.CREATED);
}
// ID로 도서 업데이트하기
@PutMapping("/{id}")
public ResponseEntity<Book> updateBook(@PathVariable Long id, @Valid @RequestBody Book book) {
Optional<Book> existingBook = bookRepository.findById(id);
if (existingBook.isPresent()) {
book.setId(id);
Book updatedBook = bookRepository.save(book);
return new ResponseEntity<>(updatedBook, HttpStatus.OK);
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "도서를 찾을 수 없습니다");
}
}
// ID로 도서 삭제하기
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBook(@PathVariable Long id) {
Optional<Book> existingBook = bookRepository.findById(id);
if (existingBook.isPresent()) {
bookRepository.deleteById(id);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "도서를 찾을 수 없습니다");
}
}
// 유효성 검사 예외 처리
@ExceptionHandler(javax.validation.ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleValidationExceptions(javax.validation.ConstraintViolationException ex) {
return ex.getMessage();
}
}
Apidog로 Spring Boot API 테스트하기
마지막 단계는 Apidog를 사용하여 API를 테스트하는 것입니다. Apidog는 API를 간단하고 직관적인 방법으로 테스트하는 데 도움을 주는 도구입니다. API에 연결하고 엔드포인트를 탐색하며 API에 대한 테스트 사례를 생성하고 실행할 수 있습니다.
Apidog로 API를 테스트하려면 다음 단계를 따르십시오:
- Apidog를 시작하고 새 프로젝트 버튼을 클릭하여 새 프로젝트를 만듭니다.

- 프로젝트의 이름과 설명을 입력하고 생성 버튼을 클릭합니다.

- API의 기본 URL을 입력하고 연결 버튼을 클릭합니다.

- 왼쪽 패널에서 API의 엔드포인트 목록을 볼 수 있습니다. 각 엔드포인트를 클릭하여 오른쪽 패널에서 세부정보와 예제를 볼 수 있습니다.

- 오른쪽 패널의 테스트 사례 탭을 클릭하여 API에 대한 테스트 사례를 생성하고 실행할 수 있습니다. 코드 편집기를 사용하여 JavaScript와 Chai 단언을 사용해 테스트 사례를 작성하고 편집할 수 있습니다.


테스트 러너를 사용하여 테스트 사례를 실행하고 각 테스트의 상태, 출력 및 오류를 볼 수 있습니다. 보고서 생성기를 사용하여 테스트 결과의 포괄적이고 사용자 정의 가능한 보고서를 생성할 수 있습니다.
결론
이 블로그 포스트에서는 Apidog로 Spring Boot API를 구축하고 테스트하는 방법을 배웠습니다. Spring Boot로 간단한 RESTful API를 만들고 Apidog로 테스트했습니다.
Spring Boot는 Java로 웹 개발을 간소화하는 프레임워크입니다. 자동 구성, 내장 서버, 스타터 종속성 등의 기능을 제공합니다. Spring Boot를 사용하면 보일러플레이트 코드를 다루기보다는 비즈니스 로직 작성에 집중할 수 있습니다.
Apidog는 API를 테스트하고 디버깅하는 데 도움을 주는 도구입니다. API에 연결하고 엔드포인트를 탐색하며 테스트 사례를 생성하고 실행하고 보고서를 생성할 수 있습니다. Apidog로 코드를 작성지 않고도 더 빠르고 쉽게 API를 테스트할 수 있습니다.