본문 바로가기
카테고리 없음

인프런 워밍업 클럽 1기_BE 6일차 과제

by 엔 터 2024. 5. 13.

 

문제 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) {

    }
}

 

 

 

출처

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C-%EC%98%AC%EC%9D%B8%EC%9B%90#

 

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인

최태현 | Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한

www.inflearn.com

 

틀린 내용이나 부족한 부분 댓글로 알려주시면 추가로 공부해서 수정하겠습니다 감사합니다.