본문 바로가기

분류 전체보기158

Kafka - consume 실패 시 리트라이 저는 개인적으로 채팅 서비스를 토이 프로젝트로 개발하고 있습니다. 웹소켓, Kafka를 이용해서 메시지 저장 기능을 개발했었는데요. 이미지처럼 메시지를 한번 송신했는데 10번이 저장되는 이슈가 발생했습니다. 어떻게 된 일일까요? 콘솔 메시지를 확인해보니 KafkaException과 그 밑에는 코드 실수로 인한 NPE 예외가 콘솔에 찍혀있었습니다. 메시지를 저장하고, 그 이후의 데이터를 처리하는 과정에서 NPE가 발생했고, consume 메서드 내에서 예외가 발생해서 리트라이가 발생한 이슈였습니다. 그렇다면 10번 메시지가 저장됐던 이유는 무엇일까요? 위 코드에서 DEFAULT_BACK_OFF의 maxAttempt가 9로 설정돼있으므로 9번의 재시도 이후 열번째의 시도에서 메시지를 저장하고, 실패하면서 .. 2024. 4. 6.
+ ""는 의미가 있을까요? 직장에서 코드를 수정해서 카나리 서버에 배포했는데 갑자기 모니터링 알람이 마구마구 울렸습니다. 배포한 내용에서 NPE가 발생한다는 내용이었어요. "왜지? 분명 로컬에선 잘 돌아갔는데?" 라는 생각을 했었는데요. 예외가 발생한 이유가 무엇이었을까요? 수정 전 코드 String str = ""; ... while(true){ ... var comment = str + ""; if(comment.equals(preComment)){ ... } ... } 기존에 위와 같은 형태로 코드가 개발돼있었습니다. 그리고 저 코드가 속한 메서드와 관계없는 코드를 수정하고 commit을 했는데요. Intellij에 Cleanup 을 포함한 여러가지 commit 설정들을 사용하고 있었고, 그 중에 Cleanup 옵션에서 자동.. 2024. 2. 19.
Intellij - Merge All Project Windows By Default! Winodw > Mege All Project Windows 옵션을 선택하면 아래 이미지처럼 실행돼 있는 프로젝트를 한 탭에서 볼 수 있다. 회사 맥북에서는 프로젝트를 새로 open할 때 자동으로 한 탭에서 프로젝트가 열렸는데, 개인 맥북에서는 새로운 탭으로 프로젝트가 열리는 문제가 있었습니다. 이 문제는 아래 설정을 통해 해결이 가능했습니다. 2024. 1. 21.
상태 패턴 (State Pattern) 상태 패턴은 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있습니다. 마치 객체의 클랙스가 바뀌는 것과 같은 결과를 얻을 수 있습니다. 상태를 별도의 클래스로 캡슐화한 다음 현재 상태를 나타내는 객체에게 행동을 위임하므로 내부 상태가 바뀔 때 행동이 달라지게 된다는 사실을 쉽게 알 수 있습니다. 상태 패턴 클래스 다이어그램 Context 객체에 수많은 조건문을 넣는 대신에 상태 패턴을 사용할 수 있습니다. 참고 에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022 https://velog.io/@y_dragonrise/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%83%81%ED%83%.. 2023. 11. 6.
반복자 패턴 (Iterator Pattern) 반복자 패턴은 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 항목을 제시합니다. 장점 모든 항목에 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체가 맡게 된다. 모든 집합체에서 쓸 수 있는 다형적 코드를 만들 수 있다. 유의점 반복자에는 특별한 순서가 정해져 있지 않습니다. Iterator public interface Iterator { //수행할 항목이 있는지 여부 확인 boolean hasNext(); //다음 항목을 선택 IteratorItem next(); } Iterator 자바의 모든 컬렉션 유형에서 Iterable 인터페이스를 구현합니다. 어떤 클래스에서 Iterable을 구현하면 그 클래스는 iterator() 메소드를 구현합니다. 그 메소드는 Iterator .. 2023. 10. 30.
템플릿 메소드 패턴 (Template Method Pattern) 템플릿 메소드 패턴은 알고리즘의 골격을 정의합니다. 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 특정 단계를 서브클래스에서 재정의할 수도 있습니다. 커피와 홍차 예제 public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } abstract void brew(); abstract void addCondiments(); private void boilWater() { //물 끓이기 } private void pourInCup() { //컵에 따르기 } } public class Coffee exten.. 2023. 10. 26.