탕구리's 블로그

모캠 History - 코드와의 첫만남 그리고 첫임무 본문

회사생활/모캠 HISTORY

모캠 History - 코드와의 첫만남 그리고 첫임무

탕구리당 2019. 3. 4. 03:46
반응형

오늘의 주제

모캠 HISTORY 첫번째 주제로 모캠의 과거와 현재에 대해서 적어 보려합니다. 모캠이 처음 외주를 받아오기 부터 지금까지 어떤 형태로 변했는지, 입사 후 처음 진행했던 업무는 무엇이었는지 되짚어보려 합니다.



첫만남..? 그리고 설레임


전체 팀원은 다섯명이었고, 이 중 개발자는 저를 포함해 세명이었습니다. 모두 신입 개발자였기 때문에 더구나 개발에 핵심인 PHP를 다뤘던 인원은 없었습니다. 그렇기 때문에, 좀 더 생산성 있는 개발을 위해서 추가로 개발 되는 부분은 Node.js로 작업하기 위한 계획을 세우고 있었습니다.


모캠을 처음 만났을 때의 전체적인 아키텍쳐 모습이에요.







모캠이 처음 외주가 끝났을때의 구조 -> 좀 더 사용하기 편리하게 변경 중 -> 변경이 끝났을 때의 구조



처음보는 것들이 많았어요. 사용해본건 AWS관련 서비스와 Mysql 그리고 PHP.. Redis에 대해서는 이론적으로만 조금 알고 있었고, Docker와 Nginx에 대해서는 전혀 알지 못했던거 같다. 도커를 통해서 서비스 내에서 사용하는 모든 기술들이 올라가 있었다. PHP, Redis, Nginx를 전부....


위와 같이 모놀로딕(Monolithic)한 구조는 확장성이 떨어지고, 서버에 장애가 발생했을 경우 서비스에 치명적입니다.

생각한대로, 생각보다 많은 양의 로그 파일, 모캠 서비스에서는 학습자료 업로드와 다운로드를 제공하고 있었기 때문에 파일들이 차지하는 용량도 만만치 않았어요.(하고 싶은 말은 용량이 꽉차서 서버가 자주 터졌다는 소리이다.)


가장 중요한건 서버가 터질까 무서워 성능 좋은 EC2 서버를 사용하였고 생각보다 많은 서버비가 발생했었죠..


확장성을 위해 서비스내에서 사용되고 있는 서비스들을 하나하나 뜯어내기 시작하였습니다. 서버 로컬 자체에서 부담하는 용량 문제를 해결하기 위해 AWS-S3를 도입했고, Redis는 Elastic-Cache 사용을 통해 분리하였다. Nginx는 Docker가 아닌 로컬 내에 설치하여 사용하기로 했죠.


위와 같이 서버구조를 변경하는 작업에는 크게 문제가 많지 않았어요. 어떻게 보면 입사후 제가 가장 먼저 맡게되 작업은 이제 곧 이야기할 "PHP와 Node.js간의 세션 데이터를 공유하는 일"이 됩니다.


팀내 인원은 전부 PHP를 사용해본 경험이 거의 전무하였고(입사 전 외주를 통해 개발된 프로그램이었기 때문에 선택권이 없었음) 그로 인해 개발속도는 정말 최악... 대표님의 정말 많은 가설들을 하나씩 검증해보기에 너무나 더딘 개발속도를 가지고 있었기 때문에, 더 이상은 PHP를 통한 개발이 아닌, 좀 더 쉽게 다룰 수 있는 Node.js를 통해 앞으로의 기능 개발을 진행 하기로 합니다.


하지만, 여기서 가장 문제가 되는것은 두개의 서버 프레임워크(CodeIgniter와 koa.js)간의 세션을 공유하는 문제였습니다.  Redis를 통해서 세션을 관리하고 있었지만, "보통 JS에서는 JSON 형태의 Object를 주로 사용하였고 PHP에서는 PHP Object를 String형태로 변환하여 Redis에 저장하여 사용하고 있었기에 하나의 세션을 두개의 프레임워크에서 클러스터링 하여 사용하는 작업이 필요 했습니다." 라고 지시를 받았지만 도통 무슨소린지 1도 몰랐기에....(눈물) 일단 알아 듣는척 하며 삽질을 시작했다. (Drake-Jin님 죄송합니다.)




PHP Object Array 가 Serialize 된 형태

PHP Obejct Array를 Serialize한 형태는 다음과 같습니다.


형태1.

a:10:{s:3:"one";s:12:"C.m.A 하나";s:3:"two";s:9:"C.m.A 둘";s:5:"three";s:9:"C.m.A 셋";s:4:"four";s:9:"C.m.A 넷";s:4:"five";s:12:"C.m.A 다섯";s:3:"six";s:12:"C.m.A 여섯";s:5:"seven";s:12:"C.m.A 일곱";s:5:"eight";s:12:"C.m.A 여덜";s:4:"nine";s:12:"C.m.A 아홉";s:3:"ten";s:9:"C.m.A 열";} 


형태2.

O:8:"stdClass":10:{s:3:"one";s:12:"C.m.A 하나";s:3:"two";s:9:"C.m.A 둘";s:5:"three";s:9:"C.m.A 셋";s:4:"four";s:9:"C.m.A 넷";s:4:"five";s:12:"C.m.A 다섯";s:3:"six";s:12:"C.m.A 여섯";s:5:"seven";s:12:"C.m.A 일곱";s:5:"eight";s:12:"C.m.A 여덜";s:4:"nine";s:12:"C.m.A 아홉";s:3:"ten";s:9:"C.m.A 열";}


JSON Object 형태

{

"auth": {

"user_id": 1,

"cam_id": 1,

"dept_id": 0,

"entrance_year": 0,

"nickname": "",

"phone_number": "",

"gender": "F",

"user_level": 10,

"auth_id": 1,

"oauth_type": "facebook",

"cam_name": "모캠대학교,

"dept_name": null

}

}


그 당시에는 PHP에서 만들어낸 형태(로그인 및 다른 세션이 생성되는 쪽은 PHP가 담당하고 있었음)로 Redis에 쪼로록 들어가 있어요. 이런 형식을 아래와 JS를 이용한 페이지에서는 아래와 같이 변환해서 사용해야 하고 PHP를 이용하는 페이지에서는 다시 위와같이 변환해줘야 하는 구조를 갖추어야 했습니다.


작업을 진행할 때는 그냥 세션이 Redis를 통해 불려오는 부분에 대해서 해당 변환을 담당해주는 모듈을 만들어 적용해주면 되겠다고 생각하고 진행했는데 생각만큼 잘 진행되지 않았어요. Node를 사용하는 곳에서 PHP serlialize 객체를 이용하는건 가능 했지만, PHP로 작성된 프로젝트에 대해 구조 자체도 잘 이해가 가지 않았습니다. 어디서 세션을 불러오는 건지, 어떤 순서로 로직을 태우는건지 조차도 말이죠ㅜㅡㅜ!!! 진짜 이해하려고 몇날 몇일을 들여다 봤는데 말이죠...(주석하나 달려있지 않는 매정함에 정말 눈물을 흘렸습니다.)


이렇게 입사 후 맡게된 첫번째 임무를 진행하던 도중.. 북딜(Bookdeal)이라는 중고책 거래 서비스를 모캠에서 인수하게 됩니다. 네, 하다말고 무기한 중지 상태가 됩니다. 그리고 차후에 서비스 전체 리뉴얼을 통해 내 첫번째 임무는 뭉개져 버린다지 아마...

지금 생각해보면 저때 진행하던 업무에 대해서 한번 더 도전해보고 싶은 생각이 많이 들어요, 세션을 관리하는 서버를 하나 운영하여 Redis로 들어갈 요청을 모두 해당 서버로 돌려서 처리하여 응답해주면 되지 않았을까 하는 생각이드네요. 아래와 같은 식으로 말이죠?


아쉽게 첫번째 임무(?) 퀘스트(?) 완료하지 못한 상태로 끝나버렸습니다. 작업물에 대해서 서비스에 직접 반영해보지는 못하였지만, 스타트업 신입 개발자로 처음 입사 후 진행한 업무에 대해서 배운 점은 다음과 같습니다.

1. 간단해 보이는 서비스라도 생각보다 상당히 복잡하고 고려해야 할 상황이 많다.
2. 당장 개발만이 중요한게 아니다. 개발할 때는 반드시 유지보수도 함께 생각하여야 한다.
3. 확장성을 생각하지 않고 구조를 잡거나, 개발을 진행할 경우 반드시 똥을 치워야하는 상황이 발생한다.

신입 개발자로 입사를 앞둔 개발자분들도 항상 명심하시면 좋을 것 같습니다.


반응형
Comments