기존에 VirtualBox 에서 VM 을 생성하여 쿠버네티스 클러스터를 구축·운영하였는데, Type1 Hypervisor 라는 개념을 알게되어 Type 1 Hypervisor 인 Proxmox 위에서 쿠버네티스 클러스터를 재구축하였다. 간단하게 Type1, Type2 하이퍼바이저의 차이와 Proxmox 클러스터 구축 과정, 추후 숙제를 정리해두려고 한다. 1. Hipervisor Type1/Type2 하이퍼바이저는 가상화를 제공하는 플랫폼 소프트웨어를 말한다. 내가 기존에 사용하던 VirtualBox(Oracle) 나 Vmware 같이 가상머신을 생성, 실행, 리소스 관리하는 기능을 수행한다. 쿠버네티스나 도커같이 컨테이너 관련 플랫폼도 가상화의 영역이긴 하지만, OS 수준에서 구현된 컨테이너 런타임에 ..
개발
이전글 [https://techforme.tistory.com/48] 이전글에서 서버를 이중화 하면서 authorization_request_not_found 오류가 나는 상황에 대한 해결책으로 ip hash 방식의 부하분산을 이야기 했었다. 이는 간단한 해결책이긴 했지만, 만약 부하 분산 방식을 round robin 으로 바꾸라는 요구사항이 생긴다면, 전혀 대응할 수 없는 미봉책이었다. (사실 Nginx 를 더 활용해 보고 싶어서 해봤다.) 근본적인 해결책이 필요했다. 이번 게시글에서는 OAuth Authorization 요청 정보를 서버 내부에 저장하지 않고 외부에 저장함으로써, Nginx 의 부하 분산 알고리즘과 상관없이 해당 문제를 해결할 수 있는 방법을 설명한다.1. 문제 상황 분석1) 문제 발..
이전에 지리데이터를 다루면서 "클러스터링" 이라는 단어를 잘 모르고 쓴 적이 있다. 개발 초기, 창고의 검색 방식에 대해 고민하다가 "위치 정보 데이터가 많아지면 대체 원하는 정보를 어떻게 조회해오지?" 라는 거의 공상에 가까운 생각을 했다. 일단은 어떤 한 점(위경도)에서 주어진 반경 내의 데이터를 조회한다고 했을 때, 가장 먼저 떠올릴 수 있는 방법은 모든 데이터와의 거리를 일일이 다 계산해서 주어진 반경 내에 있는지 판단하는 방식을 먼저 떠올렸다. (그때는 풀 스캔, 시퀀셜 스캔이라는 단어도 몰라서 내가 알고 있는 단어인 브루트 포스 단어로 이 방법을 지칭했다.) 그러다가 당근 마켓을 떠올렸고 비슷한 지역끼리 묶어서 그 근처 지역만 먼저 조회하면 되지 않나? 라는 생각에서 "클러스터링" 이라는 말을..
이전 포스팅에서 무중단 배포를 rolling 방식, blue-green 방식으로 구현했었다. 그렇게 해놓고 보니, 서버가 이중화 되었을 때도 기능들이 제대로 동작하는지 테스트 하고 싶어졌다. 단일 서버였다가 서버 개수가 두 개 이상으로 늘어나면 각각의 요청이 동일한 서버가 아닌 다른 서버로 연결 되기 때문에 예기치 않은 문제들이 생길 수 있다. 특히 서버 내부의 메모리로 관리하는 자료가 있다면 문제가 발생하기 쉽다. 이 경우 서버의 메모리마다 관리하는 정보가 각각 달라지는데 만약 요청을 서로 다른 서버가 처리하게 되면 동일한 결과가 나오지 않게 되기 때문이다. stateful 한 서버가 되는 것이다. 예를 들어 로그인 정보를 각각의 서버에서 저장하고 있게 되면 로그인 정보를 가지고 있지 않은 서버에 요..
저번 포스팅에서 무중단 배포를 구현하면서 blue-green / rolling / develop 세가지 방식의 배포를 전부 구현했었는데, 그중에 develop 배포 방식은 기존 브랜치의 배포(8080, 8081 포트)를 중단하고 8082 포트에서 develop 브랜치를 배포 새롭게 배포를 하는 식으로 동작했었다. 이것도 무중단으로 동작하긴 하지만 사실 개발 단계의 서버를 그대로 노출하게 되므로 아무 의미가 없는 배포 방식이었다. 개발용 서버는 개발자나 QA 같은 특정 집단의 사람들만 이용할 수 있도록 하고, 기존 서비스는 그대로 유지해야 제대로 된 동작 방식이라는 생각이 들었다. 그래서 이렇게 바꿔봤다. 1. Nginx 설정1) 요청 식별특정 ip 만 특정 업스트림으로 보내도록 Nginx 설정을 수정했..
무중단 배포와 자동화 배포얼마전에 유튜브 영상을 보는데 CI/CD 라는 말이 오용되는 케이스가 있다는 이야기를 들었다. 최근 신입 개발자 이력서에 Jenkins 나 Github Actions 를 이용해서 자동으로 프로젝트를 배포하는 구조를 모두 CI/CD 라고 칭하는 경향이 있는데, 사실 자동화 배포 툴로 배포를 진행한다고 해도 프로젝트가 빌드되는 시간동안 배포가 중단된다면 이는 엄밀히 말해 중단없이 연속적으로 배포된다는 의미의 CD(Continuos Deploy) 라 할 수 없으며 단순히 자동화 배포라고 이야기 해야한다는 말이었다. 그렇게 보니 우리 프로젝트 또한 빌드 시간 동안 배포가 끊기게 되는 자동화 배포 구조로 동작하고 있었다. 최근에 내 이력서를 보고 공부가 웹어플리케이션 개발에 치중되어 웹..
의 여러 서비스는 위치 정보를 기반으로 동작하게 되어있다. 예를 들어 매칭 기능 같은 경우 내가 원하는 위치를 지정하여 창고를 등록해두면 해당 위치를 기준으로 특정 반경 내에서 수요가 맞는 아이템이 있는지를 검색한다. 기획 단계에서 이런 위치 정보 기반의 서비스를 구상할 때는 실질적으로 어떻게 구현할 것인지에 대한 기술적 고민을 거의 하지 않았었기 때문에, 막상 구현하려고 하니 어떻게 할지 머리속이 깜깜했었다. 프로젝트 초반부였어서 사실 간단한 부분인데도 많은 시도와 실패 끝에 겨우 기능 구현에 성공했는데, 이미 몇 달 지난 일이지만 기억나는 대로 정리해서 올려본다. 1. 초기 아이디어 비지니스 로직을 처음 작성하기 시작 했을 때, 가장 먼저 Storage(창고) 도메인의 기능 구현을 하려고 했었다. 는..
참고 자료 - AOP, ThreadLocal을 사용하여 N+1 detector 만들어보기[https://c-king.tistory.com/entry/N1-detector-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0] 가끔씩 다른 개발 블로그들을 보면서 다른 사람들이 어떤 생각을 하고 어떤 코딩 스타일을 가지고 있는지 구경을 한다. 아무래도 랜덤한 블로그들을 다 뒤지고 다니진 않고 나와 비슷한 위치에 있지만 조금 더 실력이 좋고 나은 사람들을 위주로 구경하려고 하는데, 우테코 같은 유명한 코스를 밟고있는 사람들이 자극 받기 딱 좋다. 위 레퍼런스는 AOP 에 대해서 아예 모르던 때에 처음 본 포스팅인데 글 솜씨나, 아이디어에서 큰 자극을 받았고 본 프로젝트에도 AOP ..
이전글[https://techforme.tistory.com/34]이전 글에서 프록시객체를 자동으로 생성해주는 ProxyFactoryBean 에 대해서 썼는데, 이로써 인터페이스로 추상화하고 구현하는 지루한 과정을 하지 않아도 되게 되었다. 그러나 이 방식에는 한계가 있었는데, 또 다른 인터페이스에 부가기능을 추가하고 싶은 경우 다른 ProxyFactoryBean 을 다시 추가해야 한다는 점이었다. 이번 글에서는 한번에 여러가지 클래스, 여러 메서드를 맵핑하여 일괄적으로 부가기능을 부여하는 BeanPostProcessor (빈 후처리) 기술에 대해서 소개하고, 나아가 Spring 에서 제공하는 Spring AOP 를 통해 구현하는 것 까지 이야기하여 주제를 마치려고 한다.1. 개념 정리1) BeanP..
지난 글 [https://techforme.tistory.com/33] 지난번 트랜잭션 테스트를 위해 의도적으로 예외를 던지는 테스트 스텁을 Proxy 패턴, Decorator 패턴을 통해 구현하였다. 이 때 프록시가 적용되는 대상의 interface 를 구현 하거나 구현체를 상속하는 방식으로 프록시 객체를 생성하였는데, 상당히 번거로운 작업이었다. 만약 인터페이스의 구현체가 아니라면 해당 작업은 더욱 번거로워질 것이다. 이번 포스팅에서는 자동으로 프록시 객체를 생성하여 스프링 빈으로 등록해주는 ProxyFactoryBean 을 사용하여 이 문제를 해결해 볼 것이다. 개념 정리 FactoryBean 우선 FactoryBean 에 대한 설명이 선행되어야 할 것 같다. FactoryBean은 Bean 을 추..