[Spring Boot] CRUD 기본 API 구현(1)

2jjong·2023년 10월 9일
0

CRUD란?

CRUD는 데이터를 다루는 기본적인 작업을 나타내는 약어입니다.
클라이언트가 서버에게 요청을 보낼때 크게 4가지로 분류할수 있습니다.

  • Create (생성): 데이터를 생성한다.
  • Read (조회): 데이터를 조회한다.
  • Update (수정): 데이터를 수정한다.
  • Delete (삭제): 데이터를 삭제한다.

이 4가지 기능들만 구현된다면 하나의 서버를 동작시킬 수 있습니다.

CRUD 구현

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(생성)

    // 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(조회)

// 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(수정)

    // 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(삭제)

    // 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 구현까지하고 다음 포스팅에서 요청을 보내 반환 받는 것을 알아보겠습니다.

profile
student

0개의 댓글