-
MSA란?아키텍처 2023. 10. 21. 21:40
MSA(MicroService Architecture) vs 모놀리식 아키텍처(Monolithic Architecture) 모놀리식 아키텍처 개발이 완료된 웹 어플리케이션을 하나의 결과물로 패키징하여 배포하는 형식 WAR파일로 빌드하여 WAS에 배포하는 형식 단점 일부 장애가 전체장애 현상으로 나타남. 서비스의 수정이 어렵고, 커플링이 강하기 때문에 서로 영향을 많이 미침 ==> 결과적으로 유지보수에 좋지 않다. 이런 단점을 극복하기 위해 나타난 것이 MSA. 장점 Message Driven Api 방식으로 통신한다. 각 서비스별 개발을 더욱 편리하게 하고 기능별로 별도의 서버가 구성돼 있기 때문에 유지보수에 좋다. 단점 각 모듈별로 서버를 구성하고 있기 때문에 여러 개의 별도 서버를 구성하기가 어렵다...
-
13. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 21. 21:22
인덱스를 이용한 소트 연산 생략 TOP N 쿼리 TOP N 쿼리는 아래와 같이 간단하게 구현할 수 있다. SELECT TOP10 거래일자 ,체결건수 ,체결수량 ,거래대금 FROM 거래 WHERE 종목코드 > 'KR123456' AND 거래일시 >= '20180304' ORDER BY 거래일시 SELECT * FROM ( SELECT TOP10 거래일자 ,체결건수 ,체결수량 ,거래대금 FROM 거래 WHERE 종목코드 > 'KR123456' AND 거래일시 >= '20180304' ORDER BY 거래일시 ) WHERE ROWNUM 'KR123456' AND 거래일시 >= '20180304' AND ROWNUM
-
12. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 21. 20:52
소트가 발생하지 않도록 SQL 작성 UNION VS UNION ALL UNION을 사용하면 옵티마이저는 상단과 하단 두 집합 간 중복을 제거하려고 소트 작업을 수행 UNION ALL은 중복을 확인하지 않고 두 집합을 단순히 결합 따라서, 특이한 케이스를 제외하고는 UNION ALL을 사용하는 것이 효율적이다. UNION ALL을 사용하려면 아래와 같이 쿼리를 작성해야 한다. SELECT 결제번호 ,결제수단코드 ,주문번호 ,결제금액 FROM 결제 WHERE 결제일자 = '20180316' UNION ALL SELECT 결제번호 ,결제수단코드 ,주문번호 ,결제금액 FROM 결제 WHERE 주문일자 = '20180316' AND 결제일자 '20180316' 만약에 결제일자가 'NULLABLE'로 설계돼 있다면..
-
11. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 21. 20:45
소트 연산에 대한 이해 소트 수행 과정 소트는 기본적으로 PGA에 할당한 Sort Area에서 이뤄진다. Sort Area의 공간이 부족해지면 Temp Space를 활용한다. 메모리 소트 vs 디스크 소트 메모리 소트(In-Memory Sort) : 전체 데이터의 정렬 작업을 메모리 내에서 완료하는 것을 의미한다. 디스크 소트(To-Disk Sort) : 할당받은 Sort Area 내에서 정렬을 완료하지 못해 디스크 공간까지 사용하는 경우를 의미한다. 소트 연산은 처리할 데이터량이 많을 때는 디스크 I/O까지 발생하므로 쿼리 성능을 좌우하는데 매우 중요하다. 많은 서버 리소스를 사용하고 디스크 I/O가 발생하는 것도 문제지만, 부분범위 처리를 불가능하게 함으로써 OLTP 환경에서 애플리케이션 성능을 저하..
-
1. 영속 컨텍스트와 엔티티IT 서적/JPA 퀵 스타트 2023. 10. 21. 12:49
영속 컨텍스트란? JPA의 영속 컨텍스트가 애플리케이션과 실제 데이터베이스를 연결해주는 기능을 제공 컨테이너이다. 영속 컨테이너와 엔티티 상태 영속 컨테이너는 엔티티들을 4가지 '상태'로 관리한다. 상태 의미 생성(NEW) 엔티티가 영속 컨테이너에 등록되지 않은 상태 관리(MANAGED) 엔티티가 영속 컨테이너에 등록된 상태 분리(DETACHED) 엔티티가 등록됐다가 컨테이너에 분리된 상태 삭제(REMOVED) 엔티티가 영속 컨테이너에서 삭제 처리된 상태 1. 생성상태 Employee employee = new Employee() ; employee.setName("둘리") ; 엔티티의 생성 상태를 코드로 표현하면 위와 같다. 이는 엔티티 객체를 생성만 했을 뿐 아직 영속 컨테이너에 등록되지 않은 상태이..
-
10. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 21. 10:28
해시조인 해시 조인의 진행 단계 Build 단계 : 작은 쪽 테이블(Build Input)을 읽어 해시 테이블(해시 맵)을 생성한다. Probe 단계 : 큰 쪽 테이블(Probe Input)을 읽어 해시 테이블을 탐색하면서 조인한다. ※ 해시조인은 use_hash 힌트를 사용한다. 위의 관계도를 토대로 해시 조인의 단계를 설명하자면 Build 단계 : WHERE 조건에 해당하는 데이터를 가져온 후, 해시 테이블을 생성한다. 이때, 조인컬럼인 사원번호를 해시 테이블 키 값으로 사용한다. 해시 테이블은 PGA 영역에 할당된 Hash Area에 저장한다. Probe 단계 : WHERE 조건에 해당하는 데이터를 하나씩 읽어 앞서 생성한 해시 테이블을 탐색한다. 값이 같은 사원번호를 찾으면 조인에 성공한 것이고,..
-
9. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 21. 10:18
DB의 메모리 구조 SGA vs PGA 1.SGA 란? System Global Area의 약자로써, 공유 메모리 영역을 의미한다. SGA에 캐시된 데이터는 여러 프로세스가 공유할 수 있지만 동시에 액세스할 수는 없다. 동시에 액세스하려는 프로세스 간 액세스를 직렬화하기 위한 Lock 매커니즘으로서 래치(Latch)가 존재한다. 2. PGA란? Private Global Area의 약자로써, 각 오라클 서버 프로세스에 할당된 메모리 영역을 PGA라고 부르며, 프로세스에 종속적인 고유 데이터를 저장하는 용도로 사용한다. (PGA 공간이 작아 데이터를 모두 저장할 수 없는 경우에는 Temp 테이블스페이스를 이용한다.) 소트머지 조인의 단계 소트 단계 : 양쪽 집합을 조인 컬럼 기준으로 정렬한다. 머지 단계 ..
-
8. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 21. 09:40
NL조인이란? 인덱스를 이용한 조인방식으로 반복문을 통하여 현재 블록의 조건에 따라 데이터를 읽어 오는 방식. NL조인 실행계획 제어 SELECT /*+ ordered use_nl(c) */ e.사원명 ,c.고객명 ,c.전화번호 FROM 사원 e , 고객 c WHERE e.입사일자 >= '19960101' AND c.관리사원번호 = e.사원번호 위 쿼리문과 같이 ordered 힌트를 통하여 DBMS의 옵티마이저에게 고객 테이블을 NL조인을 이용하도록 지시할 수 있다. 세 개 이상 테이블을 조인할 때는 힌트를 아래처럼 사용한다. SELECT /*+ ordered use_nl(B) use_nl(C) use_hash(D) */ FROM A, B, C, D WHERE .......... B, C는 NL조인을 이..
-
7. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 21. 09:32
인덱스 설계 인덱스 스캔 방식에 여러 가지가 있지만, 가장 정상적이고 일반적인 방식은 Index Range Scan이다. 이를 위해서는 인덱스 선두컬럼을 반드시 조건절에 사용해야 한다. 아래 두 가지 선택 기준은 Index Range Scan을 하기 위해 필요한 조건으로서 공식처럼 외워야 한다. 1. 조건절에 항상 사용하거나, 자주 사용하는 컬럼을 선정한다. 2. '='조건으로 자주 조회하는 컬럼을 앞쪽에 둔다. 소트 연산을 생략하기 위한 컬럼 추가 인덱스는 항상 정렬상태를 유지하므로 ORDER BY, GROUP BY를 위한 소트 연산을 생략할 수 있게 해준다. 따라서 조건절에 사용하지 않는 컬럼이더라도 소트 연산을 생략할 목적으로 인덱스를 구성에 포함시킴으로써 개선을 도모할 수 있다. 1. 소트 연산에..
-
6. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 20. 23:21
함수호출부하 해소를 위한 인덱스 구성 PL/SQL 사용자 정의 함수가 느린데에는 아래와 같은 세 가지 이유가 있다. 가상머신 상에서 실행되는 인터프리터 언어 ==> JAVA와 마찬가지로 기계어로 변환하는 작업을 거쳐야함 호출 시마다 컨텍스트 스위칭 발생 내장 SQL에 대한 Recursive Call 발생 그렇다면, 어떻게 해야 함수호출을 최소화할 수 있을까...? 조건절에 아래와 같이 PL/SQL 함수를 사용하면 회면 테이블을 Full Scan 방식으로 읽는데 encryption 함수는 테이블 건수만큼 수행된다. SELECT /* full(a) **/ 회원번호, 회원명, 생년, 생월일, 등록일자 FROM 회원 a WHERE 암호화된_전화번호 = encryption( :phone_no ) 반대로 아래와 같..