일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 백준
- 탄막 스킬 범위
- 2020 KAKAO BLIND RECRUITMENT
- 원형
- 문자열 압축
- 윈도우
- AI Hub
- 우분투
- 강의실2
- 탄막
- 탄막 이동
- 자료구조 목차
- 수 만들기
- 영상 프레임 추출
- 회의실 배정
- mysqld.sock
- SWEA
- 3344
- 18249
- c#
- 알고리즘 목차
- 유니티
- 걷는건귀찮아
- 토글 그룹
- 알고리즘
- 마우스 따라다니기
- 3273
- MySQL
- 단어 수학
- 그리디알고리즘
- Today
- Total
와이유스토리
[스프링부트] 주문관리 API 서버 개발 본문
※ 주문관리 API 서버
Postman(https://www.postman.com/)을 이용해 아래 과제를 해결하였다.
https://school.programmers.co.kr/skill_check_assignments/232
※ 요건 1. API 응답 포맷
1. 상품 조회
ProductRestController.java의 return 부분에 ApiUtils.java에서 이미 구현된 success 함수를 추가하면 아래와 같이 Get 메소드가 성공적으로 동작한다.
return success(productService.findById(id).map(ProductDto::new).orElseThrow(() -> new NotFoundException("Could not found product for " + id)));
return success(productService.findAll().stream().map(ProductDto::new).collect(toList()));
2. 로그인
LoginRequest를 보면 principal, credentials가 Body로 필요하다. 각각 tester@gmail.com과 1234로 Post 메소드를 전송한다.
※ 요건 2. 공개용 API 및 인증 사용자용 API 구분
로그인이 성공하면 응답 token을 복사하여 헤더에 요건대로 추가한다. 인증 사용자용 API에 접근하기 위해서는 아래 헤더가 꼭 필요하다.
※ 요건 3. API 구현
orders 폴더 하위에 필요한 클래스(Entity, Dto, Repository, JdbcRepository, Service, RestController)를 전부 생성해 Users와 Products를 참고하여 아래 클래스를 채워넣으면 된다.
1. 주문 리뷰 작성
주문 번호로 주문 정보와 제품 정보를 찾아 주문 리뷰를 저장한다. 만약 주문 상태가 Complete가 아닌 경우와 제품 리뷰가 존재하는 경우는 checkArgument로 예외 처리한다.
주의할 점은 body가 누락된 경우를 NullPointerException으로 예외 처리하고, body의 content가 null일 때 illegalArgumentException 예외 처리를 해야 한다. 이를 위해 GeneralExceptionHandler에서 NullPointerException.class를 Bad Request Handler에 추가하고, ReviewService에서 checkArgument 함수를 실행한다. 아래는 body의 content가 null일 때 응답 결과이다.
예외 처리를 따로 하지 않으면 아래처럼 서버 에러가 나 다른 에러 처리가 되므로 테스트에 통과할 수 없다.
{
"success": false,
"response": null,
"error": {
"message": "Required request body is missing: public com.github.prgrms.utils.ApiUtils$ApiResult com.github.prgrms.orders.OrderRestController.reject(org.springframework.security.core.Authentication,java.lang.Long,com.github.prgrms.orders.OrderRequest)",
"status": 500
}
}
[ERROR] Failures:
[ERROR] OrderRestControllerTest.rejectFailureTest1:534 Range for response status value 500 expected:<CLIENT_ERROR> but was:<SERVER_ERROR>
2. 주문 조회
아래 SQL문을 이용해 Paging(Offset과 Size)을 할 수 있다.
"SELECT * FROM orders ORDER BY seq DESC LIMIT ? OFFSET ?"
또한, 주문을 조회할 때 리뷰 역시 조회해야 하므로 리뷰가 있으면 조회하고, 없으면 null로 반환한다.
3. 주문 접수 처리
Postman에서는 nginx로 오류가 나왔는데, 테스트할 때는 문제없이 통과되었다. 특히 reject를 Patch할 때, Body에서 string 타입을 여러개 받으면 에러가 나므로, OrderRequest로 Reject 메세지만 따로 저장할 수 있게 하였다. 중간에 생성자 접근제한자를 public이 아닌 protected로 해서 에러가 났었는데, 주의해야겠다.
※ 마무리
모든 요건을 만족시킨 후, 터미널에서 mvn clean test를 실행하면 test 29개를 모두 통과할 수 있다.
'프로젝트 > 백엔드' 카테고리의 다른 글
[도트타이머] 3. API 명세서 작성 (0) | 2022.12.13 |
---|---|
[도트타이머] 2. 스프링부트에 MySQL 연동 (0) | 2022.12.12 |
[도트타이머] 1. ERD모델 만들기(aka. 처음 설계할 때 잘하자) (0) | 2022.12.11 |
[스프링부트] Eclipse(Maven)/Intellij(Gradle)에서 Spring 설치 및 프로젝트 생성 (0) | 2022.07.28 |
[캡스톤A] 6. Django프로젝트 AWS에 배포하기 (0) | 2022.01.20 |