게시글
질문&답변
351쪽 질문
앗, 362쪽에 코드를 제공해주셨네요. 죄송합니다 ^^;
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 64
질문&답변
4주 2회차 과제 질문
작가님 빠른 답변 감사 드립니다! 죄송합니다. 제가 파이썬과 Fast API 입문한 지 얼마 안되서 그런지 아직 과제 요구 사항이 이해가 잘 되지 않습니다 ㅜㅜ. 아래 책의 예제 test_timeslot_api.py 에서 작가님 말씀을 참조하여, 18시 - 19시 정각 타임 슬롯을 먼저 생성 후, 테스트 케이스로 18시 30분 부터 19시 10분까지 진행되는 타임슬롯을 추가 하려는 테스트를 해보았는데, 중복 검사 테스트를 통과 하였습니다. 책 309쪽에서 작가님이 제공해주신 아래 코드가 모든 타임 슬롯 중복 검사를 잘 하는 것 같습니다. stmt = select(TimeSlot).where( and_( TimeSlot.calendar_id == user.calendar.id, TimeSlot.start_time payload.start_time ) ) result = await session.execute(stmt) existing_time_slots = result.scalars().all() for existing_time_slot in existing_time_slots: if any(day in existing_time_slot.weekdays for day in payload.weekdays): raise TimeSlotOverlapError()@pytest.mark.parametrize("start_time, end_time, weekdays, expected_status_code", [ (time(18, 30), time(19, 10), [calendar.MONDAY], status.HTTP_422_UNPROCESSABLE_CONTENT), ]) @pytest.mark.usefixtures("host_user_calendar") async def test_겹치는_시간대가_있는_경우_HTTP_422_응답을_한다( client_with_auth: TestClient, start_time: time, end_time: time, weekdays: list[int], expected_status_code: int, ): # 첫 번째 타임슬롯 생성 payload = { "start_time": time(18, 00).isoformat(), "end_time": time(19, 00).isoformat(), "weekdays": [calendar.MONDAY, calendar.TUESDAY, calendar.WEDNESDAY], } response = client_with_auth.post("/time-slots", json=payload) assert response.status_code == status.HTTP_201_CREATED # 두 번째 타임슬롯 생성 시도 payload = { "start_time": start_time.isoformat(), "end_time": end_time.isoformat(), "weekdays": weekdays, } print (payload) response = client_with_auth.post("/time-slots", json=payload) assert response.status_code == expected_status_code
- 좋아요수
- 0
- 댓글수
- 3
- 조회수
- 68
고민있어요
수강기간 연장
- 좋아요수
- 0
- 댓글수
- 1
- 조회수
- 411
블로그
전체 2
2024. 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는 람다를 포함하는 외부 인스턴스.
백엔드
・
웜업클럽-백엔드




