Data Engineering

Docker를 활용한 카프카(Kafka) Cluster 환경 구축

이번 포스팅에서는 Docker 환경에서 Producer, Broker, Consumer가 동작하는 Kafka 환경을 구축해보겠습니다. 클러스터 구축은 단일 브로커로 동작하는 환경과 여러 개의 Kafka 클러스터가 동작하는 환경을 각각 살펴보겠습니다. 먼저 본격적인 실습에 앞서 Kafka 환경을 이해하는 데 필요한 몇 가지 개념을 짚어보겠습니다. 1. Kafka Concepts Kafka는 이벤트 스트리밍을 분산 처리하는 툴로써 이벤트(메시지)를 생산하는 Producer와 이를 처리하는 Consumer사이에서 동작합니다. 이전에는 Producer - Consumer 사이에서 메시지가 직접적으로 왔다갔다 하는 환경이었다면, 이제는 Kafka가 그 사이의 결합도를 낮춰줌으로써 복잡한 애플리케이션 환경을 보다 ..

2022.09.26 게시됨

DevOps

Jenkins, Docker를 통한 CI 환경 구축과 Slack 알람 받기

1. 소개 Jenkins는 CI 환경을 구축하는 데 있어 대표적인 사용하는 툴로써 정말 많은 서비스, 그리고 저희 회사에서도 사용하는 소프트웨어입니다. 사실 Jenkins 이외의 CI 툴도 많지만, Jenkins는 자바 기반으로 Window, Mac, Linux 등의 대부분 OS에서 동작한다는 점, 웹 인터페이스에서의 Configuration이 가능하고 많은 Plugin들을 지원해줌으로써 확장성이 좋은 장점 등이 있기 때문에 많은 서비스들에서 이용하고 있는 것 같습니다. 이번 포스팅에서는 직접 Docker를 사용해 프로젝트를 진행하는 가상 환경을 만드는 것부터, 그 안에 Jenkins CI 환경 구축하고 Slack에 해당 환경의 동작을 알림으로 받을 수 있는 기능까지 붙여보는 과정을 해보면서 Jenkin..

2022.09.21 게시됨

DevOps

WSL2, Docker desktop을 사용할 때 네트워킹 실패 문제(--net=host Option 사용 시 주의할 점)

1. 문제 WSL2 환경에서 --net=host 옵션을 바탕으로 컨테이너를 실행하게 되면, 로컬 환경에서 해당 컨테이너(서비스)의 포트로의 접근이 불가능합니다. 이 문제에 대해 직접 실험해보기 위해 아래와 같이 httpd 이미지를 pull 한 후, --net=host 옵션을 바탕으로 컨테이너를 동작시켜봅니다. $ docker pull httpd $ docker run -dit --name my-app --net=host -v "$PWD":/usr/local/apache2/htdocs/ httpd 그리고 아래와 같은 명령어로 컨테이너 동작을 확인하고 Request를 보내보면, 앞서 언급한 문제를 확인할 수 있습니다. 마찬가지로 eth0:8080에 대한 요청으로 보내도 동일한 문제가 발생합니다. 2. WSL..

2022.09.14 게시됨

Thinking

2020년 여름부터 지금까지

0. 들어가기 전에 원래 한참 전부터 지난 날들을 회고하는 글을 써보려고 했는데, 계속 미루다가 지금에서야 쓰게 됐다. 사실 회고라기보다는 지금 생각나는 내용들을 주저리 주저리 남겨보는 일기에 가까운 것 같다. 그리고 개발에 대한 내용을 많이 담아보려고 했는데, 아직 나는 아는 것도 별로 없고 배울 게 많은 병아리라서 과욕인 것 같다. 블로그에 정리하는 글들도 아직 100% 확신을 갖고 작성하지 못하기 때문에 좀 더 공부해서 내 실력에 대해 책임질 수 있을 때 무슨 말이라도 적어봐야겠다. 그래서 앞으로는 반기 혹은 1년마다는 열심히 생각을 정리해서 제대로 된 회고글도 작성해야지. 1. 재미 주변의 사람들이나 여러 회사의 면접을 보면서 가장 많이 들었던 질문은 '왜 개발을 하게 되었느냐'는 것이었는데, 이..

2022.08.17 게시됨

Spring & Springboot

Spring Security - SecurityContextHolder에서 로그인 사용자 정보 가져오기

0. 문제 Spring Security, JWT을 이용해 로그인이나 권한 처리 등의 작업을 하다 보면 "로그인을 한 사용자의 정보를 어떻게 가져와야 할까"에 대한 고민을 하게 됩니다. 토큰을 어디에 저장하고 어떤 방식으로 사용하느냐에 따라 조금씩 다른 문제겠지만 근본적으로는 발급된 토큰을 가지고 현재 권한을 가진 사용자가 자유롭게 서비스를 이용할 수 있어야 하고, 해당 사용자가 누구인지 서버에서도 바로 알 수 있어야 하는 게 당연하기도 합니다. 그럼에도 불구하고 이 내용에 대해 글을 쓰기 전에는 토큰이 아니라 아래처럼 사용자 자체가 가지고 있는 필드 정보를 가지고 DB에서 사용자를 다시 찾아서 사용했었습니다. 사용자의 Email, Username, Nickname, PK 등의 고유값을 입력(전달)받는다...

2022.08.03 게시됨

Spring & Springboot

Entity 필드가 가지는 Enum값의 목록은 어떻게 가져와야 할까?

1. 문제 엔티티가 가지는 필드의 값을 특정한 값들로 고정하고 싶을 때 Enum 타입을 사용할 수 있습니다. Enum 타입은 정해진 값들을 하나의 클래스에 모아서 관리함으로써 관리가 편하고, 클라이언트는 서버에서 관리되고 있는 Enum 타입만을 사용할 수 있도록 환경이 구성된다면(Select Box, Category 등) 잘못된 데이터를 요청하거나 전달받는 일이 사라집니다. 그런데 Enum이 가져다주는 이점이 있는 만큼, Enum은 신경써서(고민해서) 사용해야 하는 부분도 존재해야 하는데요. 이번 글에서는 이러한 포인트 중 하나인 "Entity 필드가 가지는 Enum값의 목록은 어떻게 가져와야 할까?" 라는 문제에 대해 정리해보려고 합니다. 코드를 보면서 구체적으로 설명을 해보겠습니다. [Communit..

2022.05.20 게시됨

Spring & Springboot

리액트 / 스프링 데이터 JPA 환경에서 커서를 통한 페이지네이션(Pagination) 구현하기

1. 페이지네이션(Pagination) Pagination, also known as paging, is the process of dividing a document into discrete pages, either electronic pages or printed pages. 페이지네이션은 서버에서 데이터를 가져올 때, 전체 데이터를 클라이언트에게 보여지는 단위 혹은 지정된 개수만큼 잘라서 가져오는 방법을 말합니다. 요즘 대부분의 웹/앱 어플리케이션은 무한스크롤을 기반으로 한 페이지네이션을 많이 쓰고 있는데요. 각종 커뮤니티(에브리타임, 블라인드 등)와 SNS(페이스북, 인스타그램)들이 대표적인 예시입니다. 페이지네이션을 사용하는 이유는 명백합니다. 전체 데이터를 한꺼번에 가져오는 오버헤드 대신에 지..

2022.05.18 게시됨

CS/Multicore & GPU

[Multicore] 효율적인 Matrix Multiplication - 멀티쓰레드와 캐시

0. Matrix Multiplication 아래는 N * N 크기의 행렬 A, B를 곱하여 그 결과인 N * N 행렬 C를 구하는 과정입니다. 결과로 나오는 C 행렬의 (i, j)번째 값을 계산하기 위해서는 위 그림처럼 A 행렬의 i번째 행과 B행렬의 j번째 열의 원소들을 곱해야 합니다. 위 과정을 코드로 보면 아래와 같으며 두 개의 N * N 행렬의 곱셈에 드는 시간 복잡도는 O(N^3)임을 알 수 있습니다. for i = 1 to n for j = 1 to n for k = 1 to n C(i, j) = C(i, j) + A(i, k) * B(k, j) 자, 그러면 위 연산을 어떻게 멀티쓰레딩을 통해 병렬로 처리할 수 있을까요? 앞으로 몇 가지 방법에 대해 소개를 할텐데, 각 방법이 동작하는 방식과..

2022.04.19 게시됨

Git

[Git] Rebase는 왜 쓰나

0. 들어가면서 아래와 같은 상황을 보겠습니다. 처음 시작점을 기준으로 Master가 두 번의 Commit을 한 뒤, 'feat' 이라는 브랜치(branch)를 생성했습니다. 그리고 브랜치가 생긴 시점(Base)으로부터 feat 브랜치는 두 번의 commit을 더했고, master 역시 두 번의 커밋을 더 진행했습니다. 이 상황에서 master의 변경 사항을 feat 브랜치에 반영하고 싶습니다. 그러면 아래와 같이 병합(Merge)을 통해 master와 feat의 최신 Commit을 공통의 조상으로 하는 새로운 Commit을 생성할 수 있습니다. 그리고 feat 브랜치는 이제 새로 생성된 Commit의 위치로 이동하게 됩니다. 이를 3-Way Merge라고도 합니다. 한편, 이 상황에서 Rebase를 사..

2022.04.13 게시됨

Spring & Springboot

@ControllerAdvice로 Validation 예외 처리하기

0. 들어가면서 아래 링크는 최근에 JPA를 공부하면서 참고하고 있는 Github 레포지토리입니다. GitHub - cheese10yun/spring-jpa-best-practices: spring-jpa best practices :octocat: spring-jpa best practices. Contribute to cheese10yun/spring-jpa-best-practices development by creating an account on GitHub. github.com 이번 포스팅은 위 레포지토리에서 다루고 있는 효과적인 Validation, Exception 처리에 관한 내용을 제 프로젝트에 적용시켜보고, 실제로 코드로 작성해보면서 생각을 정리해보려고 합니다. 1. Validatio..

2022.03.27 게시됨