728x90
반응형
Node.js란 자바스크립트를 실행시키는 런타임환경으로,
특징은 단일쓰레드 이벤트 루프 기반과 비동기, 논블로킹 I/O모델입니다.

 

< 첫번째 특징 : 싱글쓰레드 이벤트루프 >
Node.js는 멀티쓰레드 대신에 이벤트루트 기반의 싱글쓰레드를 선택했습니다.

멀티쓰레드의 경우, 자원의 낭비가 발생하고, 상대적으로 비효율적이고, 교착상태(데드락)을 발생시킬 가능성이 높습니다.

이벤트루프 : https://pyoja.tistory.com/243

더보기

이벤트 루프는 자바스크립트에서 비동기 작업을 처리하는 방식입니다.
이벤트 루프는 스택이 비어있는지 계속 확인하고, 비어있다면 큐에서 작업을 하나씩 꺼내서 스택에 넣습니다.
이 방식을 통해 자바스크립트는 싱글 스레드임에도 비동기 처리가 가능하게 됩니다.

 

< 두번째 특징: 비동기, 논 블로킹 I/O 모델 >
Node.js에서 I/O를 직접 수행하는 함수는 거의 없으므로 프로세스는 블로킹 되지 않습니다.
그러므로 Node.js에서는 확장성 있는 시스템을 개발하는 것이 아주 자연스럽습니다.

동기/비동기 : https://pyoja.tistory.com/244

더보기

동기는 요청을 보낸 후 응답을 받아야지만 다음 동작이 이루어지는 방식입니다.

어떠한 작업을 처리한 동안, 나머지 작업은 대기합니다.

실제로 CPU가 느려지는 것은 아니지만 시스템의 전체적인 효율은 저하된다고 할 수 있습니다.

 

반면에 비동기는 요청을 보낸후, 응답 수락 여부와는 상관없이 다음 작업이 동작하는 방식입니다.

자원을 효율적으로 사용할 수 있으며, 비동기 요청이 완료되었을 때 콜백 함수가 자동으로 호출되어 작업을 처리합니다.

 

하지만 비동기 처리를 위해 여러개의 콜백함수를 중첩시키면 콜백지옥이 발생합니다.

이를 해결하기 위해 Promise를 도입하였고, 코드의 가독성을 높이기 위해 Async / Await가 추가로 도입되었습니다.

 

Node.js - 우아한테크


< 예상되는 질문리스트>

1. Node.js에 대해 설명해주세요.

Node.js는 확장성 있는 네트워크 애플리케이션 (특히 서버 사이드)에 사용되는 소프트웨어입니다.

자바스크립트를 활용하며, 논블로킹 I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있습니다.

( 서버 사이드(server-side)란 클라이언트-서버 모델에서 서버 측에서 일어나는 일을 말합니다.)

 

2. Node.js가 확장성이 크다는 이유는 무엇일까요?

Node.js는 비동기 I/O를 사용함으로써 상대적으로 적은 리소스 사용량으로 많은 수의 동시 연결을 처리할 수 있습니다.

이벤트 루프는 여러 요청의 실행을 효율적으로 관리하여 하나의 요청이 다른 요청을 차단하지 않도록 합니다.

Node.js는 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능합니다.

V8의 기능을 활용하여 높은 처리량과 낮은 대기 시간을 달성하여 성능이 뛰어난 네트워크 애플리케이션을 개발하는 것에 적합합니다.

또한 NPM을 통해 다양한 모듈을 사용함으로써 개발속도와 효율성이 크게 향상됩니다.

이러한 이유로 Node.js가 확장성이 큰 네트워크 어플리케이션에 사용되는 소프트웨어라고 할 수 있습니다.


3. Node.js를 어떻게 웹 애플리케이션 구축할 수 있을까요?

일반적으로 Node.js에서는 Express와 같은 웹 프레임워크를 사용하여 웹 애플리케이션을 구축합니다. Express는 Node.js에서 가장 널리 사용되는 웹 프레임워크 중 하나로, 미들웨어와 라우팅 기능을 제공하여 웹 애플리케이션 개발을 쉽게 할 수 있도록 도와줍니다.

 

4. Express에 대해 설명해주세요.

Express는 Node.js에서 가장 널리 사용되는 웹 프레임워크 중 하나입니다. 

Express는 웹 애플리케이션 개발을 쉽게 할 수 있도록 미들웨어와 라우팅 기능을 제공합니다.

미들웨어는 요청과 응답 사이에서 실행되는 함수로, 요청을 처리하거나 응답을 수정하는 등의 작업을 수행할 수 있습니다.

Express에서는 다양한 미들웨어가 제공되며, 개발자가 직접 미들웨어를 작성할 수도 있습니다.
라우팅은 클라이언트로부터 들어오는 요청을 적절한 핸들러 함수로 전달하는 기능입니다. 

Express에서는 간단한 API를 통해 라우팅을 설정할 수 있습니다.

 

5. NPM에 대해 설명해주세요.

NPM은 Node Package Manager의 약자로, Node.js의 패키지 관리자입니다. 

NPM은 수많은 패키지를 제공하므로 개발 속도와 효율성을 크게 향상시킬 수 있습니다.


6. Node.js는 멀티스레딩을 지원합니까? (= Node.js는 CPU 집약적인 작업을 어떻게 처리합니까?)

Node.js는 기본적으로 단일 스레드로 작동합니다. 하지만 Node.js에서는 멀티스레딩을 지원하는 몇 가지 방법이 있습니다.
Node.js의 child_process 모듈을 사용하면 자식 프로세스를 생성하여 멀티스레딩과 유사한 작업을 수행할 수 있습니다.
또한, cluster 모듈을 사용하면 다수의 코어에 로드 밸런싱이 가능하도록 프로세스 간에 소켓을 공유할 수 있습니다.
그리고 worker_threads 모듈을 사용하여 멀티스레딩을 지원합니다. worker_threads 모듈을 사용하면 

새로운 스레드를 생성하고 데이터를 주고받을 수 있습니다.


7. Node.js를 프런트엔드 JavaScript 프레임워크와 통합할 수 있습니까?

Node.js는 프런트엔드 JavaScript 프레임워크와 통합하여 사용할 수 있습니다. 

Node.js는 백엔드에서 사용되는 JavaScript 런타임이며, 프런트엔드 JavaScript 프레임워크는 클라이언트 사이드에서 사용됩니다.
Node.js와 프런트엔드 JavaScript 프레임워크를 통합하여 사용하면, 백엔드와 프런트엔드 간의 데이터 교환을 쉽게 할 수 있습니다. 

예를 들어, Node.js에서 Express와 같은 웹 프레임워크를 사용하여 RESTful API를 구현하고, 

프런트엔드에서는 이 API를 호출하여 데이터를 주고받을 수 있습니다.
Node.js는 React, Angular, Vue.js 등의 다양한 프런트엔드 JavaScript 프레임워크와 함께 사용할 수 있습니다.


8. 프로젝트에서 Node.js를 사용하는 장점과 단점은 무엇입니까?
Node.js를 사용하는 장점으로는 다음과 같은 것들이 있습니다.
빠른 개발 속도: Node.js는 JavaScript 언어를 사용하며, npm을 통해 다양한 패키지를 제공합니다. 이를 통해 개발 속도를 높일 수 있습니다.
확장성: Node.js는 이벤트 기반, Non-blocking I/O 모델을 사용하여 확장성이 높습니다. 높은 부하에서도 안정적으로 작동할 수 있습니다.
통합성: Node.js는 JavaScript 프레임워크와 쉽게 통합할 수 있습니다. 백엔드와 프런트엔드 간의 데이터 교환을 쉽게 할 수 있습니다.


Node.js의 단점으로는 다음과 같은 것들이 있습니다.
단일 스레드: Node.js는 단일 스레드로 작동하기 때문에 CPU 집약적인 작업을 처리하는 데 어려움이 있을 수 있습니다.
콜백 지옥: Node.js에서 비동기 작업을 처리할 때 콜백 함수를 사용하는 경우, 코드의 가독성이 떨어지고 콜백 지옥에 빠질 수 있습니다.

728x90
반응형
728x90
반응형

1. TCP와 UDP에 대해 설명해주세요.

TCP와 UDP는 모두 인터넷 프로토콜 스택의 전송 계층에서 사용되는 프로토콜입니다. 
TCP는 연결 지향형 프로토콜로, 높은 신뢰성을 보장하지만 속도가 느립니다. 
반면, UDP는 비연결형 서비스로 신뢰성이 낮지만 속도가 빠르며 네트워크 부하가 적습니다. 
간단하게 말하면, TCP는 신뢰성이 높은 전송이 필요할 때 사용하고, UDP는 연속성이 중요한 서비스에 자주 사용됩니다.
사용예시로는 TCP는 파일전송, 메일 등에서 주로 사용되며,

UDP는 실시간 반응이 중요한 온라인게임, 화상회의에서 사용됩니다.

 

🔥꼬리질문🔥

 <  TCP의 세션 관리 과정은 어떻게 이루어지나요? >

더보기

3-way handshake는 TCP 세션 연결을 위해 수행되는 과정입니다. 
이 과정은 다음과 같습니다:
1. 클라이언트가 서버에게 SYN 패킷을 보내 세션 연결을 요청합니다.
2. 서버는 클라이언트의 SYN 요청을 받고, 클라이언트에게 요청을 수락한다는 ACK와 SYN을 보냅니다.
3. 클라이언트가 서버의 ACK를 받으면 세션이 설정됩니다.

4-way handshake는 TCP 세션 종료를 위해 수행되는 과정입니다. 
이 과정은 다음과 같습니다:
1.클라이언트가 서버에게 FIN 패킷을 보내 세션 종료를 요청합니다.
2.서버는 클라이언트의 FIN 요청을 받고, 클라이언트에게 ACK를 보냅니다.
3.서버가 통신이 끝나면, 즉 연결을 종료할 준비가 되면 클라이언트에게 FIN 패킷을 보냅니다.
4.클라이언트가 서버의 FIN 패킷을 받고 ACK를 보내면 세션이 종료됩니다.

 

< TCP 프로토콜에서 패킷의 재전송은 어떻게 이루어지나요? >

더보기

TCP 프로토콜에서 패킷의 재전송은 수신자로부터의 ACK(Acknowledgement)에 기반을 두고 이루어집니다.
수신자는 세그먼트를 받으면 다음 세그먼트를 보내 달라는 ACK를 전송합니다. 
만약 송신자가 ACK를 받지 못하면 일정 시간을 대기한 후 패킷을 재전송합니다.
만약 수신자가 순서에 벗어난 세그먼트를 받으면 중복 ACK를 전송합니다. 
이 경우 송신자는 중복 ACK를 받으면 패킷을 재전송합니다.

2. MST 알고리즘에 대해 설명해주세요.

MST는 Minimum Spanning Tree의 약자로, 최소 신장 트리를 의미합니다. 
이는 그래프 내의 모든 정점을 포함하는 트리 중에서 사용된 간선들의 가중치 합이 최소인 트리를 말합니다.
간단하게 말하면, MST는 여러 개의 도시가 있을 때 각 도시를 모두 연결하는 도로망을 만들 때, 
가장 적은 비용으로 만들 수 있는 도로망을 찾는 것과 같습니다. 
이를 구하는 알고리즘으로는 Kruskal 알고리즘과 Prim 알고리즘이 대표적입니다.

 

Kruskal 알고리즘과 Prim 알고리즘

더보기

Kruskal 알고리즘과 Prim 알고리즘은 모두 최소 신장 트리(Minimum Spanning Tree, MST)를 찾는 알고리즘입니다. 두 알고리즘 모두 O(ElogV)의 시간복잡도를 가지지만, 그 방법이 다릅니다.

Kruskal 알고리즘은 간선들을 가중치 순으로 정렬한 후, 가장 작은 가중치의 간선부터 선택하면서 사이클을 형성하지 않는 간선을 선택합니다. 이 과정에서 서로소 집합 자료 구조(유니온 파인드: 결합과 검색)를 이용하여 어떤 꼭짓점이 어떤 콤포넌트(component)에 속하는 지 추적합니다.

반면에 Prim 알고리즘은 시작 정점에서부터 출발하여 신장트리 집합을 단계적으로 확장해나가는 방법입니다. 이전 단계에서 만들어진 MST 집합에 인접한 정점들 중에서 최소 간선으로 연결된 정점을 선택하여 트리를 확장합니다.

Kruskal 알고리즘은 간선 선택을 기반으로 하는 반면, Prim 알고리즘은 정점 선택을 기반으로 합니다. Kruskal 알고리즘은 이전 단계에서 만들어진 신장 트리와는 상관없이 무조건 최소 간선만을 선택하는 방법이며, Prim 알고리즘은 이전 단계에서 만들어진 신장 트리를 확장하는 방법입니다.

 

🔥꼬리질문🔥

<spanning tree란 무엇인지 설명해주세요>

더보기

스패닝 트리는 네트워크의 루프를 방지하는 방법입니다. 
순환 경로가 없는지 확인하면서 네트워크의 모든 장치를 포괄하는 트리와 같은 구조를 만듭니다. 
루프를 제거함으로써 스패닝 트리는 장치 간의 효율적이고 안정적인 통신을 유지하는 데 도움이 됩니다.

<MST에서 사이클이 발생하는 경우는 어떻게 처리되나요?>

더보기

MST는 그래프의 모든 정점을 포함하는 트리 중에서 간선의 가중치 합이 최소인 트리입니다. 
MST는 트리의 특수한 형태이므로 모든 정점들이 연결되어 있어야 하고 사이클을 포함해서는 안됩니다. 
따라서 MST는 그래프에 있는 n개의 정점을 정확히 (n-1)개의 간선으로 연결합니다. 
이러한 이유로 MST에서 사이클이 발생하는 경우는 없습니다.

 

 

 

 

728x90
반응형
728x90
반응형

1. OSI 7계층에 대해 설명해주세요.

OSI 7계층은 네트워크에서 통신이 일어나는 과정을 7단계로 나눈 것으로, 
국제표준화기구 (ISO)에서 네트워크 간의 호환을 위해 OSI 7 계층이라는 표준 네트워크 모델을 만들었습니다. 
이 모델은 물리 계층, 데이터 링크 계층, 네트워크 계층, 전송 계층, 세션 계층, 표현 계층 및 응용 계층으로 구성됩니다.

OSI 7계층은 다음과 같습니다:

1. 물리 계층: 전기적 신호로 변환하여 물리적인 전송이 가능하게 합니다. (리피터 , 케이블 , 허브)
2. 데이터 링크 계층: 인접한 노드간의 신뢰성 있는 데이터 전송을 제어합니다. ( 브릿지 , 스위치 )
3. 네트워크 계층: 종단간 전송을 위한 경로 설정을 담당합니다. ( 라우터 , IP )
4. 전송 계층: 종단간 신뢰성 있는 데이터 전송을 담당합니다. ( TCP , UDP )
5. 세션 계층: 응용 프로그램간의 논리적인 연결 생성 및 제어를 담당합니다. ( API , Socket )
6. 표현 계층: 데이터 표현방식, 상이한 부호체계 간의 변화에 대해 규정합니다. ( JPEG , MPEG )
7 .응용 계층: 사용자가 네트워크에 접근할 수 있도록 해주는 인터페이스를 제공합니다. ( HTTP , FTP , DNS )

 

 

계층을 3단계로 나누면,

계층1,2,3(네트워크 지원계층) : 하나의 장치에서 다른 장치로 전송되는 데이터의 물리적인 면을 처리

계층5,6,7(사용자 지원계층) : 관계 없는 소프트웨어 시스템 간 상호 운용성 제공

계층4(전송계층) : 네트워크 지원 계층과 사용자 지원 계층을 서로 연결,
네트워크 지원 계층이 전송한 것을 사용자 지원 계층이 사용할 수 있는 형태가 되도록 보장

 

 

OSI 7계층

참고: https://teamsparta.notion.site/osi-7-03d065a960704b4ca524c4a2d69ded2e

 

🔥꼬리질문🔥

 < SSH, TLS에 대해 설명해주세요 >.

더보기

SSH와 TLS는 둘 다 네트워크 통신을 보호하는 데 사용되는 프로토콜이지만 다른 용도로 사용됩니다.

SSH는 Secure Shell의 약자이며 네트워크를 통해 두 장치 간에 암호화된 보안 연결을 설정하는 데 사용되는 프로토콜입니다. 
일반적으로 원격 로그인 및 파일 전송에 사용됩니다. SSH를 사용하여 원격 장치에 연결하면 장치 간에 교환되는 모든 데이터가 암호화되므로 
네트워크에서 도청 중인 공격자가 데이터를 가로채거나 변조할 수 없습니다.

TLS는 Transport Layer Security의 약자로 웹 트래픽을 보호하는 데 사용되는 프로토콜입니다. 
SSL(Secure Sockets Layer)의 후속 제품이며 일반적으로 웹 서버와 웹 브라우저 간의 보안 통신을 제공하는 데 사용됩니다. 
HTTPS를 사용하여 웹 사이트를 방문할 때 TLS는 브라우저와 웹 서버 간에 전송되는 데이터를 암호화하는 데 사용되는 프로토콜입니다. 
TLS는 두 당사자 간에 교환되는 데이터의 인증, 기밀성 및 무결성을 제공합니다. 

요약하면 SSH는 일반적으로 원격 액세스를 위해 두 장치 간에 보안 연결을 설정하는 데 사용되는 반면 
TLS는 웹 트래픽을 보호하고 서버와 클라이언트 간에 교환되는 데이터에 대한 기밀성, 무결성 및 인증을 제공하는 데 사용됩니다.

 

<데이터 링크 계층에서 사용되는 에러 체크 기술은 어떤 것이 있나요?>

더보기

데이터 링크 계층에서 사용되는 에러 체크 기술에는 패리티 검사(Parity Check), 순환 중복 검사(CRC, Cycle Redundancy Check), 해밍 코드(Hamming Code) 등이 있습니다.
패리티 검사(Parity Check)는 데이터 뒤에 하나의 비트를 추가하여 오류가 있는지 찾아내는 방법입니다. 
데이터는 0과 1로만 이루어져 있기 때문에, 마지막에 비트 하나를 추가해서 데이터의 1의 총개수를 짝수 또는 홀수로 맞추는 형태입니다.
순환 중복 검사(CRC, Cycle Redundancy Check)는 데이터를 나누어서 나머지 연산을 수행하여 오류를 검출하는 방법입니다. 
이 방법은 패리티 검사보다 더 강력한 오류 검출 기능을 가지고 있습니다.
해밍 코드(Hamming Code)는 데이터 전송 중 발생할 수 있는 오류를 검출하고 수정하는 기능을 가진 에러 정정 코드입니다. 
이 코드는 데이터의 일부 비트를 추가하여 오류 검출 및 정정을 수행합니다. 
이러한 기술들은 데이터 전송 중 발생할 수 있는 오류를 검출하고 수정하는 역할을 합니다.

 

 < osi 7 계층을 기반으로 하는 네트워크 프로토콜은 어떤게 있나요? >

더보기

HTTP, SMTP, FTP, DNS, SNMP 및 SIP를 비롯한 여러 네트워크 프로토콜이 OSI 계층 7을 기반으로 합니다. 
이러한 프로토콜은 웹 브라우징, 이메일, 파일 전송, 네트워크 관리 및 VoIP와 같은 다양한 서비스를 사용자 애플리케이션에 제공합니다.

 

 

2. DP 알고리즘에 대해 설명해주세요.

DP(Dynamic Programming) 알고리즘은 이미 계산된 결과는 별도의 메모리 영역에 저장하여 다시 계산하기 않도록 설계함으로써
메모리를 적절히 사용하여 수행 시간 효율성을 향상시키는 방법입니다.
DP구현 방법은 일반적으로 Top-down(하향식)과 Bottom-up(상향식)으로 구성됩니다.
대표적인 예시로는 피보나치 수열이 있습니다.

 

DP 알고리즘의 대표적인 예시로 피보나치 수열이 있습니다.
피보나치 수열은 다음과 같은 점화식으로 표현됩니다: F(n) = F(n-1) + F(n-2). 이를 단순 재귀 함수로 구현하면 같은 함수를 계속해서
중복 호출을 하기 때문에 시간복잡도가 O(2^n)이 됩니다. 이는 n이 커질수록 엄청나게 커지게 됩니다.

하지만 DP 알고리즘을 사용하면 중복 호출을 방지할 수 있습니다. 이미 계산된 결과(하위 문제)는 별도의 메모리 영역에 저장하여
다시 계산하지 않도록 설계함
으로써 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 것입니다.
이를 메모이제이션(Memoization)이라고 합니다. 정상적으로 중복호출을 방지하면 시간복잡도가 O(n)이 됩니다.

 

🔥꼬리질문🔥

<이미 계산된 결과를 다시 계산할 일이 없으면 오히려 메모리 사용이 효율적이지 않은 건 아닌가요? 이 관점에 대해서는 어떻게 생각하시나요?>

더보기

이미 계산된 결과를 다시 계산할 일이 없다면 DP 알고리즘을 사용하지 않아도 됩니다. 
그러나 DP 알고리즘은 이미 계산된 결과를 다시 계산하지 않아야만 효율적으로 동작할 수 있기 때문에, 
입력 크기가 작은 경우에는 DP 알고리즘보다 더 간단한 알고리즘을 사용하는 것이 더 효율적일 수 있습니다. 
하지만 입력 크기가 큰 경우에는 DP 알고리즘이 더 효율적일 수 있습니다. 
따라서 DP 알고리즘을 사용할지 여부는 입력 크기와 같은 여러 가지 요소를 고려하여 결정해야 합니다.

 

<DP 알고리즘을 사용할 때 고려해야 할 최적 부분 구조와 중복 부분 문제에 대해서 설명해주세요.>

더보기

DP 알고리즘에서 최적 부분 구조(Optimal Substructure)란 큰 문제를 작은 문제로 나눌 수 있으며, 
작은 문제의 최적해를 이용해서 큰 문제의 최적해를 구할 수 있는 성질을 말합니다.  
(최적해(Optimal Solution)란 주어진 문제에서 가장 좋은 해결책을 말합니다.)
중복 부분 문제(Overlapping Subproblems)란 작은 문제들이 서로 중복되어 반복적으로 해결되는 성질을 말합니다. 
DP 알고리즘은 이러한 최적 부분 구조와 중복 부분 문제를 이용하여 문제를 해결합니다. 
따라서 DP 알고리즘을 사용할 때는 이러한 성질을 고려하여 적절한 구현 방법을 선택해야 합니다.

 

<dp를 사용해 해결할 수 있는 문제들은 대부분 어떤 유형에 속하나요?>

더보기

동적 프로그래밍(DP)은 최적화 문제를 더 작은 하위 문제로 나누고 각 하위 문제를 한 번만 해결하고 결과를 저장하여 중복 계산을 방지하여 최적화 문제를 해결하는 데 사용되는 기술입니다. 
DP는 광범위한 문제를 해결하는 데 사용할 수 있지만 다음과 같은 특성을 가진 문제에 가장 일반적으로 사용됩니다.

겹치는 하위 문제: 문제는 더 작은 하위 문제로 나눌 수 있으며 이러한 하위 문제에는 겹치는 하위 하위 문제가 있습니다. 
이는 동일한 하위 하위 문제를 여러 번 풀 수 있으며 중복 계산을 피하기 위해 DP를 사용할 수 있음을 의미합니다.

최적의 하위 구조: 더 큰 문제에 대한 최적의 솔루션은 더 작은 하위 문제에 대한 솔루션을 결합하여 찾을 수 있습니다. 
즉, 더 작은 하위 문제에 대한 솔루션을 사용하여 더 큰 문제에 대한 솔루션을 얻을 수 있습니다.

독립 하위 문제: 하위 문제는 서로 독립적으로 풀 수 있습니다. 이는 하나의 하위 문제에 대한 솔루션이 다른 하위 문제에 대한 솔루션에 의존하지 않음을 의미합니다.

일반적인 예에는 그래프에서 최단 경로 찾기, 두 문자열 간의 가장 긴 공통 하위 시퀀스 계산 및 배열에서 하위 배열의 최대 합계 찾기가 포함됩니다.

728x90
반응형
728x90
반응형

1. DFS & BFS에 대해 설명해주세요.

DFS (Depth First Search)는 깊이 우선 탐색으로 그래프의 모든 정점을 방문하는 방법 중 하나입니다. 
BFS (Breadth First Search)는 너비 우선 탐색으로 시작 노드를 방문한 후, 

시작 노드에 있는 인접한 모든 노드들을 우선 방문하는 방법입니다.

 

DFS 적은 메모리를 사용하고 깊은 단계에 있는 노드를 빠르게 찾을 수 있지만, 최단 경로를 보장하지 않습니다. 
반면 BFS는 최단 경로를 보장하지만, 더 많은 저장 공간이 필요합니다.

 

DFS와 BFS의 시간복잡도는 O(N)으로 동일하지만

  • DFS는 스택 또는 재귀함수로 구현하는 반면
  • BFS는 를 이용해서 구현한다는 차이점이 있습니다.

 

BFS / DFS

 

2. Isolation level에 대해 설명해주세요.

트랜젝션에서 Isolation level(격리 수준)은 데이터베이스 트랜잭션에서 동시성 제어를 위해 사용되는 개념입니다.

데이터베이스에서 여러 트랜잭션이 동시에 실행될 때, 격리 수준을 설정하여 각 트랜잭션 간에 데이터의 일관성과 안정성을 보장할 수 있습니다. 격리 수준이 높을수록 트랜잭션 간의 상호작용을 제한하여 무결성을 유지시켜주지만 성능에 영향을 미칩니다. 격리 수준은 여러 단계가 있으며 일반적인 격리수준으로 Read Uncommitted, Read Committed, Repeatable Read, Serializable 의 네 가지 수준이 있습니다.

레벨별 기능


1. Read uncommitted
다른 트랜잭션이 수정 중인 데이터를 읽을 수 있습니다.
2. Read committed
다른 트랜잭션이 수정을 완료한 데이터만 읽을 수 있습니다.
3. Repeatable read
트랜잭션 내에서 같은 쿼리를 실행하면 항상 같은 결과가 나옵니다.
4. Serializable
가장 엄격한 격리 수준입니다. 다른 트랜잭션에서는 해당 데이터에 접근할 수 없습니다.

728x90
반응형
728x90
반응형

1. 이분탐색에 대해 설명해보세요.

이분탐색은 정렬된 배열에서 데이터를 찾는 알고리즘입니다.
찾고자 하는 값과 배열의 중간값을 비교하여 탐색 범위를 절반씩 줄여나갑니다.
중간값이 찾는 값보다 크면 왼쪽 부분을, 작으면 오른쪽 부분을 탐색합니다.
이 과정을 반복하여 원하는 값을 찾을 때까지 수행합니다.
이분탐색은 O(log N)의 시간복잡도를 가지며 데이터가 많아질수록 유리합니다.
단, 정렬된 배열에서만 적용할 수 있다는 제약이 있습니다.

따라서 정렬된 데이터는 이분탐색, 정렬되지 않은 데이터에서는 선형탐색이 더 적합합니다.

 

2. 스토리지 엔진과 DB Lock에 대해 설명해보세요.

스토리지 엔진은 데이터베이스에서 데이터를 저장, 구성 및 액세스하는 방법을 관리하는 소프트웨어입니다. 
디스크 또는 메모리에서 데이터를 읽고 쓰고 검색하기 위한 규칙과 알고리즘을 정의합니다.

DB Lock은 데이터베이스에서 여러 사용자가 동시에 데이터에 접근 및 수정할 때 발생할 수 있는 문제를 해결하기 위해 사용되는 기술입니다. DB Lock 동시 접근 및 수정하려고 할때 충돌을 방지하고 일관성을 유지할 수 있습니다.

728x90
반응형
728x90
반응형

1. 선택정렬 알고리즘에 대해 설명해주세요.

선택 정렬(Selection Sort)은 배열에서 가장 작은 값을 찾아서 배열의 맨 앞에 위치시키고, 그 다음 작은 값을 찾아서 두 번째 위치에 위치시키는 방식으로 정렬하는 알고리즘입니다. 선택 정렬은 비교 정렬이며, 제자리 정렬이라고도 합니다.

선택 정렬의 장점으로는 구현이 쉽고 코드가 직관적이라는 점이 있습니다. 또한, 정렬을 위한 비교 횟수는 많지만 실제로 교환하는 횟수는 적기 때문에 많은 교환이 일어나야 하는 자료 상태에서 효율적으로 사용될 수 있습니다.
선택 정렬의 단점으로는 속도가 느리다는 점이 있습니다. 선택 정렬은 항상 O(n^2)의 시간 복잡도를 갖기 때문에 시간이 오래 걸리는 정렬 방식입니다.

 

선택 정렬의 과정은 다음과 같습니다:
1. 주어진 리스트 중에 최소값을 찾는다.
2. 그 값을 맨 앞에 위치한 값과 교체한다 (패스 (pass)).
3. 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체한다.
4. 하나의 원소만 남을 때까지 위의 1~3 과정을 반복한다.

 

2. Redis에 대해 설명해주세요.

Redis는 오픈소스 메모리 데이터 구조 저장소입니다. 키와 값으로 데이터를 저장하며, 데이터를 메모리에 저장하고 조회하기 때문에 속도가 빠릅니다. 주요 사용 사례는 캐싱, 세션관리, 순위표 등이 있습니다. Redis의 장점으로는 다양한 데이터 구조를 지원한다는 점이 있습니다. 또한, 메모리와 디스크를 활용하여 영구 데이터 보존이 가능합니다.
Redis의 단점으로는 메모리 사용량이 많다는 점이 있습니다. 또한, 대규모 트래픽에 대한 응답속도가 불안정할 수 있습니다.

 

요약하면 Redis는 캐싱, 메시징 및 고급 데이터 구조와 같은 기능을 갖춘 다목적 고성능 인 메모리 데이터 저장소입니다. 짧은 대기 시간, 높은 처리량 및 실시간 데이터 처리가 필요한 시나리오에서 탁월합니다. 그러나 메모리 용량, 복잡성, 쿼리 언어 부족 및 단일 스레드 특성과 관련된 제한 사항이 있습니다.


ChatGPT 답변

더보기

Redis(원격 사전 서버)는 데이터베이스, 캐시 및 메시지 브로커로 사용할 수 있는 오픈 소스 메모리 내 데이터 구조 저장소입니다. 데이터를 메모리에 보관하여 데이터를 저장하고 검색하는 빠르고 효율적인 방법을 제공합니다. Redis는 문자열, 목록, 세트, ​​해시 및 정렬된 세트와 같은 다양한 데이터 구조를 지원하고 이러한 데이터 유형에 대한 원자적 연산을 제공합니다.

Redis 사용의 장점은 다음과 같습니다.

  1. 고성능: Redis는 데이터를 메모리에 저장하므로 매우 빠른 읽기 및 쓰기 작업이 가능합니다. 초당 많은 양의 요청을 처리할 수 있고 대기 시간이 짧아 실시간 데이터 처리가 필요한 애플리케이션에 적합합니다.
  2. 다양성: Redis는 다양한 사용 사례에 사용할 수 있습니다. 자주 액세스하는 데이터를 메모리에 저장하여 애플리케이션 성능을 향상시키는 캐싱 계층 역할을 할 수 있습니다. 또한 게시-구독 메시징 패턴을 지원하는 분산 시스템 구축을 위한 메시지 브로커 역할을 할 수 있습니다. 또한 Redis는 복잡한 데이터 조작을 가능하게 하는 고급 데이터 구조 및 명령을 제공합니다.
  3. 지속성: Redis는 지속성 옵션을 지원하여 데이터를 디스크에 저장할 수 있습니다. 이렇게 하면 시스템 오류 또는 재시작 시 데이터가 손실되지 않습니다. Redis는 스냅샷 및 추가 전용 로그를 비롯한 다양한 지속성 메커니즘을 제공하여 특정 요구 사항에 따라 유연성을 제공합니다.
  4. 확장성: Redis는 데이터 샤딩 및 복제를 지원하여 수평 확장이 가능합니다. 샤딩을 사용하면 여러 Redis 인스턴스에 데이터를 분산하여 스토리지 및 처리 용량을 늘릴 수 있습니다. 복제는 향상된 성능과 고가용성을 위해 데이터의 복제본을 생성할 수 있도록 합니다.

많은 장점에도 불구하고 Redis에는 몇 가지 제한 사항도 있습니다.

  1. 메모리 제약: Redis는 데이터를 메모리에 저장하므로 저장할 수 있는 데이터의 양은 사용 가능한 메모리 용량에 따라 제한됩니다. 데이터 세트가 메모리 용량보다 커지면 성능 문제가 발생하거나 외부 스토리지 메커니즘을 사용해야 할 수 있습니다.
  2. 복잡성: Redis는 간단한 키-값 저장을 위해 설정하고 사용하기가 상대적으로 쉽지만 고급 기능과 데이터 구조를 활용하는 것은 더 복잡할 수 있습니다. Redis 명령 및 데이터 구조의 적절한 설계와 이해는 Redis의 잠재력을 최대한 활용하는 데 필요합니다.
  3. 쿼리 언어 없음: Redis는 SQL과 같은 쿼리 언어를 제공하지 않으므로 복잡한 쿼리 및 필터링 작업이 더 어려워집니다. 복잡한 기준에 따라 데이터를 검색하려면 추가 애플리케이션 로직이 필요할 수 있습니다.
  4. 단일 스레드: Redis는 단일 스레드 모델을 사용합니다. 즉, 단일 CPU 코어만 사용할 수 있습니다. 이 제한은 동시 읽기 및 쓰기 작업으로 매우 높은 로드를 처리할 때 성능에 영향을 미칠 수 있습니다.

요약하면 Redis는 캐싱, 메시징 및 고급 데이터 구조와 같은 기능을 갖춘 다목적 고성능 인 메모리 데이터 저장소입니다. 짧은 대기 시간, 높은 처리량 및 실시간 데이터 처리가 필요한 시나리오에서 탁월합니다. 그러나 메모리 용량, 복잡성, 쿼리 언어 부족 및 단일 스레드 특성과 관련된 제한 사항이 있습니다.

728x90
반응형
728x90
반응형

1. 시간복잡도와 공간복잡도에 대해 설명하시오.

시간 복잡도는 데이터가 입력 되었을 때 어떤 문제를 해결하는데 걸리는 알고리즘의 수행 시간을 의미하며,

공간 복잡도는해당 알고리즘이 수행하는 동안의 메모리 사용량을 의미합니다. 

빠른 반응이 필요한 경우엔 시간 복잡도가 중요하고, 용량을 아껴야 하는 경우에는 공간 복잡도가 중요해집니다.

최근에는 과거 메모리 공간이 부족하던 때와 달리 컴퓨터 성능의 발달로 공간 복잡도 보다는 

시간 복잡도를 중심으로 프로그래밍을 작성하는 경우가 많다고 합니다.

 

2. typeORM과 Sequelize의 차이점을 얘기해주세요.

TypeORM과 Sequelize는 Node.js에서 사용하는 객체지향매핑(ORM) 라이브러리입니다.

TypeORM은 주로 TypeScript와 함께 사용되는 반면 Sequelize는 JavaScript와 함께 사용됩니다.

TypeORM은 쿼리빌더가 동적이기에 복잡한 쿼리 작성에 적합하고, Sequelize는 정적 메소드를 사용합니다.

TypeORM은 마이그레이션 지원 기능이 내장되어 스키마를 변경할 때 유용하고,
Sequelize는 migration:undo:all를 통헤 데이터베이스 스키마를 변경하다가 문제가 생겼을 때 유용합니다.

 


꼬리질문 : 동적쿼리랑 정적쿼리는 무슨 뜻일까?

동적 쿼리란 쿼리를 작성할 때 런타임에 쿼리를 생성하는 것을 의미합니다. 이는 쿼리를 작성할 때 변수를 사용하여 쿼리를 동적으로 생성할 수 있습니다. 반면 정적 쿼리는 런타임에 쿼리를 생성하지 않고 미리 작성된 쿼리를 사용합니다.


더보기

TypeORM과 Sequelize는 JavaScript에서 데이터베이스 작업을 수행할 때 사용할 수 있는 라이브러리입니다.

두 도구는 다음과 같은 주요한 차이점을 가지고 있습니다.

언어: TypeORM은 TypeScript를 기반으로 만들어졌으며 TypeScript와 JavaScript 모두에서 사용할 수 있습니다. Sequelize는 JavaScript를 기반으로 만들어졌으며 TypeScript와의 호환성을 위해 별도의 타입 정의 파일을 제공합니다.


데이터베이스 지원: TypeORM은 MySQL, PostgreSQL, Oracle, MongoDB 등 다양한 SQL 및 NoSQL 데이터베이스를 지원합니다. Sequelize는 MySQL, PostgreSQL, SQLite, MariaDB 등 주로 SQL 데이터베이스를 지원합니다.


쿼리: TypeORM은 쿼리 빌더 인터페이스를 제공하여 쿼리를 생성하고 실행할 수 있습니다. 예를 들어 userRepo.createQueryBuilder("user").where("user.name = :name", { name: "John" }).getOne()과 같은 방식으로 쿼리를 작성할 수 있습니다. Sequelize는 정적 메서드를 사용하여 쿼리를 생성하고 실행할 수 있습니다. 예를 들어 User.findOne({ where: { name: "John" } })과 같은 방식으로 쿼리를 작성할 수 있습니다.


연결: TypeORM은 데코레이터를 사용하여 엔터티 간의 관계를 정의하고 연결할 수 있습니다. 예를 들어 @Entity() class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @OneToMany(() => Post, post => post.user) posts: Post[]; }과 같은 방식으로 엔터티를 작성하고 관계를 설정할 수 있습니다. Sequelize는 특정 메서드를 사용하여 모델 간의 관계를 정의하고 연결할 수 있습니다. 예를 들어 class User extends Model {} User.init({ id: { type: DataTypes.INTEGER, primaryKey: true }, name: { type: DataTypes.STRING } }, { sequelize }); class Post extends Model {} Post.init({ id: { type: DataTypes.INTEGER, primaryKey: true }, title: { type: DataTypes.STRING } }, { sequelize }); User.hasMany(Post); Post.belongsTo(User);과 같은 방식으로 모델을 작성하고 관계를 설정할 수 있습니다.

 

마이그레이션: TypeORM은 마이그레이션 기능을 내장하고 있으며 CLI 명령어나 API를 통해 마이그레이션을 생성하고 실행할 수 있습니다. 예를 들어 typeorm migration:create -n CreateUserTable과 같은 명령어로 마이그레이션 파일을 생성하고 typeorm migration:run과 같은 명령어로 마이그레이션을 실행할 수 있습니다. Sequelize는 마이그레이션 기능을 외부 도구인 sequelize-cli에 위임하고 있으며 CLI 명령어나 API를 통해 마이그레이션을 생성하고 실행할 수 있습니다. 예를 들어 sequelize migration:create --name create-user-table과 같은 명령어로 마이그레이션 파일을 생성하고 sequelize db:migrate과 같은 명령어로 마이그레이션을 실행할 수 있습니다.

728x90
반응형
728x90
반응형

1. 정규화에 대해 설명해주세요.

정규화데이터베이스에서 중복을 최소화하고 데이터 무결성을 향상시키는 프로세스를 말합니다.

정규화는 여러 단계로 이루어져 있으며, 각 단계마다 테이블을 분해하는 방법이 다릅니다.

정규화를 진행하면 데이터베이스의 설계가 개선되고, 데이터의 중복과 무결성 문제를 해결할 수 있습니다.

그러나 과도한 정규화는 데이터베이스의 복잡성이 증가하여 성능에 영향을 미칠 수 있으니 적절하게 사용해야 합니다.


제1정규형릴레이션의 모든 도메인이 원자값(Atomic Value)만을 포함하도록 분해하는 것입니다. 

즉, 하나의 속성에 여러 개의 값이 들어가 있으면 안됩니다.

제2정규형제1정규형을 만족하면서 부분 함수적 종속을 제거하는 것입니다. 

즉, 기본키가 아닌 다른 속성들이 기본키의 일부분에만 종속되어 있으면 안됩니다.

제 3 정규형제2정규형을 만족하면서 이행적 함수 종속을 제거하는 것입니다. 

즉, A -> B, B -> C와 같은 종속 관계에서 A -> C와 같은 종속 관계가 있으면 안됩니다.

정규화의 장점

- 최소의 데이터로 최적의 데이터베이스 구축 및 데이터 중복성 제거
- 종속성 삭제로 데이터의 일관성과 무결성 보장
- 릴레이션에서 발생 가능한 이상현상 제거
- 중복의 최소화로 저장공간의 효율화 달성

 

정규화의 단점
- 릴레이션을 분해하면서 조인 연산이 많아져 처리 성능이 저하될 수 있습니다.
- 릴레이션을 분해하면서 불필요한 릴레이션이 생성될 수 있습니다.

 


릴레이션이란 데이터베이스에서 데이터를 저장하는 테이블을 말합니다. 

릴레이션은 행과 열로 구성되며, 각 행은 레코드(record)라고 하며, 각 열은 속성(attribute)이라고 합니다. 

릴레이션은 관계형 데이터베이스에서 가장 기본적인 데이터 저장 단위입니다.

 

출처: 상세한 내용 https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#%EC%A0%95%EA%B7%9C%ED%99%94%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

더보기

1. 정규화는 어떤 배경에서 생겨났는가?

한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비하게 된다. 또 중복된 정보로 인해 갱신 이상이 발생하게 된다. 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것이다. 이러한 문제를 해결하기 위해 정규화 과정을 거치는 것이다.

1-1. 갱신 이상에는 어떠한 것들이 있는가?

  • 삽입 이상(insertion anomalies) 원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점을 말한다.
  • 삭제 이상(deletion anomalies) 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말한다.
  • 수정(갱신)이상(modification anomalies) 정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점을 말한다.

 

2. 그래서 정규화란 무엇인가?

관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업이다. 좀 더 구체적으로는 불만족스러운 나쁜 릴레이션의 애트리뷰트들을 나누어서 좋은 작은 릴레이션으로 분해하는 작업을 말한다. 정규화 과정을 거치게 되면 정규형을 만족하게 된다. 정규형이란 특정 조건을 만족하는 릴레이션의 스키마의 형태를 말하며 제 1 정규형, 제 2 정규형, 제 3 정규형, … 등이 존재한다.

2-1. ‘나쁜' 릴레이션은 어떻게 파악하는가?

엔티티를 구성하고 있는 애트리뷰트 간에 함수적 종속성(Functional Dependency)을 판단한다. 판단된 함수적 종속성은 좋은 릴레이션 설계의 정형적 기준으로 사용된다. 즉, 각각의 정규형마다 어떠한 함수적 종속성을 만족하는지에 따라 정규형이 정의되고, 그 정규형을 만족하지 못하는 정규형을 나쁜 릴레이션으로 파악한다.

2-2. 함수적 종속성이란 무엇인가?

함수적 종속성이란 애트리뷰트 데이터들의 의미와 애트리뷰트들 간의 상호 관계로부터 유도되는 제약조건의 일종이다. X 와 Y 를 임의의 애트리뷰트 집합이라고 할 때, X 의 값이 Y 의 값을 유일하게(unique) 결정한다면 "X 는 Y 를 함수적으로 결정한다"라고 한다. 함수적 종속성은 실세계에서 존재하는 애트리뷰트들 사이의 제약조건으로부터 유도된다. 또한 각종 추론 규칙에 따라서 애트리뷰트들간의 함수적 종속성을 판단할 수 있다. cf> 애트리뷰트들의 관계로부터 추론된 함수적 종속성들을 기반으로 추론 가능한 모든 함수적 종속성들의 집합을 폐포라고 한다.

2-3. 각각의 정규형은 어떠한 조건을 만족해야 하는가?

  1. 분해의 대상인 분해 집합 D 는 무손실 조인 을 보장해야 한다.
  2. 분해 집합 D 는 함수적 종속성을 보존해야 한다.

 

제 1 정규형

애트리뷰트의 도메인이 오직 원자값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다. 즉, 복합 애트리뷰트, 다중값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태를 말한다.

제 2 정규형

모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속이면 제 2 정규형을 만족한다고 볼 수 있다. 완전 함수적 종속이란 X -> Y 라고 가정했을 때, X 의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말한다. 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말한다.

제 3 정규형

어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X - >Y, Y -> Z의 경우에 의해서 추론될 수 있는 X -> Z의 종속관계를 말한다. 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태를 말한다.

BCNF(Boyce-Codd) 정규형

여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용이다. 복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 제 3 정규형을 보완하는데 의미가 있다. 비주요 애트리뷰트가 후보키의 일부를 결정하는 분해하는 과정을 말한다.

각 정규형은 그의 선행 정규형보다 더 엄격한 조건을 갖는다.

  • 모든 제 2 정규형 릴레이션은 제 1 정규형을 갖는다.
  • 모든 제 3 정규형 릴레이션은 제 2 정규형을 갖는다.
  • 모든 BCNF 정규형 릴레이션은 제 3 정규형을 갖는다.

수많은 정규형이 있지만 관계 데이터베이스 설계의 목표는 각 릴레이션이 3NF(or BCNF)를 갖게 하는 것이다.

 

3. 정규화에는 어떠한 장점이 있는가?

  1. 데이터베이스 변경 시 이상 현상(Anomaly) 제거 위에서 언급했던 각종 이상 현상들이 발생하는 문제점을 해결할 수 있다.
  2. 데이터베이스 구조 확장 시 재 디자인 최소화 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다. 이는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되며 응용프로그램의 생명을 연장시킨다.
  3. 사용자에게 데이터 모델을 더욱 의미있게 제공 정규화된 테이블들과 정규화된 테이블들간의 관계들은 현실 세계에서의 개념들과 그들간의 관계들을 반영한다.

 

4. 단점은 없는가?

릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다. 이로 인해 질의에 대한 응답 시간이 느려질 수 있다. 조금 덧붙이자면, 정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것이다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. 따라서 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.

 

5. 단점에서 미루어보았을 때 어떠한 상황에서 정규화를 진행해야 하는가? 단점에 대한 대응책은?

조회를 하는 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요하다.

반정규화(De-normalization, 비정규화)

반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다. 디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나, 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다. 일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

5-1. 무엇이 반정규화의 대상이 되는가?

  1. 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
  2. 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
  3. 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

5-2. 반정규화 과정에서 주의할 점은?

반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다. 또한 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다.

728x90
반응형

+ Recent posts