2021-04-27-TIL
2021-04-27-TIL
HashMap to List using Stream
- https://stackoverflow.com/questions/29625529/hashmap-with-streams-in-java-8-streams-to-collect-value-of-map
Map 자체는 스트림을 만들지 않으므로 values(), keySet(), entrySet() 중 하나에서 스트림을 연다.
1
2
3
List<Item> items = itemMap.values().stream()
.filter(item -> item.isOnSale())
.collect(Collectors.toList());
Collectors.toList()는 반환하는 List의 구현 타입이나 변경 가능 여부를 보장하지 않는다. 특정 구현이 필요하면 toCollection(ArrayList::new)를 쓴다. 반대로 리스트를 맵으로 모으는 toMap은 키가 중복되면 IllegalStateException을 던지므로, 중복 가능성이 있으면 병합 함수를 받는 오버로드를 써야 한다.
커스텀 예외
- https://devbox.tistory.com/entry/Java-%EC%98%88%EC%99%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0
- https://woowacourse.github.io/javable/post/2020-08-17-custom-exception/
- https://kihoonkim.github.io/2017/09/09/java/noexception-in-stream-operations/
커스텀 예외를 만들 때 먼저 정할 것은 checked로 할지 unchecked로 할지다. Java 튜토리얼의 기준은 “If a client can reasonably be expected to recover from an exception, make it a checked exception.”(호출자가 예외에서 회복할 수 있다고 기대할 만하면 checked로 만든다)이다(Oracle Java Tutorials). 같은 글은 단지 throws 선언이 귀찮다는 이유로 RuntimeException을 상속하지 말라고도 적는다.
ItemNotFoundException처럼 도메인 상황이 이름에 드러나는 예외를 만들면, 표준 예외(IllegalArgumentException 등)보다 로그와 예외 처리 코드에서 의도를 읽기 쉽다. 세 번째 글은 스트림 람다 안에서 checked 예외를 다루는 문제를 다룬다. Function.apply 같은 함수형 인터페이스 메서드는 checked 예외를 선언하지 않으므로, 람다 안에서 던지려면 감싸서 unchecked로 바꿔야 한다.
@ResponseStatus
- https://www.baeldung.com/spring-response-status
@ResponseStatus는 핸들러 메서드나 예외 클래스에 붙여서 응답 상태 코드를 지정한다(Spring Javadoc).
1
2
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ItemNotFoundException extends RuntimeException { }
주의할 점이 있다. 예외 클래스에 붙이거나 reason 속성을 쓰면 Spring은 HttpServletResponse.sendError를 호출한다. 그러면 서블릿 컨테이너가 HTML 오류 페이지를 쓰는 경우가 많아서 REST API의 JSON 오류 응답과 맞지 않는다. Javadoc도 이런 경우에는 ResponseEntity를 반환 타입으로 쓰는 편이 낫다고 안내한다.
2021 백엔드 데브매칭 풀이
- https://prgms.tistory.com/55
TODO
- 임베디드 톰캣 서버를 nginx로 변경
- 사진을 S3 bucket에 넣으면 url이 자동으로 생성된다. 구현이 바뀌는것은 없고 그냥 url만 가져올 수 있다.
badge,delivery_type과 같이 미리 정해진 값들을 enum으로 미리 정의해놓고 사용- 더미 데이터 넣기
- toList를 null 처리 추가해야함
TODO를 하나씩 보면 다음과 같다.
- nginx는 톰캣을 대체한다기보다 앞에 두는 서버다. 정적 파일은 nginx가 직접 응답하고, API 요청은
proxy_pass로 톰캣에 넘기는 구성이 일반적이다(nginx Beginner’s Guide). - S3의 객체는
https://버킷이름.s3.리전.amazonaws.com/키형식의 URL로 주소를 가진다(Amazon S3 문서). 다만 버킷과 객체는 기본적으로 비공개이고 새 버킷은 Block Public Access가 모두 켜진 상태로 만들어진다. URL이 생긴다고 바로 브라우저에서 열리는 것은 아니므로 공개 정책이나 CloudFront 같은 배포 방식을 따로 정해야 한다. badge처럼 값의 범위가 정해진 필드를 enum으로 두면 오타 같은 잘못된 값을 컴파일 시점에 막을 수 있다. DB에는name()문자열로 저장하는 편이 안전하다.ordinal()은 상수 선언 순서가 바뀌면 값이 바뀐다.toList에 null 처리가 필요한 것은 DB에 해당 값이 없을 때 스트림을 열기 전에 NPE가 나기 때문이다. 빈 리스트를 기본값으로 두면 응답에서도null대신[]가 나가서 클라이언트 처리가 단순해진다.
댓글
아직 댓글이 없습니다