개발하면서 처음으로 정식으로 출시한 서비스를 만들어보았다.

대학교에서 다양한 프로젝트를 했지만 실제 사용자들을 대상으로 제작하고 배포한 서비스는 처음이다.

현재 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에 대해서 많이 배울 수 있었다.

물론 높은 기술을 사용해서 퍼포먼스로 사용자에게 만족감을 주거나 효율적인 알고리즘으로 서버의 무게를 덜어주는 것도 중요하지만 기본이 가장 중요하다는 것을 알 수 있었다.

'Life > Sundries' 카테고리의 다른 글

Toss 토스 NEXT 주니어, 신입 공채  (0) 2020.07.22
Kakao adfit 승인 완료!  (0) 2020.07.20
카카오 견학 가보고싶어...  (0) 2020.07.19
취미로 독서를...  (0) 2020.07.16
신작 게임 블루프로토콜!  (0) 2020.06.19

도커의 "ㄷ"도 잘모르지만 금방 까먹을 것 같아서 정리!

 

1. 도커 로그인

docker hub에 가입하고 해당 계정의로 로그인하면 된다.

https://hub.docker.com/

 

Docker Hub

Docker Certified:Trusted & Supported Products Certified Containers provide ISV apps available as containers. Certified Plugins for networking and volumes in containers. Certified Infrastructure delivers an optimized and validated Docker platform for enterp

hub.docker.com

docker login

 

2. 이미지 관리

- LIST

docker images

- DELETE
ex) docker rmi 637ba1465942 -f

docker rmi <image id> -f

- BUILD
ex) docker build --tag test/project:v0.0.1 .

docker build --tag <docker hub name>/<repository name>:<tag value> .


뒤에 .은 dockerfile의 위치를 나타내는 것 같다.


- PUSH
ex) docker push test/project:v0.0.1

docker push <docker hub name>/<repository name>:<tag value>

 

에러 없이 잘 PUSH되었다면 docker hub에서 이미지가 추가된 것을 확인할 수 있다.


- PULL
docker pull test/project:v0.0.1

docker pull <docker hub name>/<repository name>:<tag value>

PUSH로 올린 이미지를 받고 싶다면 위 명령어로 받을 수 있다.

 

3. 컨테이너 관리

- LIST

docker ps

- STOP

docker stop <container id>

- DELETE

docker rm <container id>

'Develop > Docker' 카테고리의 다른 글

[Docker] 설치 - ubuntu 18.04, windows 10  (0) 2020.06.19

[ 잡담 ]

"Docker"이라고 하면 라쿠텐 면접 때 들었던 질문이 떠오른다.

AWS 서비스를 여러가지 사용해 봤던 경험을 풀었는데 돌아오는 질문은 Docker를 사용해 본적이 있는가였다. 당시 나는 도커라는 이름만 들어봤지 정확히 어떤 것인지 전혀 알지 못했고 제대로 대답하지 못했다. 그 후 도커를 공부해보려고 했다.

공식 홈페이지에서 도커의 개요를 보면 도커란 "Docker는 컨테이너 이동을 주도하는 회사이며 하이브리드 클라우드의 모든 애플리케이션을 처리할 수 있는 유일한 컨테이너 플랫폼 제공 업체입니다" 라고 쓰여있다.

당시 졸업작품을 개발하고 있었는데 어디에 어떻게 써야할지 감을 잡을 수 없었고 사용하는 것을 포기했다. 하지만 이번에 "거래해요 동물의숲"이라는 프로젝트를 개발하면서 도커를 처음 접하게 되었다.

"거래해요 동물의숲"이란 내가 처음 실제 사용자들에게 유치하는 서비스이다.

이 프로젝트에서 나는 백엔드를 담당했는데 서비스를 배포하고 업데이트 환경을 구성하는데 서버의 다운 타임을 줄여줄 방법이 무었이 있을까 찾아보던 도중 도커가 제격이라는 생각이었다.

결국 아직 학습 부족으로 인증서 문제 때문에 도커를 사용하지 않고 있지만 더욱 공부해서 다시 적용시켜볼 생각이다.

[ 본론 ]

그럼 본론으로 들어가 도커 설치법을 알아보겠다. 상세한 내용은 전혀 모른다. 그냥 따라하면 잘되길래 정리해서 올려본다. 다음에 내가 또 설치해야할 일이 있을지도 모르니 ㅎㅎ...

설치 환경

 

1. windows

그냥 아래 링크타고 들어가서 installer 다운받고 설치했다!

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

 

Docker Desktop for Windows - Docker Hub

Docker Desktop for Windows Docker Desktop for Windows is Docker designed to run on Windows 10. It is a native Windows application that provides an easy-to-use development environment for building, shipping, and running dockerized apps. Docker Desktop for W

hub.docker.com

 

2. ubuntu 18.04

2-1. 아래의 명령어를 사용하여 설치에 필요한 패키지들을 설치해 주시기 바랍니다.

$ sudo apt-get update && sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

 

2-2. 아래의 명령어를 사용하여 도커의 공식 GPG 키와 저장소를 추가해 주시기 바랍니다.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

 

2-3. 그리고 아래의 명령어를 사용하여 docker 패키지가 검색되는지 확인해 주시기 바랍니다.

$ sudo apt-get update && sudo apt-cache search docker-ce

만약 현재 우분투 버전에서 설치 패키지가 검색된다면 아래와 같은 내용이 출력될 것입니다.

docker-ce - Docker: the open-source application container engine

 

2-4. 그 다음 아래의 명령어를 사용하여 도커 CE 에디션을 설치해 주시면 됩니다.

$ sudo apt-get update && sudo apt-get install docker-ce

 

2-5. 그리고 일반 사용자계정으로 docker 명령어를 사용하기 위해서는 아래의 명령어로 그룹을 추가해 주시면 됩니다.
아래의 명령어는 ubuntu라는 사용자를 docker그룹에 추가하는 내용입니다.

$ sudo usermod -aG docker $USER

 

이제 docker --version 을 입력하면 버전이 잘나오는 것을 확인할 수 있을 것이다.

'Develop > Docker' 카테고리의 다른 글

[Docker] 명령어 정리  (0) 2020.06.20

RDS의 세팅을 마치고 사용을 할려고 하면 발목을 잡는 것이 한글 깨짐이다.

구글링하면서 여러가지 해봤지만 해결되지 않았다.

일반적으로 구글링하면 나오는 방법부터 내가 적용한 방법까지 적어보겠다.

1. 구글링하면 나오는 첫번째 방법

나는 파라미터를 새로 생성하지 않고 기존 파라미터를 수정해서 사용할려고 했지만 기존 파라미터는 수정이 불가능했다.
꼭 아래와 같이 파라미터 새로 생성 -> 편집 -> 적용 순서로 해주자.

1-1

파라미터 그룹을 선택한다.

1-2

그룹 이름과 설명을 대충 넣고 생성한다.

1-3

해당 파라미터에 들어가서 검색창에 character_set을 입력하면 나오는 친구들의 값을 전부 UTF8 로 변경해주자.

character-set-client : utf8
character-set-connection : utf8
character-set-database : utf8
character-set-filesystem : utf8
character-set-results : utf8
character-set-filesystem : utf8

1-4

그리고 DATABASE 수정에 들어가면 파라미터 그룹을 변경하고 DB를 재부팅하면 끝이다.

 


 

2. 구글링하면 나오는 두번째 방법

그럴 경우에 파라미터에서 collation을 검색해서 나오는 값들 또한 변경해주면 된다는 말이 있어서 해봤다.

collation_connection : utf8_general_ci
collation_server : utf8_general_ci


3. 나를 구원해준 마지막 방법

mysql 쿼리로 

alter database DB_NAME default character set utf8 collate utf8_general_ci;

이거 쿼리로 쏴주니깐 고쳐졌다.

 

출처

https://designdevelop.tistory.com/68

https://designdevelop.tistory.com/68 [DesignDevelop]

블루 프로토콜・BLUE PROTOCOL・ブループロトコル


올해 초부터 매우 기대하고 있는 게임! 블루프로토콜.

PV 영상을 보고 반했기 때문에 먼저 PV영상부터 보자.

심상치 않다. 언리얼 엔진4로 개발되었고 2019년 7월 첫 공개 되었다.

분명 나도 언리얼 엔진4를 슬쩍 만져봤지만 내가 만든 게임과 어떻게 이렇게 다를수가 있지라는 생각이 든다.

제작 초기 PV영상임에도 불구하고 OST와 그래픽이 완벽하다. 검은사막을 오랜기간 해왔지만 역시 현실적인 그래픽보다 판타지적인 그래픽이 더 끌리는 것 같다. 타격감이 조금 아쉽기는 하지만...

또한 YOUTUBE에서 테스트 진행 후 받은 피드백을 어떻게 수정해 나갈지 또는 어떻게 수정했는지 꾸준히 영상을 올려줌으로써 아직 직접 게임을 플레이하진 못하지만 대리만족을 느끼게 해준다.

유튜브에서 소개하는 멘트를 번역하여 적어보겠다! 

블루 프로토콜이란?

블루 프로토콜은 BANDAI NAMCO 온라인과 BANDAI NAMCO 스튜디오에 의한 공동 프로젝트 팀인 「프로젝트 스카이 블루」의 핵심적인 콘텐츠로써 개발중인 PC용 온라인 액션 RPG  게임입니다.
극장에서 보는 애니메이션과 같은 압도적인 그래픽으로 만들어진 세계와 온라인 게임의 특성을 살린 멀티플레이 액션을 파고든 게임성을 융합시킨 완전!신작!국산! 오리지날 게임으로써 언리얼엔진4로 개발중입니다.

현재 알파 테스트와 베타 테스트가 끝났고 추후 스케줄은 미정이라고 한다. 앞으로 테스트가 필요하면 큰 테스트부터 작은 테스트까지 얼마나 더 시행 할지 모르겠다고 한다. 자세한 내용은 아래 유튜브 채널에 들어가서 보면 된다!

▼유튜브 채널 주소

https://www.youtube.com/channel/UCQitQB5ISPu10a-DW5usIfg

 

BLUE PROTOCOL

『BLUE PROTOCOL(ブループロトコル)』公式チャンネルです。 BLUE PROTOCOLの最新動画を掲載いたします。 本作は、株式会社バンダイナムコオンラインと株式会社バンダイナムコスタジオによる共

www.youtube.com

 

 

 

'Life > Sundries' 카테고리의 다른 글

Toss 토스 NEXT 주니어, 신입 공채  (0) 2020.07.22
Kakao adfit 승인 완료!  (0) 2020.07.20
카카오 견학 가보고싶어...  (0) 2020.07.19
취미로 독서를...  (0) 2020.07.16
거래해요 동물의숲 출시!  (0) 2020.06.20

Git을 사용할 때는 안 까먹고 잘 쓰는 데 사용하지 않게 되면 명령어를 까먹게 되어 정리해본다.

깊은 Git 작업은 해본적이 없기 때문에 간단하게 push 하고 fetch 하는 것만 ㅎㅎ..


1. 저장소 세팅

  • 그냥 저장소 내용을 다 가져와서 remote 연결해주고 싶을 때
git clone <repository 주소>

 

  • 저장소 remote 등록해주기
git remote add <repository 주소>

 

2. 업로드

sudo git add .
sudo git commit -m "커밋 내용"
sudo git push -u origin master

 

3. 패치

먼저 fetch와 pull의 차이를 알아봐야겠다.

◎ pull

원격 저장소로부터 필요한 파일을 다운 + 병합

git pull

 

◎ fetch

git fetch --all

원격 저장소로부터 필요한 파일을 다운 (병합은 따로 해야 함)

fetch를 사용하는 이유는

  • 원래 내용과 바뀐 내용과의 차이를 알 수 있다
git diff HEAD origin/master

 

  • commit이 얼마나 됐는지 알 수 있다
git log --decorate --all --oneline

런 세부 내용 확인 후 아래 코드를 입력하면 git pull 상태와 같아진다.

git merge origin/master

 

4. repository remote 주소 변경할 때

/* 기존 repository */
git remote rm origin

/* 옮길 repository */
git init
git remote add https://github.com/<account name>/<repository name>.git
git add .
git commit -m "change repository"
git push -u origin master

만약에 기존 repository에 내용이 존재해서 push할 때 오류가 발생해서 덮어쓰기 해주고 싶을 때는 아래 명령어를 입력하면 오류 없이 작동된다.

git push --force --set-upstream origin master

 

5. .gitignore추가하기

1. 프로젝트 파일의 root 폴더에 .gitignore 파일 생성

2. push할 때 제외할 내용 추가

# .gitignore

# security
*.ini

# debug data
*.log
__pycache__

# not use folder
/test
/selenium_test
/python/
/deploy/

3. 캐시 삭제

git rm -r --cached .

4. commit & push

git add .
git commit -m "message"
git push -u origin master

 

참고

https://yuja-kong.tistory.com/60

[ 주의 ] 삽질하면서 코딩한 경험을 바탕으로 작성한 것임으로 틀린것도 많으니 더 좋은 정보가 있으면 알려주세요!

[ 잡담 ]

요즘들어 새로 시작한 프로젝트가 있어서 12시에 기상해서 새벽 4~6시까지 코딩만 죽어라 하고 있다.

실제로 유저들에게 상용시킬 서비스를 제작하는 것이란 대학교 때 졸업작품을 개발하는 것과는 비교도 안될 정도로 많은 변수를 생각해야하기 때문에 시간이 많이 든다.

덕분에 정말 많은 삽질을 하고 있다. 하지만 이 삽질 끝에 문제를 해결하고 잘 작동하는 모습을 보면 너무 너무 재밌다.

그럼 본론으로 들어가 Multer에 대해서 알아보겠다.

+ 지금까지 Multer를 사용하면서 겪은 3가지 삽질

[ Multer ]

정의: Multersms Multypart / form-data 형식의 Request을 다루기 위한 Node.js 미들웨어이다.

설치

> npm install --save multer

1. Formdata 받기

나는 처음에 Multer의 존재를 몰랐다. 프론트에서 Formdata를 axios로 넘겨줬지만 req.body, res.file, res.files 전부 console.log로 찍어봤지만 빈값만 들어가 있었다. 이게 새벽 2~4시까지 골머리를 썩혔다.

찾다 찾다보니 Multer라는 친구를 발견했고 아래와 같이 작성해주면 formdata 값을 받을 수 있다고 해서 적용해 봤다.

1) single

  • 파일 한 개만 받을 경우에 사용한다.
  • req.file에 이미지 데이터가 담겨있다.
  • avatar는 formdata.append("avatar": value); 에서 value의 key값을 의미한다.
app.post('/profile', upload.single('avatar'), function (req, res, next) {})

2) array

  • 여러개의 이미지 파일을 하나의 key값으로 받아올 수 있다.
  • 구분없이 여러개의 이미지를 받을 때 좋은듯?
  • req.files에 데이터가 담겨있다.
  • 12 숫자는 넘겨 받는 이미지 갯 수를 나타낸다. 한계를 정해두고싶지 않다면 그냥 key값만 적으면 된다.
app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {})

3) fields

  • 전체적으로 array와 큰 차이를 모르겠다. 확장 버전인듯?
  • key값을 구분하여 데이터를 분류해서 받고 싶다면 사용하자.
  • req.file에 데이터가 담겨있다.
var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {})

4) none

  • 안써봐서 몰라.
  • text만 담긴 formdata 받으라고 한다.

5) any

  • 마찬가지로 안써봄.
  • 유선으로 오는 모든 파일 다 받을 수 있다고 적혀잇다.

2. 그래도 값이 넘어오지 않는 경우

자! 열심히 알아봤다. 이제 받아져야지? 라고 생각한 나의 실수였다. 계속해서 데이터가 넘어오지 않았다. 여기서 삽질 또 시작.

문제는 프론트의 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에서 아무리 덮어씌어도 안바뀌더라.

그렇게 구글을 이리저리 떠돌면서 해답을 찾던 도중 정답을 발견했다.

▼ 완성 코드

/* router file */

// lib
const express = require('express');
const router = express.Router();
const ctrl = require('../api/c_board');

// modules
let s3 = require("../utils/u_s3");

router.post('/image', s3.upload.array('img'), ctrl.image);

module.exports = router;

/* ../utils/u_s3.js */

// lib
const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');
const path = require('path');

// config
const aws_crediential = require("../config/aws");

const s3 = new AWS.S3(aws_crediential);

let params = {
  Bucket: 'deac-project',
  ACL: 'public-read-write'
};

let s3Storage = multerS3({
  s3: s3,
  bucket: params.Bucket,
  key: function(req, file, cb) {
    // 요거 하나로 해결
    var bo_id = req.headers.bo_id;
    let extension = path.extname(file.originalname);
    let basename = path.basename(file.originalname, extension);
    // 아래 코드에서 header로 받은 bo_id를 활용하여 저장되는 파일이 유동적으로 바뀜
    cb(null, `images/${bo_id}/${basename}-${Date.now()}${extension}`);
  },
  acl: 'public-read-write',
  contentDisposition: 'attachment',
  serverSideEncryption: 'AES256'
});

exports.upload = multer({ storage: s3Storage });

그냥 multerS3에 있는 key 함수에서 req.headers.bo_id를 사용하니 불러와졌다.

multerS3안의 key함수의 req에도 프론트에서 보낸 데이터가 똑같이 포함되어 있을 줄은 몰랐다.

file데이터만 있을줄 알았는데...

 

이렇게 삽질이 끝났다.

 

출처

https://velog.io/@josworks27/2020-01-18-0001-%EC%9E%91%EC%84%B1%EB%90%A8-qrk5iamlmv

'Sequelize' 에 대해 알아보자!

프로젝트를 하면서 서버 개발은 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 폴더가 생성된다.

3. config.json 을 수정하여 DB를 연결해주자.

/* config/config.json */

{
  "development": {
    "username": "root", // DB 계정
    "password": "", // DB 비밀번호
    "database": "test", // DB 이름
    "host": "127.0.0.1", // DB 주소
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  }
}

주석이 달린 부분을 자신의 DB에 맞게 수정해주자.

4. 모델 정의하기.

migration을 할 수 있는 두 가지 방법이 존재한다. '직접 파일을 만들어 정의하기', '명령어로 정의하기'

1) 직접 파일을 만들어 정의하기

models 폴더를 보면 index.js 파일이 존재한다.
index.js 파일은 models 폴더 내에 있는 파일들을 읽고, 그것들을 모델로 정의한다. 

그렇다면 models 파일 안에 임의로 user.js 파일을 생성해 보자

/* models/user.js */

module.exports = (sequelize, DataTypes) => { 
  return sequelize.define('user', { 
    useremail: { 
      type: DataTypes.STRING(20), 
      allowNull: false, 
      unique: true, 
    }, 
    password: { 
      type: DataTypes.STRING(100), 
      allowNull: false, 
    }, 
    name: { 
      type: DataTypes.STRING(10), 
      allowNull: false, 
    }, 
  }); 
}

id, createdAt, updateAt 은 자동으로 생성해준다.

models/index.js에 user.js의 존재를 알려주자.

db.User = require('./user')(sequelize, Sequelize);

요렇게 한 줄 추가 시켜주자.

프로젝트 파일에 app.js 파일을 생성해주고 아래의 코드를 입력해주자.

var sequelize = require('./models').sequelize; 

sequelize.sync();

그리고 node로 app.js를 실행시켜주면 마이그레이션이 된다.

> node app

 

2) 명령어로 정의하기

파일을 만들고 코드를 쓰는 것이 귀찮은 사람은 한 줄의 명령어로 모델을 정의할 수 있다.

명령어 기본 문법

sequelize model:create --name TABLE_NAME  --attributes "COLUMN1:type, COLUMN2:type, COLUMN3:type"

예) User 모델을 생성하는 명령어

sequelize model:create --name user --attributes nickName: string, passWord: string

migrations 에 날짜가 적힌 js 파일, models에는 user.js 파일이 생성되었다.

sequelize db:migrate

이 명령어를 입력하면 마이그레이션이 완료된다.

 

더 다양한 조건을 추가하고 싶으면 아래 표를 참고하자.

이름 Type Attribute Description
type String , DataTypes    
allowNull Boolean default: true null가능, 불가능
defaultValue any default: null 초기 값
unique String , Boolean default: false 겹치는 값의 존재 가능 여부
primaryKey Boolean default: false  
field String default: null  
autoIncrement Boolean default: false 값을 1씩 증가해서 저장
comment String default: null  
references String , Model default: null  
references.model String , Model    
references.key String default: 'id'  
onUpdate String    
onDelete String    
get Function    
set Function    

 

출처

https://www.hahwul.com/2017/08/powershell-execution-of-scripts-is.html

https://medium.com/wasd/node-js%EC%97%90%EC%84%9C-mysql-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-1-b4b69ce7433f

'Develop > Node.js' 카테고리의 다른 글

[Nodejs] 실패 없이 무료로 HTTPS 등록하기  (0) 2020.06.20
PM2 80, 443포트 사용  (0) 2020.06.20
[Nodejs] Multer - Formdata 전송  (0) 2020.05.25

아마존 웹 서비스의 기원  

  IT에 관련된 지식이 없는 사람에게 아마존(Amazon)이 어떤 기업이냐 물어본다면 '세계에서 가장 큰 온라인 오픈마켓이 아니냐?'라는 답변이 돌아올 것이다. 틀린 말이 아니다. 하지만 과연 쇼핑몰 하나만으로 구글-애플을 제치고 브랜드 가치 1위의 기업에 거듭날 수 있었을까? 

  초기 아마존은 온라인 오픈마켓만을 운영했었다. 기업의 규모가 점점 커지면서 '블랙 프라이데이'와 같이 할인 행사 기간에 웹 사이트에 많은 사용자가 몰려들어 서버에 과부하가 걸리기 시작했다. 사용자들에게 불편함을 덜어주기 위해 아마존은 막대한 양의 서버를 사들였다. 

  서버 문제는 사라졌지만 트래픽이 몰리지 않는 날엔 그 많은 양의 서버를 돌릴 필요가 없었다. 그래서 아마존은 놀고 있는 서버를 개인, 기업들에 비용을 받고 대여해주는 사업을 시작하게 되었다. 2002년 아마존 웹 서비스를 시작했다.

 

아마존 웹 서비스란?

  아마존에서 제공하는 클라우드 컴퓨팅 서비스

  쉽게 설명하기 위해 내가 좋은 아이디어가 하나 떠올라서  IT사업을 진행한다고 가정해보자. 24시간 동안 내 서비스를 제공하기 위해서는 24시간 동안 작동되는 서버 컴퓨터가 필요하다. 매우 작은 프로젝트라면 컴퓨터 한 대로 충분할 것이다. 하지만 일반적으로 웹 서버, 데이터베이스 서버 등 많은 서버가 필요하다. 이 서버들을 들여놓을 초기 자금이 없다면 시작도 전에 포기해야 할까? 또 처음에는 평균 사용자가 100명이었는데 100,000명으로 늘어나면 서버를 확장하기 위해 얼마나 번거로운 작업이 많이 필요할까... 

  AWS를 사용하면 이런 문제를 쉽게 해결해 준다.

  1. 비용 절감

  AWS에서 이미 다양한 성능의 서버를 가지고 있기 때문에 내가 원하는 성능에 맞춰 커스텀 하여 우린 돈을 주고 빌리기만 하면 된다. 휴대폰 살 때 「일시불로 긁을 것이냐」 「할부로 천천히 낼 것이냐」 의 차이라고 보면 될 것 같다.

  2. 확장성

  상황에 따라 서버를 확장하거나 감축할 때 마우스 클릭 몇 번으로 정말 쉽게 처리할 수 있다. 

  AI, Blockchain, IoT 등 다양한 클라우드 서비스를 제공하고 있다. 이러한 다양한 서비스를 쉽게 연동 할 수 있도록 서비스를 제공하고 있다.

  3. 안전성

  서버를 전 세계 곳곳에 설치해 뒀기 때문에 자연재해로 회사가 사라져도 서비스를 안전하게 운영할 수 있다. 

  무엇보다 비용 절감에 있어서 메리트가 있기 때문에 다양한 스타트기업이 AWS를 활용하여 새로운 사업을 시작한다.


전하고 싶은 말...

  나(글쓴이)는 대학생 때 처음 AWS를 알게 되었다. 자취방에서는 전용 서버가 한 대 있었다. 서버용으로만 쓰는 것이 아니라 게임도 하고 웹툰도 보고 다양한 용도로 사용하다 보니 매일 켜두는 것도 컴퓨터에 부담이 가는 것 같고 프로젝트를 진행하던 도중 서버가 다운되거나 하면 너무 불편할 것 같아 클라우드 컴퓨팅 서비스에 대해서 찾아보게 되었다. 하지만 당시 구글링에 서툴렀던 나는 온통 영어로 된 검색 결과에 지쳐 온라인 수업을 통해서 AWS를 공부하기 시작했다.

나처럼 처음 AWS를 접하고 고군분투하고 있는 사람들에게 조금이나마 도움이 되길 바라는 마음으로 글을 작성한다.

 

출처: https://jobc.tistory.com/113

취업 준비

 

면접 본 회사는 총 4개이다.

라쿠텐라이플소프트뱅크렌트락스... 였나?

 

이제 면접 본 순서에 따라 적어나가겠다.

 

마지막에 소프트뱅크 면접 스크립트, 포트폴리오, 사업계획서 첨부.


 

1. 라쿠텐

 

  라쿠텐은 총 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 취업? 적당히 해도 적당한 곳에 들어가겠지"라고 생각하는 사람들에게 자극을 주고 싶었기에 글재주도 없고 재미도 없는 글을 길게 적어보았다.

 

 

면접 스크립트.docx
0.03MB
사업계획서.pdf
3.20MB
포트폴리오.pdf
3.54MB

 

  모두 자신이 원하는 회사에 취업하기 바란다!

'Job > Softbank' 카테고리의 다른 글

[소프트뱅크] 내정자 친목회  (10) 2020.08.27
전문대에서 소프트뱅크까지 - 上  (1) 2020.05.14

+ Recent posts