[ 잡담 ]

 

RDS(Relational Database Service)란 말 그대로 관계형 데이터베이스를 대여해주는 AWS의 서비스다. AWS에서 주로 사용자들이 사용하는 데이터베이스 서비스는 RDS와 DynamoDB일 것이다. DynamoDB는 비 관계형(NoSQL) 데이터베이스로 RDS와는 다른 성격을 띠고 있다. 

관계형 데이터베이스와 비 관계형 데이터베이스에 대해서는 나중에 따로 정리하는 걸로 하고 정말 간단하게 알아보자.

http://help.hancom.com/hoffice/multi/ko_kr/cell/menu/edit/change_rowcolumn.htm

관계형 데이터베이스는 위 엑셀 표처럼 Banana, Cherry, Melon, Peach라는 칼럼이 정해져 있는 데이터베이스 형태를 말한다. May행을 추가한다고 하면 Banana, Cherry, Melon, Peach에 관한 데이터만 입력할 수 있다.
하지만 비 관계형 데이터베이스는 정해진 칼럼이 없다. May행이 Banana, Cherry, Kiwi에 대한 데이터를 입력할 수 있다. 

칼럼이 기준이 되어 테이블마다 관계를 가질 수 있냐 없냐 따지는 것이 두 구조의 차이라고 생각한다.

자세한 내용은 나중에 더 공부해서 따로 작성하겠다.

 

[ 본론 ]

 

이번 글에서는 RDS 인스턴스 생생과 접속을 해보자.

목차

  • 1. 데이터베이스 생성
  • 2. 데이터베이스 접속
    • 퍼블릭 액세스 허용해주기
    • 보안 그룹 인바운드 포트 열어주기
    • 접속

 

1. 데이터베이스 생성

 

 먼저 리전을 잘 확인하자. 나는 서울에 데이터베이스를 생성할 것이기 때문에 서울을 선택하고 데이터베이스 생성 버튼을 클릭한다.

 

RDS는 다양한 관계형 데이터베이스를 지원한다. 나는 가장 흔하게 쓰이는 MySQL을 선택하고 버전은 디폴트 값을 사용하겠다.

템플릿에 프로덕션으로 디폴트 값으로 맞춰져 있을 텐데 이대로 만들면 한 달 뒤 돈이 청구되는 것을 볼 수 있다. 무료로 사용하고 싶다면 프리 티어를 선택하도록 하자.

DB이름은 그냥 말 그대로 DB 인스턴스 이름이기에 이쁘게 지어주면 되고 "마스터 사용자 이름", "마스터 암호"는 접속하는데 꼭 필요한 정보이기 때문에 꼭 기억을 해 두던지 기록을 해주자.

다른 부분은 건드릴 것이 없어서 데이터베이스 생성 버튼 클릭!

 

생성 중이다. 시간이 몇 분 걸린다. 기다리자.

이제 사용 가능한 데이터베이스를 생성했다.

 

2. 데이터베이스 접속

데이터베이스를 생성했다고 해서 바로 접근할 수 없다. 데이터베이스에 원격으로 접속하기 위해서는 몇 가지 해야 할 것들이 있다.

 

먼저 우리가 생성한 데이터베이스의 상세정보를 보기 위해 클릭하자.

 

1. 퍼블릭 액세스 허용해주기

 

수정을 클릭한다.

 

네트워크 및 보안에서 퍼블릭 액세스 가능성을 "예"로 변경하고 저장하자.

 

즉시 적용을 선택하고 수정 버튼을 누르면 끝이다.

*수정되는데 시간이 몇 분 소요된다.

 

2. 보안 그룹 인바운드 포트 열어주기

보안 그룹의 인바운드 설정으로 3306 포트를 열어줘야 접속이 가능하다.

 

보안 그룹 클릭!

 

보안 그룹 ID 클릭!

 

인바운드 규칙 편집 클릭!

 

MYSQL/Aurora를 선택하면 포트는 자동으로 설정되고 보안에 따라 위치 무관, 특정 IP만 설정해주면 된다. 그리고 규칙 저장!

 

3. 접속

데이터베이스에 접속하는 방법은 다양하다.

나는 보통 MariaDB를 설치하면 자동으로 설치되는 heidisql라는 프로그램을 사용한다.

www.heidisql.com/download.php

 

Download HeidiSQL

Ads were blocked - no problem. But keep in mind that developing HeidiSQL, user support and hosting takes time and money. You may want to send a donation instead. Download HeidiSQL 11.0 Release date: 17 Mar 2020. Installer, 32/64 bit combined Portable versi

www.heidisql.com

혹시나 사용할 사람을 위해서 다운로드 링크를 남겨놓는다.

 

먼저 접속하는 주소를 알아야 한다. 엔드포인트가 그 주소가 되겠다.

 

호스트명에는 엔드 포인트를 입력하면 된다. 데이터베이스를 생성할 때 지정한 사용자 이름과 암호를 입력하고 열기 버튼을 누르면 끝.

 

쫘좐! 너무나 잘 접속된 것을 확인할 수 있다.

[ 잡담 ]

클라우드 컴퓨팅 서비스를 사용하다 보면 콘솔로 작업을 진행해야 하는 고통을 견딜 수 없었다. vi, vim 등을 잘 사용하여 개발하면 충분히 불편함 없이 개발을 할 수 있지만 이미 Visual studio code와 같은 ide에 익숙해져 버린 몸이기에 견딜 수 없었다. 이런 나의 고충을 덜어주는 서비스가 Cloud9이었다.

Cloud9은 원래 AWS의 서비스가 아닌 다른 회사에서 운영하고 있었던 것으로 알고 있다. 하지만 AWS가 사들여 오면서 정식 AWS 서비스가 되었다. AWS의 정식 서비스가 된 지 얼마 안 됐기 때문에 서울 리전을 지원 안 했다. 도쿄나 싱가포르 리전에서 사용했지만 이제 서울 리전도 지원해서 너무 기쁘다. 사실 차이점을 체감상 못 느낌.

[ 본론 ]

환경

  • Ubuntu 18.04

준비물

  • Nodejs가 설치된 Ec2 인스턴스

인스턴스는 가지고 있지만 Nodejs가 설치되어 있지 않아 Nodejs의 설치부터 진행하겠다.

웹과 콘솔 환경을 옮겨가며 작업하기 때문에 집중하자!

만약 인스턴스가 없다면 이전 글을 보고 오길 바란다!

2020/09/04 - [Develop/Amazon Web Service] - [ AWS ] Ec2 인스턴스를 생성해보자

 

[ AWS ] Ec2 인스턴스를 생성해보자

[ 잡담 ] Smol이라 하는 프로젝트를 진행하면서 클라우드 환경에 서버를 구축해야 하여 작업하는 김에 글을 작성해본다. 깊은 부분은 나도 잘 모르기에 실용적인 부분만 캐치하고 넘어가겠다. [ ��

unchae.tistory.com

 

1. Nodejs 설치

인스턴스를 새로 생성하고 나면 일단 기분 좋게 아래 코드를 실행하곤 한다. 이거 안 하면 찝찝하고 또 문제가 발생할 수도 있기 때문에 의식 같은 개념으로 돌려주자.

$ sudo apt-get update

의식을 마치고 이제 본격적으로 Nodejs를 설치해보자.

1. curl 설치

$ sudo apt-get install curl

2. PPA를 통하여 최신 버전을 가져온다

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

3. Nodejs 설치

$ sudo apt-get install -y nodejs

4. NPM 제 기능하게 해 주기

$ sudo apt-get install build-essential

이제 node -v를 입력하면 잘 설치되어 버전이 출력되는 것을 확인할 수 있다.

 

2. Cloud9 설치

AWS 웹 사이트로 이동하자.

리전이 서울인지 확인하고 Create environment 버튼을 클릭해주자.

 

환경의 이름과 설명을 입력하고 다음 스탭으로!

 

새로운 인스턴스를 생성하면서 Cloud9 환경을 설치하는 선택지도 있지만 우리는 이미 인스턴스를 가지고 있기 때문에 3번째 "Create and run in remote server (SSH connection)"을 선택해준다.

User 값은 우리가 처음 로그인할 때 사용했던 로그인 아이디 값을 넣어준다. 만약 자신이 별도로 사용자를 만들어 줬다면 그 사용자 아이디 값을 넣어주면 된다. Cloud9에서는 자신이 설정한 사용자의 폴더만 접근할 수 있다. 

아래 public SSH key를 복사해주자.

 

다시 콘솔로!

인스턴스에서 SSH 접근을 허락해줘야 Cloud9에서 접근하여 설치를 진행할 수 있기 때문에 public SSH key를 입력해주자.

$ cd ~
$ ls -al

ubuntu 사용자 루트 디렉터리에서 ls -al 명령어를 입력하여 디렉터리를 확인해보면. ssh라는 파일이 존재한다.

$ cd .ssh
$ ls -al

위 명령어로. ssh폴더로 이동하고 내부 파일을 확인해보면 "authorized_keys"라는 파일이 존재한다. 이 파일 속에 아까 복사해준 public SSH key를 입력해주면 된다.

$ sudo vi authorized_keys

 

vi 사용법은 구글링을 통해서 자세히 알아보고 난 간단하게만 소개하겠다.

키보드에서 i를 누르면 insert, 즉 입력이 가능해진다.

기존에 적혀있는 key값 다음 줄에 우리가 가져온 key값을 붙여 넣어주자(마우스 오른쪽 클릭하면 붙여 넣기).

키보드의 esc를 누르면 insert 상태가 해제된다.

:wq를 입력하면 저장하고 나가 진다.

 

이제 모든 준비는 끝났다.

웹으로 돌아가자!

 

다음 스탭로 넘어가자!

 

*혹시 여기서 접근할 수 없다는 에러가 발생하고 다음 창으로 넘어가지 않는다면 참고하자!

인스턴스에 보안 그룹의 인바운드 설정이 제대로 되어있지 않는 것이다. SSH 접근 설정을 내 PC IP에서만 접근 가능하도록 설정해놓았을 가능성이 크다. Cloud9을 사용하기 위해 모든 IP로부터 접근을 가능하게 하면 보안상 좋지 못하다. 혹시나 좋은 방법을 아는 사람이 있다면 댓글로... 부탁드립니다.

 

또 확인 창이 한번 더 나오는데 Create environment 버튼을 누르면 어떤 항목을 설치할 것인가 확인하는 창이 나온다. 난 모든 항목을 다 체크된 상태로 설치를 진행한다.

설치중...
설치완료!

설치가 완료되었다는 창이 보인다. 이제 Cloud9을 사용하여 좀 더 편한 서버 개발을 시작할 수 있게 되었다.

[ 잡담 ]

탄력적 IP에 대해서 자세하게 아는 것은 아니나 편리성만큼은 인정하니 간단하게 소개해 볼까 한다.

이전 글에서 인스턴스를 생성하고 접속하는 것 까지 진행해 보았다.

가끔 작업을 하다가 보면 버벅거리거나 문제가 있어 재부팅해야 할 경우가 있다. 그렇게 아무런 생각 없이 재부팅한 결과 SSH에 접근이 안됐다. 무슨 문제인가 살펴보니 재부팅되면서 할당되었던 IP가 변경된 것이다. 그래서 SSH IP 설정을 변경해주고 나서야 다시 접근할 수 있었다.

이런 귀찮은 문제를 해결해 줄 수 있는 것이 탄력적 IP이다. 항상 IP를 고정시켜주는 역할을 한다. 이 서비스의 경우 IP를 할당받고 인스턴스에 연결해주지 않고 방치해 두면 요금이 발생하지만 연결시켜 준 상태로 두면 요금이 발생하지 않는다.

[ 본론 ]

준비물

  • AWS 계정
  • 인스턴스

Ec2 카테고리에서 탄력적 IP를 선택해주고 탄력적 IP 주소 할당을 클릭한다.

 

할당을 눌러준다.

 

새로운 IP가 생성된 것을 확인할 수 있다. 그럼 이제 이 IP를 우리가 생성한 인스턴스에 연결해줘야 한다.

 

동그라미가 점점 일그러지고 있는 건 귀찮아서 그런 게 절대 아니다. 주소 연결 버튼을 눌러주자.

 

인스턴스에 우리가 생성한 인스턴스의 고유 id값을 입력해주고 연결을 누르면 끝.

 

기존에 사용하던 인스턴스였다면 인스턴스의 IP가 변경되었으므로 접근이 되지 않을 것이다. SSH IP 설정을 변경해주도록 하자.

이전 글에서 인스턴스를 생성해보았다면 이번엔 인스턴스에 접근해보자.

2020/09/04 - [Develop/Amazon Web Service] - [ AWS ] Ec2 인스턴스를 생성해보자

 

[ AWS ] Ec2 인스턴스를 생성해보자

[ 잡담 ] Smol이라 하는 프로젝트를 진행하면서 클라우드 환경에 서버를 구축해야 하여 작업하는 김에 글을 작성해본다. 깊은 부분은 나도 잘 모르기에 실용적인 부분만 캐치하고 넘어가겠다. [ ��

unchae.tistory.com

Windows10에서 접근하는 방법, MacOS에서 접근하는 방법을 나눠서 살펴보도록 하자.

 

Windows10

준비물

  • putty
  • keypair (ppk 파일)
  • 인스턴스 IP주소

 

1. putty 설치

나는 putty라는 프로그램을 사용하여 접근했다. 먼저 putty를 다운로드하도록 하자.

www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

위 사이트에 들어가서 putty.exe와 puttygen.exe만 다운로드하면 된다. 자신의 운영체제가 64비트인지 32비트인지 확인하고 다운로드하여 주도록 하자. 

 

2. ppk파일 생성

먼저 puttygen.exe를 실행하자.

Load 버튼을 눌러준다.

 

파일 이름 옆에 표시되는 파일을 All Files로 변경해주면 우리가 Ec2 인스턴스를 생성하면서 다운로드하였던 pem파일이 보이게 된다. 해당 파일을 열기 해주자.

 

그리고 Save private key를 누르면 "Are yo sure you want to save this key without a passphrase to protect it?"이라는 알림 창이 뜨는데 예 눌러주면 된다. 

 

그리고 저장할 파일 이름을 적고 저장버튼을 눌러 ppk 파일을 생성해주자.

이제 puttygen.exe의 용도는 끝났다.

 

3. IP주소 알아내기

인스턴스에 접근하기 위해서는 IP주소가 필요하기 때문에 Ec2 페이지에 가서 자신의 인스턴스 IP주소를 확인해 오도록 하자.

퍼블릭 DNS를 사용해도 괜찮고 IPv4 퍼블릭 IP를 사용해도 괜찮다. 둘 중 하나를 복사해 두자.

 

4. SSH 접속

이제 putty.exe를 실행시켜주자.

Host Name 빨간색 박스 안에 복사해 두었던 IP 값을 붙여 넣어 주자.

 

다음은 카테고리에서 Connection > SSH > Auth를 클릭해주면 위 사진과 같은 화면이 보인다. Browse... 버튼을 눌러 우리가 앞서 만들었던 ppk파일의 위치를 알려주자.

 

이제 다시 Session 카테고리로 돌아와서 Saved Sessions아래의 박스에 이름을 입력하고 Save를 눌러 이 모든 설정을 저장해주도록 하자.

 

그럼 사진과 같이 smol이라는 설정 값이 생기고 앞으로 SSH로 접근하고 싶다면 저 smol만 선택하고 Open 해주면 접속할 수 있게 되었다.

 

이제 smol을 선택하고 Open 버튼을 누르면 PuTTY Security Alert라는 알림 창이 뜰 텐데 처음에만 뜨는 것이니 예를 눌러주도록 하자.

 

계정을 만든 적도 없는데 로그인을 하라는 창이 뜬다. 인스턴스를 생성하면 자동적으로 운영체제에 따라 이름이 다른 사용자를 생성해준다.

 

우리는 인스턴스를 생성할 때 Ubuntu 운영체제를 설치했기 때문에 ubuntu라고 입력하면 접속이 완료될 것이다.

*혹시 ubuntu가 아닐 경우에는 이 글의 아래에 있는 추가 내용을 살펴보자

 

MacOS

준비물

  • keypair (pem 파일)
  • 인스턴스 IP주소

mac에서는 기본적으로 terminal을 지원해주기 때문에 매우 간단하게 접속할 수 있다.

ssh -i <pem 위치> <로그인 계정>@<ip주소>

 

[ 추가 ] 운영체제에 따른 로그인 아이디

 

  • Amazon Linux 2 또는 Amazon Linux :  ec2-user

  • Centos :  centos

  • Debian :  admin 또는 root

  • Fedora : ec2-user 또는 fedora

  • RHEL :  ec2-user 또는 root

  • SUSE :  ec2-user 또는 root

  • Ubuntu :  ubuntu


출처

https://practice.hooniworld.io/entry/AWS-인스턴스-기본-계정

 

[ 잡담 ] 

Smol이라 하는 프로젝트를 진행하면서 클라우드 환경에 서버를 구축해야 하여 작업하는 김에 글을 작성해본다. 깊은 부분은 나도 잘 모르기에 실용적인 부분만 캐치하고 넘어가겠다.

Ec2란 Elastic Compute Cloud의 약자로 독립된 컴퓨터를 임대해주는 서비스를 말한다. 쉽게 설명하면 우리가 일정 비용을 내면서 아마존에게 컴퓨터를 빌려서 사용하게 해주는 서비스이다. AWS의 가장 기본이 되는 서비스 중 하나이다.

회사 내부에 서버를 배치하는 것보다 훨씬 편리한 장점이 존재한다. 그것은 바로 확장성이다. 서비스의 규모가 점점 커져서 더 큰 서버가 필요해지면 어떻게 해야 할까? 회사 컴퓨터의 더 좋은 부품을 사서 끼우고 해야 하는 작업 해야 한다. 하지만 AWS 서비스를 사용하면  버튼 몇 개로 혹은 자동으로 컴퓨터의 성능을 늘렸다가 줄였다가 할 수 있다. 그 기능의 중심이 되는 서비스가 Ec2이다.

*이제부터 "인스턴스"라는 말이 자주 나올 텐데 Ec2에서 인스턴스란 그냥 "컴퓨터"라고 받아들이면 될 것 같다. 예를 들어 한 개의 인스턴스라고 하면 한 대의 컴퓨터가 되는 것이다.

 

[ 본론 ]

그럼 한번 아마존으로부터 나만의 컴퓨터를 대여해보자!

준비물

  • AWS 계정

 

서비스를 클릭하고 ec2페이지로 들어가 보자.

 

리전 위치가 서울인지 확인하고 인스턴트 시작 버튼을 누르자.

처음 AWS를 사용하는 사람의 경우, 다른 나라 리전에 인스턴스를 생성해 놓고 "전에 만들었는데 인스턴스가 왜 없지?" 하며 새로 생성하여 요금을 두 배로 청구받는 경우가 있다. 항상 리전을 확인하고 생성 & 삭제를 하자.

*리전(Region)은 물리적인 서버의 위치를 나타낸다.
우리가 AWS를 통해 인스턴스를 만들면 생성할 때 선택한 리전에 존재하는 물리적 서버에서 우리가 사용할 서버 영역을 할당해주게 된다. 리전의 위치가 가까울수록 서버와의 통신 속도가 빠를 것이다.

 

자신이 원하는 운영체제를 선택해주자. 나는 우분투(Ubuntu) 18.04를 선택하겠다.

 

서버의 사양을 선택할 수 있다. 나는 비용을 발생시키고 싶지 않기 때문에 프리티어로 제공되는 t2.micro를 선택하고 다음으로 넘어가겠다.

 

네트워크나 뭐 다양한 설정을 할 수 있지만 그냥 넘어가도 사용하는데 큰 지장이 없으니 넘어가도록 하자. 괜히 건드렸다가 비용이 청구되는 일이 없도록 잘 알아보고 체크하자. 보안 그룹 구성이 나올 때까지 쭉 넘어가자.

 

SSH, HTTP, HTTPS 3가지 방식으로 서버에 접근이 가능하도록 설정했다. SSH는 콘솔로 서버에 대한 접근을 허용한다. 그렇기 때문에 보안상 내 IP에서만 접근이 가능하도록 설정했다. HTTP, HTTPS는 웹 서비스를 제공할 경우, 꼭 설정해야 한다.

 

이제 인스턴스 생성이 거의 다 완료되었다. 시작하기에 앞서 키 페어를 생성해야 한다. 키 페어란 콘솔에 접근하기 위한 열쇠라고 생각하면 된다. 키 페어를 활용하여 서버에 접근하는 방법은 다음 편에서 알아보도록 하자.

 

새로운 키 페어 이름을 만들어 주고 다운로드를 하면 인스턴스 시작 버튼에 불이 들어오는 것을 확인할 수 있다. 다운로드 받은 파일은 꼭 안전하게 보관하자.

 

인스턴스를 생성하고 나면 인스턴스 상태가 노란색 동그라미와 함께 pending으로 되어있는데 시간이 지나면 초록색으로 바뀌면서 running으로 바뀌게 된다.

 

이제 우리는 클라우드 환경에 어떤 환경에서도 접속 가능하며 24시간 동안 돌아가는 컴퓨터를 한 대 생성한 것이다.

그럼 다음 편에서 SSH로 서버에 접속하는 방법에 대해서 알아보도록 하자.

'Develop > Amazon Web Service' 카테고리의 다른 글

[AWS] Ec2 인스턴스에 탄력적 IP를 연결시켜보자  (0) 2020.09.04
[AWS] Ec2 인스턴스에 SSH 접근  (0) 2020.09.04
[AWS] cloud9 설치 오류  (0) 2020.07.13
[AWS] RDS 한글 깨짐  (0) 2020.06.19
[AWS] AWS?  (0) 2020.05.17

c9.ide.collab 1, c9.ide.language.go 1를 설치하는데 에러가 발생해서 다음 절차로 넘어가지 않았다.

putty로 따로 접속하여

curl -L https://raw.githubusercontent.com/c9/install/master/install.sh | bash

입력해주고 다시 설치하면 설치가 잘 된다.

 

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]

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

[ 잡담 ]

요즘들어 새로 시작한 프로젝트가 있어서 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

아마존 웹 서비스의 기원  

  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

+ Recent posts