대학교에서 다양한 프로젝트를 했지만 실제 사용자들을 대상으로 제작하고 배포한 서비스는 처음이다.
현재 Ionic framework를 활용하여 웹, Android, IOS에 전부 출시할 예정이며 웹으로 먼저 출시했다.
웹보다 어플로 나오면 사용하겠다는 피드백을 가장 많이 받았다. 얼른 구글 스토어에 검토가 완료되면 출시해야겠다.
간단하게 서비스에 대해서 정리하자면...
개발 목적
모여봐요 동물의숲을 이용하는 유저들간의 제대로된 거래 플랫폼이 존재하지 않았다.
해외에는 이미 거래 플랫폼이 있었지만 국내에는 네이버 카페나 DC 갤러리, 카카오톡 오픈채팅방을 사용하여 거래를 하고있었다. 거래량은 1분에 10건 정도의 게시글이 올라올 정도였다. (지금은 많이 식은듯 하다) 이렇게 많은 사용자들이 사용하다보니 사기꾼도 많았고 그에 따른 처벌 또한 없었다. 이런 문제점을 해결하기 위해서 개발 시작!
서비스
거래 물품을 등록하면 다른사람들이 1:1 채팅을 걸어오면 물건을 판매, 구매, 교환하는 방식의 웹앱이다.
사용 기술
Front
Back
Database
Server
Vuejs
Nodejs
MySQL
AWS
Ionic
Socket.io
느낀점
졸업작품을 개발할 때 회원가입, 유저간의 소통환경 이런 것은 대충 만들고 높은 기술을 활용한 퍼포먼스에만 집중해서 개발했다. 주로 회사에서 놀라는 것은 높은 기술력이였고 학교에서는 IoT, Blockchain과 같은 기술을 요구했다.
하지만 이번 프로젝트를 통해서 졸업작품은 정말 현실성없는 서비스라는 생각이 많이 들었다.
실제 사용자들에게 배포할 서비스에서 로그인에는 생각보다 섬세한 작업이 필요했다. 사용자들이 바라는 것은 Blockchain, Ai등을 활용한 편리한 서비스가 아닌 안정적이고 그들이 관심있는 분야의 서비스의 제공이었다.
배포 환경을 구현하는 것 또한 생각보다 시간이 많이 걸렸다. 업데이트를 할 경우 서버 다운시간을 최소화하기 위해 AWS의 Elastic Beanstalks에 대해 공부하고 Docker에 대해서 많이 배울 수 있었다.
물론 높은 기술을 사용해서 퍼포먼스로 사용자에게 만족감을 주거나 효율적인 알고리즘으로 서버의 무게를 덜어주는 것도 중요하지만 기본이 가장 중요하다는 것을 알 수 있었다.
분명 나도 언리얼 엔진4를 슬쩍 만져봤지만 내가 만든 게임과 어떻게 이렇게 다를수가 있지라는 생각이 든다.
제작 초기 PV영상임에도 불구하고 OST와 그래픽이 완벽하다. 검은사막을 오랜기간 해왔지만 역시 현실적인 그래픽보다 판타지적인 그래픽이 더 끌리는 것 같다. 타격감이 조금 아쉽기는 하지만...
또한 YOUTUBE에서 테스트 진행 후 받은 피드백을 어떻게 수정해 나갈지 또는 어떻게 수정했는지 꾸준히 영상을 올려줌으로써 아직 직접 게임을 플레이하진 못하지만 대리만족을 느끼게 해준다.
유튜브에서 소개하는 멘트를 번역하여 적어보겠다!
블루 프로토콜이란?
블루 프로토콜은 BANDAI NAMCO 온라인과 BANDAI NAMCO 스튜디오에 의한 공동 프로젝트 팀인 「프로젝트 스카이 블루」의 핵심적인 콘텐츠로써 개발중인 PC용 온라인 액션 RPG 게임입니다. 극장에서 보는 애니메이션과 같은 압도적인 그래픽으로 만들어진 세계와 온라인 게임의 특성을 살린 멀티플레이 액션을 파고든 게임성을 융합시킨 완전!신작!국산! 오리지날 게임으로써 언리얼엔진4로 개발중입니다.
현재 알파 테스트와 베타 테스트가 끝났고 추후 스케줄은 미정이라고 한다. 앞으로 테스트가 필요하면 큰 테스트부터 작은 테스트까지 얼마나 더 시행 할지 모르겠다고 한다. 자세한 내용은 아래 유튜브 채널에 들어가서 보면 된다!
자! 열심히 알아봤다. 이제 받아져야지? 라고 생각한 나의 실수였다. 계속해서 데이터가 넘어오지 않았다. 여기서 삽질 또 시작.
문제는 프론트의 axios에 있었다. axios를 사용하면 받아지지 않았지만 아래의 코드를 사용하니 값이 넘어왔다.
var req = new XMLHttpRequest()
var file = new Blob(['This is a test'], { type: 'text/plain' })
var data = new FormData()
data.append('photo', file, 'test.txt')
req.open('POST', '/upload')
req.send(data)
3. 저장 폴더를 유동적으로 바꾸기
난 aws s3에 이미지 파일을 저장해야했기 때문에 multer-s3도 사용했다.
multer의 구조는 좀 이상했다. 프론트로 받은 데이터를 기반으로 이미지가 저장될 폴더를 만들고 싶었지만
app.post('/image', s3.upload.single('avatar'), function (req, res, next) {})
이렇게 req로 받기도 전에 파일에 저장을 때리는데 어떻게 하란 말인가...
그래서 아래와 같은 방법으로 파일명을 고쳐보기로 했다.
/* router file */
const express = require('express');
const router = express.Router();
const ctrl = require('../api/c_board');
const multer = require("multer");
const {new_s3_storage} = require("../utils/u_s3_storage");
// s3를 빈 값으로 선언했더니 아래 라우터에서 빈 값에
// array() 함수가 없다고 에러가 떠서 저장 폴더가 고정된 s3객체를 넘겨줬다
let s3 = require("../utils/u_s3");
// 해당 middleware부터 먼저 실행되고 아래 /image가 실행된다
router.use('/image', (req, res, next) => {
// 프론트로부터 받은 데이터
var bo_id = req.headers.bo_id;
// 데이터를 매개변수로 넘겨 새로운 s3 storage 객체 생성
var s3_storage = new_s3_storage(bo_id);
// 기존 s3에 새로만들어진 s3 storage로 덮어준다
s3 = multer({ storage : s3_storage });
next();
})
router.post('/image', s3.array('img'), ctrl.image);
module.exports = router;
middleware를 사용해서 /image로 들어가기 전에 header 값으로 프론트로부터 받은 데이터(req.headers.bo_id)로 새로운 storage 객체를 만들어 s3에 덮어씌울 계획이었다.
결과는 실패!
let s3 = require("../utils/u_s3"); 값이 middleware에서 아무리 덮어씌어도 안바뀌더라.
프로젝트를 하면서 서버 개발은 PHP를 기반으로 하는 프레임워크인 Laravel을 가장 많이 사용했다.
이번에 새로운 프로젝트를 진행하면서 Laravel 대신 Nodejs를 사용하게 되었다.
서버의 제일 기본적인 역할은 DB를 탐색하여 프론트에서 요청하는 사항에 맞게 데이터를 돌려주는 역할이다. Laravel은 컨트롤러에서 쉽게 쿼리문을 DB에 보내 탐색할 수 있다. 하지만 Nodejs는 'Sequelize' 라는 라이브러리를 사용하여 MySQL에 접근해야 한다.
즉, 'Sequelize'를 사용하면 자바스크립트 코드로 MySQL을 제어할 수 있게 된다.
이론적인 자세한 내용은 나도 오늘 처음 만져보기에 모른다. 어떻게 사용하는지에 대해 차근차근 알아보자!
시작하기 전 준비물!
1. Nodejs 2. MySQL
1. sequelize-cli 를 설치해주자.
> npm i sequelize mysql2
> npm i -g sequelize-cli
i 는 install 의 약자이고 둘 다 사용해도 문제없다. -g 는 sequelize-cli 를 전역에 설치한다는 의미로 설치를 마치고 아무 커맨드 창에서나 sequelize 를 호출할 수 있다.
2. sequelize 를 프로젝트 폴더에 설치하자.
> sequelize init
위 명령어를 입력했지만 "이 시스템에서 스크립트를 실행할 수 없으므로 파일을 로드할 수 없습니다" 이렇게 뜰 수도 있다. 권한에 맞지 않는 실행이으로 뜨는 에러다.
만약 위 설명과 같은 문제가 생긴다면 아래의 코드를 입력해주자.
> Set-ExecutionPolicy RemoteSigned
그리고 다시 sequelize init 를 입력하면 config, models, migrations, seeders 폴더가 생성된다.
IT에 관련된 지식이 없는 사람에게 아마존(Amazon)이 어떤 기업이냐 물어본다면 '세계에서 가장 큰 온라인 오픈마켓이 아니냐?'라는 답변이 돌아올 것이다. 틀린 말이 아니다. 하지만 과연 쇼핑몰 하나만으로 구글-애플을 제치고 브랜드 가치 1위의 기업에 거듭날 수 있었을까?
초기 아마존은 온라인 오픈마켓만을 운영했었다. 기업의 규모가 점점 커지면서 '블랙 프라이데이'와 같이 할인 행사 기간에 웹 사이트에 많은 사용자가 몰려들어 서버에 과부하가 걸리기 시작했다. 사용자들에게 불편함을 덜어주기 위해 아마존은 막대한 양의 서버를 사들였다.
서버 문제는 사라졌지만 트래픽이 몰리지 않는 날엔 그 많은 양의 서버를 돌릴 필요가 없었다. 그래서 아마존은 놀고 있는 서버를 개인, 기업들에 비용을 받고 대여해주는 사업을 시작하게 되었다. 2002년 아마존 웹 서비스를 시작했다.
아마존 웹 서비스란?
아마존에서 제공하는 클라우드 컴퓨팅 서비스
쉽게 설명하기 위해 내가 좋은 아이디어가 하나 떠올라서 IT사업을 진행한다고 가정해보자. 24시간 동안 내 서비스를 제공하기 위해서는 24시간 동안 작동되는 서버 컴퓨터가 필요하다. 매우 작은 프로젝트라면 컴퓨터 한 대로 충분할 것이다. 하지만 일반적으로 웹 서버, 데이터베이스 서버 등 많은 서버가 필요하다. 이 서버들을 들여놓을 초기 자금이 없다면 시작도 전에 포기해야 할까? 또 처음에는 평균 사용자가 100명이었는데 100,000명으로 늘어나면 서버를 확장하기 위해 얼마나 번거로운 작업이 많이 필요할까...
AWS를 사용하면 이런 문제를 쉽게 해결해 준다.
1. 비용 절감
AWS에서 이미 다양한 성능의 서버를 가지고 있기 때문에 내가 원하는 성능에 맞춰 커스텀 하여 우린 돈을 주고 빌리기만 하면 된다. 휴대폰 살 때 「일시불로 긁을 것이냐」 「할부로 천천히 낼 것이냐」 의 차이라고 보면 될 것 같다.
2. 확장성
상황에 따라 서버를 확장하거나 감축할 때 마우스 클릭 몇 번으로 정말 쉽게 처리할 수 있다.
AI, Blockchain, IoT 등 다양한 클라우드 서비스를 제공하고 있다. 이러한 다양한 서비스를 쉽게 연동 할 수 있도록 서비스를 제공하고 있다.
3. 안전성
서버를 전 세계 곳곳에 설치해 뒀기 때문에 자연재해로 회사가 사라져도 서비스를 안전하게 운영할 수 있다.
무엇보다 비용 절감에 있어서 메리트가 있기 때문에 다양한 스타트기업이 AWS를 활용하여 새로운 사업을 시작한다.
전하고 싶은 말...
나(글쓴이)는 대학생 때 처음 AWS를 알게 되었다. 자취방에서는 전용 서버가 한 대 있었다. 서버용으로만 쓰는 것이 아니라 게임도 하고 웹툰도 보고 다양한 용도로 사용하다 보니 매일 켜두는 것도 컴퓨터에 부담이 가는 것 같고 프로젝트를 진행하던 도중 서버가 다운되거나 하면 너무 불편할 것 같아 클라우드 컴퓨팅 서비스에 대해서 찾아보게 되었다. 하지만 당시 구글링에 서툴렀던 나는 온통 영어로 된 검색 결과에 지쳐 온라인 수업을 통해서 AWS를 공부하기 시작했다.
나처럼 처음 AWS를 접하고 고군분투하고 있는 사람들에게 조금이나마 도움이 되길 바라는 마음으로 글을 작성한다.
라쿠텐은 총 3번 지원했다. 라쿠텐은 부서에 TO가 생기면 즉흥적으로 공채를 열기 때문에 기회가 아주 많다.
첫 번째는 라쿠텐 전기부서에서 학교에 찾아와 채용을 진행하였다.
지원자가 매우 적었기 때문에 서류는 전부 통과했고 1차부터 면접을 진행하였다. 일본 기업 첫 면접이었다.
예정은 1차 면접, 2차 면접만 보고 채용할 계획이었지만 마지막 영어 면접이 추가되었다.
※ 1차 면접
그룹으로 들어가서 아주 간단한 코딩 테스트를 진행하고 회사에 대해서 질의하는 시간을 가졌다.
코딩 테스트는 쉽게 풀 수 있었고 질의 시간에는 다른 면접자가 이야기할 땐 열심히 청취하고 궁금한 부분을 질문하였다. 1차 면접은 쉽게 합격하였다.
합격!
※ 2차 면접
1(나):2(면접관) 면접이었다. 면접을 시작하고 또 문제를 풀게 하였다. 시간이 여유로운 사람은 3문제. 촉박한 사람은 2문제를 풀었다. 면접 내용은 전반적으로 포트폴리오를 보면서 프로젝트에 관한 기술 면접이었다. 첫 면접이다 보니 많이 떨렸고 20% 정도 질문 의도를 파악하지 못하여 더듬었다. 첫 면접치고는 잘 봤다고 생각한다. 결과는 탈락이었다. 교수님을 통하여 들은 피드백은 더 라쿠텐과 어울리는 사람을 뽑고 싶다고 전달받았다.
탈락!
2. 라쿠텐
EC부서에서 공채가 열려 지원했다. 라쿠텐에 근무 중인 친구에게 추천받아 특채로 지원했다.
라쿠텐은 Codility(코딩 테스트) + 서류로 1차로 면접자를 거른다. Codility 문제 난이도는 천차만별이라 어려운 문제 걸리면 시간이 부족하고 쉬운 문제 걸리면 20분 컷이다. 마침 이때 어려운 문제 걸렸따...
탈락!
3. 라이플
여러 기업설명회와 면접을 봤지만 정말 가고 싶은 회사 두 개를 꼽으라면 소프트뱅크와 라이플이라고 느꼈다.
라이플은 도쿄에 거주하고 있는 사람이 아니면 잘 모르는 기업인 것 같다. 도쿄에 있는 일본 부동산 회사이며 자본금 40억 엔에 달하는 중견기업이다.
면접 일정은 1차 면접, 2차 면접, 기술 면접, 선배들과의 소통, 최종 면접 (2달 소요)이다.
※ 1차 면접(그룹 디스커션)
5~6명의 면접자에게 주제를 던져주고 자유롭게 토론하는 면접. 토론을 마치고 한 명이 의논한 내용을 정리하여 1분 동안 발표하는 프로세스. 우리 그룹이 받은 주제는 "취업" 이었다. 내가 사회자가 되고 나머지 인원도 각자 역할을 가지고 토론이 진행되었다. 다들 긴장한 나머지 토론 내용은 주제와 달린 점점 산으로 갔다. 그런데도 불구하고 사회자와 발표자를 담당하였기 때문에 합격할 수 있었다.
합격!
※ 2차 면접(1:1 면접)
인사 담당자와 1:1로 하는 면접. 포트폴리오를 보며 프로젝트 서비스에 대해서 소개하고 학교생활이나 성격에 관해서 이야기하는 시간을 가졌다. 너무 편안한 분위기에서 면접을 봤고 당황스러운 질문은 하나도 없었다.
합격!
※ 기술 면접(1:1 온라인 면접)
2차 면접이 끝나고 제법 시간이 지나서 온라인으로 기술 면접을 보았다. 면접관이 클라우드 관련 엔지니어라는 사실을 주워듣고 2학년 말부터 다져온 AWS에 관한 지식을 보여주었다. 합격! 30명 정도 지원했지만, 기술 면접이 끝나고 나를 포함한 4명이 남게 되었다.
※ 선배들과의 소통
근무하고 있는 선배들과 면담, 회사에 궁금한 점을 질문하는 시간을 합쳐 2시간 30분 동안 온라인 면담을 했다. 긴 채용 프로세스를 보며 "사원 한 명 한 명 제대로 뽑는 회사"라고 생각했고 면담을 마치고 왜 내(글쓴이)가 지금까지 면접에서 살아남았고 앞으로 어떻게 보완하면 최종면접에서 합격할 수 있는지 알려주는 것을 보고 정말 가고 싶은 회사 중 하나로 내 마음속에 자리 잡았다.
※ 최종 면접
최종 면접은 도쿄 본사에서 진행했다. 비행기, 숙소 비용을 전액 부담해 주었다. (라이플에서 지원해준 건지 중간 컨설턴팅 업체에서 해준 건지 모르겠다.)
오전에 비행기를 타고 도쿄로 넘어가 숙소에 짐을 풀고 식사하고 면접 준비를 조금 하니 오후 4~5시가 되었다. 밥이 코로 넘어가는지 입으로 넘어가는지 알 수 없었다. 그렇게 본사에 5시에 도착해서 기업견학을 하고 오후 6시부터 면접을 시작했다.
면접에는 CTO(기술 총 책임자)와 인사부장? 같은 사람이 와서 면접을 봤다. 한 명당 1시간~1시간 20분 정도의 시간을 소요하는 면접이었다. 나는 이번 면접을 위해 사업 아이템을 생각해 PPT로 사업계획서를 제작해서 갔다. 나는 기술 면접 때 클라우드 엔지니어가 되고 싶다고 어필하였고 마찬가지로 최종 면접에서도 똑같이 말했다. 하지만 여기서부터 멘탈이 나가는 몇 가지 질문을 받았다.
1. 클라우드 엔지니어에 대한 확실한 목표가 나에게 보이지 않았고 면접관은 놓치지 않고 압박 면접을 진행하였다.
2. 내가 준비해간 사업 아이템을 보고 클라우드 엔지니어가 되고 싶은 건지 기획을 하고 싶은 건지 캐물었다.
기억나는 예)
클라우드 엔지니어로서 일하고 있는 도중, 내가 구상한 사업 아이템을 개발해야 하면 하던 일(클라우드)을 그만둘 것인가? 와 같은 질문을 받으면서 내 멘탈은 부서졌다.
여기서부터 면접 말리기 시작하면서 "빨리 면접장에서 도망치고 싶다."라는 생각이 가장 많이 들었다.
면접을 이따위로 준비한 나 자신이 너무 분하고 미웠다. 모두 면접이 끝나고 시간을 보니 새벽 1시였다.
탈락!
최종 면접에서 떨어지고 한국에 돌아와서 라이플로부터 피드백을 들을 수 있었다. 라이플 면접을 계기로 "나는 어떤 개발자가 되고 싶을까?"에 대해서 정말 깊은 고민을 하기 시작했다. 나에게 큰 자극을 준 고마운 회사다.
4. 렌트락스
큰 관심을 가지고 지원한 기업이 아니기 때문에 준비도 부족했고 탈락했다.
탈락!
5. 라쿠텐
또 EC 클라우드 부서에서 공채가 열려서 지원했다. 다행히 코딩테스트 문제가 쉬워서 후딱 풀고 제출하고 합격했다. 하지만 소프트뱅크에 합격한 나는 면접을 보러 갈 필요가 없었다.
합격!
6. 소프트뱅크
상반기 공채도 있었지만, 라쿠텐&라이플에 겹쳐 최후의 보루로 남겨놓았던 하반기 공채! 10월 초에 지원했던 것 같다.
어필 포인트를 늘리기 위해 지푸라기라도 잡는 심정으로 8월에 소프트뱅크 인턴십에 지원했다. 사업을 계획하고 실제 구현하여 사람들에게 서비스를 제공하는 인턴십이었다. 수업을 다 빼고 팀원들과 사업계획과 PPT 작성에 몰두했다. 다행히 서류는 합격했고 도쿄 본사(시오도메)에 면접으로 보러 오라고 했다. 면접관은 한국에 거주하고 있으면 사업을 구현하는 것이 힘들다고 판단하였고 실제 인턴십에 참가도 못 하고 떨어졌다.
주변에서 "인턴십 참가도 못하고 떨어졌는데 넣어봤자 아무 효력도 없다"라는 사람들도 있었지만 이런 경험은 분명 다른 면접자와 비교될 것이라 확신했고 면접장에 사업계획서까지 챙겨갔다.
공채 서류는 자연스럽게 통과했다. 면접 하루 전날까지 교수님한테 자기소개가 부자연스럽다고 지적받았다. 덕분에 컨디션도 엉망이 되었고 확실한 어필 포인트가 부족해 걱정이었다. 하루 전날까지도 "회사에 입사하면 어떤 엔지니어로 성장하고 싶은가?"라는 질문에 정확한 답을 찾지 못하였다.
면접 당일 새벽, 새벽 감수성이 터졌는지 라이플 면접 당시 클라우드 엔지니어가 되고 싶다고 말했다가 면접에서 탈탈 털리고 스스로 분했던 그 감정이 다시 떠올랐다. 이번 면접에서는 컨셉 잡고 ○○엔지니어가 되고 싶다고 이야기했다가 후회하지 말자고 각오했다. 그냥 진심을 담아 솔직하게 면접관에게 전달하자고 생각했다.
다음날 서울에서 열리는 면접회에 참가했다. 30명 정도 기업설명회에 참가했다. 복장은 자유였기 때문에 그냥 깔끔한 옷 입고 갔다. 사람들의 반은 정장 반은 사복? 이었다.
기업설명회 듣고 감명 받은 것은 처음이었다. 설명도 깔끔하고 PPT도 깔끔하고 진행하고 있는 다양한 사업에 관해서 설명해주는데 이번에 면접에서 떨어지면 아까워서 눈물이 날 것 같았다.
이상 자세한 면접 내용은 면접 보고 나서 다음날 작성한 생생한 스크립트를 첨부하겠다.
난 면접을 끝마치고 이것보다 면접을 잘 볼 수 없겠다고 생각했다. (내 기준)
마무리...
나는 취업을 준비하는 많은 청년에 비해서 면접을 많이 본 것도 아니고 기간이 길었던 것도 아니다.
취업 준비에는 정답이 없는 것 같다. 다만 자신의 노력을 면접관에게 솔직하게 이야기하는 것만큼은 정답인 것 같다. 거짓과 과장이 가득한 면접을 준비한 사람을 뽑는 회사는 갈 필요 없다. 그런 회사에는 그런 사람들뿐이거든... 자신이 노력했고 그 사실을 솔직하게 면접관에게 전달했는데 떨어진다면 둘 중 하나다.
1. 회사와 자신의 일하는 스타일이 안 맞는다.
2. 회사에서 사람 뽑을 줄 모른다.
면접에 떨어진다 해도 좌절할 필요 없다. 전부 다 경험이고 공부이기에 더 좋은 기업에 들어갈 발판이 될 것이다.
"요즘 일본 IT 취업? 적당히 해도 적당한 곳에 들어가겠지"라고 생각하는 사람들에게 자극을 주고 싶었기에 글재주도 없고 재미도 없는 글을 길게 적어보았다.