문제 1
컨트롤러
@RestController
public class FruitController {
private final FruitService fruitService;
public FruitController(JdbcTemplate jdbcTemplate) {
this.fruitService = new FruitService(jdbcTemplate);
}
@PostMapping("/api/v1/fruit")
public void saveFruit(@RequestBody FruitCreateRequest request) {
fruitService.saveFruit(request);
}
@PutMapping("/api/v1/fruit")
public void updateFruit(@RequestBody FruitUpdateRequest request) {
fruitService.updateFruit(request.getId());
}
@GetMapping("/api/v1/fruit/stat")
public FruitStatResponse fruitSoldStatus (@RequestParam String name) {
return fruitService.getFruitStat(name);
}
}
서비스
public class FruitService {
private final FruitRepository fruitRepository;
public FruitService(JdbcTemplate jdbcTemplate) {
this.fruitRepository = new FruitRepository(jdbcTemplate);
}
public void saveFruit(FruitCreateRequest request) {
fruitRepository.saveFruit(request.getName(), request.getPrice(), request.getWarehousingDate());
}
public void updateFruit(long id) {
if (fruitRepository.isFruitNotExist(id)) {
throw new IllegalArgumentException();
}
fruitRepository.updateFruit(id);
}
public FruitStatResponse getFruitStat (String name) {
if (fruitRepository.isFruitNameNotExist(name)) {
throw new IllegalArgumentException();
}
return fruitRepository.getFruitStat(name);
}
}
리포지토리
public class FruitRepository {
private final JdbcTemplate jdbcTemplate;
public FruitRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public boolean isFruitNotExist(long id) {
String readSql = "SELECT * FROM fruit WHERE id = ?";
return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, id).isEmpty();
}
public boolean isFruitNameNotExist(String name) {
String readSql = "SELECT * FROM fruit WHERE name = ?";
return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty();
}
public void saveFruit(String name, long price, LocalDate stocked_date) {
String sql = "INSERT INTO fruit (name, price, stocked_date) VALUES (?, ?, ?)";
jdbcTemplate.update(sql, name, price, stocked_date);
}
public void updateFruit(long id) {
String sql = "UPDATE fruit SET is_sold = 1 WHERE id = ?";
jdbcTemplate.update(sql, id);
}
public FruitStatResponse getFruitStat(String name) {
String salesSql = "SELECT sum(price) FROM fruit WHERE is_sold = 1";
String notSalesSql = "SELECT sum(price) FROM fruit WHERE is_sold = 0";
Long salesAmount = jdbcTemplate.queryForObject(salesSql, Long.class);
Long notSalesAmount = jdbcTemplate.queryForObject(notSalesSql, Long.class);
return new FruitStatResponse(salesAmount, notSalesAmount);
}
}
문제 2
인터페이스
public interface FruitRepository {
boolean isFruitNotExist(long id);
boolean isFruitNameNotExist(String name);
void saveFruit(String name, long price, LocalDate stocked_date);
void updateFruit(long id);
FruitStatResponse getFruitStat(String name);
}
리포지토리
@Repository
@Primary
public class FruitMySqlRepository implements FruitRepository {
private final JdbcTemplate jdbcTemplate;
public FruitMySqlRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public boolean isFruitNotExist(long id) {
String readSql = "SELECT * FROM fruit WHERE id = ?";
return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, id).isEmpty();
}
@Override
public boolean isFruitNameNotExist(String name) {
String readSql = "SELECT * FROM fruit WHERE name = ?";
return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty();
}
@Override
public void saveFruit(String name, long price, LocalDate stocked_date) {
String sql = "INSERT INTO fruit (name, price, stocked_date) VALUES (?, ?, ?)";
jdbcTemplate.update(sql, name, price, stocked_date);
}
@Override
public void updateFruit(long id) {
String sql = "UPDATE fruit SET is_sold = 1 WHERE id = ?";
jdbcTemplate.update(sql, id);
}
@Override
public FruitStatResponse getFruitStat(String name) {
String salesSql = "SELECT sum(price) FROM fruit WHERE is_sold = 1 AND name = ?";
String notSalesSql = "SELECT sum(price) FROM fruit WHERE is_sold = 0 AND name = ?";
Long salesAmount = jdbcTemplate.queryForObject(salesSql, Long.class, name);
Long notSalesAmount = jdbcTemplate.queryForObject(notSalesSql, Long.class, name);
return new FruitStatResponse(salesAmount, notSalesAmount);
}
}
참고
https://inf.run/XKQg