[Daily Poll] 작업일지(2) - 서버 인프라 설계 : 데이터베이스

Daily Poll 의 요구사항을 세세하게 다 적지 않아도, 이 프로젝트의 시작이 명확한 Pain Point를 해결하고자 하는 것이기 때문에, Overall Server Infra 정도는 생각해 볼 수 있을 것 같다. - 유저와 투표를 관리하고 투표를 처리할 수 있는 API Endpoint 제공 및 데이터 저장을 위한 데이터 베이스 구축. 오라클 클라우드에서의 전형적인 기본 구성은 다음 글에서 잘 보여준다. https://k21academy.com/oracle/networks-in-oracle-cloud-oci-vcn-subnet-gateways-peering-transit-routing/ 너무나 당연하게도 데이터베이스 서버는 외부에서 직접 접근할 수 없어야 하고, Bastion과 보안 규칙들로 서버를 보호해야 한다. 제대로 된 프로젝트를 진행하려고 했다면 API 서버와 데이터베이스 서버의 인스턴스를 별도로 분리하고 4개의 무료 코어를 반반씩 나눠서 별도로 구성했어야 하지만... 취미에 가까운 프로젝트이니 저 내용은 머리로 이해만 하고, 실제는 한 서버에 모두 때려 넣었다. 그래도 구성 자체는 Docker 를 통해 분리를 하려고 한다. 먼저 데이터베이스는 PostgreSQL 을 사용하려고 한다. 왜 PostgreSQL 이냐고 묻는다면, 개인 프로젝트라면 뭘 선택해도 상관 없다고 본다. 이미 상용 서비스에서 검증이 끝난 많은 데이터베이스들이 있기에, 그 중에서 익숙한 것을 고르면 된다. 하지만 난 익숙한 데이터베이스가 없으므로, 그냥 마음이 끌리는 데로 선택하였다. 그 옛날 웹 서비스라고 하면 APM(Apache-PHP-MySQL)이 떠오르던 시절부터 MySQL과 함께 데이터베이스 영역을 지켜왔기도 하고, 오라클이 MySQL을 가져간 이후부터 MySQL은 탈락. (근데 난 OCI 쓰는데...) 데이터베이스를 다룰 때 마다 학교 다닐 때 좀 더 열심히 공부할 껄 생각을 하게 된다. 데이터베이스 수업을 정말 대충 들었는데, 중간고사를 완전히 망치고 다음 수업에 들어...

[Daily Poll] 작업일지(1-a) - 마인크래프트 서버 설치

이미지
이번에도 역시 의식의 흐름대로... 전문가들이 본다면 뭘 당연한 걸 적어놨나 싶겠지만, 그냥 공부한 걸 복습할 겸 기록하고 있다. 이전 글의 마지막에 말했듯이 성능이 좋은 서버가 생기니 다른 걸 하고 싶은 욕구가 생겼다. 집에 있던 N100 미니PC를 아이들과 함께 노는 마인크래프트 서버로 사용하고 있었는데, 이 서버를 오라클 클라우드의 인스턴스에 설치해 보았다. 심플하게 바닐라 서버만 실행하면 되기에 openjdk21 설치 후, minecraft 서버를 간단하게 실행하면 끝이다. 하지만 이걸로 외부에서 접속할 수는 없다. 이 인스턴스는 VCN과 Subnet 안에 위치하고 있기에, 외부의 접속 요청이 이 서버까지 도달할 수가 없기 때문이다. 간단하게 표현을 해 보자면 (내 PC의 마인크래프트) - (VCN) - (Subnet) - (Instance) 이렇게 구성되어 있을 때 마인크래스트 접속 요청이 25565번으로 가게 되는데, (내 PC) - (VCN) 사이에서 VCN 가 이걸 통과시켜 주지 않기 때문이다. 이전 글대로 서버 인프라를 구축했다면, VCN 과 Subnet 이 동일한 보안 규칙을 사용하게 된다. 그래서 VCN 혹은 Subnet 둘 중 아무데서나 보안 탭 > 보안 규칙으로 들어간 다음 25565 포트를 열어주면 된다. 자, 그럼 이제 될까? 여전히 안된다. Instance 자체에도 방화벽이 있기 때문이다. 인터넷을 찾아보면 다양한 솔루션들이 나오는데, 무작정 따라하면 안되고... 내가 확인한 바로는 ubuntu 계열이라면 iptables 를 직접 사용하거나 ufw 추가로 설치해서 사용하면 되는 것 같다. Redhat 계열은 firewalld 를 사용하는 솔루션을 찾으면 된다. ufw 가 좀 더 편리하다고 하는데, 그냥 포트 하나 추가하는데 굳이... iptables 사용하는 명령어도 찾으면 다 나오는 걸... 한국에 있는 춘천 리전이라 느리지도 않고, N100 보다도 더 성능이 좋은 거 같다. 그런데 게임을 하고 있으니 갑자기 누군가 접속해서...

[Daily Poll] 작업일지(1) - 프로젝트 시작과 서버 구하기

최근 회사의 탁구 동호회에 가입하여 탁구를 배우기 시작했다. 동호회에서는 강사님에게 레슨을 받을 수 있는 프로그램을 운영하고 있어 주 2회 레슨을 신청하였다. 레슨은 하루에 15분씩 1:1로 진행하는데, 레슨 시간은 카카오톡 투표를 이용하고 있었는데, 매일 오전 8시에 제일 먼저 투표한 사람이 해당 레슨 시간의 우선권을 가지게 된다. 나름 괜찮지만 문제는 투표 관리하는 사람이 매달 매우 많은 투표를 생성해야 하고, 사람들도 해당 날짜의 투표를 매번 찾아서 들어가야 하는 문제가 있었다. 지금은 다른 앱을 사용해보려고 하고 있으나 생각보다 편하지는 않은 듯 하여, 이걸 개인 프로젝트로 진행해보려고 한다. 그리고 먼저 프로젝트 이름부터 Daily Poll 이라는 지어보았다. (다만, 프로젝트가 완성되는 것이 우선일지, 내가 탁구를 그만 두는 게 우선일지...) 일단 이 작업일지는 의식의 흐름대로 진행하게 되고, 작업도 내키는 대로 진행하기 때문에 이야기가 중간에 새거나 할 것 같다. 뭔가 대단한 강좌를 작성하는 것이 아니라, 작업 내용과 거기에서 파생되어 확인했던 내용을 정리하기 위한 목적이 크기 때문이다. 그 시작으로 이 프로젝트에는 서버가 필요하기에 서버를 마련했던 이야기를 해보고자 한다. 가볍게 무료로 시작할 수 있고, 서버 관리도 필요없고, 자료도 많은 AWS 람다로 시작해 볼까 하다가... 이전에 시도해 보다가 그만두었던 오라클 클라우드를 한 번 사용해 보기로 하였다. https://www.oracle.com/kr/cloud/free/ 조금만 검색해 봐도 알 수 있지만, 오라클 클라우드는 상시 무료로 다음과 같은 컴퓨팅을 제공한다. ARM 기반 Ampere A1 컴퓨팅 인스턴스 최대 4개 지원(매월 3,000 OCPU 시간과 18,000 기가바이트-시간 제공) 인스턴스 4개 대신에 4코어 24GB램의 인스턴스 하나를 사용할 수 도 있는데, 무료로 제공하기에는 너무 대단한 서버가 아닌가 싶다. 특히 2026년 기준으로 요즘 AI 때문에 램 가격이 미쳐 날뛰고...

[대항해시대 온라인][글섭] 아이템 정리글

영어로 된 이름의 아이템과 약자들, 혹은 글섭에만 있는 아이템들을 좀 더 쉽게 확인하기 위해 작성해 둡니다. (계속 업데이트 예정)   - Emergency Shipbuilding Request / ESBR : 긴급조선의뢰서(긴조) - Master's Ship Material Purchase Order (No.1) : 주간 보너스 퀘스트 5회 달성 시 주는 아이템. - WTS : 삽니다 (Want to sell) - WTB : 팝니다 (Want to buy) - WTT : 교환합니다 (Want to trade) - WTH : 고용합니다 (Want to hire) - PC {물품이름}: 가격이 얼마인가요? (Price)

[STL] vector 의 정렬 - object pointer 정렬

이미지
[STL] vector 의 정렬 - object pointer 정렬 이 주제는 C++ STL 의 기본에 가까운 듯 한데, 평소에 C++ 로 프로젝트가 진행되는 경우가 없어서 익숙하지가 않아, 쓸때마다 헷갈려서 ( 특히 object pointer 타입을 다룰 때… ) 정리차원에서 한 번 포스팅해 좀. 1. Primitive 타입 먼저 가장 기본 형태. primitive type 의 vector 를 보자. vector<int> v; for (int i = 0; i < 20; i++) v.push_back(i); random_shuffle(v.begin(), v.end()); for (int i = 0; i < 20; i++) cout << v[i] << " "; cout << endl; sort(v.begin(), v.end()); for (int i = 0; i < 20; i++) cout << v[i] << " "; cout << endl; (실행결과) 1 11 15 0 14 7 16 13 8 10 17 5 2 19 18 9 4 3 6 12 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 위와 같이 오름차순으로 정렬이 된다. 기본적으로 std::sort 함수는 elements 비교에 ‘<’ 연산자를 사용하기 때문이다. 그럼 내림차순으로 정렬을 하려면 어떻게 해야 하는가? 바로 compare 하는 함수를 지정해 주거나, compare object 를 지정해 주는 것이다. 이때 함수는 bool comp(int a, int b) 형태로 표현하면 된다. 중요한 점은 comp 함수의 return value 가 true 라면 a 가 b 보다 앞으로 간다는 것이다. 위의 코드에...

[Unit Test] Robolectric 4.4 와 Shadow 그리고 Mocking

이미지
[Unit Test] Robolectric 4.4 와 Shadow 그리고 Mocking 안드로이드 어플리케이션의 유닛 테스트를 작성하다 보면,비즈니스 로직을 완전 순수하게 자바로 독립해서 작성하기에는 너무 코드가 많아지고 복잡해지고 솔직히 너무 오버 아키텍처가 되는게 아닐까 고민하게 되는 것 같습니다. 결국 안드로이드 프레임워크 API 를 이용하게 되는데, 이 안드로이드 API 들을 mocking 하기 위해서 그래도 가볍우면서 샘플코드나 자료를 쉽게 찾을 수 있는 mocking framework인 Mockito 를 사용하게 됩니다. 그런데 또 이걸 이용해서 유닛 테스트를 만들며 mock object들을 만들다보면 내가 테스트 코드를 작성하는 건지, 안드로이드 프레임워크 코드를 작성하는 건지 하는 생각이 듭니다. 결국 안드로이드 프레임워크 코드를 내가 작성해야 하는 상황이 싫어, Robolectric을 사용하는 것을 고민하게 됩니다. Robolectric의 원래 목적을 생각해보면 실제 디바이스나 에뮬레이터 상에서 UI를 수행하는 대신, 빌드 타임에 UI테스트를 수행할 수 있게 해 줍니다. 하지만 이 글에서는 여기까지는 고려하지 않고, 직접 Mock 객체를 만들지 않아도 안드로이드 프레임워크 API를 이용할 수 있다는 것에 집중하려합니다. 그리고 Mock 객체를 직접 만들지 않고 Shadow를 사용하는 것은 부족한 점이 있지만, 이 부분을 어떻게 채워가는지 이야기 하고자 합니다. Mocking 할 필요가 없다. 먼저 JUnit으로 안드로이드 어플리케이션의 유닛 테스트를 작성하는 상황을 보겠습니다. 테스트를 작성할 때, 코드에서 안드로이드 프레임워크의 API를 이용하면 IDE 상으로는 에러를 보여주지 않지만, 실제 테스트를 수행해 보면 에러가 발생합니다. (테스트 대상 클래스) public class MyClass { public boolean verifyName(String name) { r...

[책] 소프트웨어 세계화

이미지
소프트웨어 세계화 박미라 저 에어비앤비, 페이스북, 트위터는 해외에서 50% 이상의 수익을 번다. 그런데 우리나라에는 왜 그러한 소프트웨어가 없을까? 문제는 세계화다. 마이크로소프트, 구글, 에어비앤비, 페이스북, 트위터, 넷플릭스, 링크트인, 인튜이트는 기획 단계부터 세계화를 고려한다. 일단 국내에서 통하고 보자고? 그럼 영원히 해외로 나갈 수 없게 될 것이다. 이 책은 MS 미국 본사 국제화 부서에서 10년 이상 근무한 저자가 세계화를 체계적으로 정리한 국내 최초의 소프트웨어 세계화 지침서다. 세계화, 국제화, 현지화의 개념을 잡는 것... 소프트웨어의 세계화, 국제화, 현지화에 대한 책. 책의 전체적인 내용은 단순히 코딩에 대한 내용은 아니고, 소프트웨어 개발 전반에 걸쳐(기획부터 품질관리까지) 세계화를 어떻게 할 것인가에 대해서 설명하고 있다. 회사에서 세계화 담당팀이 별도로 없고, 자신이 담당하고 있는 소프트웨어 프로덕트가 세계화를 해야할 필요가 있다면 읽어보면 좋을 듯. 개인적으로 나는 이러한 내용들을, 검증으로부터 문제를 전달 받으면서 주먹구구식으로 익힌 느낌인데, 이런 책이 있으면 좀 더 개념잡기에 좋을 것 같다. 전 세계에 배포하는 소프트웨어를 담당하는 팀이라면 신입사원들에게도 한 번 읽어보도록 하면 좋을 것 같다.