[인프런 워밍업 클럽] 6일차 과제
2024.02.26

1. controller에서 service를 호출하고 service에서 repository를 호출해서 가져와 쓰는 상황을 만들어서 해보자
FruitRepository를 FruitMemoryRepository와 FruitSqlRepository로 나누어 보자
<Fruit Controller>
@RestController
public class FruitController {
private final FruitService fruitService;
public FruitController(FruitService fruitService) {
this.fruitService = fruitService;
}
@PostMapping("/api/v1/fruit")
public void saveFruit(@RequestBody Fruit fruit){
fruitService.saveFruit(fruit);
}
@PutMapping("/api/v1/fruit")
public void sellFruit(@RequestBody Map<String,Long> body){
fruitService.sellFruit(body.get("id"));
}
@GetMapping("/api/v1/fruit")
public FruitResponse calcPrice(@RequestParam String name){
return fruitService.calcPrice(name);
}
}
<FruitService>
@Service
public class FruitService {
private final FruitRepository fruitRepository;
public FruitService(FruitRepository fruitRepository) {
this.fruitRepository = fruitRepository;
}
public void saveFruit(Fruit fruit){
fruitRepository.saveFruit(fruit);
}
public void sellFruit(long id){
fruitRepository.sellFruit(id);
}
public FruitResponse calcPrice(String name){
return fruitRepository.calcPrice(name);
}
}
<FruitRepository>
@Repository
public class FruitRepository {
private final JdbcTemplate jdbcTemplate;
public FruitMySqlRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void saveFruit(Fruit fruit){
String sql = "INSERT INTO fruit (name,warehousingDate,price) VALUES (?,?,?)";
jdbcTemplate.update(sql,fruit.getName(),fruit.getWarehousingDate(),fruit.getPrice());
}
public void sellFruit(long id){
String sql = "UPDATE fruit SET isSold=1 WHERE id=?";
jdbcTemplate.update(sql,id);
}
public FruitResponse calcPrice(String name){
String sql1 = "SELECT SUM(price) FROM fruit WHERE name=? AND isSold=?";
String sql2 = "SELECT SUM(price) FROM fruit WHERE name=? AND isSold=?";
long salesAmount = jdbcTemplate.queryForObject(sql1,Long.class,name,1);
long notSalesAmount = jdbcTemplate.queryForObject(sql2,Long.class,name,0);
return new FruitResponse(salesAmount,notSalesAmount);
}
}
<문제 2번> FruitRepository를 FruitMemoryRepository 와 FruitMySqlRepository로 나누기
@Primary 어노테이션 활용하기
<FryitRepository>
public interface FruitRepository {
void saveFruit(Fruit fruit);
void sellFruit(long id);
FruitResponse calcPrice(String name);
}
<FruitMySqlRepository>
@Repository
@Primary
public class FruitMySqlRepository implements FruitRepository {
private final JdbcTemplate jdbcTemplate;
public FruitMySqlRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void saveFruit(Fruit fruit){
String sql = "INSERT INTO fruit (name,warehousingDate,price) VALUES (?,?,?)";
jdbcTemplate.update(sql,fruit.getName(),fruit.getWarehousingDate(),fruit.getPrice());
}
public void sellFruit(long id){
String sql = "UPDATE fruit SET isSold=1 WHERE id=?";
jdbcTemplate.update(sql,id);
}
public FruitResponse calcPrice(String name){
String sql1 = "SELECT SUM(price) FROM fruit WHERE name=? AND isSold=?";
String sql2 = "SELECT SUM(price) FROM fruit WHERE name=? AND isSold=?";
long salesAmount = jdbcTemplate.queryForObject(sql1,Long.class,name,1);
long notSalesAmount = jdbcTemplate.queryForObject(sql2,Long.class,name,0);
return new FruitResponse(salesAmount,notSalesAmount);
}
}
<FruitMemoryRepository>
@Repository
public class FruitMemoryRepository implements FruitRepository{
private final List<Fruit> fruits = new ArrayList<>();
@Override
public void saveFruit(Fruit fruit) {
fruits.add(fruit);
}
@Override
public void sellFruit(long id) {
Fruit fruit = fruits.get(id);
if(fruit!= null){
fruit.setSold(1);
}
}
@Override
public FruitResponse calcPrice(String name) {
long num1 = fruits.stream().filter(f -> f.getName().equals(name) && f.isSold()).mapToLong(Fruit::getPrice).sum();
long num2 = fruits.stream().filter(f -> f.getName().equals(name) && !f.isSold()).mapToLong(Fruit::getPrice).sum();
return new FruitResponse(num1,num2);
}
}
시간이 너무 부족하여 고민하는 시간이 너무 부족했고 고민해보다가 결국 다른 사람들것을 참고하면서 이해가 잘되는 코드를 찾아 내것으로 이해하는 식의 과제를 하였습니다.
조금씩의 성장하는 모습이 있어야 하는데 그러는 기미가 별로 보이지 않아 많이 답답하며서 초조해지니 더 손에 잘 안잡히는거 같습니다. 조금 더 전진해보겠습니다.
댓글을 작성해보세요.