Cloud 서비스의 구축과 연동/구현에 대해 알아보자
가상화
✔️ 물리적인 장비 한 대를 가지고 마치 여러 개의 장비처럼 동작시키거나 반대로 여러개의 장비를 묶어 한 대의 장비인 것처럼 운용할 수 있게 해 주는 기술
👉🏻 내가 실제로 가지고 있는 장비는 아니지만 내가 가지고 있는 것처럼 사용할 수 있게 해 줌
클라우드 컴퓨팅
👉🏻 서버, DB, 소프트웨어 등 필요한 IT 자원을 로컬 컴퓨터가 아닌 인터넷상의 가상화된 서버에 정보를 저장하고 처리하는 기술
✔️ 서버를 운용해 주고 있는 업체를 이용해서 사용하는 것!
ex) AWS, Oracle, Mictosoft Azure, Naver Cloud Platform, Google Cloud Platform, ...
👉🏻 다양한 IT 자원을 클라우드 컴퓨팅으로 사용할 수 있으나 우리는 서버 클라우드 서비스를 이용할 것
AWS
👉🏻 Amazon Web Server의 약자로 약자로 가상화 기술을 기반으로 한 클라우드 서비스
👉🏻 사용자가 직접 서버 장비를 구입하지 않더라도 원격지에 있는 컴퓨터 자원을 마치 실제 서버 장비처럼 사용할 수 있도록 제공해주는 서비스
EC2 (Elastic Compute Cloud)
👉🏻 AWS에서 가장 기본적으로 널리 쓰이는 인프라
👉🏻 물리 환경의 실제 로컬 컴퓨터처럼 컴퓨터 자원을 제공하는 서비스
AWS를 통해 서버를 배포하는 법
1. AWS 접속 후 로그인
클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services
컴퓨팅에 대한 새로운 소식 거의 모든 애플리케이션을 어디에서나 지원할 수 있는 AWS 설계 칩, 인스턴스 및 하이브리드 솔루션과 같은 컴퓨팅 혁신에 대해 알아보세요. 발표 내용 둘러보기
aws.amazon.com
2. 오른쪽 상단 지역(Resion)을 서울로 변경
3. 왼쪽 상단 서비스 - 컴퓨팅 - EC2 접속
4. 인스턴스 시작 클릭
1️⃣ Instance (인스턴스)
👉🏻 AMI 를 적용하여 만들어진 컴퓨터 한 대(내가 사용할 컴퓨터 1대)
2️⃣ AMI(Amazon Machine Image)
👉🏻 소프트웨어의 구성 정보가 짜여져있는 템플릿
👉🏻 운영체제 종류 및 버전, 저장공간의 용량 등의 정보가 구성되어있음
5. 인스턴스 정보 기입
1️⃣ 인스턴스 시작
👉🏻 이름과 운영체제를 기입/선택한 후
👉🏻 운영체제 버전을 선택할 때는 프리 티어 사용 가능 문구 꼭 확인하기! (아니면 과금됩니다)
2️⃣ 인스턴스 유형
👉🏻 운영체제의 사양을 선택
👉🏻운영체제 사양을 선택할 때는 프리 티어 사용 가능문구 꼭 확인하기! (아니면 과금됩니다)
3️⃣ 키 페어(로그인)
👉🏻 컴퓨터에 접속하기 위한 계정 (암호화된 키의 느낌임)
4️⃣ 프라이빗 키 파일 형식
OpenSSH(.pem): GUI(마우스로 클릭하는 방식)
.ppk(PuTTY): CLI(커맨드 창에 명령어 치는 방식)
키 페어 생성 클릭 시 해당 프라이빗 키 파일 형식으로 파일 하나가 다운로드됨
👉🏻 해당 파일은 서버에 접속할 때마다 필요하므로 dev 폴더에 넣어두자
5️⃣ 네트워크 설정
👉🏻 전반적인 네트워크와 보안 설정
퍼블릭IP
내 컴퓨터의 주소지를 자동으로 만들어 공개하겠다 (공개된 나만의 IP 주소 = 다른 사람들이 자유롭게 접속하도록 함)
에서 RDP 트래픽 허용 - 위치 무관 0.0.0.0/0
어디에서든지 내 서버에 접속할 수 있게 해 주겠다
인터넷에서 HTTP 트래픽 허용
HTTP로 다른 사람이 접속 가능하게 하겠다
인터넷에서 HTTPS 트래픽 허용
HTTPS로 다른 사람이 접속 가능하게 하겠다 (HTTP보다 보안이 향상된 버전이나 인증서 별도로 필요하기 때문에 체크하지 않음)
6️⃣ 스토리지 구성
👉🏻 이 이상의 설정을 하면 과금되기 때문에 건드리지 않음
6. 인스턴스 시작 - 모든 인스턴스 보기
📍 인스턴스 상태 설명
인스턴스 실행 중 👉🏻 컴퓨터 켬
인스턴스 중지 👉🏻 컴퓨터 끔
👉🏻 안 쓸 때는 반드시 중지시켜 놔야 함! 스토리지 이상 사용되면 과금되는데 이를 악용하는 사람들이 있다고 함
인스턴스 종료 👉🏻 아마존에서 삭제
7. 서버 설정
1️⃣ 모든 인스턴스 보기 - 인스턴스 ID 선택 - 연결 선택
2️⃣ RDP 클라이언트 선택
3️⃣ 암호 가져오기 선택
4️⃣ Upload private key file 선택 후 아까 만들었던 프라이빗 키 업로드 후 암호 해독 클릭
5️⃣ 암호 키가 잘 등록됨
8. 내 컴퓨터에 올리기
1️⃣ 원격 데스크톱 연결 열기
2️⃣ 컴퓨터에 Public DNS 주소 복붙 후 연결 클릭
3️⃣ 사용자 이름에 사용자 이름, 암호에 암호를 각각 복붙 후 확인
👉🏻 나만 사용할 것이기 때문에 기억 체크박스 해 줌! 보안상 안 해 주는 게 맞음
📍 대박... 나 컴퓨터 또 생김
9. 서버 기본 설정 및 세팅
나는 자랑스러운 대한민국 국민이니까 당당하게 언어와 시간 설정을 바꿔 주자
1️⃣ settings - Time & language - Date & time - Time zone을 Seoul로 변경
2️⃣ settings - Time & language - Region & language - Country or region을 Korea로 변경
3️⃣ 지역 및 시간 세팅 완료 화면
4️⃣ 배포수업셋팅.zip (JDK, 오라클 등 기존 윈도우 컴퓨터에 설치했던 것들)을 이 서버 컴에도 올려 주자
5️⃣ 다운로드 완료되면 Extract All로 압축 해제
10. 스프링 프로젝트를 서버에 올리기
1️⃣ 스프링에서는 Maven의 권한 하에 target/classes 안에 배포 가능한 .class 파일들이 들어 있을 것
2️⃣ 해당 프로젝트 - Run As - Maven install을 클릭
3️⃣ 콘솔창에 수많은 빌드와 함께 BUILD SUCCESS 구문을 확인
4️⃣ 다시 한번 프로젝트를 확인 해 보면 해당 프로젝트의 .war 파일이 설치된 것 확인 가능!
war 파일: .jar 파일의 웹 버전
5️⃣ 파일 탐색기로 해당 .war 파일의 위치를 찾아가 잘 복사 후 dev 파일(보관 용도)과 서버 컴퓨터(사용 용도)에 붙여넣기
11. war 파일을 실행시키기 위한 설치 과정
1️⃣ JDK를 가장 먼저 설치해야 함
👉🏻 오라클과 톰캣 등은 JDK 기반으로 돌아가기 때문
👉🏻 설치 후 기본 경로(경로를 따로 바꿔 주지 않았음)를 확인해 봤을 때 이렇게 두 가지의 파일이 확인되면 잘 설치된 것!
2️⃣ 오라클 설치
👉🏻 오라클 압축 해제 후
👉🏻 설치를 하려고 했더니 실패......?
👉🏻 오라클 setup 파일 오류가 있는 듯해 새로운 setup파일로 덮어씌우고 다시 시도해도 안 됨
파일 문제가 아니라 폴더명이 한글이라서 그런 듯해 바탕화면에 재설치 후 시도
👉🏻 오라클 계정 oracle/oracle
3️⃣ sqldeveloper 설치
👉🏻 혹시 한글 경로 때문에 오타날지도 모르니까 나머지 파일들은 바탕화면으로 옮겨 주자
👉🏻 압축 해제
👉🏻 압축 해제된 폴더를 잘라내기 하여 C드라이브에 붙여넣기
👉🏻 바탕화면에 바로가기 파일 만들기
👉🏻 실행해 주자! 아래와 같은 안내창이 뜬다면 No 클릭 후 실행 재개
👉🏻 Tools - Preferences - Environment - Encoding: UTF-8로 변경
👉🏻 관리자 계정 생성: SYS AS SYSDBA/oracle
👉🏻 SPRING 계정 생성: spring/spring
CREATE USER SPRING IDENTIFIED BY SPRING;
GRANT CONNECT, RESOURCE TO SPRING;
👉🏻 스크립트 실행
DROP TABLE ATTACHMENT;
DROP TABLE REPLY;
DROP TABLE BOARD;
DROP TABLE CATEGORY;
DROP TABLE NOTICE;
DROP TABLE MEMBER;
DROP SEQUENCE SEQ_UNO; -- 회원번호 발생시킬 시퀀스
DROP SEQUENCE SEQ_NNO; -- 공지사항번호 발생시킬 시퀀스
DROP SEQUENCE SEQ_BNO; -- 게시판번호 발생시킬 시퀀스
DROP SEQUENCE SEQ_RNO; -- 댓글번호 발생시킬 시퀀스
DROP SEQUENCE SEQ_FNO; -- 첨부파일번호 발생시킬 시퀀스
--------------------------------------------------
-------------- MEMBER 관련 ------------------
--------------------------------------------------
CREATE TABLE MEMBER (
USER_NO NUMBER PRIMARY KEY,
USER_ID VARCHAR2(30) NOT NULL UNIQUE,
USER_PWD VARCHAR2(100) NOT NULL,
USER_NAME VARCHAR2(15) NOT NULL,
PHONE VARCHAR2(13),
EMAIL VARCHAR2(100),
ADDRESS VARCHAR2(100),
INTEREST VARCHAR2(100),
ENROLL_DATE DATE DEFAULT SYSDATE,
MODIFY_DATE DATE DEFAULT SYSDATE,
STATUS VARCHAR2(1) DEFAULT 'Y' CHECK (STATUS IN('Y', 'N'))
);
COMMENT ON COLUMN MEMBER.USER_NO IS '회원번호';
COMMENT ON COLUMN MEMBER.USER_ID IS '회원아이디';
COMMENT ON COLUMN MEMBER.USER_PWD IS '회원비밀번호';
COMMENT ON COLUMN MEMBER.USER_NAME IS '회원명';
COMMENT ON COLUMN MEMBER.PHONE IS '전화번호';
COMMENT ON COLUMN MEMBER.EMAIL IS '이메일';
COMMENT ON COLUMN MEMBER.ADDRESS IS '주소';
COMMENT ON COLUMN MEMBER.INTEREST IS '취미';
COMMENT ON COLUMN MEMBER.ENROLL_DATE IS '회원가입일';
COMMENT ON COLUMN MEMBER.MODIFY_DATE IS '정보수정일';
COMMENT ON COLUMN MEMBER.STATUS IS '상태값(Y/N)';
CREATE SEQUENCE SEQ_UNO
NOCACHE;
--------------------------------------------------
-------------- NOTICE 관련 -------------------
--------------------------------------------------
CREATE TABLE NOTICE(
NOTICE_NO NUMBER PRIMARY KEY,
NOTICE_TITLE VARCHAR2(100) NOT NULL,
NOTICE_CONTENT VARCHAR2(4000) NOT NULL,
NOTICE_WRITER NUMBER NOT NULL,
COUNT NUMBER DEFAULT 0,
CREATE_DATE DATE DEFAULT SYSDATE NOT NULL,
STATUS VARCHAR2(1) DEFAULT 'Y' CHECK (STATUS IN('Y', 'N')),
FOREIGN KEY(NOTICE_WRITER) REFERENCES MEMBER(USER_NO)
);
COMMENT ON COLUMN NOTICE.NOTICE_NO IS '공지사항번호';
COMMENT ON COLUMN NOTICE.NOTICE_TITLE IS '공지사항제목';
COMMENT ON COLUMN NOTICE.NOTICE_CONTENT IS '공지사항내용';
COMMENT ON COLUMN NOTICE.NOTICE_WRITER IS '작성자회원번호';
COMMENT ON COLUMN NOTICE.COUNT IS '조회수';
COMMENT ON COLUMN NOTICE.CREATE_DATE IS '작성일';
COMMENT ON COLUMN NOTICE.STATUS IS '상태값(Y/N)';
CREATE SEQUENCE SEQ_NNO
NOCACHE;
----------------------------------------------------
---------- CATEGORY 관련 (BOARD의 CID와 연관) ----------
----------------------------------------------------
CREATE TABLE CATEGORY(
CATEGORY_NO NUMBER PRIMARY KEY,
CATEGORY_NAME VARCHAR2(30) NOT NULL
);
COMMENT ON COLUMN CATEGORY.CATEGORY_NO IS '카테고리번호';
COMMENT ON COLUMN CATEGORY.CATEGORY_NAME IS '카테고리명';
----------------------------------------------------
---------------- BOARD 관련 -----------------
----------------------------------------------------
CREATE TABLE BOARD(
BOARD_NO NUMBER PRIMARY KEY,
BOARD_TYPE NUMBER, -- 일반 게시판(1)이냐 사진 게시판(2)이냐
CATEGORY_NO NUMBER,
BOARD_TITLE VARCHAR2(100) NOT NULL,
BOARD_CONTENT VARCHAR2(4000) NOT NULL,
BOARD_WRITER NUMBER NOT NULL,
COUNT NUMBER DEFAULT 0,
CREATE_DATE DATE DEFAULT SYSDATE NOT NULL,
STATUS VARCHAR2(1) DEFAULT 'Y' CHECK (STATUS IN('Y', 'N')),
FOREIGN KEY (BOARD_WRITER) REFERENCES MEMBER(USER_NO),
FOREIGN KEY (CATEGORY_NO) REFERENCES CATEGORY(CATEGORY_NO)
);
COMMENT ON COLUMN BOARD.BOARD_NO IS '게시글번호';
COMMENT ON COLUMN BOARD.BOARD_TYPE IS '게시글타입(일반1/사진2)';
COMMENT ON COLUMN BOARD.CATEGORY_NO IS '카테고리번호';
COMMENT ON COLUMN BOARD.BOARD_TITLE IS '게시글제목';
COMMENT ON COLUMN BOARD.BOARD_CONTENT IS '게시글내용';
COMMENT ON COLUMN BOARD.BOARD_WRITER IS '작성자회원번호';
COMMENT ON COLUMN BOARD.COUNT IS '조회수';
COMMENT ON COLUMN BOARD.CREATE_DATE IS '작성일';
COMMENT ON COLUMN BOARD.STATUS IS '상태값(Y/N)';
CREATE SEQUENCE SEQ_BNO
NOCACHE;
----------------------------------------------------
--------------- REPLY 관련 -------------------
----------------------------------------------------
CREATE TABLE REPLY(
REPLY_NO NUMBER PRIMARY KEY,
REPLY_CONTENT VARCHAR2(400) NOT NULL,
REF_BNO NUMBER NOT NULL,
REPLY_WRITER NUMBER NOT NULL,
CREATE_DATE DATE DEFAULT SYSDATE NOT NULL,
STATUS VARCHAR2(1) DEFAULT 'Y' CHECK (STATUS IN ('Y', 'N')),
FOREIGN KEY (REF_BNO) REFERENCES BOARD(BOARD_NO),
FOREIGN KEY (REPLY_WRITER) REFERENCES MEMBER(USER_NO)
);
COMMENT ON COLUMN REPLY.REPLY_NO IS '댓글번호';
COMMENT ON COLUMN REPLY.REPLY_CONTENT IS '댓글내용';
COMMENT ON COLUMN REPLY.REF_BNO IS '참조하는게시글번호';
COMMENT ON COLUMN REPLY.REPLY_WRITER IS '작성자회원번호';
COMMENT ON COLUMN REPLY.CREATE_DATE IS '작성일';
COMMENT ON COLUMN REPLY.STATUS IS '상태값(Y/N)';
CREATE SEQUENCE SEQ_RNO
NOCACHE;
----------------------------------------------------
-------------- ATTACHMENT 관련 --------------
----------------------------------------------------
CREATE TABLE ATTACHMENT (
FILE_NO NUMBER PRIMARY KEY,
REF_BNO NUMBER NOT NULL,
ORIGIN_NAME VARCHAR2(255) NOT NULL,
CHANGE_NAME VARCHAR2(255) NOT NULL,
FILE_PATH VARCHAR2(1000),
UPLOAD_DATE DATE DEFAULT SYSDATE NOT NULL,
FILE_LEVEL NUMBER,
STATUS VARCHAR2(1) DEFAULT 'Y' CHECK(STATUS IN('Y', 'N')),
FOREIGN KEY (REF_BNO) REFERENCES BOARD(BOARD_NO)
);
COMMENT ON COLUMN ATTACHMENT.FILE_NO IS '파일번호';
COMMENT ON COLUMN ATTACHMENT.REF_BNO IS '참조게시글번호';
COMMENT ON COLUMN ATTACHMENT.ORIGIN_NAME IS '파일원본명';
COMMENT ON COLUMN ATTACHMENT.CHANGE_NAME IS '파일수정명';
COMMENT ON COLUMN ATTACHMENT.FILE_PATH IS '저장폴더경로';
COMMENT ON COLUMN ATTACHMENT.UPLOAD_DATE IS '업로드일';
COMMENT ON COLUMN ATTACHMENT.FILE_LEVEL IS '파일레벨(1/2)';
CREATE SEQUENCE SEQ_FNO
NOCACHE;
COMMIT;
4️⃣ Apache Tomcat 설치
👉🏻 압축 해제
👉🏻 C드라이브에 옮기기
👉🏻 포트 번호 겹치면 오류 나니까 바꿔 주기
apache-tomcat-8.5.83/config/server를 메모장으로 열어 줌
👉🏻 포트 번호 8080을 80으로 바꿔 주기(통신 규약을 지키면서 겹치지 않음)
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
👉🏻 포트 번호 80을 허용해 주기 위한 방화벽 설정
👉🏻 인바운드 : 외부에서 내 컴퓨터의 접속을 관리
포트번호 80에 대해 현재 등록된 사항이 없으므로 New Rule... 선택
👉🏻 나 포트에 대한 설정을 추가할 거고
👉🏻 포트번호는 80이야
👉🏻 접속을 허락할 거야
👉🏻 Next
👉🏻 이름 설정 해 주면
👉🏻 추가 완료!
11. war 파일 연결
1️⃣ webapps 파일의 기존 ROOT 폴더 삭제
나는 니가 준 파일 말고 내가 가져 올 SPRING 파일 쓸 거야
2️⃣ .war 파일 붙여넣기
3️⃣ spring.war로 이름 변경
12. Apache Tomcat아, 내가 연결한 war 파일 실행시켜 줘
1️⃣ C:\apache-tomcat-8.5.83\bin 접속 후 startup 실행
👉🏻 배치 파일을 실행시키면 아파치 톰캣이 구동시켜 줄 것
2️⃣ 우리가 콘솔로 보던 서버 구동창이 보임!
3️⃣ webapps에 spring 폴더가 생성됨
👉🏻 아파치 톰캣이 제대로 구동시켜 줌
4️⃣ 해당서버의ip주소/spring 으로 접속
5️⃣ 다른 컴퓨터로도 서버가 열림!
![](https://t1.daumcdn.net/keditor/emoticon/niniz/large/023.gif)
📌 주의할 점
👉🏻 과금되지 않도록 사용 후 인스턴스 상태를 중지로 바꿔 놓을 것!
👉🏻 인스턴스가 뜨지 않는다면 오른쪽 상단의 지역을 확인해 볼 것!
(실제로 내가 인스턴스 확인하러 들어갔을 때 버지니아 북부로 설정돼 있는데 인스턴스 없다고 난리침)