/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에서
현재 이 코드들이 완전히 중복되는 걸 확인할수있다.
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 클래스에 분리해놓은것을 확인할 수 있다.
/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값에 따른 값을 추출해내고 있다.
이것은 컨트롤러의 역할과 맞지 않으므로 이부분을 변경할것이다.
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 클래스를 이용하여 컨트롤러를 굉장히 단순화시킨것을 확인할 수 있다.