Webflux 는 아래 처럼 두개의 프로그래밍 모델을 지원하는데, 이번글에서는 Functional 방식을 알아보도록 하자 Functional routing and handling Annotation-based reactive components 1. RouterFunction RouterFunction 은 기존 개발자에게 익숙한 @RequestMapping 어노테이션과 동일한 역활을 한다. 하지만 가장 큰 차이점은 RouterFunction 은 동작까지 정의한다라는 것이다. @RequiredArgsConstructor @Configuration public class Router { private final PersonHandler handler; @Bean public RouterFunction per..
JPA 로 개발을 할때, 컬렉션을 Fetch Join 하면 페이징 조회 시 메모리에서 페이징 처리하는 문제가 있다. 데이터가 적으면 크게 상관은 없겠지만, 데이터가 많다고 한다면 큰 문제가 발생하게 된다. 아래와 같은 경고 메시지가 출력된다. 경고 메시지 HHH000104: firstResult/maxResults specified with collection fetch; applying in memory! 아래와 같이 엔티티를 정의해 보자 @Entity public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; @ManyToMany(mappedBy = ..
JPA 로 개발을 할때, @ManyToMany 관계를 맺는 경우가 있는데, 이때 Set 과 List 의 차이점을 알고 사용하도록 하자. Category - Article 관계가 n:m 이라고 가정을 하자. @ManyToMany 관계시 List 를 사용하였을 경우 @Entity public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; @ManyToMany(mappedBy = "categories") private List articles = new ArrayList(); public void deleteArticle(Article article) { ar..
웹 어플리케이션을 운영하다 보면 http의 request와 response 로그가 필요한 경우가 있다. 기본적으로 SpringBoot 에서는 http의 request, response 를 로깅하지 않으므로 개발자는 추가로 설정을 해줘야 한다. 먼저, Spring MVC Request Lifecycle 을 이해해야 함으로 아래 그림을 참고 하자 본 글에서는 Filter와 HandlerInterceptor를 사용하여 로깅을 할 예정이다. Http logging 방법은 2가지가 있다. Custom Request, Response 로깅 1. RequestWrapper와 ResponseWrapper 클래스를 만든다. Wrapper를 만드는 이유는 HttpServletRequest 의 InputStream 은 오직..
Spring 에서 Service 클래스를 만들때 인터페이스를 사용 한다? 안한다? public interface MyService { void doSomething(); } @Service public class MyServiceImpl implements MyService { @Override public void doSomething() { System.out.println("hello Im Impl Service"); } } 보통 스프링 개발할때 서비스를 위와 같은 패턴으로 사용은 하지만, 늘 그래왔듯이 사용하는 개발자가 적지 않다라는 것을 알았다. 그래서 궁금해서 블라인드에 투표를 올려봤다. (꽤 많은 분들이 투표를 해줬다ㅎㅎ) 203명의 개발자분들이 투표를 해주셨고, 사용한다라는 개발자가 근소한..
마이크로 아키텍처는 시스템을 운영할 때 많은 장점을 갖고 있지만, 반대로 단점도 존재한다. 마이크로 서비스들이 굉장히 많아졌을 때 이를 효과적으로 관리가 필요한데, 서비스를 찾는 디스커버리, 네트워크 트래픽 제어, 장애 전파 방지, 로깅, 보안등의 각 서비스 구성들끼리 유기적으로 잘 동작 하도록 관리 해주는 작업들로 시스템의 런타임 복잡도가 굉장히 높아진다. 지금까지는 많이들 들어본 Spring Cloud 혹은 Netflix OSS 라는 소프트웨어로 일일히 구현 혹은 설정을 해주는 것으로 많이들 해결을 하였지만, 어쩌면 이런 횡단 관심사(Cross Cutting Concerns)들을 구현하고 설정하는것이 핵심 관심사인 도메인 비즈니스를 만들어 나가는 것에 집중을 하지 못하게 되는 경우도 발생 하게 된다...