[기초 API 구현 3] - 음식점 등록 & 조회 API

박성규·2022년 6월 9일
0

[스프링 부트]

목록 보기
37/38
post-thumbnail
  1. 조건
  • 음식점 정보 입력받아 등록
    1. 음식점 이름 (name)
    2. 최소주문 가격 (minOrderPrice)
      • 허용값: 1,000원 ~ 100,000원 입력
      • 100 원 단위로만 입력 가능 (예. 2,220원 입력 시 에러발생. 2,300원은 입력 가능)
      • 허용값이 아니거나 100원 단위 입력이 아닌 경우 에러 발생시킴
  1. Entity 설계
@Entity
@Getter
@Setter
@Table(name = "restaurant")
@NoArgsConstructor(access = AccessLevel.PROTECTED) // protected로 생성자 만들기
public class Restaurant {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "restaurant_id")
    private Long id;

    @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL)
    private List<Menu> menus = new ArrayList<>();

    private String restaurantName;
    private int minOrderPrice;
    private int deliveryFee;

    //==연관관계 메서드==//
    public void addMenu(Menu menu) {
        menus.add(menu);
        menu.setRestaurant(this);
    }


    //==생성 메서드==//
    public static Restaurant createRestaurant(String restaurantName, int minOrderPrice, int deliveryFee){
        Restaurant restaurant = new Restaurant();
        restaurant.setRestaurantName(restaurantName);
        restaurant.setMinOrderPrice(minOrderPrice);
        restaurant.setDeliveryFee(deliveryFee);
        return restaurant;
    }

    public static Restaurant createMenu(Menu... menus){
        Restaurant restaurant = new Restaurant();
        for (Menu menu : menus){
            restaurant.addMenu(menu);
        }
        return restaurant;
    }

}

Restaurant는 Menu 엔티티와 일대 다 관계를 가지고 있기 때문에 Menu 엔티티를 리스트로 받아서 @oneToMany로 맵핑해줬다.

이번에 JPA를 공부하면서 새롭게 배운 방법인데, 연관관계 메서드와 생성 메서드에 대한 내용이었다.

엔티티는 기본적으로 단뱡향이 디폴트이지만, 양뱡향으로 설계할 수 있다. db는 자유롭게 양뱡향이 가능하지만 객체는 그렇지 않다. 자식에게서 부모의 정보를 얻을 수 없기 때문.

그렇기에 연관관계 메서드를 생성해서 Menu를 호출하는 시점에서 데이터를 담아준다.


엔티티 속에 비즈니스 로직을 만들었다. 서비스 트랜잭션 내부에서 비즈니스 로직을 만들어도 되지만 이번에는 다르게 시도해 보았다.

엔티티 속에 비즈니스 로직을 작성해보니, 조금 더 깔끔한 느낌이 들었다. 코드 자체도 간결하고 직관적이게 되고, 메서드로 묶여있다 보니 이때부터 엔티티가 생성된다!! 라는 느낌이 강해서 유지보수의 편리성을 느꼈다.


3.Repository

@Repository
@RequiredArgsConstructor
public class RestaurantRepository {
    private final EntityManager em;

    //레스토랑 등록
    public void save(Restaurant restaurant){
        em.persist(restaurant);
    }
    //레스토랑 조회
    public Restaurant findOne(Long id){
        return em.find(Restaurant.class, id);
    }

    public List<Restaurant> findAll() {
        return em.createQuery("select r from Restaurant r", Restaurant.class).getResultList();
    }
}

레스토랑을 등록하고 조회하는 RestaurantRepository이다. 크게 설명할 부분은 없다.


4.Service

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class RestaurantService {

    private final RestaurantRepository restaurantRepository;

    //레스토랑 등록
    @Transactional
    public void save(RestaurantRegisterDto restaurantRegisterDto){
        Restaurant restaurant = Restaurant.createRestaurant(restaurantRegisterDto.getName(),restaurantRegisterDto.getMinOrderPrice(),restaurantRegisterDto.getDeliveryFee());
        restaurantRepository.save(restaurant);
    }

    //레스토랑 조회
    public Restaurant findOne(Long id){
        return restaurantRepository.findOne(id);
    }

    public List<Restaurant> findAll() {
        return restaurantRepository.findAll();
    }
}

서비스의 save 메서드를 보면 아까 엔티티에서 만들었던 생성 메서드가 사용되는 부분이 보인다.
개발자 외의 사람이 코드를 봤을때 이 때부터 엔티티가 생성되는구나 하고 한번에 알기 쉬울 것 같다.

0개의 댓글

관련 채용 정보