CRUD는 데이터를 다루는 기본적인 작업을 나타내는 약어입니다.
클라이언트가 서버에게 요청을 보낼때 크게 4가지로 분류할수 있습니다.
이 4가지 기능들만 구현된다면 하나의 서버를 동작시킬 수 있습니다.
Entity
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.*;
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
}
Repository
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ProductRepository extends JpaRepository<Product, Long> {
List<Product> findByName(String name);
}
Service
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
// CREATE (생성)
public Product createProduct(Product product) {
return productRepository.save(product);
}
// READ (조회)
public List<Product> getAllProducts() {
return productRepository.findAll();
}
public Product getProductById(Long id) {
return productRepository.findById(id).orElse(null);
}
public List<Product> getProductsByName(String name) {
return productRepository.findByName(name);
}
// UPDATE (수정)
public Product updateProduct(Long id, Product updatedProduct) {
Product existingProduct = productRepository.findById(id).orElse(null);
if (existingProduct != null) {
existingProduct.setName(updatedProduct.getName());
existingProduct.setPrice(updatedProduct.getPrice());
return productRepository.save(existingProduct);
}
return null;
}
// DELETE (삭제)
public boolean deleteProduct(Long id) {
Product existingProduct = productRepository.findById(id).orElse(null);
if (existingProduct != null) {
productRepository.delete(existingProduct);
return true;
}
return false;
}
}
Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/products")
public class ProductController {
@Autowired
private ProductService productService;
// CREATE (생성)
@PostMapping
public ResponseEntity<Product> createProduct(@RequestBody Product product) {
Product createdProduct = productService.createProduct(product);
return new ResponseEntity<>(createdProduct, HttpStatus.CREATED);
}
// READ (조회)
@GetMapping
public ResponseEntity<List<Product>> getAllProducts() {
List<Product> products = productService.getAllProducts();
return new ResponseEntity<>(products, HttpStatus.OK);
}
@GetMapping("/{id}")
public ResponseEntity<Product> getProductById(@PathVariable Long id) {
Product product = productService.getProductById(id);
if (product != null) {
return new ResponseEntity<>(product, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
@GetMapping("/byname/{name}")
public ResponseEntity<List<Product>> getProductsByName(@PathVariable String name) {
List<Product> products = productService.getProductsByName(name);
return new ResponseEntity<>(products, HttpStatus.OK);
}
// UPDATE (수정)
@PutMapping("/{id}")
public ResponseEntity<Product> updateProduct(@PathVariable Long id, @RequestBody Product updatedProduct) {
Product product = productService.updateProduct(id, updatedProduct);
if (product != null) {
return new ResponseEntity<>(product, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
// DELETE (삭제)
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteProduct(@PathVariable Long id) {
boolean deleted = productService.deleteProduct(id);
if (deleted) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
}
CRUD의 전체 코드입니다. 먼저 컨트롤러의 상단을 보면 @RequestMapping 어노테이션을 통해 컨트롤러로 매핑되는 URL을 연결시켜 주었습니다. 이를 통해 '/api/products'로 오는 요청은 해당 컨트롤러로 매핑됩니다.
create부터 차례대로 알아보겠습니다.
// CREATE (생성)
@PostMapping
public ResponseEntity<Product> createProduct(@RequestBody Product product) {
Product createdProduct = productService.createProduct(product);
return new ResponseEntity<>(createdProduct, HttpStatus.CREATED);
}
create는 POST 요청으로 이루어지므로 @PostMapping 어노테이션을 사용하여 POST 요청을 해당 메소드로 연결합니다. 이렇게 하면 POST 요청은 createProduct를 실행하여 결과를 반환받게 됩니다.
// READ (조회)
@GetMapping
public ResponseEntity<List<Product>> getAllProducts() {
List<Product> products = productService.getAllProducts();
return new ResponseEntity<>(products, HttpStatus.OK);
}
@GetMapping("/{id}")
public ResponseEntity<Product> getProductById(@PathVariable Long id) {
Product product = productService.getProductById(id);
if (product != null) {
return new ResponseEntity<>(product, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
@GetMapping("/byname/{name}")
public ResponseEntity<List<Product>> getProductsByName(@PathVariable String name) {
List<Product> products = productService.getProductsByName(name);
return new ResponseEntity<>(products, HttpStatus.OK);
}
read는 GET 요청으로 이루어지며 @GetMapping 어노테이션을 사용하여 연결해줄 수 있습니다. 또한 어노테이션의 속성으로 URL을 추가로 기입하여 EndPoint를 설정할 수 있습니다.
@PathVariable은 경로의 값을 변수로 받아온다는 뜻인데 예를 들어 '/api/products/1'이라면 products/ 뒤의 1을 변수로 받아옵니다.
// UPDATE (수정)
@PutMapping("/{id}")
public ResponseEntity<Product> updateProduct(@PathVariable Long id, @RequestBody Product updatedProduct) {
Product product = productService.updateProduct(id, updatedProduct);
if (product != null) {
return new ResponseEntity<>(product, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
update는 PUT 요청으로 이루어지고 @PutMapping 어노테이션을 사용하여 연결해줄 수 있습니다. read와 마찬가지로 @PathVariable로 값을 받아옵니다.
// DELETE (삭제)
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteProduct(@PathVariable Long id) {
boolean deleted = productService.deleteProduct(id);
if (deleted) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
delete는 DELETE 요청으로 이루어지고 @DeleteMapping 어노테이션을 통해 연결해줄 수 있습니다.
이번 포스팅에서는 CURD API 구현까지하고 다음 포스팅에서 요청을 보내 반환 받는 것을 알아보겠습니다.