본문 바로가기

Java14

여러 API 결과 조합(with 비동기) 최종 결과 데이터를 만들기 위해 여러 API 들을 호출하고, 얻어온 각 API 결과들을 조합하는 로직을 만든다고 해보자. 먼저 아래코드처럼 각 API 결과들을 순차적으로 가져와 조합하는 방법이 있다. @Service public class SimpleContext { @Autowired private FirstJobService firstJobService; @Autowired private SecondJobService secondJobService; @Autowired private ThirdJobService thirdJobService; @Autowired private FourthJobService fourthJobService; public CombineContextResult combine(.. 2021. 10. 31.
jackson-dataformat-xml 이슈 정리 jackson-dataformat-xml(2.12.4) 를 사용하면서 겪은 이슈를 정리했다. cf) 기존 코드는 jaxb-api(2.1) 을 사용중이었다. 1. interface 네이밍 interface 네이밍은 자바에서 예약어기 때문에 xml element 로 좋은 네이밍은 아니다. 하지만 기존 코드와 똑같이 개발해야 했다. 먼저 바인딩 시킬 필드에 아래와 같이 @XmlElement 애노테이션을 붙이고 name을 interface로 지정했다. @XmlElement(name = "interface") private String interFace; 롬복을 썼기 때문에 자동으로 setter는 아래와 같이 setInterFace 네이밍으로 만들어졌다. public void setInterFace(String .. 2021. 10. 19.
리스트 객체를 특정 key 기준으로 grouping 그리고 merge 아래와 같이 Product 리스트가 있다고 해보자. Product 객체에는 id(고유 식별자), productId, itemNo(리스트) 필드가 있다. 여기서 id와 productId의 차이에 대한 설명은 비지니스 정책 이슈라 생략하려 한다. 중요한건 productId는 중복이 가능하다. 그래서 prodocutId를 기준으로 grouping 을 하고 itemNo 리스트값을 중복없이 merge 하려고 한다. List products = Arrays.asList( new Product("1", "a", Arrays.asList("11", "12", "13")), new Product("2", "a", Arrays.asList("12", "13", "14")), new Product("3", "b", Arra.. 2021. 9. 20.
@RequestParam 사용 시 주의사항 요즘은 스프링 컨트롤러를 만들 때 @GetMapping, @PostMapping 으로 HTTP Method 를 명시하거나, @RequestMapping을 쓰더라도 HTTP Method 를 명시적으로 추가하는게 일반적이다. 그런데 예전 레거시 스프링 컨트롤러를 재개발 하는 상황에서 @RequestMapping 에 HTTP Method 가 명시적으로 적혀있지 않거나, 있다고 하더라도 GET, POST 둘다 받도록 하는 경우가 있어 똑같이 맞춰서 개발해야 했다. GET + @RequestParam 인 경우는 query parameters(query string) 만 고려해서 처리하면 되서 간단한데, POST 요청까지도 같이 받는다면 @RequestParam 이 query parameters(query stri.. 2021. 9. 11.
ip 범위 구하고 범위안에 포함되는지(with subnetmask) 내부 로직을 다 이해해도 조금만 시간 지나면 까먹어서 정리했다. 코드는 IPv4 만 구현되어 있다. 서브넷 마스크, 넷마스크 용어를 엄격하게 구분져서 쓰지 않았다. 엄격히 구분할 필요가 없다고 판단했다. 먼저 ip 가 서로 같은지 다른지 비교를 해보자. 192.168.254.252와 192.168.254.253 은 당연히 다르다. string equal 을 이용해 바로 확인이 가능하다. 그런데 192.168.254.252/13 와 같이 subnetmask 가 같이 있는 경우, 192.175.254.253 이 포함되는지 여부는 바로 알기 어렵다(답은 포함됨). 코드를 보면서 하나씩 살펴보자. 먼저 IpAddressMatcher 생성자로 ip 와 subnetmask 문자열을 / 구분자로 함께 전달한다. Ip.. 2021. 8. 24.
WebClient 사용할때 주의 (3편) response body가 필요 없을 때 response body 가 필요없을 때 releaseBody(), toBodilessEntity(), bodyToMono(Void.class) 세가지 방법이 있다. 그런데 bodyToMono(Void.class) 는 한가지 문제가 있다. reactor-netty 는 bodyToMono(Void.class) 썼을 때 맺었던 커넥션을 커넥션풀에 반납을 하지 못한다. 왜냐하면 reactor-netty 는 통신하고 있는 서버에서 더 받을게 있는지 여부를 모르기 때문이다. 따라서 이 경우 reactor-netty는 해당 커넥션을 닫고 커넥션풀에서 제거한다. 그래서 reactor-netty 메인테이너는 releaseBody(), toBodilessEntity() 두가지만 .. 2021. 6. 23.