DEV/Backend

Mock API 작성하는 팁

Beomsu Koh 2023. 7. 10.

Mock API 작성하는 팁

🐥 카카오테크캠퍼스 - 2단계 2주차 과제를 수행 할 때, 하나하나 데이터를 입력해야 하는 불편함이 있었는데
오늘 강사님이 보여주신 코드를 보니까 깔끔해서 들고 왔다

@GetMapping("/products")
    public ResponseEntity<?> findAll(@RequestParam(defaultValue = "0") int page) {
        List<ProductRespFindAllDTO> responseDTO = new ArrayList<>();

        // 상품 하나씩 집어넣기
        responseDTO.add(new ProductRespFindAllDTO(
                1, "기본에 슬라이딩 지퍼백 크리스마스/플라워에디션 에디션 외 주방용품 특가전", "", "/images/1.jpg", 1000
        ));
        responseDTO.add(new ProductRespFindAllDTO(
                2, "[황금약단밤 골드]2022년산 햇밤 칼집밤700g외/군밤용/생율", "", "/images/2.jpg", 2000
        ));

난 일단 DTO를 만들어서 위의 코드처럼 데이터를 하나하나 생성해서 넣는 방법을 사용하였다.
즉 하드코딩 된 방식으로 상품을 추가하고 있다.
이러면 상품의 데이터가 변경되면 코드 자체를 변경해야 합니다.
이 방식은 유지 보수가 어렵고, 확장성이 낮습니다.

멘토님 코드 분석

// 빈을 정의하기 위한 Spring 애노테이션
@Component
public class FakeStore {

    // 다양한 더미 데이터 목록을 저장하는 데 사용되는 비공개 변수들
    private List<Product> productList = productDummyList();
    private List<Option> optionList = optionDummyList(productList);
    private List<Cart> cartList = cartDummyList(optionList);
    
    // 더미 제품 목록을 반환하는 메소드
    private List<Product> productDummyList() {
        // 제품 정보를 저장할 빈 리스트를 생성합니다.
        List<Product> productList = new ArrayList<>();
        
        // 더미 데이터를 생성하고 리스트에 추가합니다.
        productList.add(new Product(1L, "Product1", 10000, "description1"));
        productList.add(new Product(2L, "Product2", 20000, "description2"));
        
        // 더미 데이터가 포함된 리스트를 반환합니다.
        return productList;
    }
    
    // 더미 옵션 목록을 반환하는 메소드
    private List<Option> optionDummyList(List<Product> productList) {
        // 옵션 정보를 저장할 빈 리스트를 생성합니다.
        List<Option> optionList = new ArrayList<>();
        
        // 더미 데이터를 생성하고 리스트에 추가합니다.
        optionList.add(new Option(1L, "Option1", 1000, productList.get(0)));
        optionList.add(new Option(2L, "Option2", 2000, productList.get(1)));
        
        // 더미 데이터가 포함된 리스트를 반환합니다.
        return optionList;
    }

    // 더미 장바구니 목록을 반환하는 메소드
    private List<Cart> cartDummyList(List<Option> optionList) {
        // 장바구니 정보를 저장할 빈 리스트를 생성합니다.
        List<Cart> cartList = new ArrayList<>();
        
        // 더미 데이터를 생성하고 리스트에 추가합니다.
        cartList.add(new Cart(1L, 1, optionList.get(0)));
        cartList.add(new Cart(2L, 2, optionList.get(1)));
        
        // 더미 데이터가 포함된 리스트를 반환합니다.
        return cartList;
    }
}

FakeStore 클래스의 코드를 살펴보겠습니다.
여기에는 Product, OptionCart 개체의 더미 목록을 생성하는 메서드가 포함되어 있습니다.

  1. productDummyList() 방법
    이 방법은 더미 제품 목록을 생성합니다.
private List<Product> productDummyList() {
    List<Product> productList = new ArrayList<>();

    productList.add(new Product(1L, "Product1", 10000, "description1"));
    productList.add(new Product(2L, "Product2", 20000, "description2"));

    return productList;
}

2. optionDummyList() 메소드:

이 메서드는 더미 옵션 목록을 만듭니다. 각 옵션은 더미 제품 목록의 제품과 연결되어 있습니다.

private List<Option> optionDummyList(List<Product> productList) {
    List<Option> optionList = new ArrayList<>();

    optionList.add(new Option(1L, "Option1", 1000, productList.get(0)));
    optionList.add(new Option(2L, "Option2", 2000, productList.get(1)));

    return optionList;
}
  1. cartDummyList() 메소드:
private List<Cart> cartDummyList(List<Option> optionList) {
    List<Cart> cartList = new ArrayList<>();

    cartList.add(new Cart(1L, 1, optionList.get(0)));
    cartList.add(new Cart(2L, 2, optionList.get(1)));

    return cartList;
}

이 메서드는 더미 카트 항목 목록을 만듭니다. 각 장바구니 항목에는 더미 옵션 목록의 옵션이 포함되어 있습니다.

이러한 더미 데이터 목록은 FakeStore 클래스의 비공개 필드로 저장되므로 클래스 전체에서 액세스하고 사용할 수 있습니다.

FakeStore 클래스의 맨 위에 있는 @Component 주석은 Spring Bean이고 수명 주기가 Spring 컨테이너에 의해 관리됨을 나타냅니다.

이는 FakeStore가 Spring의 종속성 주입을 사용하여 다른 구성 요소에 주입될 수 있음을 의미합니다.
이 가짜 데이터를 테스트에 쉽게 주입할 수 있으므로 테스트 목적에 특히 유용할 수 있습니다.

사용 방법 : Controller에서 이렇게 쓰인다

@RequiredArgsConstructor // Lombok 라이브러리가 제공하는 어노테이션으로 필요한 인자를 가진 생성자를 자동으로 생성합니다.
@RestController        // 이 클래스가 REST 요청을 처리하는 컨트롤러라는 것을 Spring에게 알려주는 어노테이션입니다.
public class CartRestController {

    private final FakeStore fakeStore; // FakeStore 의존성이 여기에 주입됩니다.
}

이제 컨틀로러에서 만들어진 FakeStore를 사용한다.
이 때 FakeStore의 생성자를 자동으로 생성하기 위해 @RequiredArgsConstructor를 사용한다.

그후 private final로 FakeStore를 선언함으로써 싱글톤으로 더미 데이터를 다룬다

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

'DEV > Backend' 카테고리의 다른 글

MyBatis  (0) 2023.07.11
Restful API  (2) 2023.07.11
TypeORM의 Entity 참조는 어떻게 일어나는가?  (0) 2023.06.27
조회 vs Join 무엇이 더 효율적인가  (0) 2023.06.27
Secondary Index  (0) 2023.06.17

댓글