게시글
블로그
전체 22024. 02. 23.
0
인프런 웜업 0기 - 과제 4
package com.group.libraryapp.controller.api.v1; import com.group.libraryapp.dto.fruit.request.FruitSellRequest; import com.group.libraryapp.dto.fruit.request.FruitCreateRequest; import com.group.libraryapp.dto.fruit.response.FruitResponse; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.web.bind.annotation.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; @RestController public class FruitController { private final JdbcTemplate jdbcTemplate; public FruitController(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @PostMapping("api/v1/fruit") // POST /fruit public void saveFruit(@RequestBody FruitCreateRequest request) { String sql = "INSERT INTO fruit (name, warehousingDate, price) VALUES (?, ?, ?)"; jdbcTemplate.update(sql, request.getName(), request.getWarehousingDate(), request.getPrice()); } @PutMapping("api/v1/fruit") // PUT /fruit public void sellFruit(@RequestBody FruitSellRequest request) { String checkSql = "SELECT * FROM fruit WHERE id = ?"; // 해당 id가 존재하지않을 시 예외처리 boolean isNotExist = jdbcTemplate.query(checkSql, (rs, rowNum) -> 0, request.getId()).isEmpty(); if (isNotExist) { throw new IllegalArgumentException(); } String sql = "UPDATE fruit SET sold = 1 WHERE id = ?"; jdbcTemplate.update(sql, request.getId()); } @GetMapping("api/v1/fruit/stat") // GET /fruit public FruitResponse getFruit(@RequestParam String name) { String checkSql = "SELECT * FROM fruit WHERE name = ?"; boolean isNotExist = jdbcTemplate.query(checkSql, (rs, rowNum) -> 0, name).isEmpty(); if (isNotExist) { throw new IllegalArgumentException(); } // 1) sold 여부에 따른 각 price의 최종합계를 구해온 뒤, 리스트에 추가. // 2) 최종 list를 순회하면서 sold 여부에 따른 최종합계 재계산후 반환. String sql = "SELECT sold, SUM(price) AS total_price FROM fruit WHERE name = ? GROUP BY sold"; List responses = jdbcTemplate.query(sql, (rs, rowNum) -> { FruitResponse response = new FruitResponse(0, 0); if (rs.getBoolean("sold")) response.setSalesAmount(rs.getLong("total_price")); else response.setNotSalesAmount(rs.getLong("total_price")); return response; }, name); FruitResponse finalResponse = new FruitResponse(0, 0); for (FruitResponse response : responses) { finalResponse.setSalesAmount(finalResponse.getSalesAmount() + response.getSalesAmount()); finalResponse.setNotSalesAmount(finalResponse.getNotSalesAmount() + response.getNotSalesAmount()); } return finalResponse; } } Fruit 테이블 생성 Post를 이용하여 Fruit 테이블에 'apple' 레코드 생성레코드 생성확인apple의 'sold' 필드를 true로 설정.레코드 변경여부 확인2개의 apple들을 더 추가하고, sold 필드는 설정하지않았음.sold 여부에 따른 최종가격 받아오기 확인
백엔드
・
인프런웜업클럽0기
・
자바
・
백엔드
2024. 02. 21.
0
인프런 웜업클럽 0기 - 과제 3 (람다와 익명클래스)
[키워드]익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스 [질문]자바의 람다식은 왜 등장했을까? 람다식으로 생성된 순수 함수는 함수형 인터페이스 (Functional Interface)로 선언 가능하여, 함수를 변수처럼 선언할 수 있게된다. 결과적으로, 익명 클래스에 관련된 장황한 코드를 줄이고 가독성을 높이게 됨. 함수형 프로그래밍을 지원하게 됨으로써 대용량 데이터 처리 성능 개선. 자바 8의 스트림 API를 람다식과 결합하면, 낮은수준의 스레딩 작업을 추상화하여 코드의 병렬적 실행을 쉽게 해줌.그 결과로써, 멀티코어의 프로세서의 전력을 완전히 활용할수 있도록 해줌. 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까? 람다식과 익명 클래스 모두 인터페이스의 구현을 즉석에서 제공함. 익명클래스는 전통적인 클래스 정의와 유사하지만, 람다는 화살표 (->)를 사용하여 더욱 간결한 구문을 사용 익명 내부의 클래스의 this는 익명 내부 클래스 자기 자신. 람다의 this는 람다를 포함하는 외부 인스턴스.
백엔드
・
웜업클럽-백엔드