서비스 오픈을 위해 개발에 힘쓰던 중 동시성 문제를 해결해야할 상황이 왔다. 개발중인 서비스는 가계부인데, 거래가 입력되거나 수정되거나 삭제될 때마다 금액에 대한 업데이트를 정확하게 해줘야할 필요가 있었다. 그러나 고려해야 할 사항은 아래 두 가지가 있었다.첫번째, 서버의 스케일 아웃을 고려해야 한다.두번째, 서버 개발에는 최소의 비용이 들어야 한다. 첫번째 사항인 서버의 스케일 아웃을 고려하면 당연히 소스코드 내에서 처리하는 것은 불가능했고, 비관적 락, 낙관적 락, Named Lock, 혹은 분산 시스템을 사용하여 락을 구현하는 방법 등 여러 가지 방법이 있었는데 내가 선택한 방법은 Named Lock이었다. 비관적 락의 경우, 실제로 로우나 테이블 단위로 데이터에 락을 거는 방법인데, 충돌이 빈번하..
처음 내가 서버 개발을 담당하게 되었을 때, 생각보다도 간단했던 기능에 약간 기운이 빠지기도 했다. 서버는 단순히 데이터 동기화의 역할만 해주면 될 뿐이라고 알게 되었을 때 데이터 동기화 기능만 만들어주고 이후엔 서버 개발에선 빠질 것 같았다. 실제로 앱 개발 팀장님이나 우리 팀장님이나 그렇게 얘기를 하셨고. 내가 서버를 맡기 전까지 서버를 담당하신 앱 개발 팀장님께 인수인계받은 내용으로는 앱 개발 팀장님이 이미 설계하신 API가 있었고, RequestBody의 대략 형태를 그려보자면 아래와 같았다. 의미를 풀어서 써보자면, data로 type의 작업을 task의 정보를 가지고 한다는 의미이다. 그 말인즉, 엔티티는 엄청 많은데 그 많은 엔티티의 작업을 처리하는 엔드포인트가 하나였다.{ "job":..
요즘 블로그가 뜸했던 이유가 있었는데, 바로... 상반기부터 쭉 서비스 개발을 해왔기 때문이다. 그것도 스프링이 아니라 Nest.js + TypeORM으로. 우리 회사는 SI회사이긴 하지만, 창사 때부터 줄곧 자체 서비스를 목표로 했다고 한다. 그리고 여러 회의를 거쳐 아이템이 선정되었고, 지금까지 발전시켜오다가 드디어 서비스 오픈을 목표로 본격적으로 개발에 돌입한 상황이었다. 원래는 앱으로만 만들려다가 서버의 역할이 필요해졌는데, 때마침 내가 그 소식을 알게 되었고, 내가 개발자 전에 하던 업무와 밀접한 관련이 있는 앱 서비스이기도 해서 내가 자원해서 서버를 개발하기로 했다. 처음엔 서버는 한 사람으로 충분할 것 같다고 하셨지만, 우리 팀에서 나 말고도 하고 싶다고 한 사람이 있어서 팀장님은 고민하다가..
지금 진행하고 있는 프로젝트에서 DB의 Collation 관련한 문제가 생겨서 정리해둔다. 문제상황 현재 하고 있는 프로젝트는 고도화 프로젝트인데, 기존 테이블의 Collation은 utf8mb4_general_ci이고, 새로운 테이블의 Collation은 utf8mb4_unicode_ci이다. 두 테이블의 컬럼을 비교해야 하기도 하고 관리의 용이함을 위하여 기존 테이블의 Collation도 utf8mb4_unicode_ci로 변경하기로 했다. 그래서 변경을 하던 중, 특수문자를 다루는 테이블에서 문제가 발생했다. 문제가 발생한 컬럼은 Unique 설정이 되어 있었는데, 원래 utf8mb4_general_ci에서는 서로 다르다고 판단했던 데이터가 utf8mb4_unicode_ci로 변경하면서 같다고 판단..
아파치 과카몰리란? 아파치 과카몰리는 아파치 재단에서 만든 클라이언트리스 리모트 데스크탑 게이트웨이이다. VNC, RDP, SSH와 같은 표준 프로토콜을 지원한다. 클라이언트리스라고 하는 이유는 어떠한 플러그인이나 클라이언트 소프트웨어가 필요하지 않기 때문이다. 아키텍처를 살펴보면 위와 같은데, HTML5 웹브라우저만 있으면 과카몰리 서버를 거쳐 원격 데스크탑에 액세스할 수 있다. 직접 컴퓨터에 설치해도 되고, 도커로도 가능하다. 더 알아보고 싶다면 공식문서를 참고하자.(https://guacamole.apache.org/doc/gug/) 왜 필요했을까? 사실 아직 시험용으로 사용하고 있는데, 갑자기 아파치 과카몰리를 사용하게 된 이유는 다른 팀의 서버가 해킹되어 코인채굴에 사용되고 있었기 때문이다. 😱..
DB를 다룰 땐 사소해보이지만 아주 중요한 부분이 있다. 그것이 Collation인데, 이건 DB에 문자를 저장하거나 비교할 때 적용되는 규칙이라고 생각하면 된다. '가'라는 Collation에서는 'A'와 'a'를 같다고 보지만 '나'라는 Collation에서는 'A'와 'a'가 다르다고 하자. 그러면 '가'에서는 'Apple'이나 'apple'이나 같다. 하지만 '나'에서는 'Apple'과 'apple'은 엄연히 다른 것이다. 이렇게 문자를 저장하거나 비교할 때 적용되는 규칙은 컬럼 단위로 다르게 정할 수도 있고 테이블 단위로 다르게 정할 수도 있는데, 중요한 것은 MySQL에서는 서로 다른 collation의 컬럼을 비교하는 것을 막고 있다. 예를 들어, utf8mb4_general_ci인 컬럼과 ..
요즘 개발하고 있는 건은 이런저런 이유로 커밋을 못하고 개발을 하고 있었다. 나는 인텔리제이로 주로 작업을 하고, 가끔 이클립스를 사용할 때가 있는데, 오늘은 이클립스로 내가 작업하고 있는 프로젝트를 새로 열다가 내가 작업하고 있는 프로젝트를 그대로 이클립스로 여는 실수를 했고, 그러다가 내가 커밋하지 않은 작업을 날리게 되었다.(...) 이럴 때 사용할 수 있는 방법이 로컬 기록이다. 인텔리제이의 로컬 기록 기능에 대한 자세한 설명은 아래 링크 참고. https://blog.jetbrains.com/ko/2020/03/26/local-history-intellij-save-your-code-ko/ IntelliJ IDEA의 로컬 기록(local history)이 여러분의 삶 코드를 구할 수 있습니다 |..
HTTP 메시지는 크게 세 가지로 구성된다. 시작줄, 헤더, 본문. 만약 시작줄에서 오류가 발생한다면 서버는 어떻게 반응할까? 건너건너 듣기론 다른 팀에서 이런 경우를 테스트해야할 일이 생겼다고 해서 나도 테스트를 해보았다. 우선 시작줄에 오류를 만들어내기 위하여 아래의 글을 참고하여 Burp Suite를 사용했다. QA로 일하고 있는 지인에게 물어봤는데, 이런 프록시툴을 테스트할 때 꽤 사용한다고 한다. 주로 많이 사용되고 있는 툴은 Charles(찰스)와 Fiddler(피들러)이라고 한다. Postman으로도 간단한 프록시 기능을 할 수 있다고 한다. https://velog.io/@tkaqhcjstk/%ED%8C%A8%ED%82%B7%EB%B3%80%EC%A1%B0%ED%88%B4-Burp-suit..