VIEW
쿼리문 저장 가능한 DB 객체
다른 테이블의 데이터를 보여줄 뿐, 데이터를 포함하고 있진 않음
→ 물리적인 실제 테이블과의 링크 개념
뷰를 사용하면 특정 사용자가 원본 테이블에 접근하여 모든 데이터를 보게 하는게 아니라 일부만 보여지도록 할 수 있음
CREATE VIEW [OR REPLACE] 뷰명
AS
저장쿼리문;
VIEW를 통한 삽입
INSERT INT view_name VALUES(v1, v2, v3, ..);
저장된 서브쿼리에 따라 DML로 조작이 불가능한 경우
- 뷰에 정의돼있지 않은 칼럼으로 조작시
- 뷰에 미포함된 컬럼 중 베이스테이블 컬럼이 NOT NULL 제약조건일 경우
- 산술 표현식 또는 함수식이 정의된 경우
- JOIN을 통해 여러 테이블을 연결한 경우
INDEX
색인 객체
SQL 명령문의 처리 속도 향상을 위한 객체로 데이터를 빠르게 조회 가능한 포인터 제공
주로 WHERE절 조건이나 JOIN 연산에 사용되는 컬럼을 가지고 생성함
특징
BinaryTree 구조로 만들어짐
Key-value 형태로 생성
key - 인덱스 지정 컬럼값, value - 행 저장된 주소값
장점
- 데이터 검색시 전체 테이블 검색 대신 인덱스를 통한 검색으로 속도 향상
- 시스템 부하를 줄여 시스템 전체 성능의 향상 가능
단점
인덱스 생성을 위한 추가 저장 공간 필요
인덱스 생성시 시간 소요
데이터 변경시마다 인덱스 갱신
→ 변경 작업이 빈번한 테이블에 INDEX 생성시 성능 저하 발생 가능
INDEX 적용 예시
중복된 데이터값들이 없는 고유 데이터값 컬럼
→ 선택도(selectivity)가 좋은 컬럼
아이디/주민번호/이메일 : good
이름 : not bad
성별/여부 : bad
효율적인 인덱스 사용 예
WHERE 절 사용 빈도가 잦은 컬럼
두 개 이상의 컬럼이 WHERE이나 JOIN의 조건으로 자주 사용될 경우
한 번 입력된 데이터의 변경이 자주 일어나지 않은 경우
한 테이블에 저장된 데이터 용량이 클 경우
비효율적 인덱스 사용 예
중복값이 많은 컬럼
null이 많은 컬럼
SHOW INDEX FROM tbl_name;
을 통해 인덱스 확인 가능
생성
CREATE INDEX idx_name
ON tbl_name(column_name);
삭제
DROP INDEX idx_name ON tbl_name;
복합 인덱스
두 개 이상의 컬럼을 한번에 하나의 인덱스로 설정하여 생성
CREATE INDEX idx_name
ON tbl_name(cl1, cl2);
cl1로 조회 할 경우 → ref, cl2로 조회할 경우엔 index 타입으로 실행계획 조회가 된다.
실행 계획
테이블 접근 방법, 조인 순서, 데이터 처리 방식 등등이 표현돼있음.
EXPLAIN + 쿼리
type 종류(성능 우선순위로 나열)
- system : 0개 또는 하나의 row 테이블
- const : primary key나 unique key의 모든 컬럼에 대해 equal 조건으로 검색시, 반드시 1건의 레코드 반환
- ref : 조인 의 순서와 인덱스의 종류와 관계없이 equal 조건으로 검색시
- unique_subquery : IN(sub-query) 형태의 조건에서 반환 값에 중복 없음
- index_subquery : unique_subquery와 유사하나 반환 값에 중복 있음
- range : 인덱스를 하나의 값이 아닌 범위를 통한 검색시
- index : 인덱스를 처음부터 끝까지 읽는 인덱스 풀 스캔
- ALL : 풀스캔, 성능이 제일 좋지 않음
SHOW INDEX FROM tbl_menu;
-- ALL ( full scan )
EXPLAIN SELECT * FROM tbl_menu WHERE menu_code = 1;
-- const ( primary key column -> equal condition )
EXPLAIN SELECT * FROM tbl_menu WHERE category_code = 4;
-- ref ( index fk column -> equal condition )
rows와 실제 실행 결과의 차이가 클 경우 쿼리 튜닝이 필요함.
index 적용 이후의 쿼리 실행계획
EXPLAIN
SELECT *
FROM phone
WHERE
phone_name = 'iphone16pro'; -- o, ref
phone_name != 'iphone16pro'; -- o, range
phone_name LIKE 'iphone%'; -- o, range
phone_name LIKE '%iphone%'; -- x, ALL (앞에 % 있어 ALL 타입 적용)
LEFT(phone_name, 1) = 'i'; -- x, ALL 인덱스 컬럼 변형(산술 연산 혹은 함수 적용)시 ALL
phone_name IS NULL; -- o, ref
phone_name IS NOT NULL; -- o, range
phone_name = 16; -- x, ALL(인덱스 컬럼의 타입과 비교 데이터간 타입 불일치 시)
FUNCTION
db에 저장된 서브 프로그램으로 단일 값 반환토록 설계
일반적으로 공통적인 수식이나 비즈니스 규칙을 정의하고 sql문 또는 다른 저장 프로그램에서 재사용 가능
CREATE FUNCTION func_name(param1, param2, ...)
RETURN ret_type;
BEGIN
func_content
[DECLARE var;]
[SET var val]
[condition]
RETURN ret_val;
END;
condition
IF condition THEN statement_list
[ELSEIF condition THEN statement_list]
..
[ELSE statement_list]
END IF;
CASE
WHEN codition THEN statement_list
[WHEN codition THEN statement_list]
..
[ELSE statement_list]
END CASE;
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]
..
[ELSE statement_list]
END CASE;
DELIMITER $$
CREATE FUNCTION func_get_menu_with_str(param_menu VARCHAR(50))
RETURNS VARCHAR(100)
BEGIN
DECLARE result VARCHAR(100);
SET result = CONCAT('*', param_menu, 'helloWorld');
RETURN result;
END$$
DELIMITER ;
-- 최초 실행 시 바이너리 로깅으로 인한 에러 발생
-- result 뒤의 세미콜론을 함수 본문의 마지막으로 인식하지 하게 않기 위해
-- DELIMITER $$ ~ DELIMITER
SET GLOBAL log_bin_trust_function_creators = 1; -- 바이너리 로깅 비활성화
SELECT func_get_menu_with_str('hi'); -- 함수 실행
PROCEDURE
DB 저장 서브프로그램으로 여러 SQL문을 포함하고 실행 가능토록 설계됨
주로 DB 작업 자동화 혹은 비즈니스 규칙 구현에 사용
저장된 프로시저는 CALL 키워드를 통해 호출 가능, SQL문 호출 불가
CREATE PROCEDURE prcd_name(parameter_list) -- IN(기본값)/OUT/INOUT
BEGIN
prcd_content
END;
CALL prcd_name();
-- 회원 추가시 테이블에 INSERT 하고 발생된 회원번호를 돌려주는 프로시저 생성
DELIMITER $$
CREATE PROCEDURE create_user(
IN username VARCHAR(255), -- IN 모드 변수
IN password VARCHAR(16), -- IN 모드 변수
OUT mem_id INT -- OUT 모드 변수
)
BEGIN
INSERT INTO
tbl_member(username, password)
VALUES
(username, password);
SET mem_id = LAST_INSERT_ID();
END$$
DELIMITER ;
-- 사용법
CALL create_user('ino', '1234', @param);
SELECT @param;
SELECT * FROM tbl_member WHERE id = @param;
반복문
-- LOOP
condition
LOOP
loopContent
END LOOP;
-- WHILE LOOP
WHILE loop-condition DO
loopContent
END WHILE;
-- REPEAT
REPEAT
loopContent
UNTIL condition END REPEAT;
DELIMITER $$ -- LOOP예시
CREATE PROCEDURE proc_loop(n INT,OUT result INT)
BEGIN
DECLARE i INT DEFAULT 1; -- 증감변수
SET result = 0;
sum_label: LOOP
SET result = result + i;
SET i = i + 1;
IF i > n THEN LEAVE sum_label;
END IF;
END LOOP;
END$$
DELIMITER ;
DELIMITER $$ -- WHILE
CREATE PROCEDURE proc_while(n INT,OUT result INT)
BEGIN
DECLARE i INT DEFAULT 1;
SET result = 0;
WHILE i <= n DO
IF i % 2 = 0
THEN SET result = result + i;
END IF;
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
CALL proc_while(10, @p1);
SELECT @p1;
DELIMITER $$ -- REPEAT
CREATE PROCEDURE proc_repeat(OUT result INT)
BEGIN
DECLARE i INT DEFAULT 0;
SET result = 1;
REPEAT
SET i = i + 1;
SET result = i;
UNTIL i * i > 1000 END REPEAT;
SET result = POW(result -1,2);
END$$
DELIMITER ;
DROP PROCEDURE proc_repeat;
CALL proc_repeat(@repeat);
SELECT @repeat;
보안 그룹 생성
이전 글에서 설명했듯, 인바운드 규칙은 외부 → EC2 인스턴스 내부로 들어오는 데이터에 대한 네트워크 트래픽에 대한 제어, 아웃바운드 규칙은 EC2 인스턴스 내부에서 외부로 향하는 네트워크 트래픽에 대한 제어이다.
일단은 인바운드 규칙만 설정해주고 보안 그룹을 만들어주자.
그 다음으로, 인스턴스를 하나 만들어주자.
인스턴스
인스턴스는 각각의 컴퓨터 대수를 의미함
즉, 인스턴스를 여러 개 만들면 스케일 아웃, 인스턴스 각각의 성능을 높이면 스케일 업이다.
인스턴스는 gpt가 다음과 같다고 한다.
인스턴스 종류 및 설명
AWS(아마존 웹 서비스)의 인스턴스는 클라우드 컴퓨팅 환경에서 가상 서버를 나타내며, Amazon EC2(Elastic Compute Cloud)에서 제공하는 주요 컴포넌트 중 하나입니다. 인스턴스는 다양한 용도로 사용되며, 아래는 그 기본적인 개념과 특성에 대한 상세한 설명입니다.
인스턴스의 정의
인스턴스는 AWS 클라우드에서 실행되는 가상 서버로, 물리적 서버의 자원을 사용하여 운영됩니다. 사용자는 필요에 따라 인스턴스를 생성하고 관리할 수 있습니다.인스턴스 유형
AWS는 다양한 인스턴스 유형을 제공하여 사용자의 요구에 맞는 성능을 제공합니다. 인스턴스 유형은 CPU, 메모리, 스토리지, 네트워킹 성능에 따라 구분됩니다. 주요 인스턴스 유형은 다음과 같습니다:일반 목적 인스턴스: 균형 잡힌 CPU, 메모리, 네트워크 성능을 제공 (예: t3, m5)
컴퓨팅 최적화 인스턴스: CPU 성능이 중요한 애플리케이션에 적합 (예: c5)
메모리 최적화 인스턴스: 메모리 집약적인 작업에 최적화 (예: r5, x1)
스토리지 최적화 인스턴스: 대용량 데이터 처리에 최적화 (예: i3, d2)AMI (Amazon Machine Image)
인스턴스를 생성할 때 사용되는 기본 이미지입니다. AMI는 운영 체제, 애플리케이션 서버, 애플리케이션 및 필요한 설정을 포함하고 있습니다. 사용자는 기존 AMI를 사용하거나 자신의 AMI를 생성할 수 있습니다.인스턴스 시작 및 종료
AWS 관리 콘솔, CLI(Command Line Interface), SDK(Software Development Kit)를 통해 인스턴스를 쉽게 시작하고 종료할 수 있습니다. 인스턴스는 필요할 때만 실행하고, 사용하지 않을 때는 종료하여 비용을 절감할 수 있습니다.요금 체계
AWS EC2 인스턴스는 사용한 만큼 요금이 부과되는 종량제 모델을 따릅니다. 기본적으로 시간 단위로 요금이 청구되며, 예약 인스턴스와 스팟 인스턴스를 통해 비용을 추가로 절감할 수 있는 옵션도 제공됩니다.보안 및 네트워킹
인스턴스는 VPC(가상 사설 클라우드) 내에서 실행되며, 보안 그룹과 네트워크 ACL(Access Control List)을 통해 접근 제어를 설정할 수 있습니다. 이를 통해 인스턴스의 보안을 강화할 수 있습니다.스케일링
AWS는 자동 스케일링 기능을 제공하여, 트래픽 변화에 따라 인스턴스를 자동으로 추가하거나 제거할 수 있습니다. 이를 통해 애플리케이션의 가용성과 성능을 유지할 수 있습니다.결론
AWS 인스턴스는 다양한 용도와 요구에 맞게 유연하게 구성할 수 있는 가상 서버로, 클라우드 환경에서의 컴퓨팅 자원을 효율적으로 관리하고 활용할 수 있는 핵심 요소입니다.
인스턴스 타입을 프리 티어에서 사용 가능한 t2.micro로 설정해주고 키 페어를 다운로드 받아준다.
그 다음, 기존에 생성해줬던 보안 규칙을 해당 인스턴스에 적용해준다.
마지막으로, 스토리지 세팅을 해 준 다음 인스턴스를 시작시켜주자
성공적으로 인스턴스가 실행되고, 나머지 상세 정보들을 확인 가능하다.
위 연결 버튼을 눌러 우분투 쉘로 접속해준다.
시큐어쉘을 이용하면 내 pc에서 제어할 수 있다고 한다.
다음과 같이 우분투 창을 띄워주자.
그 뒤 sudo apt update, sudo apt install apache2 를 통해 apt를 업데이트하고 아파치 웹 서버를 설치해주자.
그 다음 인스턴스 정보에서 보았던 퍼블릭 주소를 통해 접속하게 되면
이렇게 80번 포트를 통해 잘 나오는걸 볼 수 있다 !
원래는 저렇게 몽고db연결까지 하는게 목표였는데 ,, 뭔 말인지 당최 모르겠다.
'TIL' 카테고리의 다른 글
TIL 3/19 - 정규화, JDBC (0) | 2025.03.19 |
---|---|
TIL 3/18 - DB 모델링, 이상(Anomaly), 정규화 (0) | 2025.03.18 |
TIL 3/14 - 제약조건,No SQL, AWS EC2 (0) | 2025.03.14 |
TIL 3/13 - DDL (0) | 2025.03.13 |
TIL 3/12 - 서브쿼리 (0) | 2025.03.12 |