Computer Science 15

복잡한 정책을 고려한 코드 작성법

기획자와 협의를 하다보면 다음과 같은 말을 종종 들을때가 있습니다."이 정책은 우선 이렇게 결정되긴 했는데, 담당자 확인후 확정 드리겠습니다.""고객에 따라서 이 정책은 다르게 적용될 수도 있습니다.""특정한 조건에 해당하는 고객은 이 정책을 적용해주세요"물론 대부분의 경우 기획에 정확한 정책을 요구하는게 이상적이지만, 기한이 얼마 남지 않았거나, 고객 별로 딱 맞는 정책들을 적용하고 싶은 경우 등 어쩔수 없이 복잡하게 개발을 해야만하는 순간이 오게 됩니다.오늘은 이러한 경우에 어떻게 회사에서 해결했는지 얘기해보려고 한다. 설명에서는 실제 도메인이 아닌 할인 정책 예시 도메인을 사용하겠습니다.1. 전략 패턴가장 처음 적용한 해결책은 전략 패턴입니다.전략 패턴은 정책의 종류나 상태에 따라 동작이 달라지는 ..

QueryDSL 데드락 해결하기

문제프론트에서 특정 페이지에 접속하면 결과가 계속 넘어오지 않는 이슈를 전달디버깅을 위해 페이지에서 호출하는 각 쿼리를 일일이 호출한 결과 문제 없이 수행정말 딱 해당 페이지에 접속할때만 결과가 넘어오지 않음더 큰 문제는, 이러한 과정이 반복되면 모든 요청이 처리되지 않는 문제가 발생원인 파악1. 커넥션 확인현 프로젝트는 JPA 를 사용하고 있으며, connection leak 이 발생하면 로그를 출력하도록 설정해둠위 버그를 재현하면 다른 로그 없이 connection leak 로그가 출력커넥션의 상태를 추적하고자 함라이브러리에서 커넥션을 흭득하는 과정을 보면 다음과 같이 metricTracker에 로그를 남기는 모습을 볼 수 있음public Connection getConnection(final lon..

Spring Data MongoDB에서 Union 연산을 수행하는법

목차 소개 $UnionWith의 지원 버전 확인 네이티브 쿼리를 이용한 Union 연산 네이티브 쿼리 실행 방법 MongoCollection.aggregate를 사용한 네이티브 쿼리 실행 코드 예시 MongoClient 설정 MongoCollection 가져오기 매치 쿼리 생성 매치 쿼리를 List로 변환 $unionWith로 쿼리 감싸기 집계 연산 쿼리 추가 최종 쿼리 실행 1. 소개 MongoDB 4.4부터 SQL의 Union all과 유사한 연산인 $UnionWith를 지원합니다. 이 기능은 데이터베이스의 여러 컬렉션을 합치는 데 사용됩니다. 그러나 Spring Data MongoDB의 최신 버전인 spring-boot-start-data-mongodb:3.0.7은 spring-data-mongod..

Computer Science 2023.07.19

Gitlab에 러너를 등록하기

목차 소개 러너 등록하기 러너 구성하기 러너 테스트하기 문제 해결 소개 이 글은 Gitlab에 러너를 등록하고 설정하는 방법에 대해 안내합니다. Gitlab의 CI/CD를 활용하기 위해서는 러너를 등록해야 하며, 이를 통해 자동화된 빌드, 테스트, 배포 등의 작업을 실행할 수 있습니다. 러너 등록하기 Gitlab 러너 설치 문서를 참고하여 해당 환경에 맞게 러너를 설치합니다. Gitlab 레포지토리로 이동하여 “Settings” 메뉴에서 “CI/CD” 탭으로 이동합니다. “Runner” 항목에서 등록할 레포지토리 URL 및 등록 토큰을 확인합니다. 터미널에서 gitlab-runner register 명령을 실행합니다. URL과 토큰을 입력하고, executor는 원하는 설정으로 선택합니다. Docker를..

Computer Science 2023.07.13

앤서블로 카프카 클러스터 구축하기

1. 서버 구조 사설 인터넷망에 3개의 클러스터용 노드가 있습니다. 사설 인터넷망에 1개의 프로젝트 배포용 노드가 있습니다. 2. 앤서블 설정하기 2.1 배포 서버 DNS 설정하기 배포 서버를 정의하기 위해 /etc/hosts 파일에 호스트를 설정해야 합니다. 호스트 설정은 각 운영 체제마다 다를 수 있습니다. 리눅스 기반 시스템에서는 다음과 같이 /etc/hosts 파일을 수정합니다: //... 10.12.204.13 peter-zk01.foo.bar 10.12.204.13 peter-kafka01.foo.bar 10.12.204.14 peter-zk02.foo.bar 10.12.204.14 peter-kafka02.foo.bar 10.12.204.17 peter-zk03.foo.bar 10.12.20..

Computer Science 2023.07.13

Github Action으로 Spring 프로젝트를 Kubernetes에 배포하기

최근 서버 환경을 쿠버네틱스로 변경했기 때문에 지속적 배포 방법을 변경해야 합니다. 오늘은 Github Action으로 구현해 볼 것입니다. 쿠버네틱스에 배포하는 방법은 간단합니다. 원하는 배포사항을 YAML 파일로 작성해 kubectl로 등록해주면 됩니다. 이후에 Github Action에서 SSH로 접속해 YAML 파일을 전달하고 kubectl을 실행해줄 것입니다. 도커 빌드 및 레지스트리 저장 레포지토리명과 브랜치 이름을 바탕으로 이미지 이름을 정할 것입니다. Github Secret 에는 도커 허브 로그인에 사용할 DOCKER_USERNAME와 DOCKER_PASSWORD를 등록하면 됩니다. 스크립트는 다음과 같습니다. # This workflow uses actions that are not c..

Computer Science 2023.03.06

Dive Data Structure with Java Collection

Overview 이 장에서는 여러 Data Structure의 개념과 자바에서는 실제로 어떻게 구현되어 있는지 알아보도록 한다. Linear Data Structure Array 논리적 저장순서와 물리적 저장순서가 일치한다. 즉 메모리에서 연속적으로 데이터가 기록되는 자료구조이다. 이 특성 덕에, 특정 아이템을 인덱스를 알면 O(1)안에 접근이 가능하지만(random access), 아이템 삭제나 추가를 진행할 때, 연속성을 유지해야 하기 때문에 최대 O(n)의 시간복잡도가 발생한다. 보통 자바에서는 []를 통해서 Array를 생성하며, 아래와 같이 스택 영역에 Array의 레퍼런스를 저장하고 힙 영역의 메모리에 연속적으로 데이터를 할당하고 있다. 이 때, 메모리의 크기는 고정적이다. 또한 Array에서..

새로운 프로젝트에 관하여 - 3. Github Project 활용법

들어가며 Github은 Git Remote Repository로 사용하는데 아주 대중적인 웹사이트다. Github에는 프로젝트 관리를 위한 다양한 기능을 가지고 있어서 이번 포스트에는 이를 우리 프로젝트에서 활용한 방법에 대해서 간략하게 소개하겠다. 1. 선택이유 지난 포스트에서도 말했듯, PM(Project Management)를 위한 툴은 여러가지가 있다. 그러나 용도에 따라 서로 분산된 툴을 사용해야 하고 이를 연동하는 과정이 가벼운 프로젝트를 시작하는 사람들에게는 오히려 짐이 된다. 그런데 Github Repository에는 Issue, Milestone, Actions, Project, Wiki 등 다양한 프로젝트 관리 도구가 한 곳에 존재하기 때문에 따로 설정할 필요가 없어 편의성이 좋다. 물..

새로운 프로젝트에 관하여 - 2. 문제 정의

들어가며 지난 포스트에는 개발방법론과 이를 실현하기 위한 툴들에 대한 내용을 작성하였다. 이번에는 새로운 프로젝트에서 문제를 정의한 과정에 대해서 알아보도록 하겠다. 1. 시작 교수님께서 소개해주신 스타트업 대표님과 개발팀장님께 자문을 받았을 때 가장 인상깊었던 말씀은 클라이언트, 팀원들 간의 생각 차이를 줄이는게 가장 중요하다는 것이었다. 자세히 말하면 같은 내용을 얘기하고 있어도 미묘하게 비즈니스 로직이나 유저 스토리에 대한 이해에 차이가 발생할수 있으며 이를 바로잡지 않으면 나중에 개발을 진행할 때 문제 정의로 회귀하여 다시 개발을 진행할 수도 있는 나비효과가 발생한다는 것이었다. 따라서 이번 프로젝트에서는 생각 차이를 줄이는데 집중하여 아래와 같이 3가지 문제정의 방법을 사용하고 검증했다. 2. ..

새로운 프로젝트에 관하여-1.시작, 개발 방법론(PM)

1. 들어가며 최근 들어서 연구실에서 새로운 프로젝트를 시작하여 블로그 글을 작성하는게 뜸해졌다. 생각한 기능을 구현하고자 바쁘게 움직이면서 무의식적으로 글을 작성하는 과정을 미뤄왔던 것 같다. 프로젝트가 어느정도 기능이 구현되어 할 일이 줄어들어 지금까지 있었던 여러 고난과 극복과정을 앓음다운 글로 작성해보면서 그 동안의 팀 리더로서의 경험을 정리하고자 한다. 아직 많이 미숙하지만 이 글이 새로운 프로젝트를 시작하려는 모든 이에게 도움이 되었으면 좋겠다. 2. 새로운 프로젝트 새로운 프로젝트의 이름은 DSMP(Dicom Service Mangement Project)로 Dicom이라는 의료용 디지털 영상 데이터를 관리한다는 의미를 가지고 있다. 의료영상을 베이스로 머신러닝을 연구하는 연구실이다 보니 의..