DataBase
join : 두 개 이상의 테이블이나 DB를 연결하여 데이터를 검색하는 방법
테이블을 연결하려면 적어도 하나의 컬럼을 서로 공유하고 있어야한다.
JOIN의 종류
| INNER JOIN | 교집함 ) 기준 테이블과 join 테이블의 중복값을 표현 |
| LEFT OUTER JOIN | 기준테이블 값 + join 테이블 중복값 |
| RIGHT OUTER JOIN | LEFT OUTER JOIN 의 반대 |
| FULL OUTER JOIN | 합집함 ) 모든 데이터 검색 |
| CROSS JOIN | 모든 경우의 수를 보여줌 EX) A테이블이 3개 B테이블이 4개면 12개의 데이터 생성 |
| SELF JOIN | 자기자신과 자기자신을 조인하는 것. 자신이 갖고 있는 칼럼을 다양하게 변형시켜 활용할 때 사용 |
해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법
1) 인증 우회
우리가 로그인을 하게 되서 input창에 "username":"ex", "password":"1234"를 보내게되면
SELECT* FROM USER WHERE ID = "ex" AND PASSWORD = "1234";라는 SQL문을 보내게 되는데
password input창에 1234; DELETE * FROM ID = "1";을 넣게되면 DB에 악영향을 미칠수 있다.
2) 데이터 노출
예시로 해커는 GET방식으로 동작하는 URL 쿼리 스트링을 추가하여 에러를 발생시키고 이에 해당하는 오류가 발생하면
이를 통해 해당 웹의 DB 구조를 유추하고 해킹에 활용한다.
SQL 의 경우 관계형 DB인데 특징으로는
스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다.
또한, 중복을 피하기 위해서 관계를 이용한다.
NOSQL 의 경우 관계형 DB의 반대이다.
스키마 , 관계가 존재하지 않는다.
SQL에 비해서 유연한것이 특징인데 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다.
JOIN 의 경우 가능은 하지만 중복되는 값의 문제로 JOIN 보다도 자주 변경되지 않은 데이터를 활용 할 떄 NOSQL 이 효율적이다.
Scailing 개념도 활용이 가능한데.
SQL : 수직적 확장
NOSQL : 수평적 확장
쓰기 작업과 저장 공간을 활용해서 DB의 검색 속도를 향상시키기 위한 자료 구조 이다.
DB안의 레코드를 B+Tree 로 구성된 구조에서 index파일 검색으로 속도를 향상시키는 기술이다.
index 는 카디널리티 즉, 중복이 없을 수록 카디널리티 수치가 증가하고
중복이 많을수록 카디널리티가 낮아진다.
index를 설정할 때에는 카디널리티 수치가 높고 활용이 많이되는 컬럼을 고려해보아야한다.
트랜잭셔널은 DB에 접근하는 기술을 의미한다.
특성으로는

보통 DB는 하드디스크나 SSD에 젖아하지만 Redis의 경우 RAM에 저장해서 디스크 스캐닝이 필요없어 매우 빠른 장점이 존재한다.
렘은 휘발성이 존재하기 떄문에 백업과정이 존재하는데
네트워크
즉, 데이터를 포트 번호에 해당하는 프로세스에 순차적이고 안정적으로 전달 하는 것 이라할 수 있다.
이로 인해 나온 개념이
TCP(Transmisstion Control Protocol) 이다.
위의 3가지 기능을 가지고 있으면서도 양방향 통신(3 way-handshake)이 가능하다.
3 way-handshake
4 way-handshake
연결 순서
1. 송 --> 수 SYN 비트 1로 설정해서 패킷을 송신
2. 송 <-- 수 SYN + ACK 비트를 1로 설정해 패킷 송신
3. 송 --> 수 ACK비트를 1로 설정해 패킷 송신
데이터 전송 순서
1. client가 패킷을 송신
2. server에서 ACK송신
2-1. ACK 를 수신하지 못했으면 1번 재전송
연결 중단 순서
1. [C-->S] 데이터를 전부 송신한 Client 가 FIN 송신
2. [C<--S] Server가 ACK 송신
3. [C<--S] Server에서 남은 패킷을 송신
4. [C<--S] Server가 FIN 송신
5. [C-->S] Client 가 ACK 송신
이렇게 모든 연결과 데이터를 PACKET을 통해 확인을 하는데
데이터 손실이 있음에도 불구하고 티가 나지 않은 경우도 불필요한 자원이 소모되는 것이다.
이런 단점을 파고들어 나온것이
UDP (User Datagram Protocol)이다.
사용자에게 보이고 가장 가까운 계층이며 상호작용 하는 계층이다. 크롬,파이어폭스,사파리 등 웹 브라우저나
오피스 같은 응용 프로그램이 대표적이다.
응용프로그램이나 네트워크를 위해 데이터를 표현하는 곳이다. 예를 들어, 데이터를 안전하게 전송하기 위해 암호화 및 복화하는 것인데 이런작업이 6계층에서 처리된다.
2대의 기기, 컴퓨터 서버 간에 소통을 하려면 세션을 만들어야 하는데 이 작업이 여기서 처리된다.
포트 번호를 사용하여 목적지 컴퓨터의 최종 도착지인 프로세스에 까지 데이터가 도달하게 하는 모듈
포트 번호 : 하나의 컴퓨터에서 동시에 실행되고 있는 프로세스들이 서로 겹치지 않게 가져야하는 정수값
수많은 네트워크들의 연결로 이루어지는 네트워크 속에서 목적지 컴퓨터로 데이터를 전송하기 위해서
IP주소를 이용해 길을 찾고 (**Routing), 자신 다음의 라우터에게 데이터를 넘겨주는 것 (Forwarding)
Routing : 네트워크에서 경로를 선택하는 프로세스. 통신의 효율성을 높인다
.
같은 네트워크에 있는 여러대의 컴퓨터들이 데이터를 주고받기 위해서 필요한 모듈이다.
Framing은 Data-link Layer에 속하는 작업중 하나이다.
시스템의 전기적, 물리적 표현을 나타낸다. 물리적으로 연결된 컴퓨터 끼리 0과 1의 나열을 주고
받을 수 있게 해주는 모듈이다.
Encoding : 0과 1의 나열을 아날로그 신호로 바꾸어 전선으로 흘려보내고
Decoding : 아날로그 신호가 들어오면 0과 1의 나열로 해석한다.
OS
프로세스 : 프로그램을 메모리 상에서 실행중인 작업
쓰레드 : 프로세스 안에서 실행되는 여러 흐름 단위
프로세스는 각각 별도의 주소공간을 할당을 받아 독립적으로 실행되지만
프로세스 안에 있는 스레드 같은 경우
DATA + HEAP + CODE 메모리를 공유하며 독립적인 STACK 메로리를 가지고있다.
기본적으로 프로세스 : 스레드 = 1 : 1의 관계인데
멀티스레드를 활용하여 1:N 관계를 만들어 낼수 있다.
독립적인 프로세스에 비해서 메모리를 공유하기 떄문에 자원을 아낄 수 있지만
하나의 스레드가 데이터 공간을 활용하고 있다면 관련된 다른 스레드는 움직일 수 없는 상태가 된다. dead lock
즉, 상호 배제, 진행, 한정된 대기를 충족해야 한다.
JAVA
call by value
값에 의한 호출
함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시공간이 생성된다.
메모리가 임시적으로 생성되었다는 것은 함수를 위한 변수값들을 복사해서 사용한다는 것을 예상할 수 있는데
이때 복사된 인자는 함수 안에서 지역적으로 사용된다.
즉, 원래의 변수는 값이 변하지 않는다. java 에서는 이를 사용한다.
call by reference
참조에 의한 호출
함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달한다.
따라서 함수 안에서 인자 값이 변경되며, 전달된 객체의 값도 변경된다.
String
한성 생성되면 할당된 메모리 공간을 불변한다.
그렇기 때문에 새로운 값을 넣게되면 기존 메모리는 gc에 의해 제거되고
새로운 String 객체를 참조하게 된다.
따라서 연산이 많은 경우 성능이 좋지 않다.
StringBuffer, StringBuilder
Sring과 다르게 기존 객체의 공간이 부족하게 되는 경우 기존의 크기를 늘리며 유연하게 작동한다.
둘의 차이는 동기화 여부인데
StringBuffer는 각 메서드 별로 Synchronized Keyword가 존재하여 멀티스레드 환경에서도 동기화를 지원하지만
StringBuilder의 경우 동기화를 보장하지 않는다.
즉, 멀티스레드 환경일시에는 StringBuffer 아닐경우 StringBuilder를 사용한다.
프로그램이 "동적으로 할당했던 메모리 영역" 중 "필요 없게된 영역"을 알아서 해제시켜준다.
GC는 힙메모리만 다루게 된다.
Young영역
Eden이 꽉차게 되면 GC에서 살아남은 객체는 Survival0-1 로 옮겨진다.
또한 Survival0-1도 꽉차게 되면 GC가 일어난다.
GC에서 살아남은 객체들은 AGE가 증가한다.
Survival에서 age가 일정 수준으로 올라간 객체의 경우 Old영역으로 이동하게 된다. 이것을 Promotion이라한다.
Old 영역
Old에서도 꽉차게되면 GC가 일어나게 되고 이것을 major gc라고 한다.
Collcetion
모든 값을 메모리에 저장하는 자료구조이다 . 따라서 Collection 에 추가하지 전에 미리 계산이 완료되어야한다.
외부 반복을 통해서 사용자가 직접 반복 작업을 거쳐 요소를 가져올 수 있다.
Stream
요청 할 때만 요소를 계산한다. 내부반복을 사용하므로, 추출 요소만 선언해주면 알아서 반복 처리를 진행한다.
스트림 요소를 따로 추가제거 하는 작업은 불가능하다.
스트림은 중간 최종 연산 과정이 존재한다.
내부 반복은 작업을 병렬 처리하면서 최적화된 순서로 처리하므로 최적화되어있다. 성능면에서도 우수하다.
제어권에 대한 이야기이다.
A함수내에 B함수가 호출 되었을 때 .
제어권은 A -> B로 넘어간다. 자바같은 Block 언어는 B함수가 끝날 때까지 제어권을 가지고있지만
NonBlock 언어는 A로 바로 제어권이 넘어간다.
동기와 비동기도 비슷한 맥락인데
동기는 대상들의 시간이 일치할 때
비동기는 대상들의 시간이 일치하지 않을 때를 말한다.
java는 Block + 동기 이기 때문에
제어권이 넘어가는 순간과 결과값이 반환되는데 같은 시간이 걸린다.
대칭키 : Symmetric Encryprion (Shared)
비대칭키 : Asymmetric Encryprion (RSA Keypair)
댓글 영역