문제 1
원래 코드
package com.group.libraryapp.ex.fruitstore.controller;
import com.group.libraryapp.ex.fruitstore.dto.request.FruitRequest;
import com.group.libraryapp.ex.fruitstore.dto.request.SellInfoRequest;
import com.group.libraryapp.ex.fruitstore.dto.response.ShowFruitResponse;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;
@RestController
public class FruitStoreController {
private final JdbcTemplate jdbcTemplate;
public FruitStoreController(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@PostMapping("/api/v1/fruit")
public void saveFruitInfo(@RequestBody FruitRequest request) {
String sql = "INSERT INTO fruit(name, price, warehousingDate) VALUES (?, ?, ?) ";
jdbcTemplate.update(sql, request.getName(), request.getPrice(), request.getWarehousingDate());
}
@PutMapping("/api/v1/fruit")
public void sellFruitInfo(@RequestBody SellInfoRequest request) {
String sql = "UPDATE fruit SET status = TRUE WHERE id = ?";
jdbcTemplate.update(sql, request.getId());
}
@GetMapping("/api/v1/fruit/stat")
public ShowFruitResponse showfruitInfo(@RequestParam String name) {
String saleSql = "SELECT sum(price) from fruit where status = TRUE";
String notSaleSql = "SELECT sum(price) from fruit where status = FALSE";
Long salesAmount = jdbcTemplate.queryForObject(saleSql, Long.class);
Long notSalesAmount = jdbcTemplate.queryForObject(notSaleSql, Long.class);
return new ShowFruitResponse(salesAmount, notSalesAmount);
}
}
Controller
package com.group.libraryapp.ex.day6.controller;
import com.group.libraryapp.ex.day6.service.FruitService;
import com.group.libraryapp.ex.fruitstore.dto.request.FruitRequest;
import com.group.libraryapp.ex.fruitstore.dto.request.SellInfoRequest;
import com.group.libraryapp.ex.fruitstore.dto.response.ShowFruitResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;
@RestController
public class FruitController {
private final FruitService fruitService;
private final JdbcTemplate jdbcTemplate;
public FruitController(JdbcTemplate jdbcTemplate) {
this.fruitService = new FruitService(jdbcTemplate);
this.jdbcTemplate = jdbcTemplate;
}
@PostMapping("/api/v2/fruit")
public void saveFruitInfo(@RequestBody FruitRequest request) {
fruitService.saveFruitInfo(request);
}
@PutMapping("/api/v2/fruit")
public void sellFruitInfo(@RequestBody SellInfoRequest request) {
fruitService.sellFruitInfo(request);
}
@GetMapping("/api/v2/fruit/stat")
public ResponseEntity<ShowFruitResponse> showFruitInfo(@RequestParam String name) {
ShowFruitResponse response = fruitService.showFruitInfo(name);
return ResponseEntity.ok(response);
}
}
Service
package com.group.libraryapp.ex.day6.service;
import com.group.libraryapp.ex.day6.repository.FruitMySqlRepository;
import com.group.libraryapp.ex.fruitstore.dto.request.FruitRequest;
import com.group.libraryapp.ex.fruitstore.dto.request.SellInfoRequest;
import com.group.libraryapp.ex.fruitstore.dto.response.ShowFruitResponse;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class FruitService {
private final FruitMySqlRepository fruitMySqlRepository;
public FruitService(JdbcTemplate jdbcTemplate) {
fruitMySqlRepository = new FruitMySqlRepository(jdbcTemplate);
}
public void saveFruitInfo(FruitRequest request) {
fruitMySqlRepository.saveFruitInfo(request.getName(), request.getPrice(), request.getWarehousingDate());
}
public void sellFruitInfo(SellInfoRequest request) {
fruitMySqlRepository.sellFruitInfo(request.getId());
}
public ShowFruitResponse showFruitInfo(String name) {
return fruitMySqlRepository.showFruitInfo(name);
}
}
Repository
package com.group.libraryapp.ex.day6.repository;
import com.group.libraryapp.ex.fruitstore.dto.response.ShowFruitResponse;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import java.time.LocalDate;
@Primary
public class FruitMySqlRepository{
private final JdbcTemplate jdbcTemplate;
public FruitMySqlRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void saveFruitInfo(String name, long price, LocalDate warehousingDate) {
String sql = "INSERT INTO fruit(name, price, warehousingDate) VALUES (?, ?, ?) ";
jdbcTemplate.update(sql, name, price, warehousingDate);
}
public void sellFruitInfo(long id) {
String sql = "UPDATE fruit SET status = TRUE WHERE id = ?";
jdbcTemplate.update(sql, id);
}
public ShowFruitResponse showFruitInfo(String name) {
String saleSql = "SELECT sum(price) from fruit where status = TRUE";
String notSaleSql = "SELECT sum(price) from fruit where status = FALSE";
Long salesAmount = jdbcTemplate.queryForObject(saleSql, Long.class);
Long notSalesAmount = jdbcTemplate.queryForObject(notSaleSql, Long.class);
return new ShowFruitResponse(salesAmount, notSalesAmount);
}
}
Request
POST
PUT
DB
GET
문제 2
원래 만든 Repository를 FruitMySqlRepository로 바꾸고 새로 FruitRepository와 FruitRepository를 만들고 @Primary를 사용해서 Service가 사용할 Repositroy를 정해주었다.
근데 이렇게 하는 게 맞나?
Interface
package com.group.libraryapp.ex.day6.repository;
public interface FruitRepository {
public void saveFruitInfo(String name);
}
FruitMemoryRepository
package com.group.libraryapp.ex.day6.repository;
import java.util.ArrayList;
import java.util.List;
public class FruitMemoryRepository implements FruitRepository {
private final List<String> fruits = new ArrayList<>();
@Override
public void saveFruitInfo(String name) {
fruits.add(name);
}
}
FruitMySqlRepository
package com.group.libraryapp.ex.day6.repository;
import com.group.libraryapp.ex.fruitstore.dto.response.ShowFruitResponse;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import java.time.LocalDate;
@Primary
public class FruitMySqlRepository implements FruitRepository{
private final JdbcTemplate jdbcTemplate;
public FruitMySqlRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void saveFruitInfo(String name, long price, LocalDate warehousingDate) {
String sql = "INSERT INTO fruit(name, price, warehousingDate) VALUES (?, ?, ?) ";
jdbcTemplate.update(sql, name, price, warehousingDate);
}
public void sellFruitInfo(long id) {
String sql = "UPDATE fruit SET status = TRUE WHERE id = ?";
jdbcTemplate.update(sql, id);
}
public ShowFruitResponse showFruitInfo(String name) {
String saleSql = "SELECT sum(price) from fruit where status = TRUE";
String notSaleSql = "SELECT sum(price) from fruit where status = FALSE";
Long salesAmount = jdbcTemplate.queryForObject(saleSql, Long.class);
Long notSalesAmount = jdbcTemplate.queryForObject(notSaleSql, Long.class);
return new ShowFruitResponse(salesAmount, notSalesAmount);
}
@Override
public void saveFruitInfo(String name) {
}
}
출처
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인
최태현 | Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한
www.inflearn.com
틀린 내용이나 부족한 부분 댓글로 알려주시면 추가로 공부해서 수정하겠습니다 감사합니다.