본문 바로가기

Programing/Framework

(71)
[Spring JPA] 멀티컬럼 - 쿼리메소드 vs @Query 도비님이 코드리뷰 PR을 주셨다. 기존에 query method로만 사용을 했는데 @Query 를 사용하여 왜 그랬는지 궁금했다. 알고보니 특정 컬럼에 대하여 or 조건으로 결합이 되었던 것이 이유였다. 예를 들어 (t.a = 'abc' or t.a = 'bcd') and ... 같이 우선적으로 적용해야 하는 or가 있는 경우였다. 물론 결합법칙으로 (A OR B) AND C 를 A AND C OR B AND C 로 풀 수는 있지만 trade-off 비용이 더 안좋았을 거라 생각이든다. 다른 생각 하지만 JPA 객체지향이 아닌 쿼리지향으로 사용하고 있지 않는가 하는 생각을 하게 되었다. query method가 점점 길어지고 복잡해지고 있다면 쿼리지향을 하고 있는가 생각해 보는 점검의 시간(냄새)으로 생..
[Spring] spring-retry 재시도 및 백오프 정책 정리 재시도에 대한 생각을 할 때 일반적으로 참고를 할 수 있을 것 같아서 정리했다. 현재 사용하고 있는 spring-retry 1.2.5 기준이다. RetryPolicy (재시도 정책) SimpleRetryPolicy 주어진 횟수만큼만 반복 수행 AlwaysRetryPolicy 항상 재시도를 수행 - 테스트 용도나 수동 설정시 이용 NeverRetryPolicy 1회만 수행(재시도를 안함) - 테스트 용도나 수동 설정시 이용 CircuitBreakerRetryPolicy 서킷 브레이커 방식의 재시도 - 시스템 장애시 유용 ExceptionClassifierRetryPolicy 최종 예외 클래스에 기반한 재수행 TimeoutRetryPolicy 제한을 시간을 가지고 반복을 수행 ExpressionRetryPo..
[spring boot] 2.1.6 -> 2.2.0 테스트 깨짐(인코딩) 무엇이 바뀌었길래 테스트가 깨지는가? org.springframework.test.web.servlet.MockMvc 를 이용한 Mock 컨트롤러 테스트. 한글 인코딩이 깨진다. MockMvc의 경우 perform이 수행되면 MockFilterChain -> HttpServlet -> TestDisplacherServlet -> FrameworkServlet -> HttpServlet - FrameworkServlet -> DispatcherServlet -> AbstractHandlerMethodAdapter ... 등을 거치다. application/json의경우 HttpEntityMethodProcessor 의 handleReturnValue에서 AbstractMessageConverterMetho..
[spring integration] TCP 연결시간 설정 버전 의존성 Spring boot Spring core Spring integration Jackson core 2.1.6 5.1.8 5.1.6 2.9.0 2.2.0 5.2.0 5.2.0 2.10.0 2.2.4 5.2.3 5.2.3 2.10.2 2.2.5 5.2.4 5.2.4 2.10.2 TCP 통신을 하는 것을 만들고 있는데, 아직 상대방 방화벽이 닫혀있는지 긴 타임아웃이 발생하였다. 기본 연결 대기 시간 이전에 timeout이 발생하게 하고 싶었다. AbstractClientConnectionFactory 에 정의되어 있는 기본 연결 타임아웃은 60초이다. 구현체에서 소켓을 만들때 getConnectTimeout() 이라는 메서드를 통해 값을 구해온다. 예) https://github.com/spri..
[Spring] mvc - DispatcherServlet 1부 서블릿과 스프링 MVC는 밀접하면서 독립적이다. DispatcherServlet 클래스는 HTTP 요청을 처리하는 중심 디스패처 클래스이다. DispatcherServlet 클래스는 아래와 같은 계층 구조를 가진다. Servlet 인터페이스 서블릿의 핵심은 요청과 응답이다. ServletRequest과 ServletResponse가 요청 및 응답을 추상화해놓은 인터페이스이다. public interface Servlet { // .. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; HttpServlet 추상 클래스 Servlet 인터페이스의 구현체인 HttpServlet 라는 ..
[Spring] SSE vs WebFlux WebFlux를 쓰지 않을 경우 스레드풀 방식에 의해 매 연결이 계속 연결이 될까 궁금했다. 코드 방법1. Tomcat, MVC 방법.2 Tomcat, WebFlux https://supawer0728.github.io/2018/03/15/spring-http-stereamings/ http://jmlim.github.io/spring/2018/11/27/spring-boot-schedule/ @EnableScheduling 크롬브라우저는 되는데 HttpPie는 -S 옵션을 붙여주어야 한다. 안그러면 마지막 응답 후 한꺼번에 결과를 보여준다.
[Spring] mvc 예외처리 스프링의 mvc에서 예외처리는 실무에서 보면 @ControllerAdvice 을 이용해서 많이 한다. 아래와 같이 밑바닥 부터 예외 처리기를 구현해도 무방하다. @RestControllerAdvice(basePackages = {"com.tistory.namocom.controller"}) public class NamoExceptionHandler { 하지만 편의를 위해 스프링은 미리 ResponseEntityExceptionHandler을 만들어놓았다. public abstract class ResponseEntityExceptionHandler { 추상클래스이므로 상속을 받아 사용이 가능하다. @RestControllerAdvice(basePackages = {"com.tistory.namocom...
[Spring] ServiceLocatorFactoryBean 어떤 기능이 여러 출처에 의해 분기를 해야하는 경우가 실무에서는 자주 생긴다. 주문 도메인이라면 처음에는 카테고리 A에 대해서만 판매를 하다가 카테고리 B라는 것이 생긴다. 결제 도메인이라면 처음에는 카카오페이만 지원을 했더라도 나중에 다른 네이버페이를 추가할 수 있다. 이럴 경우 레이어를 두는 것이 보통 일반적이다. Client -> KakaopayService -> KakaopayExternalAPI 이런식으로 되어 있는데 네이버 페이를 추가한다면 Client -> PaymentService -> KakaopayService -> KakaopayExternalAPI -> NaverpayService -> NaverpayExternalAPI 이런식으로 분기를 할 수 있는 계층(위에서 PaymentSer..