
์ ๊ฐ ์๊ฐํ๊ณ ์๋ ์ตํํ๋ ๊ฐ์ ์ถ์ฒ์ ๋๋ค!
์ด๊ฒ ์ ๋์๊ฐ..? ๋ฅผ ์ ์คํ ๊ฒฝํ์ค์ธ ์ค๋์ด๋ค. ์์งํ ๊ทธ๋ฅ ๋ญ๊ฐ ๋ญ์ง ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ณ ์์ด์.. ๊ทธ๋ฅ ํ๋ฒ ํด๋ณด์๋ ๋ง์์ผ๋ก ๊ฐ์๊ฐ ๋ซ๋ฆด๋ฏ์ด ๋ค์๋ณด๊ณ ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด์ง๋ง ๋น์ทํ๊ฒ ๋ฐ๋ผํด๋ดค๋ค. ์ด๋ ๊ฒ ํ๋๊ฒ ๋ง๋๊ฑด์ง.. ์ฒ์์ ์๋ํ์๋ ์ ๋๋ก ์ ํ์ด ์๋ผ์ ๊ทธ๋ฅ ํฌ๊ธฐํ์๋๋ฐ, ๊ณผ์ ๋ง๊ฐ ํ ์๊ฐ ์ ์ ์กฐ๊ธ๋ง ๋ ํด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ์๊ฒผ๋ค.
์๊ณ ๋ณด๋ ์คํ์ด ์๋์๋๊ฒ, FruitMemoryRepository๋ FruitMysqlRepository์ "implements FruitRepository" ์ด๊ฑธ ๋นผ๋จน์ด์ ๊ทธ๋ฌ๋๋ผ.. ๋ ์๋ํด๋ณด๊ธธ ์ํ๊ฑฐ ๊ฐ๋คใ ใ ใ ใ ใ
-> ๋ด๊ฐ ๋ชจ๋ฅด๋๊ฑฐ ์ธํฐํ์ด์ค,์ค๋ฒ๋ผ์ด๋,์์กด์ฑ..
FruitController.java
package com.group.libraryapp.controller.fourthAssignment;
import com.group.libraryapp.dto.fourth.request.SaveFruitRequest;
import com.group.libraryapp.dto.fourth.response.FruitFinalResponse;
import com.group.libraryapp.service.fruit.FruitService;
import org.springframework.web.bind.annotation.*;
@RestController
public class FruitController {
//์ถ๊ฐ
private final FruitService fruitService ;
//์ถ๊ฐ
public FruitController(FruitService fruitService){
this.fruitService = fruitService;
}
@PostMapping("/api/v1/fruit")
public void saveFruitInfo(@RequestBody SaveFruitRequest request) {
fruitService.saveFruitInfo(request);
}
@PutMapping("/api/v1/fruit")
public void updateFruit(@RequestBody SaveFruitRequest request){
fruitService.updateFruit(request);
}
@GetMapping("/api/v1/fruit/stat")
public FruitFinalResponse getFruits(@RequestParam String name) {
return fruitService.getFruit(name);
}
}
FruitService.java
package com.group.libraryapp.service.fruit;
import com.group.libraryapp.dto.fourth.request.SaveFruitRequest;
import com.group.libraryapp.dto.fourth.response.FruitFinalResponse;
import com.group.libraryapp.dto.fourth.response.FruitResponse;
import com.group.libraryapp.repository.fruit.FruitMysqlRepository;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class FruitService {
private final FruitMysqlRepository fruitRepository;
public FruitService(FruitMysqlRepository fruitRepository){
this.fruitRepository = fruitRepository;
}
public void saveFruitInfo( SaveFruitRequest request){
fruitRepository.saveFruit(request.getName(),request.getWarehousingDate(),request.getPrice());
}
public void updateFruit(SaveFruitRequest request){
//query() ํตํด ๋์ค๋๊ฒ ๋ฆฌ์คํธ์ธ๋ฐ, ๋ญ๋ผ๋ ์์ผ๋ฉด 0์ ๋ฃ์ด์ค๊ฑฐ๊ณ ์กฐํ๊ฐ ์๋๋ฉด ๋น์ด์์๊ฑฐ์.
boolean isFruitIdNotExist = fruitRepository.isFruitIdNotExist(request.getId());
if(isFruitIdNotExist){
throw new IllegalArgumentException();
}
fruitRepository.updateFruitSellStatus(request.getId());
}
public FruitFinalResponse getFruit(String name){
//๊ฐ์ ธ์จ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ rs ๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ userResponseํํ๋ก ๋ฐ๊ฟ์ค.์ด๊ฑฐ๋ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ์ธ๋ฐ, ์ ์ฒด์์ ๋ฐํํ๋๊ฑด ๊ฒฐ๊ตญ query๋ก ๊ฐ์ธ์ ๋์ค๋ฏ๋ก ๋ฆฌ์คํธ ํ์
.
boolean isFruitNameNotExist = fruitRepository.isFruitNameNotExist(name);
if(isFruitNameNotExist){
throw new IllegalArgumentException();
}else{
List<FruitResponse> fruitList = fruitRepository.getFruit(name);
long salesTotal=0;
long notSalesTotal=0;
for(int i=0;i<fruitList.size();i++){
if(fruitList.get(i).isSell()){
salesTotal = salesTotal + fruitList.get(i).getSalesAmount();
}else{
notSalesTotal = notSalesTotal + fruitList.get(i).getSalesAmount();
}
}
return new FruitFinalResponse(salesTotal,notSalesTotal);
}
}
}
FruitMysqlRepository.java
package com.group.libraryapp.repository.fruit;
import com.group.libraryapp.dto.fourth.response.FruitResponse;
import com.group.libraryapp.service.fruit.FruitService;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.time.LocalDate;
import java.util.List;
@Repository
public class FruitMysqlRepository{
private final JdbcTemplate jdbcTemplate;
public FruitMysqlRepository(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
public void saveFruit( String fruitName, LocalDate warehousingDate, long price){
String sql = "INSERT INTO fruit(name,warehousingDate,price) VALUES(?,?,?)";
jdbcTemplate.update(sql,fruitName,warehousingDate,price);
}
public boolean isFruitIdNotExist(long id){
String readSql ="SELECT * from fruit WHERE id = ?";
return jdbcTemplate.query(readSql, (rs, rowNum) -> 0,id).isEmpty();
}
public void updateFruitSellStatus(long id){
String sql = "UPDATE fruit SET isSell = ? WHERE id = ?";
jdbcTemplate.update(sql,true,id);
}
public boolean isFruitNameNotExist(String name){
String sql = "SELECT * FROM fruit WHERE name = ?";
return jdbcTemplate.query(sql, (rs, rowNum) -> 0,name).isEmpty();
}
public List<FruitResponse> getFruit(String name){
String isSellsql = "SELECT * FROM fruit WHERE name = ?";
return jdbcTemplate.query(isSellsql,(rs, rowNum) -> {
long price = rs.getLong("price");
boolean isSell = rs.getBoolean("isSell");
return new FruitResponse(price,isSell);
},name);
}
}
FruitController.java
package com.group.libraryapp.controller.fourthAssignment;
import com.group.libraryapp.dto.fourth.request.SaveFruitRequest;
import com.group.libraryapp.dto.fourth.response.FruitFinalResponse;
import com.group.libraryapp.service.fruit.FruitService;
import org.springframework.web.bind.annotation.*;
@RestController
public class FruitController {
//์ถ๊ฐ
private final FruitService fruitService ;
//์ถ๊ฐ
public FruitController(FruitService fruitService){
this.fruitService = fruitService;
}
@PostMapping("/api/v1/fruit")
public void saveFruitInfo(@RequestBody SaveFruitRequest request) {
fruitService.saveFruitInfo(request);
}
@PutMapping("/api/v1/fruit")
public void updateFruit(@RequestBody SaveFruitRequest request){
fruitService.updateFruit(request);
}
@GetMapping("/api/v1/fruit/stat")
public FruitFinalResponse getFruits(@RequestParam String name) {
return fruitService.getFruit(name);
}
}
FruitService.java
package com.group.libraryapp.service.fruit;
import com.group.libraryapp.dto.fourth.request.SaveFruitRequest;
import com.group.libraryapp.dto.fourth.response.FruitFinalResponse;
import com.group.libraryapp.dto.fourth.response.FruitResponse;
import com.group.libraryapp.repository.fruit.FruitRepository;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class FruitService {
private final FruitRepository fruitRepository;
public FruitService(FruitRepository fruitRepository){
this.fruitRepository = fruitRepository;
}
public void saveFruitInfo( SaveFruitRequest request){
fruitRepository.saveFruit(request.getName(),request.getWarehousingDate(),request.getPrice());
}
public void updateFruit(SaveFruitRequest request){
//query() ํตํด ๋์ค๋๊ฒ ๋ฆฌ์คํธ์ธ๋ฐ, ๋ญ๋ผ๋ ์์ผ๋ฉด 0์ ๋ฃ์ด์ค๊ฑฐ๊ณ ์กฐํ๊ฐ ์๋๋ฉด ๋น์ด์์๊ฑฐ์.
boolean isFruitIdNotExist = fruitRepository.isFruitIdNotExist(request.getId());
if(isFruitIdNotExist){
throw new IllegalArgumentException();
}
fruitRepository.updateFruitSellStatus(request.getId());
}
public FruitFinalResponse getFruit(String name){
//๊ฐ์ ธ์จ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ rs ๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ userResponseํํ๋ก ๋ฐ๊ฟ์ค.์ด๊ฑฐ๋ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ์ธ๋ฐ, ์ ์ฒด์์ ๋ฐํํ๋๊ฑด ๊ฒฐ๊ตญ query๋ก ๊ฐ์ธ์ ๋์ค๋ฏ๋ก ๋ฆฌ์คํธ ํ์
.
boolean isFruitNameNotExist = fruitRepository.isFruitNameNotExist(name);
if(isFruitNameNotExist){
throw new IllegalArgumentException();
}else{
List<FruitResponse> fruitList = fruitRepository.getFruit(name);
long salesTotal=0;
long notSalesTotal=0;
for(int i=0;i<fruitList.size();i++){
if(fruitList.get(i).isSell()){
salesTotal = salesTotal + fruitList.get(i).getSalesAmount();
}else{
notSalesTotal = notSalesTotal + fruitList.get(i).getSalesAmount();
}
}
return new FruitFinalResponse(salesTotal,notSalesTotal);
}
}
}
FruitRepository.java
package com.group.libraryapp.repository.fruit;
import com.group.libraryapp.dto.fourth.response.FruitResponse;
import java.time.LocalDate;
import java.util.List;
public interface FruitRepository
{
void saveFruit(String fruitName, LocalDate warehousingDate, long price);
boolean isFruitIdNotExist(long id);
void updateFruitSellStatus(long id);
boolean isFruitNameNotExist(String name);
List<FruitResponse> getFruit(String name);
}
FruitMemoryRepository.java
package com.group.libraryapp.repository.fruit;
import com.group.libraryapp.dto.fourth.response.FruitResponse;
import org.springframework.stereotype.Repository;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
@Repository
public class FruitMemoryRepository implements FruitRepository {
List<Fruit> fruits = new ArrayList<>();
long id = 0;
public void saveFruit(String fruitName, LocalDate warehousingDate, long price){
id++;
Fruit fruit = new Fruit(fruitName,warehousingDate,price,id,false);
fruits.add(fruit);
}
public boolean isFruitIdNotExist(long id){
boolean result = false;
for (Fruit fruit : fruits) {
if(fruit.getId()==id){
result = false;
}else{
result= true;
}
}
return result;
}
public void updateFruitSellStatus(long id){
for (Fruit fruit : fruits) {
if(fruit.getId()==id){
fruit.isSell = true;
}
}
}
public boolean isFruitNameNotExist(String name){
boolean result = false;
for (Fruit fruit : fruits) {
if(fruit.getFruitName().equals(name)){
result = false;
}else{
result= true;
}
}
return result;
}
public List<FruitResponse> getFruit(String name){
List<FruitResponse> test = new ArrayList<>();
for (Fruit fruit : fruits) {
if(fruit.getFruitName().equals(name)) {
FruitResponse fruitResponse = new FruitResponse(fruit.getPrice(),fruit.isSell());
test.add(fruitResponse);
}
}
return test;
}
}
FruitMysqlRepository.java
package com.group.libraryapp.repository.fruit;
import com.group.libraryapp.dto.fourth.response.FruitResponse;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.time.LocalDate;
import java.util.List;
@Repository
@Primary
public class FruitMysqlRepository implements FruitRepository{
private final JdbcTemplate jdbcTemplate;
public FruitMysqlRepository(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
public void saveFruit( String fruitName, LocalDate warehousingDate, long price){
String sql = "INSERT INTO fruit(name,warehousingDate,price) VALUES(?,?,?)";
jdbcTemplate.update(sql,fruitName,warehousingDate,price);
}
public boolean isFruitIdNotExist(long id){
String readSql ="SELECT * from fruit WHERE id = ?";
return jdbcTemplate.query(readSql, (rs, rowNum) -> 0,id).isEmpty();
}
public void updateFruitSellStatus(long id){
String sql = "UPDATE fruit SET isSell = ? WHERE id = ?";
jdbcTemplate.update(sql,true,id);
}
public boolean isFruitNameNotExist(String name){
String sql = "SELECT * FROM fruit WHERE name = ?";
return jdbcTemplate.query(sql, (rs, rowNum) -> 0,name).isEmpty();
}
public List<FruitResponse> getFruit(String name){
String isSellsql = "SELECT * FROM fruit WHERE name = ?";
return jdbcTemplate.query(isSellsql,(rs, rowNum) -> {
long price = rs.getLong("price");
boolean isSell = rs.getBoolean("isSell");
return new FruitResponse(price,isSell);
},name);
}
}
Fruit.java
package com.group.libraryapp.repository.fruit;
import java.time.LocalDate;
public class Fruit {
String fruitName;
LocalDate warehousingDate;
long price;
long id;
boolean isSell;
public Fruit(String fruitName, LocalDate warehousingDate, long price,long id,boolean isSell) {
this.fruitName = fruitName;
this.warehousingDate = warehousingDate;
this.price = price;
this.id = id;
this.isSell = isSell;
}
public String getFruitName() {
return fruitName;
}
public LocalDate getWarehousingDate() {
return warehousingDate;
}
public long getPrice() {
return price;
}
public long getId() {
return id;
}
public boolean isSell() {
return isSell;
}
}
-> ๋๋ฆฌ์, 2023-01-01 , 10000 ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋ณด๊ฒ ๋ค.

-> 200, ok ๊ฐ ๋ด๋ค.

-> ๋๋ฆฌ์์ด ์ ๋๋ก ๋ค์ด๊ฐ๋์ง, ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ ๊ฐ์ ธ์๋ณด๊ฒ ๋ค.

-> ๋ฐฉ๊ธ ์ ๋ ฅํ ๋๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ArrayList์ ์ ๋ค์ด๊ฐ๋ค.

-> ์ฐธ๊ณ ๋ก, mysql db์๋ ๋๋ฆฌ์์ ์๋ค. ๊ณ ๋ก,, ๋ ์ฑ๊ณตํ ๊ฒ์ด๋ค..!

์ด๋ฒ์๋ ํ๋ฆฐ ๊ณผ์ผ์ ํ์ํด๋ณด์. ํ
์คํธ๋ฅผ ์ํด ArrayList์ ํํ์ผ,1500์์ ๋ฃ์ด๋ณด๊ฒ ๋ค. ์์ ๋๊ฐ์ ๊ณผ์ผ์ ๋ฃ์ด๋ดค์ง๋ง, ๋๋ ๊ณผ์ผ ์ข
๋ฅ๋ณ๋ก arraylist๋ฅผ ๋ง๋ค๊ฒ ํด๋์ id =1์ด๋ค.


ํํ์ผ 15000์์ด salesAmount์ ์ง๊ณ๋๋ค.

20000์์ง๋ฆฌ ํํ์ผ๋ฅผ ๋ ๋ฃ์ด๋ดค๋ค. ๋ฌผ๋ก ์์ ์ ์ํ์ผ๋, ์ด 20000์์ notSales์ ์ง๊ณ๋์ผ ํ๋ค.

๋ด ์์๋๋ก์ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.

-> ์ด๋ฒ์๋ Mysql์ ์ค์ธ๋จธ์ค์ผ, 2023-01-21 , 20000 ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋ณด๊ฒ ๋ค. 200 ok๊ฐ ๋ด์ผ๋, mysql ์ ํ์ธํด๋ณด์

-> ์ด๋ฒ์ mysql์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค..

-> ์ค์ธ๋จธ์ค์ผ์ด ํ๋ ธ๋ค๊ณ ๋ฐ๊ฟ๋ณด์. id=8์ด๋ค.

-> ์๊น๋ ๋ค๋ฅด๊ฒ isSell ์ด true, ์ฆ 1๋ก ๋ณ๊ฒฝ๋๋ค(์จ-์ต)
