Rizingblare 2024. 7. 12. 17:17

# 자료구조

Q.  Array는 어떤 자료구조 인가요?

- Array는 연관된 데이터를 연속된 메모리 상에 미리 할당된 크기만큼 저장하는 자료구조 입니다.


Q.  미리 설정한 것보다 Array에 더 많은 데이터를 저장해야 한다면 어떻게 해결할 수 있을까요?

- 기존보다 더 큰 size의 Array를 새로 선언하고 데이터를 옮긴 후에 기존의 Array는 메모리에서 삭제하는 방법으로 해결할 수 있습니다. 이와 같은 방식으로 동적으로 배열의 크기를 조절하는 자료구조를 Dynamic Array라고 합니다. 또 다른 방법으로는 데이터가 추가될 때마다 메모리 공간을 할당받는 LinkedList를 사용할 수 있습니다.


Q.  Dynamic Array는 어떤 자료구조 인가요?

- Dynamic Array는 resize를 통해 Array의 size를 유동적으로 조절하여 데이터를 저장할 수 있는 자료구조입니다.


Q.  Linked List는 어떤 자료구조 인가요?

- Linked List는 메모리 상에선 불연속적이지만 논리적으로 연속성을 갖는 자료구조입니다. Linked List는 노드(Node)라는 구조체로 구성되는데, 노드는 데이터의 값과 다음 노드의 주소값을 저장하므로 이를 통해 Linked List의 논리적 연속성을 보장합니다.


Q.  Array와 Dynamic Array의 차이점은 무엇인가요?

- Array는 정적 배열컴파일 타임에 크기가 결정되고 스택 메모리에 주로 할당되지만, Dynamic Array는 동적 배열런타임에 메모리를 할당받기 때문에 힙 메모리에 할당됩니다.


Q.  Dynamic Array가 resize하는 과정을 설명해주세요.

- Dynamic Array에서 저장공간이 가득차게 되면 더 큰 크기의 새로운 배열을 선언하고, 기존 배열에서 새 배열로 요소들을 복사하고, 기존 배열을 해제하여 메모리를 반환하는 방식으로 진행이 됩니다. 따라서 resize는 선형 시간인 O(N)의 시간 복잡도를 가지며, 일반적으로 기존의 2배 크기 배열을 새로 선언하는데 자바의 ArrayList는 1.5배 크기의 배열을 새로 할당합니다. 


Q.  Array와 Linked List의 차이점은 무엇인가요?

- Array는 메모리 상에서 연속적으로 데이터를 저장하는 자료구조입니다. 반면 Linked List는 메모리 상에선 불연속적이지만 노드(Node)를 통해 논리적 연속성을 유지하는 자료구조입니다.


Q.  Array를 쓰면 좋은 상황과 Linked List를 쓰면 좋은 상황을 비교해서 설명해주세요.

- 데이터가 얼마나 저장될 지 예상할 수 없을 때 Linked List를 사용하면 좋습니다. 반면 Array는 저장될 데이터의 개수를 예상할 수 있을 때 사용하면 좋습니다. Linked List는 노드마다 데이터를 비롯해 주소 등의 추가 정보를 저장하기 때문에 메모리를 적게 사용해야 하는 상황일 때는 Array를 사용하는 것이 유리합니다. 또한 Array는 조회에 있은 높은 성능을 보이며, Linked List는 삽입과 삭제에 있어 높은 성능을 보이므로 이를 고려하여 선택하면 성능을 향상시킬 수 있습니다.


Q. Array와 Linked List의 메모리 할당은 언제 일어나는지 설명해주세요.

- Array는 미리 설정된 크기만큼 컴파일 타임에 스택 메모리에 할당됩니다. 반면 Linked List는 런타임에 새로운 노드가 추가될 때마다 힙 메모리에 추가적으로 할당됩니다.


Q.  Queue는 어떤 자료구조 인가요?

- Queue는 FIFO(First In First Out)을 구현한 자료구조입니다. 주요 연산으로는 큐의 끝에 새로운 요소를 추가하는 enqueue, 큐의 첫 번째 요소를 제거하는 dequeue가 있습니다. 두 연산 모두 O(1)의 시간 복잡도를 갖으며, 프로세스 스케줄링이나 너비 우선 탐색(BFS) 등에 이용됩니다.


Q.  Stack은 어떤 자료구조 인가요?

- Stack은 LIFO(Last In First Out)을 구현한 자료구조입니다. 주요 연산으로는 스택의 끝에 새로운 요소를 추가하는 push, 스택의 마지막 요소를 제거하는 pop이 있습니다. 두 연산 모두 O(1)의 시간 복잡도를 갖으며, 함수 콜 스택이나 웹 브라우저 방문기록 뒤로가기, 깊이 우선 탐색 등에 이용됩니다.


Q.  Hash Table을 어떤 자료구조 인가요?

- Hash Table은 Key와 Value 형태로 데이터를 저장하는 자료구조입니다. 해시 함수에 Key 값을 입력으로 넣어 얻은 해시값 h(k) 위치에 데이터를 저장하여 조회, 삽입, 삭제가 모두 O(1)의 시간 복잡도를 갖는 것이 특징입니다.


Q.  좋은 Hash 함수의 조건에는 어떤 것들이 있을까요?

- 연산 속도가 빠르고, 해시값의 중복을 최소화 할 수 있는 함수가 좋은 함수라고 생각합니다.


Q.  Hash Table에서 Collision이 발생했을 때 해결방안에 대해서 설명해주세요.

- 두 가지 방안을 생각해볼 수 있습니다. 하나는 Collison이 발생하면 미리 정해둔 규칙에 따라 Hash Table의 비어있는 slot을 찾는 Open Addressing 방식을 적용할 수 있습니다. 구체적으로는 충돌이 발생한 해시값으로부터 일정한 값만큼 건너뛰는 선형 조사법, 제곱수만큼 건너뛰는 이차 조사법, 이동폭을 얻기 위해 새로운 해시 함수를 적용하는 더블 해싱이 해당됩니다. 다음은 충돌이 발생하면 Linked List에 노드를 추가해 저장하는 Separate Chaining 방식을 적용해볼 수 있습니다.

 
 

# 운영체제

Q.  Process에 대해 설명해주세요.

- 프로세스(Process)는 프로그램이 메모리에 적재되고 CPU를 할당받아 실행되고 있는 상태를 의미합니다.


Q.  Process의 메모리 영역에 대해 설명해주세요.

- 프로세스(Process)가 할당받는 메모리 영역은 4가지로 구분할 수 있습니다. 코드(Code) 영역, 데이터(Data) 영역, 힙(Heap) 영역, 스택(Stack) 영역으로 구성됩니다. 코드 영역은 기계어로 번역된 프로그램의 소스 코드가 저장되는 영역입니다. 데이터 영역은 전역 변수나 static 변수들이 할당되는 영역입니다. 힙 영역은 런타임에 필요할 때마다 동적으로 할당되는 메모리 영역입니다. 스택 영역은 함수 호출 시에 생성되는 지역 변수나 매개 변수, 반환 값 등이 저장되는 영역입니다.


Q.  Multi Process에 대해서 설명해주세요.

- 멀티 프로세스(Multi Process)는 2개 이상의 프로세스가 동시에 실행되는 것을 말합니다. 2개 이상의 프로세스가 동시에 실행된다는 건 동시성(concurrency) 또는 병렬성(parallelism)을 의미할 수 있습니다. 동시성은 하나의 CPU Core에서 매우 짧은 시간동안 여러 프로세스들을 번갈아가면서 연산하는 시분할 시스템을 뜻하고, 병렬성은 여러 개의 CPU Core에서 각각의 프로세스를 연산해 물리적으로 동시에 실행하는 것을 의미합니다.


Q.  Process의 Context Switching에 대해서 설명해주세요.

- 컨텍스트 스위칭(Context Switching)이란 CPU를 점유 중인 프로세스가 다음 프로세스에게 CPU의 제어권을 넘겨주는 것을 말합니다. 현재 프로세스의 상태를 PCB에 저장하여 보관하고, 다음 실행될 프로세스의 PCB를 읽어서 상태를 복구하는 작업이 이루어지게 됩니다.


Q.  PCB(Process Control Block)가 무엇인가요?
 
- PCB는 운영체제가 프로세스에 대해 필요한 정보들을 모아놓은 자료구조 입니다. 일반적으로 PCB에는 프로세스의 고유한 ID인 PID, New, Ready, Running, Waiting, Terminated 등 프로세스의 현재 상태, 프로세스가 다음에 실행해야 하는 명령어 위치를 가리키는 PC 레지스터, CPU 스케쥴링 우선순위 등의 정보를 저장하고 있습니다.


Q.  Multi Process 환경에서 프로세스들은 어떻게 데이터를 주고 받나요?

- 원칙적으로 프로세스는독립적인 메모리 공간을 갖기 때문에 서로 다른 메모리 공간을 참조할 수 없습니다. 하지만 운영체제 차원에서 프로세스 간 자원 접근을 위해 IPC(Inter Process Communication)를 제공하기도 합니다. IPC는 공유 메모리 모델과 메시지 전달 모델로 구분할 수 있습니다. 공유 메모리(Shared Memory) 모델은 커널에게 공유 메모리 공간을 할당받아서 read/write를 통해 통신합니다. 메시지 전달(Message Passing) 모델은 커널의 시스템 콜을 통해 메시지를 send/receive하는 방식으로 통신합니다. 공유 메모리 방식은 통신 과정에서 커널의 개입이 없어 빠르게 통신할 수 있지만 동기화 문제가 발생할 수 있다는 단점이 있습니다. 메시지 전달 방식은 커널을 통해 데이터를 주고 받기 때문에 통신 속도가 느리지만 안정성을 보장해준다는 장점이 있습니다.


Q.  Thread에 대해서 설명해주세요.

- 쓰레드(Thread)는 한 프로세스 내에서 실행되는 흐름의 단위 입니다. Thread는 속해있는 프로세스의 Stack 영역을 제외한 나머지 메모리 영역을 공유할 수 있습니다.


Q.  Thread에서 Stack 영역은 서로 공유하지 않는 이유가 무엇인가요?
 
- 쓰레드는 함수로 동작하기 때문에 각 쓰레드가 독립적으로 기능하기 위해서는 함수 호출이 독립적으로 이루어져야 합니다. 그렇기 때문에 지역 변수, 매개 변수, 리턴 값들을 저장하는 스택 영역이 독립적이어야 합니다.


Q.  Multi Thread에 대해서 설명해주세요.

- 멀티 쓰레드(Multi Thread)는 하나의 프로세스에게 여러 작업을 병렬로 처리시키기 위해 사용합니다. 각 쓰레드는 프로세스로부터 Program Counter와 스택 영역을 독립적으로 할당받아서 실행됩니다.


Q.  Multi Process와 Multi Thread를 비교해서 설명해주세요.

- 멀티 프로세스는 하나의 프로그램을 여러 개의 프로세스가 처리하도록 하는 것입니다. 멀티 쓰레드는 하나의 프로그램을 한 프로세스 내의 여러 개의 쓰레드가 처리하도록 하는 것입니다. 멀티 프로세스는 각 프로세스가 독립적인 메모리 공간을 할당받기 때문에 많은 메모리 공간이 필요하고 프로세스 간 통신이 어렵습니다. 멀티 쓰레드는 메모리를 공유하기 때문에 자원을 효율적으로 사용할 수 있으며 통신이 쉽고 Context Switcing이 빠르다는 장점이 있습니다. 하지만 동기화 문제가 발생할 수도 있고, 하나의 쓰레드에서 오류가 발생할 경우 전체 쓰레드가 종료될 위험이 있는 등 안정성이 떨어진다는 단점이 있습니다.


Q.  Paging 기법에 대해 설명해주세요.

- 페이징(Paging) 기법은 물리적 메모리를 미리 동일한 크기의 페이지 프레임 단위로 나누어 프로세스가 물리적으로 연속적이지 않은 공간에 메모리를 할당받을 수 있도록 하는 메모리 관리 기법입니다. 페이징 기법에서는 논리적 메모리 주소와 물리적 메모리 주소의 바인딩을 위한 페이지 테이블이 필요합니다.


Q.  Segmentation 기법에 대해 설명해주세요.

-  세그멘테이션(Segmentation) 기법은 프로세스의 메모리 공간을 논리적 의미 단위로 구분하여 물리적으로 연속되지 않은 메모리 공간에 할당받을 수 있도록 하는 메모리 관리 기법입니다. 일반적으로 코드, 데이터, 힙, 스택 영역과 같은 기능 단위로 세그먼트를 정의하는 경우가 많고, 주소 바인딩을 위한 세그먼트 테이블이 필요합니다.


Q.  메모리 단편화 현상에 대해서 설명해주세요.

- 메모리 단편화(Memory Fragmentation)는 물리적 메모리의 여유 공간이 충분함에도 불구하고 작은 조각으로 나누어져 더 이상 새로운 할당이 불가능한 상태를 말합니다. 페이징(Paging) 기법을 사용하면 외부 단편화 문제를 예방할 수 있지만 프로세스에서 필요한 메모리의 크기가 page의 배수라는 보장이 없기 때문에 내부 단편화 문제가 발생할 수 있습니다. 세그멘테이션(Segmentation) 기법을 사용하면 내부 단편화 문제를 예방할 수 있지만 서로 다른 크기의 세그먼트들이 메모리에 적재되기 때문에 외부 단편화 문제가 발생할 수 있습니다.


Q.  동기화 문제를 해결하기 위한 방법을 설명해주세요.

- 동기화 문제는 동시에 임계 영역에 접근하기 위해 경쟁하는 상태에서 생기는 문제를 의미합니다. 이를 해결하기 위해 뮤텍스, 세마포어 등을 활용할 수 있습니다. 뮤텍스(Mutex)는 상호 배제를 뜻하는 Mutual Exclusion의 약자로 lock을 통해 오직 하나의 스레드 만이 임계 영역에 접근할 수 있도록 하는 방법입니다. 반면, 세마포어(Semaphore)는 스레드가 임계 영역에 접근하면 세마포어값을 감소시키고, 자원을 반환하면 다시 증가시키는 방식을 통해 임계 영역에 접근할 수 있는 스레드의 개수를 제한시키는 동기화 기법입니다.


Q.  Deadlock에 대해서 설명해주세요.

- 교착 상태(Deadlock)은 둘 이상의 스레드가 다른 스레드가 점유하고 있는 자원을 서로 기다릴 때 발생하는 문제를 의미합니다. 데드락이 발생할 수 있는 조건은 상호 배제, 점유 대기, 비선점, 순환 대기입니다. 상호 배제(mutual exclusion)는 동시에 하나의 스레드 만이 자원을 점유할 수 있는 상황입니다. 점유 대기(hold-and-wait)는 스레드가 하나의 자원을 보유한 상황에서 다른 스레드가 보유한 공유 자원을 추가로 기다리는 상황입니다. 비선점(non-preemption)은 다른 스레드가 보유한 자원을 강제로 선점할 수 없으며 스스로 반환할 때까지 기다려야 하는 상황입니다. 순환 대기(circular wait)는 서로 순환 형태로 자원을 대기하고 있는 상황입니다. 데드락 문제를 해결하기 위한 방법으로는 데드락 발생 가능성을 무시하거나 순환 대기 상황이 발생하지 않도록 설계하여 예방하거나 데드락이 발생하면 이를 탐지하여 회복시키도록 설계하여 해결할 수 있습니다.


Q.  가상 메모리에 대해서 설명해주세요.

- 가상 메모리(Virtual Memory)는 프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법입니다. 필요한 페이지만 물리 메모리에 적재하고 당장 필요하지 않은 페이지는 디스크의 스왑 영역에 저장하는요구 페이징 기법을 적용합니다. 이를 통해 사용자 프로그램이 물리 메모리의 제약에서 벗어나 한번에 더 많은 프로그램을 실행할 수 있고 개발자는 개발에만 집중할 수 있다는 장점이 있습니다.


Q.  페이지 교체 알고리즘에 대해서 설명해주세요.

- 물리적 메모리가 가득 찬 상태에서 프로세스가 물리적 메모리에 적재되어 있지 않은 페이지를 요청하는 페이지 폴트(Page Fault)가 발생했을 때, 어떤 페이지를 디스크의 스왑 영역으로 내보낼지 결정하는 알고리즘 입니다. FIFO, LRU, LFU 등의 알고리즘이 있으며 페이지 폴트가 적게 일어나도록 참조될 가능성이 가장 적은 페이지를 선택하여 교체하는 것이 효율적입니다.

 
 

# 데이터베이스

Q.  관계형 데이터베이스와 NoSQL을 비교해서 설명해주세요.

- 관계형 데이터베이스(Relational Database)는 데이터의 중복을 최소화하고, 무결성을 보장하기 때문에 UPDATE가 용이하다는 특징이 있습니다. 하지만 사전에 엄격하게 정의된 스키마에 따라 데이터를 저장하므로 유연성과 확장성이 떨어지고, JOIN 연산이 잦아질수록 조회 성능이 떨어지고, Scale Out에 적합하지 않다는 단점이 있습니다. 반면 확장 가능성에 초점을 둔 NoSQL은 이러한 문제점들을 해결할 수 있지만 데이터 중복과 ACID에 대한 부분어플리케이션 차원에서 개발자가 직접 제어해주어야 한다는 단점이 있습니다.



Q.  Primary Key에 대해서 설명해주세요.


- 기본 키(Primary Key)는 릴레이션에서 튜플을 유일하게 식별할 수 있는 후보키 중에서 선택된 후보키를 의미합니다. 그렇기 때문에 기본 키는 Null 값을 가져서도 안되고 중복된 값을 가져서도 안 됩니다.


Q.  N대 M 관계에 대해서 설명해주세요.

- 관계형 데이터베이스에서 N대 M 관계는 양쪽 엔티티(Entity)가 서로 1대 N의 관계를 맺는 구조를 의미합니다. 대표적인 예시로는 수강신청 상황에서 학생 엔티티와 강의 엔티티가 해당됩니다. 일반적으로 엔티티의 기본 키들로 구성된 매핑 테이블을 생성하여 이를 관리할 수 있습니다.


Q.  LEFT OUTER JOIN과 INNER JOIN의 차이점에 대해서 설명해주세요.

- JOIN 연산은 두 개 이상의 테이블들에 있는 데이터를 한 번에 조회하는 것을 의미합니다. INNER JOIN은 두 테이블에서 JOIN Condition을 만족하는 튜플들로 결과 테이블을 만드는 조인 연산입니다. OUTER JOIN은 두 테이블에서 JOIN Condition을 만족하지 않는 튜플들도 결과 테이블에 포함하는 조인 연산을 말합니다. LEFT OUTER JOIN은 두 테이블 중에서 JOIN문을 기준으로 왼쪽인 FROM 절과 함께 명시된 테이블에 대해서만 JOIN Condition을 만족하지 않더라도 누락없이 결과 테이블에 포함하는 연산을 말합니다.


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

- 데이터베이스 정규화(Normalization)는 데이터의 중복과 이상 현상을 최소화하기 위해서 일련의 단계에 따라 관계형 데이터베이스를 최적화하는 과정입니다. 모든 속성 값은 더 이상 나눠질 수 없는 원자값으로 구성되어야 한다는 제 1 정규화, 모든 키에 대해서 부분적 함수 종속성을 제거하는 제 2 정규화, 키가 아닌 값끼리 함수 종속성을 갖는 이행적 함수 종속성을 제거하는 제 3정규화 등의 과정이 있습니다. 이외에도 BCNF, 제4정규화, 제5정규화, 제6정규화 등이 있지만 실용성이 부족하고 복잡성을 증가시키는 경우가 많으므로 자주 사용되진 않습니다. 


Q.  Transaction에 대해서 설명해주세요.

- 트랜잭션(Transaction)은 데이터베이스에서 하나의 기능을 수행하기 위한 논리적인 작업의 단위입니다. 트랜잭션은 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)의 4가지 특성으로 나타낼 수 있습니다. 원자성(Atomicity)은 트랜잭션에 포함된 작업은 전부 수행되거나 혹은 전부 실행되지 않아야 한다는 것을 의미합니다. 일관성(Consistency)은 트랜잭션 수행 중에 제약 조건이나 트리거 등에서 정의된 규칙을 위반하지 않도록 항상 일관된 상태를 유지시켜줘야 한다는 것을 의미합니다. 고립성(Isolation)은 동시에 수행되는 여러 트랜잭션이 동일한 데이터를 갖고 충돌하지 않도록 하는 동시성 제어를 의미합니다. 지속성(Durability)은 커밋이 완료된 트랜잭션은 더 이상 시스템 오류에 영향을 받지 않도록 비휘발성 메모리 등의 데이터베이스에 영구적으로 저장되어야 한다는 것을 의미합니다.


Q.  Isolation Level에 대해서 설명해주세요.

- 데이터베이스는 트랜잭션의 동시성 제어에서 Trade-Off 관계에 있는 성능과 데이터 정합성 사이에서 사용자가 필요에 따라 선택할 수 있도록 격리 수준(Isolation Level)을 제공합니다. Read Uncommitted, Read Committed, Repeatable Read, Serializable 순으로 엄격한 격리 수준을 의미합니다. Read Uncommitted 레벨은 트랜잭션의 변경 내용에 대해 Rollback이나 Commit 여부에 관계없이 다른 트랜잭션에서 값을 읽을 수 있습니다. Read Committed 레벨은 커밋이 완료된 트랜잭션의 내용만 참조할 수 있도록 해서 Dirty Read를 방지합니다. Repeatable Read 레벨은 참조하는 값이 트랜잭션 도중에 변경되는 것을 방지합니다. Serializable 레벨은 트랜잭션을 순차적으로 처리해서 발생할 수 있는 모든 이상 현상을 방지합니다.


Q.  Index에 대해서 설명해주세요.

- 데이터베이스 인덱스(Index)는 조건을 만족하는 튜플들을 빠르게 조회하기 위해 사용합니다. 일반적으로 Full Table Scan에는 O(N)의 시간 복잡도가 요구되지만, B+ Tree 기반 인덱스를 사용하면 O(log N), Hash Table 기반 인덱스를 사용하면 O(1)의 시간복잡도로 조회가 가능해집니다. 하지만 통상적으로 인덱스 하나당 테이블의 20% 정도의 추가 저장공간이 필요하고 원본 데이터의 수정이 일어날 때마다 인덱스 수정을 위한 오버헤드가 발생하기 때문에 적절한 상황 판단이 필요합니다. 


Q.  인덱스를 활용하기 좋은 Column에 대해서 설명해주세요.

- 조회가 잦으며, 수정 빈도가 낮고, 카디널리티가 높은(중복도가 낮은) 컬럼이 인덱스를 활용하기에 적합합니다.


 
 

# 네트워크

Q.  OSI 모델과 TCP/IP 모델을 비교해서 설명해주세요.

- OSI 모델과 TCP/IP 모델은 모두 네트워크 통신에 필요한 프로토콜들을 계층화하여 구성한 모델입니다. 하지만 OSI 모델은 이론적인 참조 모델로서 실제 통신에는 사용되지 않지만, TCP/IP 모델은 인터넷 표준 프로토콜로 실질적인 통신을 위해 사용되고 있다는 점에서 차이점이 있습니다.


Q.  TCP와 UDP를 비교해서 설명해주세요.

- TCP와 UDP는 TCP/IP 4계층인 전송 계층에 해당하는 통신 프로토콜입니다. TCP 프로토콜은 연결형 신뢰성 전송 프로토콜입니다. 3-way handshake를 통해 데이터를 전송하기 전에 먼저 논리적 연결을 성립하고, 흐름 제어, 혼잡 제어, 오류 감지 등을 통해 이전 계층인 IP 프로토콜의 한계점을 극복하고 신뢰성을 확보합니다. 하지만 신뢰성 확보를 위해 그만큼 시간 손실이 발생한다는 문제점이 있습니다. 반면 UDP 프로토콜은 비연결형 비신뢰성 프로토콜 입니다. 그렇기 때문에 IP 프로토콜이 갖는 문제점을 그대로 갖는 대신 오버헤드가 적고 속도가 빠르다는 장점이 있습니다.


Q.  3-way handshake에 대해서 설명해주세요.

- 3-way handshake는 TCP/IP 전송 계층에 해당하는 프로토콜인 TCP에서 데이터를 전송하기 전에 먼저 엔드포인트 간의 논리적 연결을 수립하는 과정입니다. 클라이언트가 서버에 연결을 요청하는 SYN 패킷을 보내면, 이를 수신한 서버는 ACK 패킷과 본인의 SYN 패킷을 클라이언트에게 발송합니다. 이를 수신한 클라이언트가 서버에게 ACK 패킷을 전송함으로써 연결이 이루어지고 데이터를 주고 받을 수 있게 됩니다.


Q.  HTTP에 대해서 설명해주세요.

- HTTP는 HyperText Transfer Protocol의 약자로 웹 상에서 정보를 주고 받을 수 있는 통신 프로토콜입니다. 서버-클라이언트 모델을 따르기 때문에 인터페이스와 비즈니스 로직을 구분하기 용이합니다. TCP/IP 기반으로 동작하고 비연결성과 무상태성이 특징입니다.


Q.  URI와 URL의 차이점에 대해서 설명해주세요.

- URI는 Uniform Resource Identifier의 약자로 리소스 식별하는 통합된 방법을 의미합니다. URI는 또다시 URL과 URN으로 분류될 수 있는데 URL은 위치 경로로 리소스를 식별하는 방법, URN은 이름으로 리소스를 식별하는 방법입니다. URN은 자주 사용되지 않기 때문에 일반적인 상황에서 URI는 보통 URL을 지칭하는 경우가 많습니다


Q.  REST API에 대해서 설명해주세요.

- REST는 웹의 장점을 최대한 활용하고자 고안된 하나의 아키텍쳐입니다. REST API는 REST 설계 원칙을 잘 지켜서 개발한 API를 의미하며, 핵심 내용은 URI는 정보의 자원만 표현해야하고 자원의 행위는 HTTP Method로 나타내는 것 등이 있습니다.


Q.  GET과 POST 메서드를 비교해서 설명해주세요.

- HTTP Method는 클라이언트에게 서버에게 요청을 할 때 기대하는 행동을 나타냅니다. REST API에 따라 주요 메서드들에는 행동이 매칭되어 있습니다. GET 메서드는 클라이언트가 서버에게 리소스 조회를 요청할 때 사용하는 메서드입니다. 반면 POST 메서드는 서버에게 전달한 데이터를 처리해줄 것을 요청할 때 사용하는 메서드입니다. GET 메서드는 요청 데이터를 쿼리 스트링을 통해 서버에 전달하고, POST 메서드는 요청 데이터를 바디(Body)에 담아서 서버에 전달한다는 차이점이 있습니다. GET 메서드는 요청 파라미터까지 히스토리에 남아서 캐시가 가능해서 조회에 유리하지만 POST 요청은 캐시가 어렵습니다.


Q.  PUT과 PATCH 메서드를 비교해서 설명해주세요.

- PUT은 서버의 리소스에 대해서 완전한 대체를 요청하는 메서드, PATCH는 서버의 리소스에 대해 부분 변경을 요청하는 메서드입니다. 또한 POST 요청과의 차이점은 해당 리소스를 직접 식별해서 URI를 특정해줘야 한다는 차이점이 있습니다.


Q.  HTTP Status Code에 대해서 설명해주세요.

- 상태 코드(Status Code)는 클라이언트가 보낸 요청에 대한 서버의 응답 코드입니다. 코드는 100번대부터 500번대까지 총 5개의 클래스로 구분되고, 상태 코드를 통해 요청의 성공 혹은 실패 여부를 판단할 수 있습니다. 100번대는 요청이 수신되어 처리중임을 나타내는 클래스입니다. 200번대는 요청이 정상 처리되었음을 나타내는 클래스입니다. 300번대는 요청을 완료하려면 추가적인 행동이 필요하다는 의미로 사용되는 클래스입니다. 400번대는 클라이언트의 요청에 문제가 있어서 서버가 이를 수행할 수 없음을 의미하는 클래스입니다. 500번대는 클라이언트의 유효한 요청에 대해서 서버가 처리에 실패했음을 의미합니다.


Q.  HTTP Status Code 401과 403의 차이점에 대해서 설명해주세요.

- 401 상태코드(Unauthorized)는 클라이언트가 해당 리소스에 대해서 인증이 필요하다는 의미를 나타냅니다. 반면 403 상태코드(Forbidden)는 인증 자격은 증명했지만 접근 권한이 불충분한 경우에 서버가 승인을 거부했다는 의미로 사용됩니다.
 

Q.  쿠키와 세션의 차이점에 대해서 설명해주세요.

- 쿠키와 세션은 서버가 클라이언트의 상태를 유지시키기 위해 사용하는 임시 저장소입니다. 쿠키와 세션의 가장 큰 차이점은 저장되는 위치에 있습니다. 쿠키는 서버가 클라이언트의 컴퓨터에 저장시키는 상태 정보 파일입니다. Key-Value 형태로 구성되며, 속도가 빠르지만 보안성에 취약하다는 단점이 있습니다. 반면 세션은 클라이언트가 브라우저를 종료할 때까지의 상태 정보웹 서버에 저장시키는 파일입니다. 그로 인해 쿠키보다 보안성이 높고 용량 제한이 없지만, 그만큼 서버의 자원을 많이 사용하고, 접근 속도가 느리며 브라우저가 종료되면 삭제된다는 차이점이 있습니다.  


Q.  인증과 인가의 차이점에 대해서 설명해주세요.

- 인증(Authentication)은 해당 사용자가 누구인지를 확인하는 행위, 인가(Authorization)는 사용자가 해당 리소스에 접근 권한이 있는지를 확인하는 행위라고 할 수 있습니다. 인가는 승인이라고도 표현할 수 있으며, 인증 절차를 거친 이후에 진행됩니다.


Q.  JWT에 대해서 설명해주세요.

- JWT는 JSON WEB Token의 약자로 사용자 인증 과정에서 서버에서 서명한 토큰을 발급Stateless한 방식으로 클라이언트의 상태를 유지할 수 있도록 하는 기술입니다. JWT는 헤더(Header)와 내용(Payload), 그리고 서명(Signature)의 세 가지 파트로 구성되어 있습니다. 각 파트는 JSON 포맷으로 구성되어 있으며 Base64로 인코딩된 이후에 마침표(.)로 구분됩니다. 헤더(Header)는 토큰의 타입과 해싱에 사용할 알고리즘 등으로 구성되어 있습니다. 내용(Payload)은 토큰에서 사용할 정보의 조각들을 담고 있으며 이러한 조각들을 클레임(Claim)이라고 부릅니다. 서명(Signature)은 토큰의 유효성을 검증할 때 사용하는 암호화 코드입니다. 서명은 base64로 인코딩한 header와 payload 값을 마침표(.)로 이어붙인 다음 서버에 있는 비밀키로 해싱한 값으로 구성됩니다. 토큰이 탈취될 경우 보안에 취약하므로 유효 기간이 짧은 액세스 토큰(Access Token)토큰 재발급에 사용하며 유효 기간이 긴 리프레쉬 토큰(Refresh Token)을 함께 사용하는 경우가 많습니다.


Q.  웹 브라우저에 www.google.com을 입력할 때 일어나는 과정에 대해서 설명해주세요.

- 웹 브라우저에 구글의 도메인 주소를 입력하게 되면 먼저 해당 도메인 주소로 캐싱된 DNS 기록이 있는지 확인합니다. 만약 없다면 DNS 서버에 해당 주소에 해당하는 IP 주소를 요청합니다. 웹 서버의 IP 주소를 알아낸 다음 3-way handshake로 먼저 TCP 연결을 수립합니다. TCP 연결을 수립한 이후 웹 서버로 입력한 URL에 해당하는 HTTP 요청 메시지를 보냅니다. 이를 수신한 웹 서버는 구글 홈페이지에 대한 내용을 담아 응답 메시지를 전송합니다. 클라이언트의 웹 브라우저는 도착한 응답 메시지를 받아서 렌더링을 하고, 최종적으로 사용자가 구글 홈페이지를 볼 수 있습니다. 

(참고: https://uknowblog.tistory.com/369)

 
 

# 공통 (객체 지향 언어, 디자인 패턴)

Q.  객체와 클래스를 비교해서 설명해주세요.

- 객체는 상태가 있고 행동을 하는 실체를 의미합니다. 클래스는 어떠한 속성이 있고, 어떤 행동을 하는지에 대한 구체적인 설계도를 의미를 합니다. 인스턴스는 이러한 클래스를 기반으로 생성된 실체를 의미합니다.


Q.  OOP의 4가지 특징에 대해서 설명해주세요.

- 객체지향 프로그래밍(Object-Oriented Programming)은 기존의 절차 지향적 프로그래밍에서 벗어나 인간 중심적 프로그래밍을 통해 메시지와 상호작용에 초점을 두고 코드의 재사용성을 높인 프로그래밍을 의미합니다. OOP는 추상화, 캡슐화, 상속, 다형성의 4가지 특징으로 나타낼 수 있습니다. 추상화(Abstraction)는 객체의 공통된 속성이나 행위를 추출하는 작업을 의미합니다. 캡슐화(Encapsulation)는 연관된 속성과 기능을 하나의 클래스로 묶고 외부로부터의 접근을 제어하는 것을 의미합니다. 상속(Inheritance)은 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미합니다.다형성(Polymorphism)은 하나의 객체가 여러 가지 타입을 가질 수 있는 특성을 의미합니다.


Q.  OOP의 5가지 설계 원칙에 대해서 설명해주세요.

- 객체지향 프로그래밍에는 좋은 설계의 기준이 되는 SOLID라는 5가지 설계 원칙이 존재합니다. 단일 책임 원칙(SRP), 개방-폐쇄 원칙(OCP), 리스코프 치환 원칙(LSP), 인터페이스 분리 원칙(ISP), 의존관계 역전 원칙(DIP)입니다. 먼저, 단일 책임 원칙(Single Responsibility Principle, SRP)은 하나의 클래스는 하나의 책임만 갖도록 설계되어야 함을 의미합니다. 개방-폐쇄 원칙(Open-Closed Principle, OCP)은 클래스는 확장에는 열려있으며 수정에는 닫혀있도록 설계되어야 함을 의미합니다. 리스코프 치환 원칙(Liscorf S Principle)은 자식 클래스는 부모가 가능한 행위는 모두 수행할 수 있어야 함을 의미합니다. 인터페이스 분리 원칙(Interface Sepa Principle)은 인터페이스는 각 클라이언트의 목적과 용도에 따라 분리되어서 설계되어야 함을 의미합니다. 의존관계 역전 원칙(Dependency Inversion Principle)은 개별 클래스에 의존하는 것이 아니라 인터페이스에 의존하도록 설계되어야 함을 의미합니다. 


Q.  GC에 대해서 설명해주세요.

- 가비지 컬렉션(Garbage Collection)은 Heap 영역에서 더 이상 사용되지 않는 메모리를 찾아서 해제하는 기능을 의미합니다. 대부분 Mark-Sweep 알고리즘으로 동작하며, 가비지 컬렉션이 수행되는 중에는 실행되고 있던 다른 스레드가 전부 멈추는 Stop-The-World가 발생합니다. 힙 메모리 영역을 Young과 Old 영역으로 구분하고 각각 Minor GC와 Major GC를 구분해서 적용해 이 시간의 발생시간을 최적화합니다.


Q.  캐시에 대해서 설명해주세요.

- 캐시는 자주 조회되는 데이터들을 저장해서 같은 데이터에 대한 반복적인 조회를 줄여주는 역할을 합니다. 이를 통해 성능을 높이고 데이터베이스의 부하를 줄일 수 있습니다. 


Q.  디자인 패턴에 대해서 설명해주세요.




Q.  싱글톤 패턴에 대해서 설명해주세요.




Q.  옵저버 패턴에 대해서 설명해주세요.


 

Q.  Overloading과 Overriding를 비교해서 설명해주세요. 

-


Q.  의존성 주입에 대해서 설명해주세요.




Q.  MVC 패턴에 대해서 설명해주세요.