스프링 부트 프로젝트(레스토랑 예약 사이트 만들기)-가게상세-2 09강 해석

Psj·2021년 12월 19일
0

#1 중복되는 코드 분리(1)

/main/~/interfaces/RestaurantController.java

package kr.co.fastcampus.eatgo.interfaces;

import kr.co.fastcampus.eatgo.domain.Restaurant;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class RestaurantController {

    @GetMapping("/restaurants") // 가게목록 반환 api
    public List<Restaurant> list(){

        List<Restaurant> restaurants = new ArrayList<>();

        restaurants.add(new Restaurant(1004L,"Bob zip", "Seoul"));
        restaurants.add(new Restaurant(2020L, "Cyber Food", "Seoul"));


        return restaurants;
    }

    @GetMapping("/restaurants/{id}") // 특정 가게상세 반환 api
    public Restaurant detail(@PathVariable("id") Long id){

        List<Restaurant> restaurants = new ArrayList<>();

        restaurants.add(new Restaurant(1004L, "Bob zip", "Seoul"));
        restaurants.add(new Restaurant(2020L, "Cyber Food", "Seoul"));

        Restaurant restaurant = restaurants.stream() // java의 stream사용
                .filter(r -> r.getId().equals(id)) // 리스트에 들어있는 restaurant의 id중 요청들어오는 id와 같은것이 있어야하고
                .findFirst() // 그중 첫번째값을 골라(id는 유니크한 값이기때문에 어차피 하나밖에 없을것이다)
                .get(); // 가져오라는것이다.
                // .get(); 을 지우고 orElse(null); 을 넣어도 정상작동하는데 이것은 요청들어오는값과 일치하는 값이 없을때 표시할값을 orElse()안에 적는것이다 여기서는 null을 적었으니 일치하는값으없을때 null이 반환될것이다.

        return restaurant;
    }

}

중복되는 코드

List restaurants = new ArrayList<>();

restaurants.add(new Restaurant(1004L,"Bob zip", "Seoul"));
restaurants.add(new Restaurant(2020L, "Cyber Food", "Seoul"));

가게목록 반환 api와 특정 가게상세 반환 api에서
현재 이 코드들이 완전히 중복되는 걸 확인할수있다.

#2 중복되는 코드 분리(2)

main/~/domain/RestaurantRepository.java 생성

package kr.co.fastcampus.eatgo.domain;

import java.util.ArrayList;
import java.util.List;

public class RestaurantRepository {


    public List<Restaurant> findAll() {

        List<Restaurant> restaurants = new ArrayList<>();

        restaurants.add(new Restaurant(1004L,"Bob zip", "Seoul"));
        restaurants.add(new Restaurant(2020L, "Cyber Food", "Seoul"));

        return restaurants;
    }
}
    

/main/~/interfaces/RestaurantController.java

package kr.co.fastcampus.eatgo.interfaces;

import kr.co.fastcampus.eatgo.domain.Restaurant;
import kr.co.fastcampus.eatgo.domain.RestaurantRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

@RestController
public class RestaurantController {

    private RestaurantRepository repository = new RestaurantRepository(); // 중복되는 코드를 RestaurantRepository 클래스로 분리

    @GetMapping("/restaurants") // 가게목록 반환 api
    public List<Restaurant> list(){
        
        List<Restaurant> restaurants = repository.findAll(); // repository.findAll() 메서드로 가게목록 반환

        return restaurants;
    }

    @GetMapping("/restaurants/{id}") // 특정 가게상세 반환 api
    public Restaurant detail(@PathVariable("id") Long id){

        List<Restaurant> restaurants = repository.findAll(); // repository.findAll() 메서드로 가게목록 반환

        Restaurant restaurant = restaurants.stream() // java의 stream사용
                .filter(r -> r.getId().equals(id)) // 리스트에 들어있는 restaurant의 id중 요청들어오는 id와 같은것이 있어야하고
                .findFirst() // 그중 첫번째값을 골라(id는 유니크한 값이기때문에 어차피 하나밖에 없을것이다)
                .get(); // 가져오라는것이다.
                // .get(); 을 지우고 orElse(null); 을 넣어도 정상작동하는데 이것은 요청들어오는값과 일치하는 값이 없을때 표시할값을 orElse()안에 적는것이다 여기서는 null을 적었으니 일치하는값으없을때 null이 반환될것이다.

        return restaurant;
    }

}

  

private RestaurantRepository repository = new RestaurantRepository();

중복되는 코드를 RestaurantRepository 클래스에 분리해놓은것을 확인할 수 있다.

#3 컨트롤러에서 id값에 따른 객체불러오는 기능 분리(1)

/main/~/interfaces/RestaurantController.java

@GetMapping("/restaurants/{id}") // 특정 가게상세 반환 api
public Restaurant detail(@PathVariable("id") Long id){
  
List<Restaurant> restaurants = repository.findAll(); // repository.findAll() 메서드로 가게목록 반환
  

Restaurant restaurant = restaurants.stream() // java의 stream사용
                .filter(r -> r.getId().equals(id)) // 리스트에 들어있는 restaurant의 id중 요청들어오는 id와 같은것이 있어야하고
                .findFirst() // 그중 첫번째값을 골라(id는 유니크한 값이기때문에 어차피 하나밖에 없을것이다)
                .get(); // 가져오라는것이다.
                // .get(); 을 지우고 orElse(null); 을 넣어도 정상작동하는데 이것은 요청들어오는값과 일치하는 값이 없을때 표시할값을 orElse()안에 적는것이다 여기서는 null을 적었으니 일치하는값으없을때 null이 반환될것이다.
  }

현재 해당코드는 컨트롤러에서, 가게의 전체리스트를 불러와 요청되는 id값에 따른 값을 추출해내고 있다.
이것은 컨트롤러의 역할과 맞지 않으므로 이부분을 변경할것이다.

#4 컨트롤러에서 id값에 따른 객체불러오는 기능 분리(2)

main/~/domain/RestaurantRepository.java

package kr.co.fastcampus.eatgo.domain;

import java.util.ArrayList;
import java.util.List;

public class RestaurantRepository {

    private List<Restaurant> restaurants = new ArrayList<>(); // 가게목록 담을 리스트

    public RestaurantRepository(){ // 생성자를 이용해 가게 객체 추가
        restaurants.add(new Restaurant(1004L,"Bob zip", "Seoul"));
        restaurants.add(new Restaurant(2020L, "Cyber Food", "Seoul"));
    }

    public List<Restaurant> findAll() { // 가게목록 반환 
        return restaurants;
    }

    public Restaurant findById(Long id) { // 특정가게 상세 반환

        return restaurants.stream()
                .filter(r -> r.getId().equals(id))
                .findFirst()
                .orElse(null);
    }
}

/main/~/interfaces/RestaurantController.java

package kr.co.fastcampus.eatgo.interfaces;

import kr.co.fastcampus.eatgo.domain.Restaurant;
import kr.co.fastcampus.eatgo.domain.RestaurantRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

@RestController
public class RestaurantController {

    private RestaurantRepository repository = new RestaurantRepository(); // 중복되는 코드를 RestaurantRepository 클래스로 분리

    @GetMapping("/restaurants") // 가게목록 반환 api
    public List<Restaurant> list(){

        List<Restaurant> restaurants = repository.findAll(); // repository.findAll() 메서드로 가게목록 반환

        return restaurants;
    }

    @GetMapping("/restaurants/{id}") // 특정 가게상세 반환 api
    public Restaurant detail(@PathVariable("id") Long id){

        Restaurant restaurant = repository.findById(id); // repository.findById(id) 메서드로 특정 가게상세 반환

        return restaurant;
    }

}

RestaurantRepository 클래스를 이용하여 컨트롤러를 굉장히 단순화시킨것을 확인할 수 있다.

profile
Software Developer

0개의 댓글