본문 바로가기

분류 전체보기

(24)
EKS pod에서 Elasticache에 접근하기 (feat. peering) 현재 상황 : EKS pod에서 AWS Elasticache에 접근하려고 하는 상황. 현재 EKS와 Elasticache는 위치한 VPC가 다른 상태 다이어그램으로 보면 아래와 비슷한 상태. 그림 내의 CIDR도 눈여겨 봐두어야 이해에 도움이 된다. app이 속한 VPC의 경우 외부 인터넷과 연결되어 있는 것도 참고. 이런 상황에서, 피어링을 이용해 연결을 할 수 있다. 우선 두 VPC 간의 피어링을 생성한다. 생성자와 수락자를 누가 할지는 상관없다. 생성된 피어링에 대해 수락을 진행한다. 피어링이 생성된 후, 라우팅 테이블을 업데이트한다. 왼쪽이 CACHE VPC의 라우팅 테이블이고, 오른쪽이 app VPC의 라우팅 테이블이다. Destination에는 상대 VPC의 CIDR을 적고, Target에는 ..
테스트 커버리지 100% with 파이썬 얼마전에 Toss에서 진행하는 Slash21에서 인상적인 세션이 있었다. 영상을 보고 나니 테스트 커버리지를 100%를 유지하는 것이 상당히 이점이 많아 보여 이번에 새로 진행하는 프로젝트에 적용하기로 했다. (다만 실제로 100%를 실제로 적용하는 것은 꽤 요원한 일일 듯 하다.) 이번 포스트는 파이썬 프로젝트를 진행할 때 테스트 커버리지 100%를 달성(가능하도록)하기 위해 어떤 테스트 관련 설정을 했는지 공유하기로 한다. 테스트 도구 : pytest python에도 다양한 테스트 도구들이 있지만, 검색으로 좀 찾아보니 대부분이 pytest를 사용하는 분위기다. pytest의 장점은 fixture를 통해 테스트 시 반복적인 작업을 줄여주는 등의 장점이 있다. 커버리지 측정 : pytest-cov 커버..
K8S - Sealed Secret 적용하기 (feat. k9s) K8S 에는 secret이라는 객체가 있는데, 이 때 secret의 내부 value가 base64로 암호화된 상태라서, 쉽게 복호화할 수 있다. 이를 좀더 보안성을 강화하기 위해 비트나미에서 만든 것이 Sealed Sercet이다. sealed Secret을 실제로 어떻게 K8S 클러스터에서 적용하는 방법을 설명한다. 0. sealed secret controller가 k8s 클러스터에 필요한데, 관련 정보는 아래 블로그 참조 https://kangwoo.kr/2020/01/29/sealed-secretes/ Sealed Secretes – 지구별 여행자 Secrets in Kubernetes 쿠버네티스를 사용하다 보면, 수 많은 YAML 파일들을 만들어 낼 것입니다. 그리고 이 YAML 파일들을 잘 관..
SICAL v1.1.0 개발노트 v1.1.0을 런칭한 지 거의 2주만에 개발노트를 작성한다.. 패치노트 이번 버전에는 사용자가 자신이 원하는 시험 일정만 달력에 표시할 수 있는 기능을 추가했다. 시험목록 탭에서 현재 열람 가능한 시험목록을 볼 수 있고, 구독 버튼을 통해 원하는 시험 일정만 조회할 수 있다. 구독 시에 사용자가 원하는 색상으로 시험 일정의 색깔을 변경할 수 있다. 일단 당분간은 조회 가능한 시험종류를 늘리는데 집중해야 할 듯 하다.
SICAL v1.0.0 개발노트 SICAL 이란? SICAL은 시험 캘린더의 줄임말로, '대한민국의 시험일정들을 모아보자'를 모토로 만든 앱이다. 추후 시험뿐만 아니라 다른 행사나 개인일정 등도 포함하고, 커뮤니티 기능 등을 통해 재방문율이 높은 앱을 만들어볼 생각이다. 앱 제작 목적 앱의 제작 이유는 세 가지 정도이다. 다양한 시험 종류와 많은 수험생이 있어 잠재 수요가 크다고 판단 2021년 5월 기준 비슷한 앱이 거의 존재하지 않음 유저들 간의 커뮤니티 형성을 위한 발판 위에서 말한 기능들을 추가하면 사람들이 꽤 쓰지 않을까 하는 생각도 있지만, 과연 제대로 된 수익을 낼 수 있을지 의구심이 많다. 이를 빠르게 확인하려면 일을 엄청 해서 반응을 확인해보는 수밖에 없다(...). 2021년 3월경부터 제작을 시작해서 매우 부실하지만..
flutter 빌드 시 디버그 표시 제거하기 앱 스크린샷을 찍을 때 디버그 표시를 안 보이게 하는 옵션 MaterialApp( debugShowCheckedModeBanner:false, home:... ) 앱스토어에 올리기 위한 스크린샷이 필요했는데, ios 시뮬레이터에서 release 빌드를 할 수 없어서 임시로 플래그를 제거하고 찍었다.
TypeORM 타임존 옵션 관련 Timezone option TypeORM을 사용해 작업중에 TypeORM이 테이블에서 가져오는 값과 실제 테이블 내 컬럼값이 상이함을 발견했다. 예를들어 DB 내 실제 값은 2021-09-04 00:00:00 인데, 이 값을 TypeORM으로 가져왔을 때는 2021-09-03 15:00:00으로 변경되어 있었다. 처음에는 서버 리눅스 내부의 timezone이 상이해서 그런줄 알았는데, 똑같이 seoul로 맞춰봐도 동일했다. 혹시 ORM 수준에서 변환을 하고 있지 않을까 해서 찾아보니, 관련한 Github issue에서 해결법을 발견했다. 코드 상에서 DB 연결을 위한 ORM 설정 부분에서 timezone 파라미터를 추가해주면 된다. const connectionInfo = ({ type: 'mysql', name: 'mysql',..
ElasticSearch 인덱스에 동의어 사전 적용하기 동의어 적용은 검색에 있어 사용자에게 wow 및 ai를 활용하는 듯한 느낌을 줄 수 있다. 동의어 적용 자체는 mysql로도 어찌어찌 적용해본 경험은 있으나, DB에 쓸데없는 부하가 있어 ES에 직접 사전을 넣어 동의어 적용을 하는 것이 가장 좋다고 느껴진다. 예를 들어 생로랑과 입생로랑의 경우, 생로랑이 공식단어라 그것만 있을 경우 입생로랑을 검색했을때 생로랑이 뜨지 않을 것이다.(만약 반대조건이라면 생로랑이 입생로랑에 포함되어 상황에 따라 좀더 검색확률이 올라갔을 것이다) 현재 나는 AWS의 ElasticSearch Service를 통해 ES를 쓰고 있으므로 이를 기준으로 작성할 것이다. (ver 6.8) 예시 사전은 다음과 같다. dict.txt 생로랑, 입생로랑 구찌, 구지, 구띠 사전이라고 해서..
MySQL / MariaDB 서브 쿼리 내의 order by 안 되는 현상 + 해결법 작업을 하다 보면 다루어야 할 데이터도 많아지고, 테이블도 많아집니다. 그에 따라서 사용하는 쿼리문이 길어지기도 합니다. 쿼리가 길어지다 보면 과거 심플하던 시절에는 없던 문제가 생기기도 하는데, 이번에 제가 발견한 케이스가 있어 공유하고자 합니다. 사용했던 쿼리의 형태는 아래와 같았습니다. 3개의 테이블을 A 테이블의 m_id를 중심으로 join하고, 그 결과값을 원하는 기준으로 정렬한 후에 특정 컬럼을 기준으로 group하는 쿼리입니다. SELECT * FROM (SELECT A.m_id, A.name, B.gender, C.items FROM A JOIN B ON A.m_id = B.m_id JOIN C ON A.m_id = C.m_id ORDER BY A.regdt DESC ) AS RESULT ..
ElasticSearch - index Alias를 활용한 유연한 인덱스 운영 ElasticSearch(이하 ES)를 사용하다 보면 운영 중인 index를 수정할 일이 생긴다. (mapping이나 setting 등) 그런데 ES는 MySQL과 달리 인덱스의 메타데이터를 수정하기가 쉽지 않다. (ES의 데이터 불변성이 인덱스에도 적용되는 느낌이다) 그래서 나는 보통 새로운 인덱스를 생성해 reindex를 해주는 방식을 사용했는데, 이 때 index의 크기가 클 경우 reindex의 시간이 길어 그 동안 해당 index를 사용할 수 없는 문제가 생긴다. 실제 운영 중인 서비스의 경우 이 문제가 상당히 크게 다가오는데, 이 때 유용하게 사용될 수 있는 것이 ES에서 제공하는 Alias 기능이다. Alias는 어떤 인덱스의 별칭을 정해두고, ES에 요청이 올 때 인덱스명이 별칭인 요청이 ..