본문 바로가기

전체 글31

Cassandra Pagination Problem Webflux + cassandra-driver-mapping을 사용하고 있는데 full gc가 발생하였습니다. non-blocking시스템이였기에 NIO 스레드가 blocking되는 것을 문제로 추측하였고 당시 인프라 문제로 인해 덤프는 뜨지 못하였기 때문에 휴리스틱하게 문제를 추측하였습니다. 그러다 카산드라에서 데이터를 가져오는 쪽에 의심이 될만한 부분을 찾았습니다. Problem Statement 문제가 되는 코드입니다. 카산드라 라이브러리에서 사용하는 ResultSetFuture를 CompletableFuture로 변환하는 메서드 입니다. ResultSetFuture resultSetFuture = session.executeAsync(ps); CompletableFuture future = ne.. 2023. 10. 30.
테스트에서의 서비스 추상화 JavaMailServiceImpl을 사용하는 UserService가 있다고 생각해보자. 테스트를 진행하려는데 JavaMailServiceImpl을 사용하되 실제 메일은 보내지지 않았으면 좋겠다. 이런 경우에는 JavaMailServiceImpl을 위한 Interface인 MailSender를 둔 후, MailSender만 사용한다. UserService에서는 DI를 통해 운영 시에는 JavaMailServiceImpl을, 테스트 시에는 DummyMailService를 사용하게 만든다면 의도한 대로이다. 추상화와 DI를 잘 활용하는 것이 Spring이라는 Framework를 잘 사용하는 것인 것 같다. 2020. 10. 5.
Java에서의 예외 처리 예외의 종류와 특징 1. Error java.lang.Error의 에러들입니다. 시스템에 비정상적인 상황(메모리 초과)이므로 애플리케이션 레벨에서 할 수 있는 것이 없습니다. 그러니 신경 노노 2. Exception의 언체크 예외(RuntimeException) Try~Catch문으로 안잡아도 되는 예외입니다.(물론 잡아줘도 상관없다) 할당되지 않은 레퍼런스 변수를 사용하려고 할 때 발생하는 NullPointerException과 같은 것으로 미리 코드에서 체크한다면 피할 수 있는 것이다.(대부분 개발자의 부주의로 발생...) 3. Exception의 체크 예외 사용할 메소드가 체크예외를 던진다면 이를 catch문으로 잡든지, 아니면 다시 throws로 메소드 밖으로 던져야 한다. 밑의 그림이 Excep.. 2020. 10. 5.
전략 패턴(Strategy Pattern) 전략 패턴은 개방 폐쇄 원칙을 잘 지키는 구조이면서도 템플릿 메소드 패턴보다 유연하고 확장성이 뛰어나면서 오브젝트를 아예 둘로 분리하고 클래스 레벨에서는 인터페이스를 통해서만 의존하도록 만드는 것입니다. 전략 패턴은 OCP관점에서 보면 확장에 해당하는 변하는 부분을 별도의 클래스로 만들어 추상화된 인터페이스를 통해 위임하는 방식입니다. 이 전략 패턴에 유연성을 위해서 DI를 적용할 때가 많습니다. 이를 위해 기존의 컨텍스트를 클라이언트와 컨텍스트로 분리를 합니다. 클라이언트는 단순하게 컨텍스트를 사용하는 놈, 컨텍스트는 전략을 사용하는 놈으로서 한 단계 더 분리를 했다고 봐도 무방할 것 같습니다. 2020. 9. 25.