Spring Boot와 Swagger를 사용하여 간단한 CRUD 예제를 만드는 방법을 설명하겠습니다. 이 예제는 Java 언어를 사용하여 구현되며 Swagger를 통해 API 문서를 자동으로 생성합니다.
1. 프로젝트 설정
Maven 프로젝트의 pom.xml에 의존성 추가
Spring Boot와 Swagger를 사용하기 위해 아래의 의존성을 추가합니다.
xml
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Swagger (SpringFox) -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!-- H2 Database (In-Memory) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
2. 애플리케이션 설정
application.properties 설정 파일
H2 데이터베이스를 사용하기 위한 설정입니다.
properties
# H2 데이터베이스 설정
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# Swagger 설정
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
3. 엔티티 생성
Product 엔티티 클래스를 생성합니다.
java
import javax.persistence.*;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
4. Repository 생성
ProductRepository 인터페이스를 생성합니다.
java
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
}
5. Controller 생성
ProductController를 생성하여 CRUD API를 구현합니다.
java
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/products")
@Api(tags = "Product Management")
public class ProductController {
@Autowired
private ProductRepository productRepository;
@ApiOperation("Get all products")
@Tag(name = "Response Estimate", description = "Response Estimate API")
@GetMapping
public List<Product> getAllProducts() {
return productRepository.findAll();
}
@ApiOperation("Get a product by ID")
@Tag(name = "Response Estimate", description = "Response Estimate API")
@GetMapping("/{id}")
public ResponseEntity<Product> getProductById(@PathVariable Long id) {
return productRepository.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@ApiOperation("Create a new product")
@Tag(name = "Response Estimate", description = "Response Estimate API")
@PostMapping
public Product createProduct(@RequestBody Product product) {
return productRepository.save(product);
}
@ApiOperation("Update an existing product")
@Tag(name = "Response Estimate", description = "Response Estimate API")
@PutMapping("/{id}")
public ResponseEntity<Product> updateProduct(@PathVariable Long id, @RequestBody Product updatedProduct) {
return productRepository.findById(id)
.map(existingProduct -> {
existingProduct.setName(updatedProduct.getName());
existingProduct.setPrice(updatedProduct.getPrice());
productRepository.save(existingProduct);
return ResponseEntity.ok(existingProduct);
}).orElse(ResponseEntity.notFound().build());
}
@ApiOperation("Delete a product by ID")
@Tag(name = "Response Estimate", description = "Response Estimate API")
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteProduct(@PathVariable Long id) {
return productRepository.findById(id)
.map(product -> {
productRepository.delete(product);
return ResponseEntity.noContent().build();
}).orElse(ResponseEntity.notFound().build());
}
}
6. Swagger 설정
Swagger를 활성화하기 위해 설정 클래스를 추가합니다.
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.OAS_30)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo"))
.paths(PathSelectors.any())
.build();
}
}
7. 실행 및 Swagger 확인
-
애플리케이션 실행
Spring Boot 애플리케이션을 실행합니다.
-
Swagger UI 접속
브라우저에서 다음 URL로 Swagger UI에 접속합니다.
bash
http://localhost:8080/swagger-ui/
Swagger UI를 통해 구현된 CRUD API를 확인하고 테스트할 수 있습니다.
API 테스트 예시
Swagger를 사용하면 UI에서 바로 API를 테스트할 수 있습니다.
POST 요청 예시 (Create Product)
json
{
"name": "Laptop",
"price": 1200.0
}
PUT 요청 예시 (Update Product)
json
{
"name": "Updated Laptop",
"price": 1500.0
}
이제 Spring Boot와 Swagger를 사용하여 CRUD API를 성공적으로 구현하고 테스트할 수 있습니다!
|