자바에서 스트림은 연속적인 데이터를 순차적으로 처리한다. 그런데 효율을 위해 멀티코어를 사용하여 병렬스트림으로 처리하는 경우가 있다. 이때 병렬스트림이 내부적으로 어떻게 동작하는지 알아보고자 한다. 병렬스트림은 각각 스레드에서 데이터를 처리할 수 있도록 스트림 요소를 여러 청크로 나눈다. 여기서 청크란 무엇일까? 청크는 스트림 요소를 작은 단위로 분할하는 단위이다. 예를 들어, ["hello", "judy", "smile"] 이 있다고 하자. 그러면 각각 "hello", "judy", "smile"처럼 세 가지로 분할하여 처리하는 것이 효율적일 것이다. 그런데 데이터가 엄청 많다고 하자. 그럴 때는 ["hello", "judy", "smile"]를 하나의 청크로 하여 스레드에 넘겨주는 것이 효율적일 것이..
얼마전 신입분의 질문으로 JSESSIONID부터 세션 클러스터링에 대해 알아보았는데(JSESSIONID에서 세션 클러스터링까지) 실습을 해볼 수 있으면 좋을 것 같아서 간단하게 도커로 환경을 만들어서 실습해본 내용을 정리한다.(Redis 클러스터링 실습 프로젝트 소스는 https://github.com/arajo-hub/redis-session-clustering-practice에. noclustering소스는 간단한 내용이므로 따로 업로드해두지 않았다.) 참고링크(https://zzang9ha.tistory.com/442) 도커로 Redis와 실습 프로젝트 인스턴스 2대를 돌린다. 제일 먼저 도커로 Redis를 실행한다. docker run -d --name my-redis-container redi..
얼마전 신입분이 현재 개발중인 소스에 결함이 있다며 부르셨다. 내용을 보니 JSESSIONID가 같아서 한쪽에서 세션이 풀리는 문제였는데, 그렇게 설명은 해드렸지만 좀 더 자세하게 알아볼 필요가 있어서 글로 남긴다. JSESSIONID는 서블릿 컨테이너에서 접속한 사용자를 식별하기 위한 식별자라고 보면 된다. 톰캣에서는 아래와 같이 JSESSIONID를 생성한다.(https://tomcat.apache.org/ 에서 Source Code Distributions에서 tar.gz이나 zip으로 소스를 받은 뒤 열어보면 확인할 수 있다.) package org.apache.catalina.util; public class StandardSessionIdGenerator extends SessionIdGene..
최근에 다른 분이 OpenSSL을 업데이트하다가 문제가 생겨 도움을 요청하셨는데 그 문제와 관련하여 포스팅해본다. Ubuntu 20.04에는 기본적으로 openssl 1.1.1f가 설치되어 있다고 한다. 그런데 최신버전의 openssl(1.1.1t)을 설치해야하는 상황이었고, 업데이트를 하기 위해 작성한 스크립트로 설치를 하면 1.1.1t가 적용되지 않는다는 것이었다. 설치를 완료하고 버전을 확인하는 명령어를 실행하면 다음과 같은 메시지가 표시됐다. /usr/bin/openssl: symbol lookup error: /usr/bin/openssl: undefined symbol: EVP_mdc2, version OPENSSL_1_1_0 그런데 스크립트없이 그냥 아래와 같이 설치를 하면 1.1.1t가 제..
이번 프로젝트에서 나를 제일 애먹인 건 데이트피커였다... 챗GPT한테도 물어보고 인터넷에도 찾아봤지만 비슷한 기능에 대한 정보가 없어서 내가 구현한 내용을 정리해본다. 구현해야 하는 기능은 아래와 같았다. 라디오버튼 "일", "월"이 있고, "일"을 선택하면 데이트피커로 일단위 선택을 할 수 있고, "월"을 선택하면 데이트피커로 월단위 선택을 할 수 있다. 선택한 날짜에 따라 날짜 선택 범위가 제한된다.(예를 들어, 시작일을 4월을 선택하면 종료일은 4월 전을 선택할 수 없고, 시작일도 종료일을 넘겨서 선택할 수 없다.) 기본 데이트피커에서 선택 가능한 최대 과거일은 3개월전, 선택 가능한 최소 현재일은 전일이다. 일 월 위와 같은 라디오버튼을 만들었고, 각 라디오버튼에 클릭하면 데이트피커를 변경하는 ..
이번 프로젝트에서 여러 서버로 요청을 보내는 기능을 하나 맡게 되었는데, 구현하는 과정에서 겪은 어려움과 어떻게 해결했는지 기록해본다. 내가 맡은 기능은 스케줄을 돌면서 여러 서버로 요청을 보내고 결과를 받아서 처리하는 기능이었다. 기존코드는 한 스케줄이 시작되면 다른 스케줄은 접근할 수 없도록 AtomicBoolean으로 처리가 되어 있었고, 서버를 for문을 돌리며 요청하고 있었다. 그런데 한 가지 문제가 발생했다. 결과를 줘야하는 상대서버에서도 고도화를 진행하면서 응답속도가 현저히 느려졌다. 각 서버를 굳이 for문을 돌리며 요청할 필요가 없었기 때문에 속도를 위해 서버들에 비동기로 요청하는 것으로 변경했다. 서버들에 비동기로 요청하면서 발생하는 문제 중 하나는 비동기작업이 끝났는지 어떻게 알 수 ..
우여곡절 끝에 개발자로 일한 지 만 2년이 되었다. 지난 2년을 돌아보니 좀 더 성장하지 못했다는 아쉬움이 남는다. 분명 더 성장할만한 기회들이 있었을텐데. 지난 만 1년차 회고를 오랜만에 읽었는데 이후 1년동안 참 다양한 일들이 있었구나, 싶다. 1년차 회고를 쓰고 난 바로 이후쯤부터 내가 썩 내켜하지 않았던 업무를 맡게 되었고, 이후로 1년간 너무 힘들었다. 썩 내키진 않았지만 내게 주어진 일이니 잘하고 싶었는데, 아귀가 잘 맞지 않는 느낌이었다. 더구나 개발과도 거리가 먼 업무이니 마음이 제대로 잡히지도 않았다. 그래도 최근에 이런 저런 이유로 다른 분에게 인수인계를 거의 마쳤다. 그외에 개발자로서 성장했었던 포인트들을 꼽자면, 1. 중첩된 @Transactional을 실험해보며 전파 속성에 대해 ..
매번 파이콘을 다니면서 내가 업무에서 사용하는 자바, 스프링 컨퍼런스는 없나 하고 기다렸는데, 마침 한국스프링사용자모임에서 스프링캠프 2023을 연다고 해서 다녀왔다. 오픈한지 43초만인가에 티켓이 동났다고 해서 엄청 인기있는 컨퍼런스구나 싶었다. 이하의 내용에는 세션 관련 내용이 포함되어 있지만 모든 내용을 담고 있지 않고, 정확하지 않은 내용을 포함하고 있을 수 있습니다. 추후 유튜브로 영상이 올라온다고 하니 자세한 내용은 해당 영상을 참고해주세요. 11시부터 12시까지가 접수였는데, 11시 40분쯤 도착했는데 다들 인프런, 현대 부스 등에 가있어서 그런지 자리가 꽤 남아 있었고, 나름 좋은 자리에 앉게 되었다. 파이콘은 동시에 여러 세션이 진행되서 듣고 싶은 세션이 겹치면 그 중 하나를 택일해야 하..