데이터베이스 연결 (RDS)
RDS 란?
- RDS (Relational Database Service) 는 관계형 데이터베이스 서비스로 MysQL , MariaDB 등 여러 관계형 데이터베이스 서비스를 AWS 로부터 빌려서 사용한다고 생각하면 된다.
RDS 사용 이유
- 로컬 환경에서 개발할 때는 로컬 환경에 설치된 MySQL 와 같은 DB 를 연결해서 사용하지만, 서버를 배포하게 되면 서버가 내 컴퓨터에 설치된 MySQL 과 연결을 할 수 없다.
- 즉 DB 도 외부 인터넷에서 접근할 수 있도록 같이 배포를 해줘야한다.
- 이러한 이유 떄문에 AWS RDS 라는 데이터베이스를 빌려서 사용하는 것이며, 이외에도 자동 백업 , 모니터링 , 다중AZ 와 같은 편리한 부가기능도 제공한다.
EC2 에 MySQL 직접 설치 후 운영한다면?
- EC2 에 MySQL 을 설치하면 별도의 RDS 의 비용이 나오지 않는다.
- 하지만 실제 현업에서는 이런 방식을 사용하지 않는데, 그 이유는 백엔드 서버에 장애로 인해 EC2 컴퓨터가 죽을 경우, 애꿏은 MySQL 도 같이 죽기 때문이다.
- 추가로 RDS 가 제공하는 부가적인 편리한 기능이 많기 떄문에 MySQL 을 직접 설치 하지 않고 RDS 를 쓴다.
정리
현업에서는 EC2 와 RDS 를 분리해서 사용하는 것이 일반적이지만, 비용이 부담될때는 EC2에 백엔드 서버와 MySQL 을 모두 설치해서 사용해도 무방하다.
ECS -> RDS 아키텍처
- 해당 예제에서는 사용자는 EC2 에 요청을 보내고 EC2 는 RDS 에서 데이터를 가져온다.
RDS 생성
- AWS 에서 RDS 들어가기
- 표준 생성 , MySQL , 프리티어 , DB 인스턴스 식별자 설정 , 마스터 이름 + 마스터 비밀번호 설정 , 스토리지 설정
- EC2 컴퓨팅 리소스에 연결 안 함 , 퍼블릭 액세스는 "예" 하고 데이터 생성하기
- 퍼블릭 액세스를 한다고 해서 보안적으로 취약해지는 것은 아니기 때문에 그냥 사용해도 무방하다.
보안 그룹 설정
- RDS 라는 집에 접근하기 전에 울타리와 대문와 같은 곳에서 어떤 IP 들을 허용할 것인지 정하는 것이 보안 그룹이라고 생각하면 된다.
- 보안 그룹은 AWS EC2 에 들어가서 보안 그룹에서 생성하면 된다.
- 적절한 이름을 넣어주고 인바운드 규칙에 MySQL/Aurora , 소스 유형은 IPv4 를 설정해준다.
- RDS 는 MySQL 의 유형 요청만 받는다는 것이다.
- 생성한 RDS 에 들어가 수정을 누른 후 연결에서 위에서 만든 보안 그룹을 선택하고 즉시수정을 하면 된다.
파라미터 그룹 추가하기
- 파라미터 그룹은 MySQL 에도 여러가지 설정 값들을 가진다.
- RDS 를 사용하면 MySQL 설정을 어렵게 설정하는게 아니라 파라미터 그룹에서 쉽게 설정할 수 있도록 해준다.
- 파라미터 그룹 생성을 누르고 유형은 mysql8.0 , 그룹 이름을 넣어주고 생성하면 된다.
- 들어가보면 여러가지 설정 값들이 많은데 이 값들이 MySQL 에서 적용시킬 옵션 값이다.
- 아래에 있는 값들을 모두 수정해줘야 한다.
- 속성들을 utf8mb4 로 설정
- character_set_client
- character_set_connection
- character_set_database
- character_set_filesystem
- character_set_results
- character_set_server
- 인코딩 방식을 utf8mb4 로 바꿔준다. (한글 지원뿐만 아니라 이모티콘도 지원)
- 속성들을 utf8mb4_unicode_ci 로 설정
- collation_connection
- collation_server
- utf8mb4_unicode_ci 는 정렬 , 비교 방식을 나타낸다.
- time_zone 을 Aisa/Seoul 로 설정
다시 만든 RDS 로 가서 수정에서 추가구성->DB 파라미터 그룹에 우리가 만든 파라미터 그룹을 넣어주면 된다.
- DB 파라미터 그룹을 변경한 뒤에는 RDS 의 DB 를 재부팅해야만 정상적으로 적용된다.
RDS에 접속하기
- RDS 에 대한 기본적인 설정은 끝났고
- 데이터베이스를 만들면 데이터베이스 관리 툴과 연결을 하고 데이터베이스가 잘 동작하고 연결이 됐는지 체크를 먼저 해야한다.
- 가장 많이 사용하는 것은 Datagrip , Workbench , DBeaver 가 있다.
- RDS 에 들어가보면 엔드포인트가 있는데 그 값을 복사한 후, 워크벤치에서 새로운 커넥션을 만들 때 HostName 에 엔드포인트를 넣어주고 비밀번호에는 RDS 를 만들 때 설정했던 비밀번호를 넣어주면 된다.
- 그렇게 접속하면 sys 라는 데이터베이스가 이미 만들어져있는데 거기에는 설정에 관련된 값들이 있기 때문에 삭제해서는 안 된다.
엔드포인트(EndPoint)란?
- 특정 리소스(Server , DB등)에 접근할 수 있도록 해주는 URL
- RDS 뿐만 아니라 다양한 곳에서 사용하는 단어이다.
- 우리는 EC2 나 RDS 와 같은 리로스에 접근 할 때 특정 주소를 통해 접근하는데, 그 주소가 해당 리소스의 대문 같은 역할을 한다.
- 그 대문을 넘어서야 내부에 있는 코드나 데이터를 가져올 수 있다.
Spring 서버에 RDS 연결
- yml 파일에 위에서 만든 USERNAME , PASSWORD , HOST(엔드포인트) 들을 넣으면 된다.
- EC2 배포는 이 자체를 배포하게 되면 EC2 에 있는 컴퓨터가 RDS 와 연결이 되기 떄문에 이 자체를 JAR 로 만들어서 배포하면 된다.
파일 및 이미지 업로드 (S3)
S3 란?
- S3는 파일 저장 서비스로 사진이나 동영상과 같은 파일들을 구글 드라이브나 iCloud 에 저장하는데, S3 는 이런 종류의 서비스라고 생각하면 된다.
S3 사용 이유?
- 백엔드 서버를 구현하면 이미지 업로드 기능을 구현할 때가 많은데, 이 이미지 파일을 어디에 저장을 해야할까?
- 물론 EC2 내부에 넣을 수 있지만 서비스를 조금만 운영하다보면 EC2 에 쌓이는 파일들이 너무 많아지고 지저분해지기 때문에 좋지 않다.
- 핸드폰에 저장공간이 있어도 구글 드라이브나 iCloud 같은 곳에 사진을 옮기는 것과 같은 맥락으로, S3 는 파일 저장에 특화된 서비스이다.
- 파일 저장 뿐만 아니라 파일을 다운 받는 것에 대해서도 최적화가 되어 있는 서비스이기 때문에 S3 를 사용한다.
실제로 현업에서도 파일 업로드 기능을 구현해야할 때 AWS S3 를 많이 활용한다.
S3 을 활용한 아키텍처 구성
이미지 파일 업로드 과정
- 사용자는 EC2 에게 이미지 업로드 API 로 요청을 보낸다.
- EC2 는 S3 에 이미지를 업로드 한다.
- S3 는 이미지가 저장된 URL 을 EC2에게 리턴한다.
- EC2 는 DB(RDS) 에 이미지가 저장된 URL 을 저장한다.
- 이미지 자체를 저장한다는 개념이 아니라 이미지가 저장된 URL 을 저장한다.
이미지 파일 다운로드 과정
- 사용자는 EC2 에게 이미지 조회 API 로 요청을 보낸다.
- EC2 는 DB(RDS) 에 조회 SQL 문을 날린다.
- DB(RDS) 에 저장되어 있던 이미지 URL 을 EC2 에게 전달한다.
- EC2 는 사용자한테 이미지 URL 을 응답을 보내준다.
- 사용자가 이미지 URL 을 사용할 경우, S3 로부터 이미지를 다운로드 받는다.
- 5번에 경우는 우리가 네이버를 들어가보면 여러가지 이미지들이 보인다.
- 이때 우리는 어디선가 다운로드 받은 이미지들을 가지고 오는 것과 똑같다고 생각하면 된다.
해당 예시들은 이미지 파일이지만, 이미지 이외에도 다양한 종류의 파일을 저장하는 용도로 사용된다.
S3 버킷 생성
- S3 에서는 버킷과 객체라는 용어를 사용하기 때문에 이 용어들에 대해서 알아보자.
- 버킷 : 깃허브에서도 여러 개의 Repository 를 만들 수 있는 것 처럼 S3 에서도 여러 개의 저장소를 만들 수 있고, 여기서 하나의 저장소를 버킷이라고 한다.
- 객체 : S3 업로드한 파일을 보고 S3 에서는 파일이라고 하지 않고 객체라고 부른다.
-> S3 버킷에 업로드된 파일
AWS Bucket 생성
- 버킷 만들기에서 버킷 이름을 두고 퍼블릭 액세스 차단 설정을 모두 풀어주고 다른 것들은 기본값을 사용하고 만들어준다.
- 정책 추가
- 정책은 권한(Permission) 을 정의하는 JSON 문서를 의미하는데, AWS 는 기본적으로 대부분의 권한이 주어져있지 않기 때문에 AWS의 특정 소스에 접근하려면 권한을 허용해줘야 한다.
- 그 허용을 하기 위해서는 정책을 작성해야 한다.
- 1번에서 만든 버킷에 들어가서 권한에 들어가고 버킷 생성에서 편집을 누르고 새문 추가에서 서비스 중에서 S3 를 선택한다.
- 그 중에서 GetObject 를 선택하고 리소스에는 S3 , object , bucket 이름에는 생성한 버킷 이름과 object 는 * 을 넣어준다.
- 이렇게 하면 S3 중에서 해당 Bucket 이름에 해당하는 버킷에 모든파일(*) 을 사용할 수 있다는 것이다.
- 그런 후 Principal 은 "*" 로 바꿔줘서 모두가 접근할 수 있도록 해준다.
S3에 파일을 업로드할 수 있도록 IAM 에서 액세스 키 발급
- 기본적으로 AWS 의 리소스에 아무나 접근을 못하도록 막았기 때문에 S3 에 접근해서 파일을 업로드할 수 없다.
- 백엔드 서버가 S3 접근해서 파일을 업로드 할 수 있어야 하는데, 그렇게 하기 위한 권한을 IAM 을 통해서 받을 수 있다.
- IAM 에 들어가서 사용자 추가를 누른 후 사용자 이름 설정하고 , 직접 정책 연결에서 AmazonS3FullAccess 를 선택하고 만들어주면 된다.
- 만든 후 보안 자격 증명->액세스 키 에서 액세스 키 생성을 할 떄 AWS 외부에서 실행되는 애플리케이션을 선택하고 만들어주며 된다.
- 그렇게 발급된 액세스 키와 비밀 액세스 키를 어딘가에 잠깐 복사해놓자.
S3 를 활용해 Spring 서버에 이미지 업로드 기능 구현
- S3 접속할 수 있는 라이브러리를 다운로드 받고 yml 파일에 ACESS_KEY , SECRET_KEY , BUCKET_NAME 들을 넣어준다.
- S3Client 객체를 생성하고 key 값들을 넣어주면 된다.
- POSTMAN 으로 이미지를 업로드 할 때 Body 에서 form-data 로 간 후 key 를 넣고 Value 에는 업로드할 파일을 넣어주면 된다.