지금까지는 테스트 파일을 이용해서 웹 서버를 구축하고 화면을 보여줬다. 데이터를 저장하거나 관리할 이유가 없어서 AWS 인스턴스에서 끄적끄적 거리는 정도였는데, 이제 DB서버를 별도로 구축해서 데이터를 다뤄볼 예정이다. 아직은 데이터의 관계들에 대해서 아리송한게 많지만 차근차근 개념을 잡아가야겠다. 💪
📖 강의 주제
- DB & ERD
DB의 개념 및 구성 요소 파악, ERD 설계 방법론
📝 목표
- DB 서버 구축
- AWS RDS 인스턴스 생성
- RDS 파라미터 설정
- DB 클라이언트 연결
- ERD 설계
- 상용 App 개념 데이터 모델링 분석
- 상용 App ERD 분석 및 설계
- 상용 App 화면 조회 쿼리
▶️ 개발 일지
1. 강의 내용 정리
1) phpMyAdmin vs DB 클라이언트
- phpMyAdmin은 AWS 인스턴스에서 추가적인 포트를 할당하지 않아도 DB에 접속할 수 있다.
- DB 클라이언트는 포트 할당이 안돼있으면 DB와 연결할 수 없다.
- phpMyAdmin은 웹 브라우저를 사용해서 DB에 접속. DB 클라이언트는 별도의 데스크탑 어플리케이션으로 접속
2) 소스 배포 방법
- Git 활용 (내용 조사)
- IDE를 원격 서버에 직접 연결
3) RDBMS
- Relational Database Management System의 약자로 보통 관계형 데이터베이스라고 부른다.
- 여기서 관계란 데이터와 데이터 사이의 상관관계를 의미한다.
- 쉽게 생각해서 엑셀의 표를 생각하며 된다.
엑셀 파일 === 데이터베이스
엑셀 시트 === 테이블(릴레이션)
엑셀 열 === 테이블 속성(컬럼, 필드)
액셀 행 === 테이블 레코드
- 보통 1:N 관계일 때는 컬럼이나 테이블로 두 데이터 집단을 분리한다.
- DDL / DML / DCL로 명령어가 구분된다.
1) DDL : Data Definition Language. Create, Alter, Drop 등
2) DML : Data Manipulation Language. Select, Update, Delete 등
3) DCL : Data Control Language. Grant, Revoke 등
4) ERD 설계
- 데이터의 관계가 1:N
- 속성들의 중복을 제거하여 정규화를 잘해야 한다.
하지만 너무 심한 정규화는,,,
- 주로 리소스를 중심으로 설계한다.
- 생성일시, 수정일시, 상태는 필수적으로 들어간다.
- 현업에서 데이터를 삭제하는 경우는 적으며, 법적인 문제가 되지 않는 선에서 사용자가 볼 수 없게만 막아놓는다.
2. SFTP 연결
그 동안 AWS 인스턴스에 접속할 때, SSH나 웹 브라우저를 사용했다. 개인적으로 템플릿 웹 페이지를 만들어보다가, 파일을 전송하기 위한 프로토콜이 필요함을 느끼고 FTP를 연결하는 과정을 적어둔다.
1) FTP, SFTP, FTPS
- FTP, SFTP, FTPS 셋 다 이름이 비슷해서 다 FTP와 비슷한 프로토콜인줄 알았다. 비슷한 건 맞지만 조금씩 차이가 있고, SFTP는 엄밀히 남이다. 😲 차이는 아래와 같다.
- 이 외에도 파일 전송 프로토콜은 많지만, 나는 보안에도 무난한 SFTP를 사용했다.
2) SFTP 설정
- SSH를 사용하기 때문에, 현재 원격 서버에서 열어놓은 SSH 포트를 그대로 사용해도 된다. 하지만 보안 및 유저권한 문제 때문에 이렇게 사용하기 보단 원격 접속용 포트와 파일 전송용 포트를 분리하고 싶었다.
- AWS 보안 그룹 설정에서 SFTP용 포트를 추가했다. 10000번대 이상으로 설정하자.
- sshd conifg파일에서 포트를 설정해야 한다. Port라 돼있는 곳에 보안그룹에 추가한 포트번호를 입력한다.
- SFTP는 SSH 프로토콜을 이용하기 때문에 SFTP 포트로 SSH 원격 접속 또한 가능하다. SFTP 포트로는 원격 접속을 막기 위해 Subsystem에 internal-sftp 옵션을 추가한다. Match User는 특정 유저를 SFTP 접속만 가능하게 하는 설정이고, Match LocalPort는 특정 포트에 SFTP만 접속 가능하게 하는 설정이다.
- 방화벽이 설정돼있다면 내가 설정한 포트를 허용해야 한다. 그리고 sshd를 재시작하면 접속하기 위한 설정이 완료된다.
$ sudo ufw allow [port]
$ sudo service sshd restart
3) 다운로드 폴더 권한 설정 및 접속
- SFTP로 접속한 계정으로 root 폴더에 접근하면 안되므로, 다운받는 폴더의 권한 설정을 해줘야 한다. 나는 root 권한으로 sshd config 파일에 입력한 것과 같이 /home 위치에 ftpDownloads 폴더를 만들었다. 그 안에 또 sftp 폴더를 생성하고 접근 권한은 아래와 같이 설정한다. (블로그[2] 참고)
ftpDownloads -> chmod 755
sftp -> chmod 775
- sshd config에서 SFTP 접근 유저의 키 페어를 다운 받아야 한다. AWS 키 페어 메뉴에서 생성한 뒤 해당 유저에 입력해놓는다. 키 페어를 설정하는 방법은 따로 적어두지 않는다. 이제 터미널 창에서 접속이 잘 되는지 확인해보자. 키 페어를 보관하고 있는 로컬 폴더에서 명령어를 입력해야 한다.
$ ssh -i "key.pem" [User]@[AWS IP Address] -p[Port]
$ sftp -P [Port] -i "key.pem" [User]@[AWS IP Address]
- 터미널을 클라이언트로 접속하는 건 성공이고, CLI 환경이 불편하면 FileZilla같은 GUI 프로그램으로 사용해도 된다.
3. 템플릿 웹 페이지
AWS 인스턴스를 만든 기념으로 템플릿을 사용해서 웹 페이지를 만들어봤다. 소스는 수정해서 바로 AWS 인스턴스에 파일 전송하는 방식으로 배포했다.
1) 템플릿 다운로드
- HTML5 UP! 에 들어가서 원하는 웹 템플릿을 다운 받는다. 나는 멀티버스라는 템플릿을 다운 받았다.
2) HTML 수정
- index.html 파일에 들어가서 사진 파일 불러오는 부분과 제목, 설명을 수정한다. HTML 태그에 대한 설명은 따로 하지 않는다.
3) Sub Domain 추가
- 이제 웹 페이지 소스를 만들었으니 AWS 인스턴스의 웹 서버에 배포해야 한다. 먼저 DNS 레코드 설정에서 Sub Domain을 추가하자
- AWS 인스턴스에서 /var/www/html 내부에 서브 도메인 폴더를 만들고, SFTP로 소스 파일을 전송 시킨다. 압축 파일로 전송했다면 /html에서 압축을 해제해야 한다.
$ sudo mkdir /var/www/html/multiverse
- 이제 웹 브라우저에서 서브 도메인으로 접속했을 때, 템플릿 페이지가 나오면 성공이다!
4. AWS RDS
1) RDS 인스턴스 생성
- RDS는 AWS 클라우드에 관계형 데이터베이스를 제공하는 웹 서비스다.
- EC2는 가상의 컴퓨터를 빌려 내 맘대로 이것저것 설치한다면, RDS는 데이터베이스만 설치할 수 있고, 관리는 AWS에서 하고 사용자는 애플리케이션 개발에만 집중할 수 있다.
- 더 자세한 EC2와 RDS의 차이는 AWS 홈페이지에서 내용을 확인하자
- 처음에 할 것은 인스턴스를 생성해야 한다. AWS 메인 화면에서 RDS 인스턴스 생성을 누른다.
- 어떤 데이터베이스를 생성할 것인지 묻는데, 나는 MySQL을 골랐다. 각자 필요한 혹은 작업하고 있는 데이터베이스를 고르면 된다. MySQL을 고를 시 버전 선택에 유의한다.
- 템플릿을 골라야 하는데 프리티어 유저라면 어짜피 하나밖에 고를 수 없다. 😅
DB 인스턴스의 이름을 입력하고, 마스터 유저의 아이디와 비밀번호를 만든다.
- 스토리지는 프리티어에서 할당할 수 있는 최대크기로 할당했다.
- EC2에서 한 것처럼 보안 그룹을 설정한다. 이전에 만든게 있다면 그대로 사용해도 되고, 새로 생성하여 포트를 할당해도 된다. MySQL이라면 기본으로 3306 포트가 할당된다.
- 데이터베이스에 접속할 때 인증 방식을 선택한다. 무난한 암호 인증을 선택했다. 그리고 초기에 설정할 DB 이름을 적는다.
- 여기까지 진행하고 생성하기를 누르면, 데이터베이스 목록에 내가 만든 인스턴스가 보인다. 생성하는데 최대 10분정도 시간이 걸리니 그 동안 설정해야 할 것들을 건드려보자
2) 보안 그룹 및 파라미터 옵션 설정
- 나는 이번 인스턴스를 만들 때 보안 그룹을 새로 생성했다. 따라서 어떤 포트만 열어둘 지, 어떤 소스포트만 허용할 것인지 설정해야 한다. 임의로 지정한 포트와 내 외부 IP 주소를 입력한다.
그리고 혹시 EC2에서 RDS로 접속할 수도 있으니, 3306포트와 내부 IP도 열어둔다.
- 다음으로 파라미터 옵션 메뉴에 들어간다. 파라미터 그룹에 DB 인스턴스를 생성할 때 만들었던 default 파라미터가 있다. 하지만 여기엔 옵션을 임의로 바꿀 수 없으니 새로 파라미터 그룹을 생성하자
- 새로운 파라미터 그룹에서 그룹 패밀리 설정에 유의한다. 이전 버전이 기본으로 설정돼있을 수 있다.
- 첫 번째로 설정할 것은 DB 내부 시간이다. 아무 설정도 안한 상태라면 UTC 기준(영국을 기준으로 시차 규정)으로 돼있을 것이니 KST 기준(한국 표준 시간)으로 바꿀 것이다.
생성한 파라미터 그룹에 들어가서 검색 창에서 time_zone을 검색한다. 파라미터 변경을 누른 뒤, time_zone 옵션에서 Asia/Seoul을 선택한다.
- 두 번째로 설정할 것은 Character Set(문자 집합)과 Collation(정렬 방식)이다.
Character Set은 문자의 집합으로 텍스트 데이터에 저장공간의 크기를 지정하는 것이다.
Collation은 텍스트 데이터를 정렬할 경우 어떻게 비교하여 정렬할 것인가에 대한 기준이다. (블로그 내용[3] 참고)
- 검색 창에 character나 character_set을 입력해서 옵션을 찾은 뒤, 값을 모두 utf8mb4로 선택한다.
utf8과 utf8mb4는 쉽게 말해 이모티콘 🤨🤩🥸 을 사용할 수 있냐 마느냐에 대한 차이다.
- 검새 창에 collation을 검색한 뒤 나오는 옵션을 모두 utf8mb4_general_ci나 혹은 utf8mb4_unicode_ci로 변경한다.
- 이렇게 파라미터를 바꿨으면, 데이터베이스 인스턴스 수정에 들어가서 파라미터 그룹을 기존에 쓰던 default에서 내가 만든 파라미터 그룹으로 바꿔준다.
- 수정 시간은 즉시 적용으로 한다.
3) 클라이언트 연결
- DB 인스턴스를 생성하고 모든 설정까지 마쳤으니 이제 클라이언트를 통해 접속해보자.
- 각자 사용하는 DB 클라이언트에서 새로 연결하기를 누르고, DB 인스턴스의 엔드포인트를 복사해서 호스트에 붙여넣는다.
- 사용자와 비밀번호는 초기에 설정한 마스터 계정으로 들어간다. 포트 번호에 유의하고 아래에 연결 테스트를 진행한다. 문제가 없으면 접속 성공이다!
- 쿼리 콘솔에서 time_zone과 현재 시각을 확인하면, KST로 잘 나오는 것을 알 수 있다.
SELECT @@time_zone, NOW();
- 쿼리 콘솔에서 현재 데이터베이스의 chartset을 확인하고 싶으면 아래와 같이 입력하면 된다. 참고로 MySQL에 대한 SQL을 입력한 것이다.
SHOW variables LIKE 'c%';
charset과 collation 일부가 기본 설정값인 utf8(=utf8mb3), utf8mb4_0900_ai_ci에서 안 바뀌는데 파라미터 옵션 설정에서 강제로 기본값을 만드는 게 있는 것 같다.
아무리 찾아봐도 한국 블로그에는 해결 방법을 찾을 수가 없다... 나와있는 정보는 다 내 상황에서 안되는 것 같다 ㅠㅠ
& 링크모음
[1] : 라이징캠프
[2] : SFTP Permission 조정 및 Chroot 설정
[3] : Charset / Collation 이란?