개발공간/Project

🛒 Controller - Service - Repository 만들기

로지네 2023. 4. 19. 19:43

배달 API를 만들기 위한  Controller - Service - Repository를 만들고, 각 계층에게 필요한 의존성 주입 하기!

 

💪🏻 갑자기 Controller, Service, Repository를 만들려고 하니 막막하고 어디부터 설계해야할까 고민이 되었지만 차근 차근 해보자!

 

🍴 FoodRepository

package com.delivery.repository;

import com.delivery.entity.Food;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface FoodRepository extends JpaRepository<Food, Long> {
}

FoodRepositoryJpaRepository 인터페이스를 상속받아 구현한다. 

JpaRepositoryFood 엔티티를 조작하는 CRUD 메소드를 제공

@Repository 어노테이션은 스프링에게 FoodRepository가 리파지토리 인터페이스임을 알려주는 역할

 

🍴FoodController

package com.delivery.controller;

import com.delivery.entity.Food;
import com.delivery.service.FoodService;
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("/foods")
public class FoodController {
    @Autowired
    private FoodService foodService;

    @GetMapping
    public List<Food> getAllFoods() {
        return foodService.getAllFoods();
    }

    @GetMapping("/{id}")
    public ResponseEntity<Food> getFoodById(@PathVariable Long id) {
        Food food = foodService.getFoodById(id);
        return new ResponseEntity<>(food, HttpStatus.OK);
    }

    @PostMapping
    public ResponseEntity<Food> addFood(@RequestBody Food food) {
        Food newFood = foodService.addFood(food);
        return new ResponseEntity<>(newFood, HttpStatus.CREATED);

    }
}
  1. @RestController 어노테이션은 해당 클래스가 RESTful 웹 서비스의 엔드포인트임을 나타냄
  2. @RequestMapping 어노테이션은 URL 경로를 지정하고 HTTP 요청 메서드와 연결, "/foods" 경로로 매핑되어 있으므로 "/foods"로 시작하는 모든 요청을 이 컨트롤러가 처리
  3. @GetMapping 어노테이션은 HTTP GET 요청을 처리합니다. "/foods" 경로에 대한 GET 요청이 들어오면 getAllFoods() 메서드가 호출
  4. @GetMapping("/{id}") 어노테이션은 URL 경로에 변수를 지정하여 해당 변수 값을 파라미터로 전달할 수 있음 "/foods/{id}" 경로에 대한 GET 요청이 들어오면 getFoodById(Long id) 메서드가 호출
  5. @RequestBody 어노테이션은 요청 본문을 Java 객체로 변환. addFood() 메서드는 HTTP POST 요청에 대한 처리 메서드로서, HTTP 요청 본문에 있는 JSON 데이터를 Food 객체로 변환하여 FoodService의 addFood() 메서드를 호출
  6. ResponseEntity는 HTTP 응답을 나타내는 객체
  7. getFoodById()와 addFood() 메서드는 ResponseEntity<Food>를 반환하며, HttpStatus.OK와 HttpStatus.CREATED를 응답 코드로 설정 // 사실 이 부분은 공부가 더 필요한 것 같다. 

 

🍴FoodService

package com.delivery.service;

import com.delivery.entity.Food;
import com.delivery.exception.ResourceNotFoundException;
import com.delivery.repository.FoodRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class FoodService {
    @Autowired
    private FoodRepository foodRepository;

    public List<Food> getAllFoods() {
        return foodRepository.findAll();
    }

    public Food getFoodById(Long id) {
        Optional<Food> food = foodRepository.findById(id);

        if (food.isEmpty()) {
            throw new RuntimeException("id에 해당하는 음식을 찾을 수 없습니다.  " + id);
        }

        return food.get();
    }

    public Food addFood(Food food) {
        return foodRepository.save(food);
    }

    public Food updateFood(Long id, Food updatedFood) {
        Optional<Food> optionalFood = foodRepository.findById(id);

        if (optionalFood.isEmpty()) {
            throw new RuntimeException("id에 해당하는 음식을 찾을 수 없습니다. " + id);
        }

        Food food = optionalFood.get();
        food.setName(updatedFood.getName());
        food.setPrice(updatedFood.getPrice());
        food.setCategory(updatedFood.getCategory());
        food.setDescription(updatedFood.getDescription());
        food.setImageUrl(updatedFood.getImageUrl());
        food.setQuantity(updatedFood.getQuantity());

        return foodRepository.save(food);
    }

    public void deleteFoodById(Long id) {
        Optional<Food> food = foodRepository.findById(id);

        if (food.isEmpty()) {
            throw new RuntimeException("id에 해당하는 음식을 찾을 수 없습니다. " + id);
        }

        foodRepository.deleteById(id);
    }
}
  • 1. FoodRepository의 findAll() 메소드를 호출하여 모든 음식 정보를 조회
  • 조회된 음식 정보를 List<Food> 형태로 반환
  • 2. FoodRepository의 findById() 메소드를 호출하여 주어진 id에 해당하는 음식 정보를 조회
  • 조회된 음식 정보가 존재하지 않으면 Exception을 던짐
  • 존재하는 경우 조회된 음식 정보를 반환
  • 3. FoodRepository의 save() 메소드를 호출하여 새로운 음식 정보를 저장
  • 저장된 음식 정보를 반환
  • 4.FoodRepository의 findById() 메소드를 호출하여 주어진 id에 해당하는 음식 정보를 조회
  • 조회된 음식 정보가 존재하지 않으면 Exception을 던짐
  • 존재하는 경우, updatedFood 객체의 정보를 이용하여 해당 음식 정보를 업데이트
  • 업데이트된 음식 정보를 저장하고 반환
  • 5. FoodRepositorydeleteById() 메소드를 호출하여 주어진 id에 해당하는 음식 정보를 삭제

 

'개발공간 > Project' 카테고리의 다른 글

❓SpringBoot @NotEmpty 적용 안될때  (0) 2023.04.25
💭 본격 프로젝트 table 설계하기  (0) 2023.04.18
test  (0) 2023.03.28