배달 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> {
}
FoodRepository는 JpaRepository 인터페이스를 상속받아 구현한다.
JpaRepository는 Food 엔티티를 조작하는 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);
}
}
- @RestController 어노테이션은 해당 클래스가 RESTful 웹 서비스의 엔드포인트임을 나타냄
- @RequestMapping 어노테이션은 URL 경로를 지정하고 HTTP 요청 메서드와 연결, "/foods" 경로로 매핑되어 있으므로 "/foods"로 시작하는 모든 요청을 이 컨트롤러가 처리
- @GetMapping 어노테이션은 HTTP GET 요청을 처리합니다. "/foods" 경로에 대한 GET 요청이 들어오면 getAllFoods() 메서드가 호출
- @GetMapping("/{id}") 어노테이션은 URL 경로에 변수를 지정하여 해당 변수 값을 파라미터로 전달할 수 있음 "/foods/{id}" 경로에 대한 GET 요청이 들어오면 getFoodById(Long id) 메서드가 호출
- @RequestBody 어노테이션은 요청 본문을 Java 객체로 변환. addFood() 메서드는 HTTP POST 요청에 대한 처리 메서드로서, HTTP 요청 본문에 있는 JSON 데이터를 Food 객체로 변환하여 FoodService의 addFood() 메서드를 호출
- ResponseEntity는 HTTP 응답을 나타내는 객체
- 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. FoodRepository의 deleteById() 메소드를 호출하여 주어진 id에 해당하는 음식 정보를 삭제
'개발공간 > Project' 카테고리의 다른 글
❓SpringBoot @NotEmpty 적용 안될때 (0) | 2023.04.25 |
---|---|
💭 본격 프로젝트 table 설계하기 (0) | 2023.04.18 |
test (0) | 2023.03.28 |