데이터베이스 설계 과정은 개념설계, 논리설계, 물리설계로 총 3단계로 이루어져있다. 줄여서 개논물...
근데 만들다가 성능이 안나오는 경우가 있다. 왜냐하면 정규화를 거치게 되면 Join이라는 연산이 나오는데 조인은 곱하기 연산이다. 1억 곱하기 1억 이렇게 엄청나게 작업을 하면 결국 조인으로 인해 성능이 떨어진다.
그래서 물리설계(인덱스, 파티션, 클러스터링...)를 해도 성능이 안나오면 반정규화를 시킨다.
반정규화는 DB의 성능향상을 위해 정규화에 위배되는 행위를 하는 것이다.
그러면 정규화는 왜 할까? 정규화는 이상현상 때문에 하게된다. (ex. 테이블이 중복되거나 등등)
이상현상에는 삽입이상, 삭제이상, 갱신이상이 있다. 이런 것들을 없애기 위해 정규화 과정을 하게 된다.
그래서 정답을 정리하면
데이터베이스 정규화 이후, 성능향상과 개발 편의성 등 정규화 기법에 위배되는 수행 기법이다.
W3C(World Wide Web Consortium)에서 개발되었고, 웹 브라우저 간 호환이 되지 않는 문제와 SGML(Standard Generalized Markup Language)의 복잡함을 해결하기 위해 개발된 다목적 마크업 언어이다.
마크업 언어는 구조적인 언어이다. 우리가 가장 많이 쓰는 마크업 언어는 HTML이다. 뜻은 텍스트를 초월한(클릭해서 다른 곳으로 갈 수 있으니 ㅎㅎ) 구조화된 언어... 이런 뜻이다. 구조화는 HTML의 Tag를 생각하면 된다. 그리고 작성한 HTML을 브라우저가 해석해서 이미지로 보여준다.
근데 태그가 정해져있기에 내가 테이터를 전송할 때 태그들로 전송을 할 수 없다. 그래서 SGML을 만들었다. 근데 SGML이 사용하기 어려워서 XML을 만들게 되었다. XML의 뜻은 확장형 마크업 언어라는 뜻이다.
HTML처럼 기본적인 태그만 쓰는 것이 아니라 내가 원하는 태그들을 확장해서 만들 수 있는 언어로 알면 된다. 보통 마크업 언어를 말하면 HTML, SGML, XML을 뜻한다. 그리고 XML은 UTF-8 형태로 저장하기에 유니코드를 사용해 전 세계 언어를 지원한다.
그래서 정답은 XML
옛날에는 XML을 통해 데이터를 많이 전송했다.(ex. RSS, Atom...) 그러나 요즘에는 JSON이 더 많이 쓰인다.
※ 인터페이스 전송 데이터
JSON
XML
YAML
살충제 패러독스는 동일한 테스트 케이스로 동일한 절차를 반복 수행하면 새로운 결함을 찾을 수 없다.
※ 소프트웨어 테스트의 원리
소프트웨어 개발에 있어 기능을 분할하고 추상화하여 성능을 향상시키고 유지보수를 효과적으로 하기 위한 공통 컴포넌트 구현 기법이다.
인터페이스 모듈, 데이터베이스 접근 모듈 등 필요한 공통 모듈을 구현한다.
모듈간의( 1 )는 줄이고,( 2 )는 높은 공통모듈 구현을 권장하고 있다.
모듈은 하나의 일처리 과정이다. 예를 들어서 계산기라는 프로그램을 만들면 더하기 모듈, 빼기 모듈, 곱하기 모듈, 나누기 모듈을 만들어서 각각의 기능을 수행한 다음에 이것을 통합하는 것이다.
모듈은 하나 하나가 기능을 하는 것이다. 모듈은 독립성이 높아야 한다. 독립성은 만약에 더하기를 뜯어서 다른 프로젝트에 쓸 수 있는 것이다. 이런 독립성을 높이기 위해 결합도(Coupling)는 줄이고 응집도(Cohesion)는 높인다.
★ 결합도 유형, 응집도 유형 잘 외우기
Fan-in이 있고 Fan-out이 있다. Fan-in은 나를 누군가 호출하는 것! Fan-out 내가 호출하는 것!
👉 F, H 👈
👉 JSON 👈
지표 | 설명 |
---|---|
( 1 ) | 일정 시간 내에 애플리케이션이 처리하는 일의 양 |
( 2 ) | 애플리케이션에 요청을 전달한 시간부터 응답이 도착할 때까지 걸린 시간 |
( 3 ) | 애플리케이션에 요청을 전달한 시간부터 처리가 완료될 때까지 걸린 시간 |
자원 사용률 | 애플리케이션이 작업을 처리하는 동안의 CPU 사용량, 메모리 사용량, 네트워크 사용량 등 자원 사용률 |
👉 ( 1 ): 처리량(Throughput)
👉 ( 2 ): 응답 시간(Response Time)
👉 ( 3 ): 경과 시간(Turnaround Time)
애플리케이션 성능 측정 지표
처응경자 | 처리량 / 응답시간 / 경과시간 / 자원 사용률 |
---|
1 SELECT DEPT FROM STUDENT; // 학생에서 DEPT 전체를 가져와
2 SELECT DISTINCT DEPT FROM STUDENT // DISTINCT 중복제거
3 SELECT COUNT(DISTINCT DEPT) FROM STUDENT // 컴퓨터과 1만
WHERE DEPT=‘컴퓨터과’
튜플의 수는 행의 수를 말한다.
SELECT의 구조
SELECT
*, A, B, C
FROM
SELECT
*, A, B, C
FROM TABLE
WHERE DEPT = '전기'
SELECT
*, A, B, C
FROM TABLE
WHERE DEPT = '전기'
AND / OR
SELECT
*, A, B, C
FROM TABLE
WHERE DEPT = '전기'
AND / OR
GROUP BY DEPT
SELECT
*, A, B, C
FROM TABLE
WHERE DEPT = '전기'
AND / OR
GROUP BY DEPT
HAVING
SELECT
*, A, B, C
FROM TABLE
WHERE DEPT = '전기'
AND / OR
GROUP BY DEPT
HAVING
ORDER BY 속성 DESC
ASC
👉 1. 200
👉 2. 3
👉 3. 1
보안의 3요소
서비스 공격 유형의 종류
👉 랜드 어택(Land Attack)
프로토콜의 기본요소
구의타 | 구문 / 의미 / 타이밍 |
---|
👉 구문(Syntax), 의미(Semantic), 타이밍(Timing)
SJF(Shortest Job First)는 기아현상이 일어날 수 있다. 왜냐하면 실행 시간이 빠른 것들을 먼저 처리(CPU에 넣는다)를 한다. 그러면 상대적으로 시간이 긴 것은 처리가 안될 수 있다. 그래서 대기시간이 긴 친구부터 먼저 처리를 하자라는 것이 HRN이다.
HRN은 대기 중인 프로세스 중 우선순위가 가장 높은 것을 선택하는 기법이다.
프로세스 스케줄링
비선점 스케줄링 | 선점 스케줄링 |
---|---|
FCFS (계산식 있음) | SRT (계산식 있음) |
SJF (계산식 있음) | RR |
HRN (계산식 있음) | MLQ(다단계 큐) |
기한부 | MFQ (다단계 피드백) |
우선순위 |
👉 (대기시간 + 서비스시간) / 서비스시간
👉 원자성, 격리성
👉 물리 계층(Physical Layer)
OSI 7 참조 모델
OSI 7 계층 참조 모델 | TCP / IP 4 계층 | 프로토콜 | 장비 |
---|---|---|---|
응용 계층 | 응용 계층 | TCP와 연관된 프로토콜: telnet, FTP, HTTP, POP, SMTP / UDP와 연관된 프로토콜: DHCP, SNMP, DNS | |
표현 계층 | 응용 계층 | TCP와 연관된 프로토콜: telnet, FTP, HTTP, POP, SMTP / UDP와 연관된 프로토콜: DHCP, SNMP, DNS | |
세션 계층 | 응용 계층 | TCP와 연관된 프로토콜: telnet, FTP, HTTP, POP, SMTP / UDP와 연관된 프로토콜: DHCP, SNMP, DNS | |
전송 계층 | 전송 계층 | TCP, UDP | |
네트워크 계층 | 인터넷 계층 | IP, ICMP, ARP, RARP | 라우터 |
데이터링크 계층 | 링크 계층 | 브리지 | |
물리 계층 | 링크 계층 | 허브, 리피터 |
문서 이름(릴리스 노트 이름), 제품 이름, 버전 번호, 릴리즈 날짜, 참고 날짜, 노트 버전 등의 정보
👉 헤더
👉 수많은 데이터에서 가치있는 유용한 정보를 찾아내는 것이다.
👉 MD5
SHA
관련된 것을 많이 사용한다.👉 프로젝트 개발 기간: 20개월
👉 계산식: (30,000라인 ÷ 300라인) ÷ 5명 = 20개월
#include <stdio.h>
void main( ){
int i, j; //1️⃣
int temp; //2️⃣
int a[5] = {75, 95, 85, 100, 50};
for(i=0; i<4; i++){ //3️⃣
for(j=0; j<4-i; j++){ //4️⃣
if(a[j] > a[j + 1]){ //5️⃣
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for(i=0; i<5; i++){ //6️⃣
printf("%d ", a[i]);
}
}
1️⃣ 이중 for문을 위한 변수 i,j
2️⃣ 임시 저장 변수
3️⃣ (요소의 개수-1)만큼 반복
4️⃣ (요소의 개수-i)만큼 반복
5️⃣ 현재 요소의 값과 다음 요소의 값을 비교하여 큰 값을 다음 요소로 보냄
6️⃣ 0번째에서 4번째 값을 출력
👉 정답: 50, 75, 85, 95, 100
public static void main(String[] args) {
int i; //1️⃣
int a[4] = {0, 1, 2, 3}; //2️⃣
for(i=0; i<4; i++){
System.out.print(a[i] + “ ”); //3️⃣
}
}
1️⃣ for 문을 제어하기 위한 변수
2️⃣ 4개의 요소를 가진 배열
3️⃣ i번째 인덱스의 요소 값을 출력, + “ ”
는 공백
👉 정답: 0 1 2 3
public static void main(String[] args){ //1️⃣
int i = 3;
int k = 1;
switch(i){
case 0:
case 1:
case 2:
case 3: k=0; //2️⃣
case 4: k+=3; //3️⃣
case 5: k-=10; //4️⃣
default: k--; //5️⃣
}
System.out.print(k); //6️⃣
}
1️⃣ i가 3이므로 case 3으로 이동
2️⃣ case 3에서 k=0을 실행
3️⃣ break가 없으므로 k+=3 실행(k는 3)
4️⃣ break가 없으므로 k-=10 실행(k는 -7)
5️⃣ break가 없으므로 k-- 실행(k는 -8)
6️⃣ k가 저장하고 있는 값인 -8을 출력
👉 정답: -8