본문 바로가기

분류 전체보기263

[Redis] 레디스를 활용한 장애 감지 (feat. Exception counting) 장애 감지를 구현해야 할 일이 있었다. 아래와 같은 고민들이 있었다. 분산 환경에서 장애 감지를 어떻게 할까?? exception이 일정 시간 동안 일정 횟수 이상 발생하면 모니터링 알림을 줘야 한다. 각각의 exception count의 총합을 어떻게 관리하지..? 일정 시간은 어떻게 체크하지..? 정답은 바로 "레디스" 레디스로 어떻게..? 레디스의 특징 중에서 여러 프로세스에서 동시에 같은 key에 대해서 갱신을 요청하는 경우 Atomic 하게 처리해주기 때문에 Exception 발생 시 키 값에 대해 카운트를 증가시켜 줄 수 있다. 오 그럼 일정 시간은 어떻게..? 레디스는 TTL 제공을 제공해준다. 그렇기 때문에 일정 시간을 TTL로 잡고 해당 시간 동안 count 수가 내가 설정해놓은 수치를 .. 2021. 9. 12.
2021 상반기 회고 (feat. 이직) 상반기 회고를 쓸 생각은 없었다. (1년에 한 번씩 쓰고 있기 때문에ㅎ) 회고를 쓰는 이유는 다름이 아니고 이직을 하게 되어 쓰게 되었다. 이직을 결심하게 된 이유? 이직을 결심하게 된 이유는 많지만, 크게 2가지가 있었다. 더딘 성장 사수가 없었다 성장하기 힘들었다고 생각이 들었다. (할많하않) 물론 성장을 하지 못하는 것은 아니다. 성능개선도 경험해봤고, mq도 사용해볼 수 있었다. 하지만, 빠르게 갈 수 있는 길을 크게 돌아간다고 표현하는 것이 적합할 것 같다. 복불복이 심했다. 나는 최단거리로 가고 싶었다. 기술적으로 성장을 하여 언젠가는 나만의 서비스를 만들고 싶었기 때문에 좀 더 조급했었던 것 같다. 사수가 없었기에, 이렇게 해도 되나? 더 좋게 바꿀 수 있을 것 같은데.. 항상 의구심의 연속.. 2021. 7. 21.
[Java] Optional은 왜 사용할까? (Feat. NullPointerException) 자바 프로그래밍을 하면서 NPE를 겪어보지 않은 사람은 없을것이다. null 처리를 하기 위해 우리는 많은 노력을 한다. 모든 객체를 null 체크, null 일 경우에 대한 처리 if(person != null){ //null이 아닐 때만 코드 수행 } ################# if(person == null){ throw new PersonNotExistException(); } 이 경우 객체의 개수 만큼 if절이 늘어나게 되어 가독성에 좋지 않다. Optional (java.util.Optional) 자바8 에서는 Optional이라는 새로운 클래스를 제공한다. 예를 들어, 위의 person 객체가 있다고 가정했을 때 Optional 처럼 객체를 감싼다. 값이 있을 경우 객체를 감싸지만, 없.. 2021. 5. 14.
[Java] parallelStream 완전분석 (feat. fork/join framework) 단순하게 stream은 순차처리, parallelStream은 병렬 처리가 된다. 그럼 무조건 parallelStream을 쓰면 빠를 텐데? 하지만 그러면 안 되는 이유가 있을 것만 같은 느낌적인 느낌 parallelStream도 분명 뭔가가 불편하거나 힘들었기 때문에 나왔을 것이다. 파헤쳐보자. 자바 7 이전의 컬렉션 데이터 병렬 처리 방식 데이터를 서브 파트로 분할 후, 분할된 서브 파트에 따라서 각각의 스레드로 할당한다. 각각의 할당된 스레드에서 경쟁상태가 발생하지 않도록 적절한 동기화를 해줘야 하며, 마지막으로 부분 결과를 다시 합쳐야 한다. 자바 7 이후의 컬렉션 데이터 병렬 처리 방식 자바 7부터 포크/조인 프레임워크 기능을 제공한다. 또한 자바 8에서는 스트림을 사용함으로써 병렬 스트림 처리.. 2021. 5. 10.
[사이드프로젝트] 공모주 청약일정 슬랙 알림 어플리케이션 최근에 SK바이오사이언스에 공모주 청약을 넣어서 소소하게 돈을 벌었다 ㅎㅎ 만약에 좀 더 미리 알았더라면 조금 더 벌 수 있었을 텐데ㅠ 그래서 우리 슬랙 방에 공모주 알림을 주는 녀석을 만들어보려고 했다. 공모주 일정이라고 검색을 했더니 일정이 정리된 사이트가 있었다. :smile: 다른 비슷한 사이드 프로젝트를 진행하기에 앞서서 사전 예행연습 겸 조그맣게 만들어보았다. 6시간(?) 정도 소요되었다. 개발환경 Java + SpringBoot + heroku 개발과정 사이트에서 공모주 데이터를 크롤링한다. 오늘 날짜와 청약 일정이 같다면 해당 데이터를 담는다. 슬랙 웹 훅을 호출해 api 템플릿에 맞게 넣어준다. 삽질 부분 만약에 당일 공모주가 여러 개라면 공모주 개수만큼 슬랙 알림이 울리게 된다.(몇 개.. 2021. 4. 16.
[Java] Boxing을 지양하자.(feat primitive type vs reference type) 모던 자바 인 액션을 공부하는 요즘 왜 자바에 더 집중하지 않았는가에 대한 자아성찰을 많이 하는 중이다. 흔히 말하는 Boxing, unBoxing은 다들 알고있다고 생각한다. 간단하게 말해서, Wrapper Class를 사용해서 primitive Type을 reference Type으로 변환하는 과정을 박싱(Boxing), 이 반대의 과정을 언박싱(unBoxing)이라고 한다. 자바에서는 오토박싱 기능을 제공해주기도한다. 그렇다면 왜 Boxing을 지양해야할까? 결론부터 말하자면, 비용이 추가적으로 발생 한다. 박싱한 값(Wrapper class)은 reference Type이다. 고로 Heap 영역에 저장된다. 그렇기 때문에, primitive Type을 가져오려고할 때도 Wrpper class로 인.. 2021. 4. 8.