인프런 지식공유자 최태현 님의 자바 스프링부트 서버개발 올인원 강의 커리큘럼에 포함된 과제입니다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인
최태현 | Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한
www.inflearn.com

Controller
package com.group.libraryapp.controller.fruit;
import com.group.libraryapp.dto.fruit.request.FruitCreateRequest;
import com.group.libraryapp.dto.fruit.request.FruitUpdateRequest;
import com.group.libraryapp.dto.fruit.response.FruitPriceResponse;
import com.group.libraryapp.service.fruit.FruitService;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1/fruit")
public class FruitController {
private final FruitService fruitService;
private final JdbcTemplate jdbcTemplate;
public FruitController(FruitService fruitService, JdbcTemplate jdbcTemplate) {
this.fruitService = fruitService;
this.jdbcTemplate = jdbcTemplate;
}
@PostMapping("")
public void saveFruit(@RequestBody FruitCreateRequest request) {
fruitService.saveFruit(request);
}
@PutMapping("")
public void updateFruit(@RequestBody FruitUpdateRequest request) {
fruitService.updateFruit(request);
}
@GetMapping("/stat")
public FruitPriceResponse getFruitSellPrice(@RequestParam String name) {
return fruitService.getFruitSellPrice(name);
}
}
Service
package com.group.libraryapp.service.fruit;
import com.group.libraryapp.dto.fruit.request.FruitCreateRequest;
import com.group.libraryapp.dto.fruit.request.FruitUpdateRequest;
import com.group.libraryapp.dto.fruit.response.FruitPriceResponse;
import com.group.libraryapp.repository.fruit.FruitRepository;
import org.springframework.stereotype.Service;
@Service
public class FruitService {
private final FruitRepository fruitRepository;
public FruitService(JdbcTemplate jdbcTemplate) {
fruitRepository = new FruitRepository(jdbcTemplate);
}
public void saveFruit(FruitCreateRequest request) {
fruitRepository.saveFruit(request);
}
public void updateFruit(FruitUpdateRequest request) {
if (FruitRepository.isFruitNotExist(request) {
throw new IllegalArgumentException();
}
fruitRepository.updateFruit(request);
}
public FruitPriceResponse getFruitSellPrice(String name) {
return fruitRepository.getFruitSellPrice(name);
}
}
Repository
package com.group.libraryapp.repository.fruit;
import com.group.libraryapp.dto.fruit.request.FruitCreateRequest;
import com.group.libraryapp.dto.fruit.request.FruitUpdateRequest;
import com.group.libraryapp.dto.fruit.response.FruitPriceResponse;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class JdbcFruitRepository implements FruitRepository {
private final JdbcTemplate jdbcTemplate;
public JdbcFruitRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void saveFruit(FruitCreateRequest request) {
String sql = "insert into fruit(name, warehousingDate, price) values(?, ?, ?)";
jdbcTemplate.update(sql, request.getName(), request.getWarehousingDate(), request.getPrice());
}
public void updateFruit(FruitUpdateRequest request) {
String updateSql = "UPDATE fruit SET is_sold = ? WHERE id = ?";
jdbcTemplate.update(updateSql, true, request.getId());
}
public boolean isFruitNotExist(long id) {
String sql = "SELECT * FROM fruit WHERE id = ?";
return jdbcTemplate.query(sql, (rs, rowNum) -> 0, id).isEmpty();
}
public FruitPriceResponse getFruitSellPrice(String name) {
String sql = "SELECT " +
"SUM(CASE WHEN is_sold = true THEN price ELSE 0 END) AS salesAmount, " +
"SUM(CASE WHEN is_sold = false THEN price ELSE 0 END) AS notSalesAmount " +
"FROM fruit " +
"WHERE name = ?";
return jdbcTemplate.queryForObject(sql, (rs, rowNum) ->
new FruitPriceResponse(rs.getLong("salesAmount"), rs.getLong("notSalesAmount")), name);
}
}

FruitRepository를 인터페이스로 빼고 이를 구현하는 FruitMemoryRespository와 FruitMySqlRepository를 각각 작성하여 @Primary를 사용해 기본빈을 지정해준다.
package com.group.libraryapp.repository.fruit;
import com.group.libraryapp.dto.fruit.request.FruitCreateRequest;
import com.group.libraryapp.dto.fruit.request.FruitUpdateRequest;
import com.group.libraryapp.dto.fruit.response.FruitPriceResponse;
public interface FruitRepository {
void saveFruit(FruitCreateRequest request);
void updateFruit(FruitUpdateRequest request);
boolean isFruitNotExist(long id);
FruitPriceResponse getFruitSellPrice(String name);
}
@Repository
public class FruitMySqlRepository implements FruitRepository {
private final JdbcTemplate jdbcTemplate;
public FruitMySqlRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void saveFruit(FruitCreateRequest request) {
//
}
@Override
public void updateFruit(FruitUpdateRequest request) {
//
}
@Override
public boolean isFruitNotExist(long id) {
//
}
@Override
public FruitPriceResponse getFruitSellPrice(String name) {
//
}
}
@Qualifier 사용
@Service
public class FruitService {
private final FruitRepository fruitRepository;
public FruitServiceImpl(@Qualifier("fruitMemoryRepository") FruitRepository fruitRepository) {
this.fruitRepository = fruitRepository;
}
//
...
//
}
'인프런 워밍업 클럽 1기 - 백엔드' 카테고리의 다른 글
| 5일차 과제 - 클린코드 (0) | 2024.05.09 |
|---|---|
| 4일차 과제 - API 만들기 2 (0) | 2024.05.07 |
| 3일차 과제 - 람다식에 대해 (0) | 2024.05.03 |
| 2일차 과제 - api 만들기 (0) | 2024.05.01 |
| 1일차 과제 - 어노테이션(서버 개발을 위한 환경설정 및 네트워크 기초) (0) | 2024.04.29 |