
CS 면접 질문운영체제(OS) - Process & Thread1. Process를 간단히 설명해주세요.2. (⭐️⭐️⭐️⭐️) Multi process에 대해서 설명해주세요.3. (⭐️⭐️) Multi thread에 대해서 설명해주세요.4. (⭐️⭐️) Mutli process와 Multi thread를 비교설명해주세요.5. (⭐️⭐️) Multi process 환경에서 process간에 데이터를 어떻게 주고 받을까요?6. (⭐️) Mutli process/thread 환경에서 동기화 문제를 어떻게 해결하나요?7. 교착상태(Deadlock)에 대해서 간단히 설명해 주세요.운영체제(OS) - Memory1. paging이란 무엇인가요?2. segmentation에 대해서 설명해 주세요.3. (⭐️) 가상메모리에 대해서 설명해주세요.데이터베이스 - DB 구조 & 설계1. Primary key가 무엇인지 설명해주세요.2. Primary Key와 Foreign Key에 대해 설명해 주세요.3. Candidate key에 대해 설명하시오4. alternate key에 대해 설명하시오.5. Composite key에 대해 설명하시오6. 관계형 데이터베이스의 N:M 관계에 대해서 설명해 주세요.7. 1:N 관계에 대해서 설명해 주세요.8. left outer join, inner join 차이를 설명해 주세요.9. (⭐️) RDB - NoSQL을 비교 설명해주세요.데이터 베이스 - Transaction1. (⭐️⭐️) Transaction을 간단히 설명해 주세요.2. (⭐️) DeadLock이란 무엇인지 설명해 주세요.데이터 베이스 - Index1. Index가 왜 필요한가요?2. SELECT의 성능을 높일 수 있는 방법은 뭐가 있을까요?3. index를 많이 생성하면 안되나요?4. (⭐️⭐️⭐️⭐️) index를 어느 column에 사용하는 것이 좋을까요?5. Index를 쓰면 성능이 좋아지니까 모든 컬럼에 인덱스를 사용하면 성능이 더 좋아질까요?6. 우리 회사 고객 DB에서 성별 column에 index를 걸어주는게 좋을까요?7. true 또는 false 값을 갖는 column에서, true 1%, false99%의 비율로 구성된 상황에서는 index를 거는게 좋을까요?8. (⭐️) 데이터를 검색할 때 hash table의 시간복잡도는 O(1)이고 b+tree는 O(logN)으로 더 느린데 왜 index는 hash table이 아니라 b+tree로 구현되나요?네트워크 - TCP/IP1. OSI 7계층과 TCP/IP 4계층을 비교하여 설명해주세요.2. (⭐️) TCP vs UDP를 비교해서 설명해주세요.3. 3-way handshake는 무엇이고 각 과정은 어떻게 되나요?네트워크 - HTTP1. HTTP가 무엇인지 설명해주세요.2. (⭐️⭐️) HTTP request method 중 GET vs POST를 비교 설명해주세요.3. HTTP requst method 중 Put vs Patch을 비교 설명해주세요.4. Http status code에 대해서 설명해주세요.5. (⭐️⭐️) www.google.com을 주소창에 쳤을 때 화면에 나오기까지의 과정을 네트워크 관점으로 설명해주세요.네트워크 - Authorization1. (⭐️) 쿠키와 세션의 차이점을 설명해주세요.2. 세션이 보안도 좋은데 쿠키를 사용하는 이유는 무엇인가요?3. 쿠키와 세션을 이용한 로그인 방식을 화이트보드에 설명해주세요.4. JSESIONID에 대해서 설명 해주세요.자료구조 - Array & LinkedList1. LinkedList에 대해서 설명해주세요.2. (⭐️) Array vs LinkedList를 비교해서 설명해주세요.3. 어느 상황에서 LinkedList를 쓰는게 Array보다 더 나을까요?4. 어느 상황에서 Array를 쓰는게 LinkedList보다 더 나을까요?5. Array와 Linked List의 memory allocation은 언제 일어나며, 메모리의 어느 영역을 할당 받나요?자료구조 - Hash table & BST(Binary Search Tree)1. (⭐️⭐️) BST는 어떤 자료 구조인가요?2. BST의 worst case 시간복잡도는 입니다. 어떠한 경우에 worst case가 발생하나요? 3. (⭐️⭐️) Hash table은 어떤 자료구조 인가요?4. (⭐️⭐️⭐️⭐️) Hashtable에서 collision이 발생한 경우 어떻게 되고, 해결방법은 무엇인가요?5. worst case의 시간복잡도는 이라고 했는데 어떤 상황인가요?자료구조 - Queue & Stack1. Queue는 무슨 자료구조 인가요?2. Stack은 어떤 자료구조인가요?3. Stack 두 개를 이용하여 Queue를 구현해 보세요.4. Queue 두 개를 이용하여 Stack을 구현해 보세요.5. (⭐️) Queue vs priority queue를 비교하여 설명해주세요.모의면접모의면접 11. 자기소개를 1분정도 간단히 해주세요.2. hash table이 뭔지 설명해주실 수 있나요?3. http의 get과 post의 차이점을 말씀해주세요.4. 삽입정렬에 대해서 설명해 주세요.5. DB사용되는 Transaction에 대해서 간단하게 설명해주시겠어요6. 지원자님께서 저희에게 물어볼 것이 있거나, 못다한 말이 있다면 간단히 해주세요모의면접 21. 자기소개를 1분정도 간단히 해주세요.2. 멀티쓰레드와 멀티 프로세스를 비교 설명해 주세요3. heap 자료구조에 대해서 아시나요4. 이진 탐색 트리에서 저장된 정보가 256개 일 때, 탐색횟수는 몇번일까요?5. RDB에서 index가 왜 필요할까요?6. 지원자님께서 저희에게 물어볼 것이 있거나, 못다한 말이 있다면 간단히 해주세요모의면접 31. 3분정도 시간을 드릴테니 편안하게 자기소개를 해주세요.2. Linked list에 대해서 간단히 설명해 주세요.2-1. Linked list와 Array를 비교해서 설명해주세요.2-2. 어느 상황에 Array보단 Linked list를 쓰는게 좋을까요.2-3. Dynamic array에 대해서 간단히 설명해 주세요.3. 웹서비스에서 REST API의 특성에 대해서 갖추야 하는 조건을 생각나는 대로 말씀해주시겠어요?3-1. REST API가 왜 이런 특성들을 갖춰야하나요? 무슨 장점이 있길래,3-2. 그럼 모든 웹 API들이 RESTful하게 만들면 좋겠네요?4. 가상 메모리에 대해서 간단히 설명해 주세요5. NoSQL을 프로젝트에서 사용해보신 적 있으신가요?5-1. NoSQL의 장점이 어떤게 있을까요?5-2. RDB의 장점은 어떤게 있을까요?모의면접 41. 자기소개를 1분정도 간단히 해주세요.2. hash table의 검색 시간복잡도는 어떻게 되나요?3. RDB에서 사용되는 JOIN의 종류 아는대로 말씀해주세요4. www.google.com을 주소창에 쳤을 때 화면이 나오기까지의 과정을 설명해 주세요.5. TCP와 UDP를 비교해서 설명해 주세요.6. 쿠키와 세션을 비교해서 설명해 주세요.7. 지원자님께서 저희에게 물어볼 것이 있거나, 못다한 말이 있다면 간단히 해주세요
CS 면접 질문
운영체제(OS) - Process & Thread
1. Process를 간단히 설명해주세요.
[답안]
실행파일(program)이 memory에 적재되어 CPU를 할당받아 실행되는 것을 process라고 합니다.
[내 답변]
프로세스란 한 프로그램이 CPU로 부터 자원을 할당받은 한 단위입니다. 프로세스가 메모리에 올라가면서 프로그램이 실행 되며, 프로세스 안에는 여러 개의 스레드가 존재합니다. 그리고 프로세스는 서로의 데이터를 참조 할 수 없습니다.
2. (⭐️⭐️⭐️⭐️) Multi process에 대해서 설명해주세요.
[답안]
Multi process란 2개 이상의 process가 동시에 실행되는 것을 말합니다. 동시에라는 말은 동시성(concurrency)과 병렬성(parallelism) 두 가지를 의미합니다.
동시성은 CPU core가 1개일 때, 여러 process를 짧은 시간동안 번갈아 가면서 연산을 하게 되는 시분할 시스템(time sharing system)으로 실행되는 것입니다.
병렬성은 CPU core가 여러개일 때, 각각의 core가 각각의 process를 연산함으로써 process가 동시에 실행되는 것입니다.
[내 답변]
멀티 프로세스란 여러 개의 프로세스가 병렬적으로 실행되는 것을 뜻한다. 코어가 하나인 경우에는 복수의 프로세스가 번갈아 가면서 실행되고, 코어가 여러개인 경우 각 코어 당 하나 이상의 프로세스가 동시에 실행된다.
3. (⭐️⭐️) Multi thread에 대해서 설명해주세요.
[답안]
thread는 한 process 내에서 실행되는 동작(기능 function)의 단위입니다. 각 thread는 속해있는 process의 Stack 메모리를 제외한 나머지 memory 영역을 공유할 수 있습니다.
Multi thread란 하나의 process가 동시에 여러개의 일을 수행할수 있도록 해주는 것입니다. 즉, 하나의 process에서(실행이 된 하나의 program에서) 여러 작업을 병렬로 처리하기 위해 multi thread를 사용합니다. multi thread에서는 한 process 내에 여러 개의 thread가 있고, 각 thread들은 Stack 메모리를 제외한 나머지 영역(Code, Data, Heap) 영역을 공유하게 됩니다.
[내 답변]
멀티 쓰레드는 하나의 프로세스 안에서 병렬로 실행되는 작업 단위를 뜻합니다. 각 쓰레드는 프로세스 내의 자원을 공유 하면서 협력적으로 작업할 수 있습니다.
4. (⭐️⭐️) Mutli process와 Multi thread를 비교설명해주세요.
[답안]
- multi thread는 multi process보다 적은 메모리 공간을 차지하고
Context Switching
이 빠릅니다.
- multi process는 multi thread보다 많은 메모리공간과 CPU 시간을 차지합니다.
- multi thread는 동기화 문제와 하나의 thread 장애로 전체 thread가 종료될 위험이 있습니다.
- multi process는 하나의 process가 죽더라도 다른 process에 영향을 주지 않아 안정성이 높습니다.
- 메모리 구분이 필요할 때는 multi process가 유리하고 컨텍스트 스위칭이 자주 발생하고 데이터 공유가 빈번한 경우 그리고 자원을 효율적으로 사용해야 되는 경우에는 multi thread를 사용하는 것이 유리하다.
[내 답변]
멀티 프로세스와 멀티 쓰레드를 비교 설명해보겠습니다. 멀티 프로세스는 여러 프로그램이 메모리에 올라가 코어에 의해 교차 혹은 병렬적으로 실행되는 것을 뜻합니다. 각 프로세스는 독립된 메모리 공간을 가지며 서로 영향을 주지 않습니다. 멀티 쓰레드는 하나의 프로세스 안에 여러 개의 쓰레드가 병렬적으로 실행되는 것을 뜻합니다. 멀티 쓰레드는 프로세스의 자원을 공유할 수 있습니다. 쓰레드 간 동기화를 주의해야 합니다.
5. (⭐️⭐️) Multi process 환경에서 process간에 데이터를 어떻게 주고 받을까요?
[답안]
원칙적으로 process는 독립적인 주소 공간을 갖기 때문에, 다른 process의 주소 공간을 참조할 수 없습니다. 하지만 경우에 따라 운영체제는 process 간의 자원 접근을 위한 매커니즘인 프로세스 간 통신(IPC, Inter Process Communication)를 제공합니다.
프로세스 간 통신(IPC) 방법으로는 파이프, 파일, 소켓, 공유메모리 등을 이용한 방법이 있습니다.
[내 답안]
멀티 프로세스 환경에서 프로세스간 데이터를 주고 받는 방법은 프로세스는 서로의 주소 공간을 참조할 수 없기 때문에, 프로세스간 통신을 통해서 데이터를 주고 받습니다. 프로세스간 데이터를 주고 받는 방식은 파일, 소켓, 공유 메모리, 메시지 큐 방식이 있습니다.
메세지 큐 방식은 메세지 큐를 사용하여 프로세스는 서로 비동기적으로 메세지를 주고 받습니다.
6. (⭐️) Mutli process/thread 환경에서 동기화 문제를 어떻게 해결하나요?
[답안]
동기화문제를 해결하기 위해 mutex, semaphore 기법 등을 사용할 수 있습니다.
Mutex란 1개의 스레드만이 공유 자원에 접근할 수 있도록 하여, 경쟁 상황(race condition)를 방지하는 기법입니다. 공유 자원을 점유하는 thread가 lock을 걸면, 다른 thread는 unlock 상태가 될 때까지 해당 자원에 접근할 수 없습니다.
Semaphore란 S개의 thread만이 공유 자원에 접근할 수 있도록 제어하는 동기화 기법입니다. Semaphore 기법에서는 정수형 변수 S(세마포) ****값을 가용한 자원의 수로 초기화하고, 자원에 접근할 때는
S--
연산을 수행하여 세마포 값을 감소시키고 자원을 방출할 때는 S++
연산을 수행하여 세마포 값을 증가시킵니다. 이 때 세마포 값이 0이 되면 모든 자원이 사용 중임을 의미하고, 이후 자원을 사용하려는 프로세스는 세마포 값이 0보다 커질 때까지 block 됩니다.[내 답안]
멀티 스레드 환경에서 동기화 문제를 해결하기 위한 주요 방법 중 하나는 락(또는 뮤텍스)을 사용하는 것입니다. 여러 스레드가 공유 자원에 동시에 접근하는 것을 방지하기 위해 락을 사용하여 특정 스레드만 공유 자원에 접근할 수 있도록 합니다. 공유자원을 점유하는 스레드가 락을 걸면 다른 스레드는 해당 스레드가 언락하기 전엔 접근할 수 없습니다.
7. 교착상태(Deadlock)에 대해서 간단히 설명해 주세요.
[답안]
둘 이상의 thread가 각기 다른 thread가 점유하고 있는 자원을 서로 기다릴 때, 무한 대기에 빠지는 상황을 말합니다.
deadlock이 발생하는 조건은 상호 배제(mutual exclusion), 점유 대기(hold-and-wait), 비선점(no preemption), 순환 대기(circular wait)입니다. 이 4가지 조건이 동시에 성립할 때 발생할 수 있습니다.
deadlock 문제를 해결하는 방법에는 무시, 예방, 회피, 탐지-회복의 4가지 방법이 있습니다
[Deadlock 발생조건 및 해결방법]
🔒 Deadlock 발생 조건
- 상호 배제 - 동시에 한 thread만 자원을 점유할 수 있는 상황
- 점유대기 - thread가 자원을 보유한 상태에서 다른 thread가 보유한 자원을 추가로 기다리는 상황
- 비선점 - 다른 thread가 사용 중인 자원을 강제로 선점할 수 없는 상황
- 순환 대기 - 대기 중인 thread들이 순환 형태로 자원을 대기하고 있는 상황
🔒 Deadlock 해결 방법
- 무시 - 아무런 조치를 취하지 않음
- 예방 - 교착 상태의 4가지 발생 조건 중 하나가 성립하지 않게 함 (순환대기의 예방이 현실적)
- 회피 - thread가 앞으로 자원을 어떻게 요청할지에 대한 정보를 통해 순환 대기 상태가 발생하지 않도록 자원을 할당
- 자원 할당 그래프 알고리즘, 은행원 알고리즘
- 탐지-회복 - 시스템 검사를 통해 deadlock 발생을 탐지하고 이를 회복 시키는 방법
[내 답안]
교착상태란 멀티 스레드 환경에서 둘 이상의 스레드가 각기 다른 스레드가 점유하고 있는 자원을 서로 상대방의 작업이 끝날 때까지 무한 대기 하는 상황을 뜻합니다. 교착상태(데드락)가 발생하는 조건은 상호배제, 점유대기, 비선점, 순환 대기입니다. 교착상태를 예방하기 위해서는 위 네가지 조건 중 하나를 깨뜨리면 됩니다.
교착 상태의 4가지 발생 조건 중 하나가 성립하지 않게 하는 것이 가장 효과 적이다.
- 상호배제(Mutual Exclusion) 조건 해소:
- 예시: 자원을 공유 가능한 자원으로 변경. 여러 스레드가 동시에 해당 자원에 접근할 수 있도록 함.
- 점유대기(Hold and Wait) 조건 해소:
- 예시: 자원을 한 번에 모두 요청하도록 변경. 스레드는 모든 필요한 자원을 확보한 후에만 작업을 시작하도록 함.
- 비선점(No Preemption) 조건 해소:
- 예시: 우선순위가 낮은 스레드가 우선순위가 높은 스레드의 자원을 강제로 해제할 수 있도록 함.
- 순환 대기(Circular Wait) 조건 해소:
- 예시: 자원에 고유한 번호를 부여하고, 스레드는 오직 오름차순이나 내림차순으로만 자원을 요청하도록 함.
운영체제(OS) - Memory
1. paging이란 무엇인가요?
[답안]
paging이란 process가 할당받은 메모리 공간을 일정한 page 단위로 나누어, 물리 메모리에서 연속되지 않는 서로 다른 위치에 저장하는 메모리 관리 기법입니다.
2. segmentation에 대해서 설명해 주세요.
[답안]
segmentation이란 process가 할당받은 메모리 공간을 논리적 의미 단위(segment)로 나누어, 연속되지 않는 물리 메모리 공간에 할당될 수 있도록 하는 메모리 관리 기법입니다.
3. (⭐️) 가상메모리에 대해서 설명해주세요.
[답안]
가상 메모리(virtual memory)란 process 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법입니다. 가상 메모리 기법을 통해 사용자 프로그램이 물리적 메모리보다 커져도 실행이 가능하다는 장점이 있습니다.
데이터베이스 - DB 구조 & 설계
1. Primary key가 무엇인지 설명해주세요.
[답안]
candidate key 중 선택한 main key로써, 각 row를 unique하게 구분하는 column(또는 column의 집합)을 말합니다. 그래서 기본키는 Null 값을 가질 수 없고, 중복된 값을 가질 수 없습니다. 기본키는 table당 1개만 지정해야합니다.
2. Primary Key와 Foreign Key에 대해 설명해 주세요.
[답안]
Primary key는 candidate key 중 선택한 main key로써, Null 값을 가질 수 없고, 중복된 값을 가질 수 없습니다. Candidate key 중 선택했으므로 유일성과 최소성을 만족합니다.
Foreign key는 다른 table의 Primary key column과 연결되는(참조되는) table의 column을 의미합니다
3. Candidate key에 대해 설명하시오
[답안]
Candidate key는 table을 구성하는 column들 중에서 최소성과 유일성을 만족하는 column 또는 column의 집합입니다. 즉 primary key로 사용할 수 있는 column들을 말합니다.
- 최소성 : 키를 구성하는 속성(칼럼)들 중 꼭 필요한 최소한의 속성(칼럼)들로만 키를 구성하는 성질
- 주민등록번호 - 최소성 만족
- 주민등록번호 + 나이 + 이름 - 최소성 불만족
4. alternate key에 대해 설명하시오.
[답안]
primary key를 제외한 나머지 candidate key들을 말합니다. 대체키/보조키라고도 부릅니다.
5. Composite key에 대해 설명하시오
[답안]
Composite Key란 table에서 각 row를 식별할 수 있는 두 개 이상의 column으로 구성된 key를 말한다 (최소성이랑 관련이 없음)
6. 관계형 데이터베이스의 N:M 관계에 대해서 설명해 주세요.
[답안]
관계형 데이터베이스에서 양쪽 entity 모두가 서로에게 1:N 관계를 갖는 구조를 말합니다. 주로 매핑 테이블을 사용한다. 예) 주문과 상품 관계
7. 1:N 관계에 대해서 설명해 주세요.
[답안]
관계형 데이터베이스에서 하나의 entity(table)가 관계를 맺은 entity의 여러 객체를 가질 수 있는 구조를 말합니다.
8. left outer join, inner join 차이를 설명해 주세요.
[답안]
Join이란 두 개 이상의 테이블을 서로 연결하여 하나의 결과를 만들어 보여주는 것을 말합니다.
inner join(또는 join)은 두 테이블에 모두 있는 내용만 join되는 방식입니다.
left outer join(또는 left join)은 왼쪽 table의 모든 행에 대해서 join을 진행합니다.
9. (⭐️) RDB - NoSQL을 비교 설명해주세요.
[답안]
관계형 데이터베이스(RDB)는 사전에 엄격하게 정의된 DB schema를 요구하는 table 기반 데이터 구조를 갖습니다.
NoSQL(비관계형 데이터베이스)은 table 형식이 아닌 비정형 데이터를 저장할 수 있도록 지원합니다.
RDB는 엄격한 schema로 인해 데이터 중복이 없기 때문에 데이터 update가 많을 때 유리합니다.
NoSQL의 경우 데이터 중복으로 인해 데이터 update 시 모든 컬렉션에서 수정이 필요하기 때문에 update가 적고 조회가 많을 때 유리합니다.
[NoSQL (Key-value storage system)]
MongoDB 예시
db.createCollection("student")
db.student.insert({"id": 2022394, "name": "Nossi", "class": ["Math", "Eng"]})
db.student.insert({"id": 2021921, "name": "Bob", "class": ["Eng"]})
db.student.find() // Fetch all students in JSON format
db.student.findOne({"id": 2022394}) // Find one matching student
db.student.remove({"name": "Nossi"}) // Delete matching students
db.student.drop() // Drops the entire collection
ㅤ | RDB | NoSQL |
데이터 저장 모델 | ㅤ | ㅤ |
개발 목적 | ㅤ | ㅤ |
데이터 베이스 - Transaction
1. (⭐️⭐️) Transaction을 간단히 설명해 주세요.
[답안]
transaction는 데이터베이스 내에서 수행되는 작업의 최소 단위로, 데이터베이스의 무결성을 유지하며 DB의 상태를 변화시키는 기능을 수행합니다. transaction은 하나 이상의 query를 포함해야 하고, ACID라고 칭해지는 원자성, 일관성, 고립성, 지속성의 4가지 규칙을 만족해야합니다.
[ACID]
트랜잭션은 데이터베이스의 무결성을 유지하기 위해 원자성, 일관성, 고립성, 지속성의 성질을 갖습니다.
- Atomicity(원자성) : transaction에 포함된 작업은 전부 수행되거나 아니면 전부 수행되지 말아야 합니다.(all or nothing)
- 데이터베이스는 COMMIT과 ROLLBACK 명령어를 통해 데이터 무결성을 보장합니다.
- Consistency(일관성): transaction이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 송금 전후 모두 잔액의 data type은 integer이여야 한다는 것이 일관성의 한 예가 될 수 있습니다.
- Isolation(고립성): 여러 Transaction은 동시에 수행됩니다. 이때 각 transaction은 다른 transaction의 연산 작업이 끼어들지 못하도록 보장하여 독립적으로 작업을 수행합니다. 따라서 동시에 수행되는 transaction이 동일한 data를 가지고 충돌하지 않도록 제어해줘야 합니다. 이를 동시성제어(concurrency control) 라고합니다.
- Durability(지속성): 성공적으로 수행된 transaction은 데이터베이스에 영원히 반영되어야 함을 의미합니다. transaction이 완료되어 저장이 된 데이터베이스는 저장 후에 생기는 정전, 장애, 오류 등에 영향을 받지 않아야 합니다.
[동시성 제어]
여러 개의 transaction이 한 개의 데이터를 동시에 갱신(update)할 때 어느 한 transaction의 갱신이 무효화 될 수 있는데 이를 갱신손실이라고 합니다. 동시성제어를 통해 갱신손실을 미리 막을 수 있습니다. 즉, transaction이 동시에 수행될 때 일관성을 해치지 않도록 transaction의 데이터 접근을 제어하는 DBMS의 기능을 동시성제어라고 합니다.
갱신손실 문제를 해결하기 위한 방법중에 하나로 데이터를 수정중에 있는 transaction은 해당 데이터를 Lock으로 잠금장치를 하여 다른 Transaction이 접근하지 못하게 하는 방법이 있습니다. Lock이 걸린 데이터는 Unlock이 될 때까지 다른 Transaction들은 접근하지 못하고 기다려야 합니다.
2. (⭐️) DeadLock이란 무엇인지 설명해 주세요.
[답안]
데이터베이스 deadlock(교착 상태)이란, 여러 transaction들이 각각 자신의 데이터에 대하여 lock을 획득한 상태에서 상대방 데이터에 대하여 접근하고자 대기를 할 때 교차 대기를 하게 되면서 서로 영원히 기다리는 상태를 말합니다.
[Deadlock 해결방안]
두 transaction이 각각 lock을 설정하고, unlock을 하지 않은 상태에서 서로의 lock이 걸린 데이터에 접근하려고 할 때, 서로 대기를 계속하여 영원히 처리되지 않는 상황이 발생합니다.
deadlock을 해결하는 방법은 다음과 같습니다.
- 예방기법: 각 transaction이 실행되기 전에 필요한 데이터를 모두 Locking 해주는 것입니다. 하지만 locking해줘야 하는 데이터가 많다면 사실상 모든 데이터를 전부 locking한 것과 동일하여 transaction의 병행성을 보장하지 못할 수 있습니다.
- 회피기법: 자원을 할당할 때 timestamp를 사용하여 deadlock가 일어나지 않도록 회피하는 방법입니다.
- 탐지/회복 기법: Transaction이 실행되기 전에는 아무런 검사를 하지 않고, deadlock이 발생하면 이를 감지하고 회복시키는 방법입니다.
즉, deadlock을 해결하려면 각 transaction이 실행되기 전에 사용될 모든 데이터를 미리 locking을 해주는 예방기법이 있고, 자원 할당시 timestamp를 사용하여 deadlock이 발생하지 않도록 회피하는 기법이 있습니다. 또한 deadlock이 발생하면 이를 감지하고 회복시키는 탐지/회복기법이 있습니다.
데이터 베이스 - Index
1. Index가 왜 필요한가요?
[답안]
Index는 데이터베이스에서 table의 검색 성능을 높여주는 대표적인 방법중 하나입니다. 일반적인 RDBMS(관계형데이터베이스)에서는 B+Tree구조로 된 index를 사용하여 검색속도를 향상시킵니다.
index는 책마다 마지막 페이지에 있는 색인(index)과 같은 역할을 하는 자료구조입니다. 책에서 어떤 용어나 단어를 찾기위해 첫 페이지부터 끝 페이지 까지 전체를 훑지 않아도(Full Table Scan) index를 찾아보면 몇 페이지에 적혀 있는지 바로 찾을 수 있는 것(Index Scan)과 비슷합니다.
SELECT ~WHERE query를 통해 특정 조건을 만족하는 데이터를 찾을 때, full table scan할 필요 없이 정렬되어 있는 index에서 훨씬 빠른 속도로 검색을 할 수 있게 됩니다.
[Index 구조]
index는 대부분 B+Tree 자료구조로 이루어져 있어, WHERE 조건과 일치하는 데이터들의 저장위치를 훨씬 빠르게 찾을 수 있습니다.
Index는 Btree, B+tree, Hash, Bitmap로 구현될 수 있습니다. 많은 데이터베이스 시스템에서 index는 B+tree구조를 가집니다. index를 생성하게 되면 특정 column(속성, attribute)의 값을 기준으로 정렬하여 데이터의 물리적 위치와 함께 별도 파일에 저장합니다. 이 때, Index에 저장되는 속성 값을 search-key값이라고 하고 실제 데이터의 물리적 위치를 저장한 값을 pointer라고 합니다. 즉, index는 순서대로 정렬된 search-key값과 pointer값만 저장하기 때문에 table보다 적은 공간을 차지합니다.
정리해보면 특정 column을 search-key 값으로 설정하여 index를 생성하면, 해당 search-key 값을 기준으로 정렬하여 (search-key, pointer)를 별도 파일에 저장합니다. 이를 index라고 합니다.
[Index 사용하는 이유]
Table에 데이터를 지속적으로 저장하게 되면 내부적으로 순서 없이 쌓이게 됩니다. 이 경우에 특정 조건을 만족하는 데이터를 찾고자 WHERE절을 사용한다면 Table의 row(record)를 처음부터 끝까지 모두 접근하여 검색조건과 일치하는지 비교하는 과정이 필요합니다. 이를 Full Table Scan이라고 합니다.
하지만 특정 coloumn에 대한 Index를 생성해 놓은 경우 해당 속성에 대하여 search-key가 정렬되어 저장되어 있기 때문에 조건 검색(SELECT ~ WHERE) 속도가 굉장히 빠릅니다.
[clustering index & secondary index]
- clustering index: 특정 column을 기본키(primary key)로 지정하면 자동으로 클러스터형 인덱스가 생성되고, 해당 column 기준으로 정렬이 됩니다. Table 자체가 정렬된 하나의 index인 것입니다. 마치 영어사전처럼 책의 내용 자체가 정렬된 것을 떠올리면 쉽습니다.
- secondary index : 일반 책의 찾아보기와 같이 별도의 공간에 인덱스가 생성됩니다.
create index
와 같이 index를 생성하기를 하거나 고유키(unique key)로 지정하면 보조 인덱스가 생성됩니다.
[Index의 장단점]
Index의 최대 장점은 검색 속도 향상 (SELECT~WHERE~ ) 입니다. 테이블을 만들고 안에 데이터가 쌓이게 되면 테이블의 record는 내부적으로 순서가 없이 뒤죽박죽으로 저장됩니다. 이렇게 되면 WHERE절을 통해 특정 조건에 맞는 데이터들을 찾아낼 때에도 reocrd의 처음부터 끝까지 다 읽어서 검색 조건과 맞는지 비교해야 합니다. 이것을 Full Table Scan이라고 합니다. 반면에 index를 생성하면 index에는 데이터들이 정렬되어 저장되어 있기 때문에 검색 조건에 일치하는 데이터들을 빠르게 찾아낼 수 있습니다. 이것이 Index를 사용하는 가장 큰 이유입니다.
Index의 단점으로는 크게 두 가지가 있습니다.
- 추가 저장공간 필요
index를 생성하면 index 자료구조를 위한 저장 공간이 추가적으로 필요합니다. 보통 table의 크기의 10%정도의 공간을 차지합니다.
- 느린 데이터 변경 작업
검색이 아닌 데이터 변경을 할 때, 즉 INSERT, UPDATE, DELETE가 자주 발생하면 성능이 나빠질 수 있습니다. 그 이유는 보통 B+tree구조의 index는 데이터가 추가 삭제 될 때마다 tree의 구조가 변경될 수 있기 때문입니다. 즉 인덱스의 재구성이 필요하기 때문에 추가적인 자원이 소모됩니다.
2. SELECT의 성능을 높일 수 있는 방법은 뭐가 있을까요?
[답안]
SELECT query의 성능을 높이는 가장 대표적인 방법중에 하나는 Index를 사용하는 것입니다. index를 사용하게 되면 SELECT WHERE절처럼 특정 조건을 만족하는 데이터를 검색할 때 table의 모든 데이터를 살펴볼 필요 없이 index에서 빠르게 해당 데이터에 접근할 수 있게 됩니다.
3. index를 많이 생성하면 안되나요?
[답안]
index를 생성하면 조건 검색 성능이 향상될 수 있습니다. 하지만 추가 저장공간이 필요하고, 데이터를 추가/수정/삭제를 할 때마다 관련 index를 모두 수정해줘야 되기 때문에 시간이 추가적으로 소요됩니다. 따라서 추가 저장공간과, 데이터 업데이트시 소요되는 추가 시간등을 복합적으로 고려하여 조건 검색의 성능향상이 더 큰 이득이 된다고 판단되는 column에만 index를 생성하는 것이 좋습니다.
4. (⭐️⭐️⭐️⭐️) index를 어느 column에 사용하는 것이 좋을까요?
[답안]
index는 where 절에서 자주 조회되고, 수정 빈도가 낮으며, 카디널리티는 높고, 선택도가 낮은 column을 선택해서 설정하는 것이 가장 좋습니다.
- 높은 카디널리티 - 데이터 중복도가 낮다.
[Index 효과적으로 사용하는 방법]
- SELECT WHERE절에 자주 사용되는 or Join 조건으로 자주 사용되는 Column에 대해 index를 생성하는 것이 좋습니다.
- 데이터 수정 빈도가 낮을수록 적합합니다. insert / update / delete 작업 시, 데이터에 변화가 생기기 때문에 index에서는 매번 정렬을 다시 해야합니다. 이에 따른 부하가 발생하기 때문에 수정 빈도가 낮은 column을 index로 설정하면 좋습니다.
- 데이터의 중복이 높은 column은 index 효과가 별로 없습니다. 예를 들어 성별은 종류가 2 가지 밖에 없으므로 index를 생성하지 않는 것이 좋습니다. 즉, 선택도가 낮을 때 유리합니다.(보통 5~10% 이내)
- 데이터의 양이 많을 수록 index로 인한 성능향상이 더 큽니다. 데이터 양이 적다면 index의 혜택보단 손해가 더 클 수 있습니다.
- 한 table에 index가 너무 많은면 데이터 수정시 소요되는 시간이 너무 길어질 수 있습니다. (table당 4~5개 정도 권장)
5. Index를 쓰면 성능이 좋아지니까 모든 컬럼에 인덱스를 사용하면 성능이 더 좋아질까요?
[답안]
그렇지 않습니다. 일단 index는 SELECT WHERE절에 대해서만 성능향상을 해줍니다. 이외에 데이터를 수정하게 되면 모든 index를 업데이트(+정렬)해야 하기 때문에 오히려 성능저하를 초래합니다. 또한 index를 생성할 때마다 저장공간도 차지하기 때문에 무분별하게 생성해서는 안됩니다.
6. 우리 회사 고객 DB에서 성별 column에 index를 걸어주는게 좋을까요?
[답안]
성별처럼 남녀 두 종류로만 나눠지는 경우에는 카디널리티가 매우 낮게 됩니다. 이 경우, index가 주는 이점이 매우 적고 오히려 저장공간 차지와 데이터 수정시 성능저하등을 고려하여 index를 생성하지 않는 것이 좋습니다.
7. true 또는 false 값을 갖는 column에서, true 1%, false99%의 비율로 구성된 상황에서는 index를 거는게 좋을까요?
[답안]
아무리 1%, 99%로 비율에 차이가 있어도, true / false 두 종류로만 나눠지는 경우에는 카디널리티가 매우 낮게 됩니다. 이 경우, index가 주는 이점이 매우 적고 오히려 저장공간 차지와 데이터 수정시 성능저하등을 고려하여 index를 생성하지 않는 것이 좋습니다.
8. (⭐️) 데이터를 검색할 때 hash table의 시간복잡도는 O(1)이고 b+tree는 O(logN)으로 더 느린데 왜 index는 hash table이 아니라 b+tree로 구현되나요?
[답안]
Hash table을 사용하면 하나의 데이터를 탐색하는 시간은 O(1)로 b+tree보 다 빠르지만, 값이 정렬되어 있지 않기 때문에 부등호를 사용하는 query에 대해서는 매우 비효율적이게 되어 데이터를 정렬해서 저장하는 b+tree를 이용합니다.
즉, 하나의 값만을 가져올 때는 Hash Table이 더 효율적일 수 있지만, 일정 범위의 값들을 찾을 때는 B+tree가 적합합니다.
[B+tree]
🚀 B+tree가 DB index를 위한 자료구조로 적합한 이유
- 항상 정렬된 상태를 유지하여 부등호 연산에 유리합니다.
- 데이터 탐색뿐 아니라, 저장, 수정, 삭제에도 항상 O(logN)의 시간 복잡도를 갖습니다.
#️⃣ Hash Index
hash index는 빠른 데이터 검색$O(1)$이 필요할 때 유용합니다. 하지만 index로써 hash index가 사용되는 경우는 제한적입니다. 왜냐하면 hash index는 등호(=) 연산에만 특화되었기 때문입니다.
네트워크 - TCP/IP
1. OSI 7계층과 TCP/IP 4계층을 비교하여 설명해주세요.
[답안]
OSI 7계층은 네트워크 통신을 표준화한 모델로, 통신 시스템을 7단계로 나누어 설명한 것입니다.
하지만 OSI 모델이 실무적으로 이용하기에 복잡한 탓에 실제 인터넷에서는 이를 단순화한 TCP/IP 4계층이 사용되고 있습니다.
[OSI 7계층과 TCP/IP 4계층]
OSI 7계층과 TCP/IP 4계층 모델에서 각 계층은 하위 계층의 기능을 이용하고, 상위 계층에게 기능을 제공합니다. 예를 들어서 HTTP는 TCP과 IP을 이용해서 작동합니다.
일반적으로 상위 계층의 프로토콜은 소프트웨어로, 하위 계층의 프로토콜은 하드웨어로 구현됩니다.
(ex. 물리 계층의 통신은 케이블을 통한 전기 신호로 이루어집니다.)

[캡슐화 & 역캡슐화]
캡슐화란 통신 프로토콜의 특성을 포함한 정보를 Header에 포함시켜서 하위 계층에 전송하는 것을 말합니다. 통신 상대측에서 이러한 Header를 역순으로 제거하면서 원래의 Data를 얻는 과정을 역캡슐화라고 합니다.
예를 들어, 사용자는 최상위 계층인 응용 계층에서 인터넷 접속(HTTP), 메일 전송(SMTP), 파일 전송(FTP), 원격 로그인(Telnet) 등의 작업을 수행합니다.
각 사용자입장에서 보면 data가 그냥 전송되는 것처럼 보이게 됩니다. 하지만 이 과정을 OSI 7계층 관점의 캡슐화 / 역캡슐화 과정까지 바라보면 다음과 같습니다.

사용자가 전송하고자 하는 데이터는 각 프로토콜의 정보를 Header에 포함시켜서 하위 계층에 전달하고 (Encapsulation), 이것은 최종적으로 물리 계층에서 binary 데이터로 변환되어 전송됩니다.
상대측에서는 이러한 Header를 역순으로 하나씩 제거하면서 상위 계층으로 데이터를 전달하고 (Decapsulation), 최종적으로 원본 데이터를 수신하게 됩니다.
[L4 로드 밸런서, L7 로드 밸런서]
로드밸런서는 트래픽을 받아서 여러 대의 서버에 분산시키는 하드웨어 또는 소프트웨어 입니다.
부하 분산에는 L4 Load Balancer와 L7 Load Balancer가 많이 사용됩니다. L4부터 Port를 다룰 수 있기 때문입니다.
한 대의 서버의 각각의 포트에 여러개의 서비스들을 운영하기 위해서 L4 Layer 위에서 작동하는 Load Balancer가 필요해진 것입니다.
이전에는 비싼 L4 하드웨어 장비를 주로 사용했지만, 현재는 MSA의 등장 등으로 L7 로드밸런싱도 많이 사용하고, AWS ELB, NginX, HaProxy등 다양한 소프트웨어를 사용하고 있습니다.
L4 Load Balancer는 IP, Port 를 기준으로 스케줄링 알고리즘을 통해 부하를 분산합니다.
클라이언트에서 로드밸런서(DNS)로 요청을 보냈을 때 최적의 서버로 요청을 전송하고 결과를 클라이언트에게 줍니다. 즉, 요청하는 서비스의 종류와 상관 없이 공장을 여러 개 돌리는 것입니다.
L7 Load Balancer는 L7 위에서 동작하기 때문에 IP, Port 이외에도 URI, Payload, Http Header, Cookie 등의 내용을 기준으로 부하를 분산합니다. 그래서 콘텐츠 기반 스위칭이라고도 합니다.
L4 Load Balancer는 단지 부하를 분산시키는 것이라면, L7 Load Balancer는 요청의 세부적인 사항을 두고 결제만 담당하는 서버, 회원가입만을 담당하는 서버 등으로 분리해서 가볍고 작은 단위로 여러 개의 서비스를 운영하고 요청을 각각의 서버에 분산할 수 있는 것입니다.
L7 Load Balancer는 L4 Load Balancer와 다르게 데이터를 분석해서 처리가 가능하기 때문에 악의적이거나 비 정상적인 콘텐츠를 감지해 보안 지점을 구축할 수도 있는 장점이 있고, 그 만큼 자원 소모가 크다는 단점이 있습니다.
2. (⭐️) TCP vs UDP를 비교해서 설명해주세요.
[답안]
TCP는 연결형, 신뢰성 전송 프로토콜 입니다. 연결지향적 서비스를 제공하기 위해 데이터를 전송하기 전에 3way handshaking을 하여 두 호스트의 전송 계층 사이에 논리적 연결을 설립합니다. 신뢰성 있는 서비스를 제공하기 위해 오류제어, 흐름제어, 혼잡제어 등을 실행합니다. 신뢰성을 보장하기 위해서 header가 더 크고 속도가 비교적 느리다는 단점이 있습니다.
UDP는 비연결형 프로토콜로 3-way handshake 등의 세션 수립 과정이 없습니다. 또한 비신뢰성 프로토콜로 흐름제어, 오류제어, 혼잡 제어를 제공하지 않습니다. 이러한 단순성 덕분에 적은 양의 오버헤드갖고 수신여부를 확인하지 않아서 속도가 빠릅니다
TCP는 신뢰성이 중요한 통신(HTTP, File 전송 등)에 쓰이고, UDP는 실시간성이 중요한 통신(동영상 스트리밍 등)에 주로 사용됩니다.
3. 3-way handshake는 무엇이고 각 과정은 어떻게 되나요?
[답안]
3-way handshake는 TCP/IP 프로토콜로 통신하기 전, 정확한 정보 전송을 위해 상대방 컴퓨터와 세션을 수립하는(연결을 하는) 과정입니다. (TCP 연결 초기화)
클라이언트가 서버에게 접속을 요청하는 SYN 패킷을 보내면, 서버는 요청을 수락하는 ACK를 포함하여 SYN+ACK 패킷을 클라이언트에게 발송합니다. 클라이언트가 이것을 수신한 후, 다시 ACK를 서버에게 발송하면 연결이 이루어지고, 이로써 데이터를 주고받을 수 있게됩니다.
🤝 HTTP 1.1 과 2.0 버전은 모두 TCP프로토콜을 사용합니다. 그래서 우리가 네이버에 접속할 때마다 네이버의 서버와 나의 노트북이 3-way handshake를 하면서 서로를 확인하게 됩니다.
[TCP 3-way handshake]
TCP 통신은 아래와 같은 3단계의 과정을 거칩니다.
- Connection setup (tcp 연결 초기화) - 3way handshaking
- Data transfer (데이터 전송)
- Connection termination (tcp 연결 종료) - 4way handshaking
우리가 공부한 3-way handshaking이 바로 Connection setup의 과정입니다.

[4-way handshake]
3-way handshake를 통해 Connection setup을 했다면 tcp 연결을 종료하는 Connection termination 과정은 4-way handshaking을 통해 이루어집니다.
TCP connection termination은 양방향으로 2개의 연결이 독립적으로 닫히기 때문에 4-way 단계를 밟게 됩니다.
네트워크 - HTTP
1. HTTP가 무엇인지 설명해주세요.
[답안]
HTTP는 HyperText Transfer Protocol의 약자로 서버-클라이언트 모델을 따르면서 request/response 구조로 웹 상에서 정보를 주고받을 수 있는 프로토콜입니다. TCP/IP 기반으로 작동하며, HTTP의 가장 큰 특징은 Connectionless와 Stateless 입니다.
[HTTP의 특징]
- HTTP는 서버에 연결 후 요청에 응답을 받으면 연결을 끊어버리는 Connectionless 특성을 갖습니다.
- 많은 사람이 웹을 이용하더라도 실제 동시 접속을 최소화하여 더 많은 유저의 요청을 처리할 수 있습니다.
- 연결을 끊었기 때문에, 클라이언트의 이전 상태(로그인 유무 등)를 알 수가 없다는 Stateless 특성이 생기게 됩니다.
- 정보를 유지할 수 없는 Connectionless, Stateless 특성을 가진 HTTP의 단점을 해결하기 위해, cookie, session, jwt 등이 도입되었습니다.
- HTTP는 정보를 text 형식으로 주고받기 때문에 중간에 인터셉트할 경우 데이터 유출이 발생할 수 있는 문제가 있어서 이를 해결하고자 HTTP에 암호화를 추가한 프로토콜이 바로 HTTPS입니다.
2. (⭐️⭐️) HTTP request method 중 GET vs POST를 비교 설명해주세요.
[답안]
GET 메소드는 클라이언트가 서버에게 리소스를 요청할 때 사용하는 메소드이고, POST 메소드는 서버에게 데이터 처리(주로 생성)를 요청할 때 사용하는 메소드입니다.
GET 요청의 경우 필요한 정보를 특정하기 위해 URL 뒤에 Query String을 추가하여 정보를 조회하고, POST 요청의 경우 전달할 데이터를 Body 부분에 포함하여 통신합니다.
GET 요청의 경우 URL 뒤의 Query String까지 포함해서 브라우저 히스토리에 남게 되고 캐시가 가능하지만, POST 요청의 경우 브라우저 히스토리에 남지 않고 캐시도 불가능합니다.
3. HTTP requst method 중 Put vs Patch을 비교 설명해주세요.
[답안]
PUT 메소드와 PATCH 메소드는 모두 서버의 리소스를 업데이트하는 메소드라는 공통점이 있습니다. 하지만 PUT 요청의 경우 모든 리소스를 수정,대체하고, PATCH 요청의 경우 일부 리소스만 수정하게 됩니다.
4. Http status code에 대해서 설명해주세요.
[답안]
HTTP status code는 클라이언트가 보낸 HTTP 요청에 대한 서버의 응답 코드로, 상태 코드를 통해 요청의 성공/실패 여부를 판단할 수 있습니다. 100번대부터 500번대까지 총 5개의 클래스로 구분되어 HTTP 요청에 대한 상태를 알려줍니다.
Status code
웹 개발시 서버와 클라이언트가 HTTP 통신할 때 주고받아야 할 값중에 하나입니다. 클라이언트로 부터 받은 request에 대한 서버의 response에 대한 간략할 설명 이라고 볼 수 있습니다. 상황에 알맞는 status code를 response에 담아서 클라이언트에 넘겨주면 이를 토대로 클라이언트는 알맞는 대응을 할 수 있습니다.
모든 HTTP status code는 5개의 클래스로 구분됩니다.
- 1xx (정보): 요청을 받았으며 작업을 계속한다.
- 2xx (성공): 클라이언트가 요청한 동작을 성공적으로 수신하여 이해했고 성공적으로 처리하였다.
- 3xx (리다이렉션): 요청을 완료하기 위해 추가 작업 조치가 필요하다.
- 4xx (클라이언트 오류): 클라이언트의 요청에 문제가 있다.
- 5xx (서버 오류): 서버가 유효한 요청의 수행을 실패했다.
5. (⭐️⭐️) www.google.com을 주소창에 쳤을 때 화면에 나오기까지의 과정을 네트워크 관점으로 설명해주세요.
[답안]
- 사용자가 브라우저에 URL을 입력하면, 브라우저는 DNS를 통해서 서버의 IP를 찾습니다.
- Client에서 HTTP request 메세지를 보내고, 이를 TCP/IP 패킷을 생성해서 서버로 전송합니다.
- Server에서 HTTP request에 대한 HTTP response 메세지를 받고, 이를 TCP/IP 패킷으로 생성해서 Client로 재전송합니다.
- 도착한 HTTP response message는 웹 브라우저에 의해 출력/렌더링 됩니다.
[웹 동작 방식(Detail)]

- 유저가 브라우저에서 www.google.com(URL)을 입력을 하면 HTTP request message를 생성합니다.
- IP주소를 알아야 전송을 할 수 있으므로, DNS lookup을 통해 해당 domain의 server IP주소를 알아냅니다.
- 반환된 IP주소(구글의 server IP)로 HTTP 요청 메시지(request message) 전송 요청을 합니다.
- 생성된 HTTP 요청 메시지를 TCP/IP층에 전달합니다.
- HTTP 요청 메시지에 헤더를 추가해서 TCP/IP 패킷을 생성합니다.
- 해당 패킷은 전기신호로 랜선을 통해 네트워크로 전송되고, 목적지 IP에 도달합니다.
- 구글 server에 도착한 패킷은 unpacking을 통해 message를 복원하고 server의 process로 보냅니다.
- server의 process는 HTTP 요청 메시지에 대한 response data를 가지고 HTTP 응답 메시지(response message)를 생성 합니다.
- HTTP 응답 메시지를 전달 받은 방식 그대로 client IP로 전송을 합니다.
- HTTP response 메시지에 담긴 데이터를 토대로 웹브라우저에서 HTML 렌더링을 하여 모니터에 검색창이 보여집니다.
네트워크 - Authorization
1. (⭐️) 쿠키와 세션의 차이점을 설명해주세요.
[답안]
쿠키는 클라이언트 측에 저장되어 상태를 유지하고, 세션은 서버측에서 저장되어 상태를 유지합니다.
쿠키는 클라이언트(브라우저) 로컬에 key-value 쌍으로 저장되는 데이터 파일입니다. 유효시간 내에서는 브라우저가 종료되어도 계속 유지됩니다.
세션은 브라우저가 종료되거나, 서버에서 해당 세션을 삭제할 수 있기 때문에 쿠키보다 보안성이 좋습니다. 주로 메모리나 데이터베이스에 저장하므로 서버 용량이 허용하는 한에서 제한 없이 데이터를 저장할 수 있다는 장점이 있지만 서버의 부하가 커진다는 단점이 될 수 있습니다.
[Connectionless(비연결성) & Stateless(비상태성)]
쿠키와 세션을 사용하는 이유는 HTTP의 connectionless(비연결성), stateless(비상태성)라는 특징 때문입니다. 클라이언트가 요청(request)을 했을 때 그 요청에 맞는 응답(response)을 보낸 후 연결을 끊고, 서버는 클라이언트에 대한 상태 정보를 유지하지 않기 때문에 알 수 없게 됩니다.
(단 request header에 keep-alive 값을 통해 connection을 끝내지 않고 유지할 수 있다.)
만약 쿠키와 세션을 사용하지 않는다면 인프런에 로그인을 했음에도 페이지를 이동할 때마다 계속 로그인을 해야됩니다. 또한 로그인을 할때, 아이디 비밀번호 저장을 하여 다음번에 재방문 할 때에도 해당 아이디와 비밀번호를 자동으로 입력하도록 할 수 있습니다. 이 외에도 쇼핑몰의 장바구니 기능과 팝업에서 “오늘 더이상 이 창을 보지 않음" 등의 편의성을 제공할 수 있게 됩니다.
[Cookie]

쿠키의 생성과 저장은 구현에 따라 다르지만 원리는 동일합니다.
- 서버가 클라이언트로부터 요청을 받았을 때, 클라이언트에 관한 정보를 토대로 쿠키를 구성합니다.
- 서버는 클라이언트에게 보내는 응답의 header에 쿠키를 담아 보냅니다.
- 클라이언트가 응답을 받으면, 브라우저는 쿠키를 쿠키 디렉터리에 저장합니다.
쿠키는 클라이언트(브라우저) key-value 쌍으로 로컬에 저장되는 데이터 파일입니다. 유효시간 내에서는 브라우저가 종료되어도 계속 유지됩니다. 서버에서 response header에 set-cookie속성을 사용해서 클라이언트에 쿠키를 만들고, 사용자가 따로 작업을 하지 않아도 브라우저가 쿠키를 request header에 담아서 서버에 전송합니다.
[Session]

세션은 기본적으로 쿠키를 이용하여 구현이 됩니다. 클라이언트를 구분하기 위해 각 클라이언트에게 session ID를 부여하고 클라이언트는 쿠키에 session ID를 저장해 둡니다. 사용자 정보를 브라우저에 저장하는 쿠키와 달리 세션은 서버측에 저장하여 관리합니다. 세션은 유효시간을 두어 일정 시간 응답이 없다면 끊을 수 있고, 브라우저가 종료될 때까지 인증상태를 유지할 수 있습니다. 사용자 정보를 서버에 두기 때문에 쿠키보다 보안은 좋지만 서버 자원을 차지하기 때문에 서버에 과부하를 줄 수 있고 성능 저하의 요인이 될 수 있습니다.
2. 세션이 보안도 좋은데 쿠키를 사용하는 이유는 무엇인가요?
[답안]
세션은 서버의 자원을 사용하기 때문에 서버가 느려질 수 있고 서버 자원이 부족할 수 있습니다. 따라서 쿠키를 사용하면 서버 자원의 낭비를 방지하여 웹사이트 속도를 높일 수 있습니다.
- 상태를 클라이언트에 유지 - 브라우저가 종료되더라도 상태 유지
- 클라이언트 사이드에서 쉽게 관리
- 일정 기간 동안 유지 가능 - 사용자 경험 향상
- 서버 자원 절약
3. 쿠키와 세션을 이용한 로그인 방식을 화이트보드에 설명해주세요.
HTTP는 비연결성, 비상태성의 특성을 지니기 때문에 서버는 클라이언트가 로그인을 했더라도 이후 요청 때 해당 클라이언트가 로그인을 했었는지 알 수 없습니다. 하지만 쿠키와 세션을 활용한다면 로그인 상태를 유지할 수 있게 됩니다.
[답안]

쿠키와 세션을 이용한 인가 절차
- 클라이언트가 로그인을 하면 서버는 회원정보를 대조하여 인증을 합니다.(authentication)
- 회원 정보(클라이언트 정보)를 세션저장소에 생성하고 session ID를 발급합니다.
- http response header 쿠키에 발급한 session ID를 담아서 보냅니다.
- 클라이언트에서는 session ID를 쿠키 저장소에 저장하고 이후에 http request를 보낼 때마다 쿠키에 session ID를 담아서 보냅니다.
- 서버에서는 쿠키에 담겨져서 온 session ID에 해당하는 회원 정보를 세션 저장소에서 가져옵니다.(authorization)
- 응답 메시지에 회원 정보를 바탕으로 처리된 데이터를 담아서 클라이언트에 보냅니다.
[단점]
- session ID만 노출되어 악의를 가진 다른 사용자가 이를 이용해 서버에 요청하면 서버는 구별해낼 수 있는 방법이 없습니다. 이를 Session hijacking 이라고 합니다. 해결책으로는 HTTPS 를 사용하거나 session에 짧은 주기로 만료시간을 설정하는 방법이 있습니다.
- 세션과 쿠키를 이용한 로그인 방식은 Load Balancing 및 서버 효율성 관리 및 확장이 어려워질 수 있다는 단점이 있습니다. (여러 대의 서버를 사용하는 시스템의 경우, 유저 로그인 시 해당 유저는 처음 로그인했던 서버로만 요청을 보내도록 설정해야 하기 때문입니다.)
4. JSESIONID에 대해서 설명 해주세요.
[답안]
JSESSIONID는 톰캣 컨테이너에서 세션을 유지하기 위해서 발급하는 키 입니다. 톰캣은 JESSIONID 쿠키를 클라이언트에게 발급해주고 이 값을 통해 세션을 유지할 수 있도록 합니다.
[동작방식]
- 브라우저에 최초 접근시 톰캣은 Response 헤더에 아래와 같이 JESSIONID를 발급합니다.
Set-Cookie: JSESSIONID=3CB361E0BE1A9A7DE7DB926DF0772BAE
- 브라우저 재요청시 Response를 통해 받은 JSESSIONID를 Request 헤더의 쿠키에 값을 넣어 서버에 요청한다.
- 쿠키를 통해 JSESSIONID 값을 전달받게 되면 서버는 새로운 JESSIONID 값을 Response 헤더에 발급하지 않는다.
- 클라이언트로 부터 전달받은 JESSIONID값을 기준으로 서버에서는 세션 메모리 영역에 상태를 유지할 값들을 저장할 수 있게 된다.
- HttpSession
[로그인 정보를 가져오는 절차]
- 세션에 사용자 정보 저장
HttpSession session = request.getSession();
session.setAttribute("loginVO", loginVO);
RequestContextHolder
를 통한 로그인 정보 가져오기
ServletRequestAttributes attributes
= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
HttpSession session = request.getSession();
LoginVO loginVO = (LoginVO)session.getAttribute("loginVO");
return loginVO;
- 이 방식은 기본적인 로그인 관리를 수행하며, Spring Security가 제공하는 다양한 기능 (인증, 권한 부여, CSRF 방어등) 포함하지 않는다.
RequestContextHolder
- Spring에서 현재 스레드와 연결된 웹 요청의 컨텍스트 정보에 접근할 수 있게하는 유틸리티 클래스입니다.
- 주로 웹 요청과 관련된 정보를 얻거나 설정할 때 사용합니다.
- 해당 클래스를 사용하려면 RequestContextListener 또는 RequestContextFilter를 설정해야 한다.
- web.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
[전자정부프레임워크 설정]
context-egovuserdetailshelper.xml
<!--인증된 유저의 LoginVO, 권한, 인증 여부를 확인 할 수있는 서비스 클래스-->
<bean id="egovUserDetailsHelper" class="egovframework.com.cmm.util.EgovUserDetailsHelper">
<property name="egovUserDetailsService">
<!-- 원하는 bean id를 아래에 ref 태그에 적용한다 -->
<ref bean="egovUserDetailsSessionService" />
</property>
</bean>
<!-- 1. 세션을 이용한 인증을 사용하는 빈 -->
<bean id="egovUserDetailsSessionService"
class="egovframework.com.cmm.service.impl.EgovUserDetailsSessionServiceImpl"/>
EgovUserDetailsHelper
/**
* 인증된 사용자객체를 VO형식으로 가져온다.
* @return Object - 사용자 ValueObject
*/
public static Object getAuthenticatedUser() {
return egovUserDetailsService.getAuthenticatedUser();
}
EgovUserDetailsSessionServiceImpl
public Object getAuthenticatedUser() {
return RequestContextHolder
.getRequestAttributes()
.getAttribute("loginVO", RequestAttributes.SCOPE_SESSION);
}
4 . 사용
LoginVO user =
(LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
자료구조 - Array & LinkedList
자바의 기본 데이터 타입과 크기
- byte: 1바이트
- short: 2바이트
- int: 4바이트
- long: 8바이트
- float: 4바이트
- double: 8바이트
- char: 2바이트
- boolean: JVM 구현에 따라 다르지만, 보통 1바이트
- String 클래스 - 내부적으로 UTF-16을 사용하여 문자열을 저장하므로, 글자당 2바이트가 할당된다.
1. LinkedList에 대해서 설명해주세요.
[답안]
Linked List는 Node라는 구조체로 이루어져 있는데, Node는 데이터 값과 다음 Node의 address를 저장합니다. Linked List는 물리적인 메모리상에서는 비연속적으로 저장이 되지만 Linked list를 구성하는 각각의 Node가 next Node의 address를 가리킴으로써 논리적인 연속성을 가진 자료구조입니다.
[LinkedList]
LiskedList의 특징
- LinkedList를 설명할 때는 메모리상에서 불연속적으로 데이터가 저장된다는 점 + Node의 next address를 통해 불연속적인 데이터를 연결하여 논리적 연속성을 보장되는 점
- Node = value + adress
- Node는 8byte (참조크기, 64비트 기준)
- 데이터가 추가되는 시점에 메모리를 할당함 → 메모리를 좀 더 효율적으로 사용할 수 있음
VS Array
- Array의 경우 연속성을 유지하기 위해 물리적 메모리 상에서 순차적으로 저장하는 방법을 사용합니다.
- LinkedList는 이에 비해 메모리 사용이 좀 더 자유로운 대신에 Next Address를 추가적으로 저장해야 하기 때문에 메모리가 더 필요합니다.
시간 복잡도
- LinkedList는 물리적으로 옮길 필요 없이 next address 값만 변경ㅎ아면 되기 때문에 추가/삭제에 O(1)의 시간 복잡도를 가진다.
- 접근, 검색 - O(N)
- 추가, 삭제 - O(1)
2. (⭐️) Array vs LinkedList를 비교해서 설명해주세요.
[답안]
Array는 메모리 상에서 연속적으로 데이터를 저장하는 자료구조 입니다. Linked List는 메모리상에서는 연속적이지 않지만, 각각의 원소가 다음 원소의 메모리 주소값을 저장해 놓음으로써 논리적 연속성을 유지합니다.
그래서 각 operation의 시간복잡도가 다릅니다. 데이터 조회는 Array의 경우 , Linked list는 의 시간복잡도를 갖습니다. 삽입/삭제는 Array , Linked list 의 시간복잡도를 갖습니다.
따라서 얼마만큼의 데이터를 저장할지 미리 알고있고, 조회를 많이 한다면 Array를 사용하는 것이 좋습니다. 반면에 몇개의 데이터를 저장할 지 불확실하고 삽입 삭제가 잦다면 Linked list를 사용하는 것이 유리합니다.
LinkedList의 특징
- Linked list의 경우 추가/삭제를 하려는 index까지 도달하는데 의 시간이 걸리기 때문에, 실질적으로 Linked List도 추가/삭제 시에 의 시간이 걸린다고 볼 수 있습니다.
- LinkedList의 경우에는 runtime중에도 size를 늘리고 줄일 수 있어, 필요한 만큼 memory allocation을 하여 메모리 낭비가 적다.
3. 어느 상황에서 LinkedList를 쓰는게 Array보다 더 나을까요?
[답안]
- 으로 삽입/삭제를 자주 해야 될 때
- 얼마만큼의 데이터가 들어올지 예측을 할 수 없을 때
- 조회 작업을 별로 하지 않을 때
4. 어느 상황에서 Array를 쓰는게 LinkedList보다 더 나을까요?
[답안]
- 조회 작업을 자주 해야될 때
- Array를 선언할 당시에 데이터의 갯수를 미리 알고 있을때
- 데이터를 반복문을 통해서 빠르게 순회할 때.
- 메모리를 적게 쓰는게 중요한 상황일 때. Linked list보단 Array가 메모리를 적게 차지 하기 때문에 미리 들어올 데이터의 양을 알고만 있다면 Array가 메모리를 더 효율적으로 사용합니다.
5. Array와 Linked List의 memory allocation은 언제 일어나며, 메모리의 어느 영역을 할당 받나요?
[답안]
Array는 컴파일 단계에 스택 영역에 memory allocation이 일어나고, Array의 실제 데이터는 런타임 단계에 힙 메모리에 동적으로 할당 됩니다. LinkedList는 런타임 단계에 새로운 node가 추가될 때마다 힙 메모리 영역에 동적으로 할당 됩니다.
자료구조 - Hash table & BST(Binary Search Tree)
1. (⭐️⭐️) BST는 어떤 자료 구조인가요?
[답안]
“내 대답”
이진탐색트리는 정렬된 트리로서 특정 노드의 왼쪽 하위 트리는 해당 노드 값 보다 작은 노드 들로 이루어져있고, 오른쪽 하위 트리에는 해당 노트 값 보다 큰 노드 들로 이루어 져있는 바이너리 트리입니다.
이진탐색트리(Binary Search Tree; BST)는 정렬된 tree입니다. 어느 node를 선택하든 해당 node의 left subtree에는 그 node의 값보다 작은 값들을 지닌 node들로만 이루어져 있고, node의 right subtree에는 그 node의 값보다 큰 값들을 지닌 node들로만 이루어져 있는 binary tree입니다.
검색과 저장, 삭제의 시간복잡도는 모두 이고, worst case는 한쪽으로 치우친 tree가 됐을 때 입니다.
2. BST의 worst case 시간복잡도는 입니다. 어떠한 경우에 worst case가 발생하나요?
[답안]
균형이 많이 깨져서 한 쪽으로 치우친 BST의 경우에 worst case가 됩니다. 이렇게 되면 Linked list와 다를게 없어집니다. 따라서 탐색시에 이 아니라 이 됩니다.
🔎 모든 노드의 자식 노드의 갯수가 2개 이하이기 떄문에 이진 트리의 조건을 만족함

[해결방법]
자가 균형 이진 탐색 트리(Self-Balancing BST)는 알고리즘으로 이진 트리의 균형이 잘 맞도록 유지하여 높이를 가능한 낮게 유지합니다. 대표적으로 AVL트리와 Red-black tree가 있습니다. JAVA에서는 hashmap의 seperate chaning으로써 (해시충돌을 처리) Linked list와 Red-black tree를 병행하여 저장합니다.
3. (⭐️⭐️) Hash table은 어떤 자료구조 인가요?
[답안]
hash table은 효율적인 탐색(빠른 탐색)을 위한 자료구조로써 key-value쌍의 데이터를 입력받습니다. hash function 에 key값을 입력으로 넣어 얻은 해시값 를 위치로 지정하여 key- value 데이터 쌍을 저장합니다. 저장, 삭제, 검색의 시간복잡도는 모두 입니다.
[HashTable]
hash table은 hash function 를 이용해서 (, )를 index: 에 저장합니다. 이 때, “키 값을 갖는 원소가 위치 에 hash된다.” 또는 “는 키 의 해시값이다”라고 표현합니다. key는 무조건 존재해야 하며, 중복되는 key가 있어서는 안됩니다.
[Collision]
collision이란 서로 다른 key의 해시값이 똑같을 때를 말합니다. 즉, 중복되는 key는 없지만 해시값은 중복될 수 있는데 이 때 collision이 발생했다고 합니다. 따라서 collision이 최대한 적게 나도록 hash function을 잘 설계해야하고, 어쩔 수 없이 collision이 발생하는 경우 seperate chaining 또는 open addressing등의 방법을 사용하여 해결합니다.
[시간복잡도와 공간복잡도]
시간복잡도는 저장, 삭제, 검색 모두 기본적으로 이지만, collision으로 인하여 최악의 경우 이 될 수 있습니다.
공간효율성은 떨어집니다. 데이터가 저장되기 전에 미리 저장공간(slot, bucket)을 확보해야 하기 때문입니다. 따라서 저장공간이 부족하거나 채워지지 않은 부분이 많은 경우가 생길 수 있습니다.
4. (⭐️⭐️⭐️⭐️) Hashtable에서 collision이 발생한 경우 어떻게 되고, 해결방법은 무엇인가요?
[답안]
“내 답변”
충돌이 발생하면 주로 두가지 방법으로 해결합니다. 첫 번째 방법은 open addressing 방식으로서 collision이 발생하면 미리 정해진 규칙에 따라 hash table에 비어있는 슬롯을 찾는 방법입니다. 이 방법은 연결 리스트를 사용하지 않습니다. 두 번째 방법은 seperate chaining 방식으로서 충돌이 발생하면 해당 버킷에 연결 리스트를 이용하여 여러 개의 키-값 쌍을 저장합니다. 즉, 동일한 버킷에 속한 엔트리들을 연결리스트로 관리하여 충돌을 해결합니다.
java 8부터는 HashMap에서는 충돌로 인해 연결 리스트의 길이가 일정 수준 이상이면 해당 버킷을 Red-Black Tree로 변환하여 선언하여 성능을 향상시키는 기능이 있다.
👉
HashMap
의 treeifyBin
메소드hash table에서 collision이 발생하면 아래 두가지으로 해결 합니다.
첫 번째, open addressing 방식은 collision이 발생하면 미리 정한 규칙에 따라 hash table의 비어있는 slot을 찾습니다. 빈 slot을 찾는 방법에 따라 크게 Linear Probing, Quadratic Probing, Double Hashing으로 나뉩니다.
두 번째, separete chaining 방식은 linked list를 이용합니다. 만약에 collision이 발생하면 linked list에 노드(slot)를 추가하여 데이터를 저장합니다.
[HashTable vs HashMap]
- 동기화 (Synchronization):
HashTable
은 동기화된 메서드로 구성되어 있습니다. 따라서 여러 스레드가 동시에HashTable
에 접근해도 안전하게 사용할 수 있습니다. 하지만 이로 인해 성능이 저하될 수 있습니다.HashMap
은 동기화를 제공하지 않기 때문에 여러 스레드 간에 안전한 사용을 보장하지 않습니다. 따라서 단일 스레드 환경이거나 명시적으로 동기화를 처리해야 할 경우HashTable
을 사용할 수 있습니다.
- Null 허용 여부:
HashTable
은 키나 값으로null
을 허용하지 않습니다. 즉, 키나 값으로null
을 사용하려고 하면NullPointerException
이 발생합니다.HashMap
은 키와 값 모두null
을 허용합니다.
- 성능 및 확장성:
HashMap
은 일반적으로HashTable
보다 높은 성능을 제공합니다.HashMap
은 동기화를 제공하지 않기 때문에 단일 스레드 환경에서의 성능이 향상됩니다. 또한, Java 8부터는 트리 구조를 사용하여 성능을 최적화합니다.HashMap
은 초기 크기와 적재율을 설정할 수 있어서 미리 크기를 조절할 수 있습니다.HashTable
은 크기를 동적으로 조절하므로 성능에 영향을 줄 수 있습니다.
5. worst case의 시간복잡도는 이라고 했는데 어떤 상황인가요?
[답안]
n개의 모든 key가 동일한 해시값을 갖게 되면 길이 n의 linked list가 생성되게 됩니다. 이 때, 특정 key를 찾기 위해서는 길이 n의 linked list를 검색하는 의 시간복잡도와 동일하게 됩니다.
자료구조 - Queue & Stack
1. Queue는 무슨 자료구조 인가요?
[답변]
queue는 선입선출 FIFO(First In First Out)의 자료구조입니다. 시간복잡도는 enqueue O(1) , dequeue O(1) 입니다. 활용 예시는 Cache구현, 프로세스 관리, 너비우선탐색(BFS) 등이있습니다.
[Enqueue & Dequeue]

- enqueue의 경우 queue의 맨 뒤에 데이터를 추가하면 완료되기 때문에 시간복잡도는 O(1) 입니다. 이와 비슷하게 dequeue의 경우 맨 앞의 데이터를 삭제하면 완료 되기 때문에 동일하게 O(1)의 시간복잡도를 갖습니다.
[Dequeue]
queue의 개념에서 조금 확장한 자료구조들로는 양쪽에서 enqueue와 dequeue가 가능한 deque(double-ended queue)와 시간순서가 아닌 우선순위가 높은 순서로 dequeue할 수 있는 priority queue가 있습니다.
- 활용 예시
- 하나의 자원을 공유하는 프린트
- CPU task scheduling
- Cache 구현
- 너비우선탐색 - BFS
[Array-Base & List-Base]
두 가지 종류의 자료구조로 queue를 구현을 하더라도 enqueue와 dequeue는 모두 O(1)의 시간복잡도를 갖습니다.
Array-Base의 경우 전반적으로 performance가 더 좋지만, worst case의 경우에는 훨씬 더 느릴 수 있습니다(resize).
List-Base의 경우에는 enqueue를 할 때마다 memory allocation을 해야 하기 때문에 전반적인 runtime이 느릴 수 있습니다.
2. Stack은 어떤 자료구조인가요?
[답안]

stack은 후입선출 LIFO(Last In First Out)의 자료구조입니다. 시간복잡도는 push O(1) , pop O(1) 입니다. 활용 예시는 후위 표기법 연산, 괄호 유효성 검사, 웹 브라우저 방문기록(뒤로 가기), 깊이우선탐색(DFS) 등이 있습니다.
3. Stack 두 개를 이용하여 Queue를 구현해 보세요.
[접근 방법]
stack 두 개를 사용하여 enqueue와 dequeue를 구현하는 것에 초점을 맞춰서 문제를 해결하면 됩니다.
편의상 enqueue()에 사용할 stack을 instack이라고 부르고 dequeue()에 사용할 stack을 outstack이라고 칭하겠습니다. 두 개의 stack으로 queue를 구현하는 방법은 다음과 같습니다.
- enqueue() :: instack에 push()를 하여 데이터를 저장합니다.
- dequeue() ::
- 만약 outstack이 비어 있다면 instack.pop() 을 하고 outstack.push()를 하여 instack에서 outstack으로 모든 데이터를 옮겨 넣습니다. 이 결과로 가장 먼저 왔던 데이터는 outstack의 top에 위치하게 된다.
- outstack.pop()을 하면 가장먼저 왔던 데이터가 가정 먼저 추출된다.(FIFO)
[코드]
public class TwoStackToQueue {
private Stack<Integer> instack = new Stack<>();
private Stack<Integer> outstack = new Stack<>();
public void enqueue(Integer number){
instack.push(number);
}
public Integer dequeue(){
if(outstack.isEmpty()){
while(!instack.isEmpty()){
outstack.push(instack.pop());
}
}
return outstack.pop();
}
public static void main(String[] args) {
TwoStackToQueue queue = new TwoStackToQueue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
System.out.println(queue.dequeue() == 1);
}
}
[시간복잡도]
- enqueue : instack.push() 한번만 호출하면 되기 때문에 O(1) 입니다.
- dequeue : dequeue의 경우에는 두가지의 경우를 고려해봐야 합니다.
- 최선의 케이스 : outstack.pop() 한번만 호출하는 경우 O(1)입니다.
- 최악의 케이스 : 이때는 n개의 데이터에 대해 instack.pop()을 한 이후에 outstack.push()를 해줘야 합니다. 따라서 2*N 번의 계산이 수행되어야 하므로 O(N)의 시간 복잡도를 갖습니다.
4. Queue 두 개를 이용하여 Stack을 구현해 보세요.
[접근 방법]
queue 두 개를 사용하여 stack의 push와 pop를 구현하는 것
- push() :: inqueue으로 enqueue()를 하여 데이터를 저장합니다.
- pop() ::
- inqueue에 저장된 데이터의 갯수가 1 이하로 남을 때까지 poll()를 한 후, 추출된 데이터를 outqueue에 offer()합니다. 결과적으로 가장 최근에 들어온 데이터를 제외한 모든 데이터는 outqueue로 옮겨진다.
- inqueue에 남아 있는 하나의 데이터를 poll()해서 가장 최근에 저장된 데이터를 반환한다.(LIFO)
- 다음에 진행될 pop()을 위와 같은 알고리즘으로 진행하기 위해 outqueue를 inqueue로 대체하고, outqueue는 초기화 한다.
[코드]
public class TwoQueueToStack {
private Queue<Integer> inqueue = new LinkedList<>();
private Queue<Integer> outqueue = new LinkedList<>();
public void push(Integer number) {
inqueue.offer(number);
}
public Integer pop(){
while(inqueue.size() > 1){
outqueue.offer(inqueue.poll());
}
Integer number = inqueue.poll();
inqueue = outqueue;
outqueue = new LinkedList<>();
return number;
}
public static void main(String[] args) {
TwoQueueToStack stack = new TwoQueueToStack();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.pop() == 3);
}
}
[시간복잡도]
- push() : inqueue.offer() 한번만 수행하면 되므로 O(1)의 시간 복잡도를 갖습니다.
- pop() : inqueue에 저장되어 있는 n개의 원소중에서 n-1개를 outqueue에 옮겨야 하므로 O(N)이 됩니다.
5. (⭐️) Queue vs priority queue를 비교하여 설명해주세요.
[답안]
Queue 자료구조는 시간 순서상 먼저 집어 넣은 데이터가 먼저 나오는 선입선출 FIFO(First In First Out) 구조로 저장하는 형식입니다. 이와 다르게 우선순위큐(priority queue)는 들어간 순서에 상관없이 우선순위가 높은 데이터가 먼저 나옵니다.
Queue의 operation 시간복잡도는
enqueue
O(1), dequeue
O(1)이고,Priority queue는
push
O(logn) , pop
O(logn) 입니다.모의면접
모의면접 1
1. 자기소개를 1분정도 간단히 해주세요.
- 개발자를 하게 된 이유가 뭘까요?
- 개발 관련 공부는 어떤 방식으로 하시나요?
- 저희 회사에서 지원자님을 뽑아야 하는 이유를 어필해주실 수 있나요?
2. hash table이 뭔지 설명해주실 수 있나요?
[내 답변]
해시 테이블이란 해시 함수를 이용해서 key-value 형태로 데이터를 저장하는 것을 뜻 합니다. key를 해시 함수에 넣어서 나온 해시 값을 인덱스 삼아서 값을 저장합니다. 해당 해시 값을 인덱스로 사용하여 데이터를 저장하고 검색하기 때문에 해시 테이블은 검색이 빠르다는 장점이 있습니다.
- hash table에서 hash value가 충돌하는 경우에는 어떻게 해결해야 할까요?
[내 답변]
해시 테이블에서 해시 값이 충돌하는 경우에는 특정 해시 값을 인덱스로 가진 노드 내부에 LinkedList를 구현하여 여러 값을 순차적으로 저장하는 방법이 있습니다. 이를 체이닝이라고 하며, 충돌이 발생한 위치의 연결 리스트에 새로운 노드를 추가하여 데이터를 저장하게 됩니다.
- open addressing방식으로 해결한다고 하셨는데, 이 경우 데이터 삭제를 할 때 어떤 문제점이 생길 수 있을까요?
[내 답변]
개방 주소법은 충돌이 발생한 경우 다른 해시 인덱스에 데이터를 저장하는 방식입니다. 데이터 삭제를 위해서는 특별한 마커 값이나 삭제 플래그를 사용해서 삭제된 데이터를 표시하거나, 삭제한 데이터를 유지하지 않고 해당 인덱스를 빈 상태로 만들어야 합니다.
선형탐사 방법을 예를 들어보면 충돌이 발생하면 다음 인덱스로 선형적으로 이동하면서 비어 있는 곳을 찾아 데이터를 저장합니다. 이때 삭제된 데이터를 표시하기 위해 마커 값을 사용할 수 있습니다.
- double hashing이 뭔지 설명해주실 수 있나요?
[내 답변]
이중 해싱 방법은 두 번째 해시 함수를 이용하는 방법입니다. 충돌이 발생하면 두 번째 해시 함수의 값 만큼 떨어진 인덱스로 이동하면서 비어있는 곳을 찾아 데이터를 저장합니다.
3. http의 get과 post의 차이점을 말씀해주세요.
[내 답변]
GET, POST 방식은 모두 HTTP 통신 규격 메서드이며, GET은 주로 데이터를 조회를 할 때 사용하며 path parameter나 query string을 사용하여 파라미터 값을 전달합니다. POST는 주로 데이터를 저장할 때 사용하며 Body를 이용해서 파라미터 값을 전달합니다. POST 방식이 URL에 데이터가 노출되지 않기 떄문에 보안에 좋습니다.
- patch과 put의 차이점을 말씀해주세요
[내 답변]
PATCH와 PUT의 차이점을 설명해보자면, PATCH는 주로 부분적인 수정에 사용되며 업데이트를 할 때 주로 사용됩니다. PATCH는 일부 수정할 데이터만 JSON형태로 전송합니다. PUT은 리소스를 생성하거나 완전히 교체할 때 사용됩니다. 따라서 전체 데이터를 요청 본문에 담아서 전송하며, 해당 리소스가 없으면 생성하고 있으면 완전 교체 합니다.
4. 삽입정렬에 대해서 설명해 주세요.
- 정렬중에서 가장 빠른 정렬이 어떤 정렬일까요?
[내 답변]
정렬 알고리즘 중에서 가장 빠른 것은 퀵 정렬입니다. 퀵 정렬은 평균 및 최악의 경우에 O(NlogN)의 시간 복잡도를 가집니다.
- 퀵정렬에 대해서 설명해 주세요.
[내 답변]
퀵 정렬은 분할 정복 방법을 사용하여 정렬하는 알고리즘 입니다. 각 단계에서 피벗을 정하고 해당 배열을 피벗을 기준으로 왼쪽은 작은 수 오른쪽은 큰 수로 정렬합니다. 이후 피벗으로 분할 된 각 배열에 대해서 같은 방법을 재귀적으로 적용하여 퀵 정렬을 수행합니다.
퀵 정렬은 평균적으로 O(NlogN)의 시간 복잡도를 가지며, 추가 메모리를 사용하지 않는 장점이 있습니다. 하지만 이미 정렬된 배열에서는 성능이 저하될 수 있습니다.
- 선택 정렬에 대해서 설명해 주세요.
[내 답변]
선택 정렬은 첫번째 숫자부터 시작하여 그 뒤에 요소들과 비교하며 제일 작은 값을 앞으로 오게 만드는 과정을 반복하여 정렬하는 방법입니다.
이 알고리즘은 최소 값을 찾아 해당 위치로 이동하기 때문에 “선택” 정렬로 불립니다. 선택 정렬은 안정적인 알고리즘이지만 시간 복잡도가 O(N²) 이므로 비효율적인 편입니다. 따라서 대규모 데이터에는 적합하지 않습니다.
Java
Arrays.sort()
메서드
- 기본적으로 Dual-Pivot QuickSort 알고리즘을 사용합니다.
- 해당 알고리즘은 퀵소트 알고리즘의 개선 버전으로, 하나의 피벗 대신에 두개의 피벗을 사용하여 배열을 분할하고 정렬합니다.
- Java 7 이후로는 특정 상황에서 다른 알고리즘으로 전환될 수 있습니다.
- 객체 배열이나 기본 데이터 타입의 배열 모두 TimSort 알고리즘을 사용합니다.
- TimSort 알고리즘은 병합 정렬과 삽입 정렬을 결합한 알고리즘 입니다.5. DB사용되는 Transaction에 대해서 간단하게 설명해주시겠어요
[내 답변]
DB의 Transaction에 대해 간단히 설명하자면 트랜잭션은 DB에서 논리적인 작업 단위를 의미합니다. 이 작업은 여러 개의 쿼리로 이루어져 있으며 전부 성공하여 커밋되거나 하나라도 실패하면 모두 롤백되야 합니다.트랜잭션은 원자성(트랜잭션 내 모든 쿼리가 성공해야만 최종 커밋), 일관성(트랜잭션이 수행된 전후 모두 DB는 무결성을 유지해야 함), 독립성(트랜잭션은 영향을 미치지 않음), 지속성(트랜잭션이 성공적으로 수행되면 영구저장)과 같은 특징을 가지고 있습니다.
- transaction의 무결성을 유지하기 위한 특징을 아는대로 말씀해주세요.
[내 답변]
트랜잭션이 무결성을 유지하기 위한 특징은 원자성, 독립성, 지속성, 일관성이 있습니다.
원자성은 트랜잭션 내 쿼리가 모두 성공해야지만 커밋된다는 것이고, 독립성은 트랜잭션은 서로 영향을 끼지 않는 상태여야 한다는 것이고, 지속성은 트랜잭션이 성공적으로 수행되면 영구 저장되어야 한다는 것입니다. 마지막으로 일관성은 트랜잭션 전후 DB는 무결성을 유지해야 한다는 것입니다.
- Deadlock을 간단히 설명해주세요.
[내 답변]
Deadlock은 트랜잭션 간 교착상태가 발생했다는 뜻입니다. 두 트랜잭션이 서로 상대방이 가지고 있는 잠금을 획득하려고 대기하면서 무한정 기다리는 상태를 의미합니다.이런 상황에서는 두 트랜잭션이 상대가 가진 잠금을 획득하지 못하고 계속해서 대기하여 작업이 진행되지 않습니다.
- Deadlock을 해결하는 방법은 뭐가 있을까요?
- 기본 격리 수준 : ‘READ COMMITED’
- 가장 높은 격리 수준 : ‘SERIALIZABLE’
[내 답변]
DB에서 Deadlock을 해결하기 위해서는 DBMS 자체 모니터링을 통해서 자동으로 락을 해소하거나(자동 탐지와 해결), 특정 트랜잭션에서 락을 일정시간 보유하고 있을 때 해당 트랜잭션을 롤백하여 락을 해제하는 방법(타임아웃)이 있습니다. 또한 우선순위가 높은 트랜잭션이 우선순위가 낮은 트랜잭션의 락을 뺏을 수 있도록 우선순위 부여 기능을 사용할 수 있습니다.
사용자가 직접 V$SESSION을 통해서 락 상태를 모니터링 하고, ALTER SYSTEM KILL SESSION 명령을 통해 특정 세션을 종료시키거나 ‘DBMS_LOCK’ 패키지를 통해 락을 해제할 수 있습니다.
또한 트랜잭션 격리 수준을 조절하여 세심한 락 제어를 할 수 있습니다.
6. 지원자님께서 저희에게 물어볼 것이 있거나, 못다한 말이 있다면 간단히 해주세요
모의면접 2
1. 자기소개를 1분정도 간단히 해주세요.
- 수행해야 되는 프로젝트가 굉장히 어려운 주제인데, 혼자서는 해결 못할 것 같으면 어떻게 하시겠나요?
- 팀프로젝트를 하실 때 주로 어떤 역할을 담당하셨나요? 매니저 또는 팀원 충돌 조율 같은 역할이요
- 팀을 구성할 때, 처음에는 맘에 들어서 팀원을 받아들였는데, 같이 일하다보니까 멀어진 경우가 있나요? 아니면 처음에 마음에는 쏙 들지 않았지만 일하다 보니 맘에 들었던 상황이 있나요?
2. 멀티쓰레드와 멀티 프로세스를 비교 설명해 주세요
[내 답변]
멀티 스레드와 멀티 프로세스를 비교해서 설명해 보겠습니다. 일단 프로세스 안에 여러 개의 스레드가 동시에 실행됩니다. 멀티 프로세스란 프로세스 여러 개가 동시에 실행되는 건데, 프로세스는 독립적이고 서로의 작업영역을 참조할 수 없어 데이터의 공유가 어렵습니다. 서로의 작업영역을 참조 하려면 별도의 통신 방법이 필요합니다. 반면에 스레드는 프로세스의 공통 메모리 영역을 참조할 수 있어 데이터의 공유가 쉽습니다.
- multi process/thread 환경에서 발생하는 동기화 문제에 대해서 아시나요?
[내 답변]
멀티 프로세스와 멀티 스레드 환경에서 발생하는 동기화 문제에 대해 설명해보겠습니다. 멀티 프로세스는 서로 독립적으로 실행되기 때문에 동기화 문제가 발생하지 않습니다. 각 프로세스는 자체 메모리 공간을 가지고 있어 서로의 데이터에 적접적인 영향을 미치지 않습니다.
하지만 멀티 스레드는 프로세스 내 공유된 메모리에 접근하면서 데이터 무결성과 일관성 측면에서 동기화 문제가 발생할 수 있습니다. 여러 스레드가 동일한 자원에 동시에 접근하면 예상치 못한 결과가 발생할 수 있기 때문에 이를 방지 하기 위해 동기화 매커니즘을 사용해야 합니다.
- 동기화문제를 어떻게 해결하면 좋을까요?
[내 답변]
멀티 스레드 동기화 문제 해결 방법에 대해 설명해 보겠습니다. 멀티 스레드에 동기화 문제 해결방법은 뮤텍스와 세마포어 방법이 있습니다.
- mutex와 semaphore 차이점을 중심으로 설명해 주세요.
[내 답변]
뮤텍스 방법은 상호 배제를 제공하여 공유 자원에 대한 동시 접근을 막는 것이 목적입니다. 세마포어 방법은 스레드가 접근할 수 있는 리소스의 개수를 제한하거나 스레드의 특정 작업 순서를 제어하는 데 사용되며 보다 일반적인 동기화 문제에 적용할 수 있습니다.
3. heap 자료구조에 대해서 아시나요
[내 답변]
heap 자료구조에 대해 설명해보겠습니다. heap 자료구조는 heap 메모리와 관련이 있는 특별한 자료구조입니다. 힙은 주로 동적으로 할당된 메모리를 관리하고, 힙 자료구조는 데이터를 저장하고 검색하는데 사용되는 이진 트리의 일종입니다.
- 힙 메모리 : 프로그램이 실행 될 때 동적으로 할당되고, 자원에 대한 메모리를 할당하거나 해제할 때 사용합니다.
- 힙 자료구조 : 데이터를 저장하고 검색하는데 사용되는 이진 트리입니다. 주로 우선순위 큐등 자료구조를 구현하는데 활용됩니다.
- heap을 구현하기 위해서 array 와 linked list중에 어떤 것을 이용하면 좋을까요?
[내 답변]
heap은 array 기반으로 구현하는 것이 좋습니다. 힙은 이진 트리의 형태로 구성되어 있으며, 배열은 이진 트리의 노드들을 효율적으로 저장할 수 있습니다. 배열은 인덱스 계산이 간단하고 메모리 사용이 효율적이라서 heap의 구현에 적합합니다.
- heap의 push()와 pop() operation의 시간복잡도는 어떻게 될까요
[내 답변]
heap의 push 및 pop 연산의 시간 복잡도는 일반적으로 O(logN)입니다. heap은 이진 트리의 형태를 가지고 있어서 원소를 삽입하거나 삭제할 때 이진 트리의 높이에 비례하는 시간이 소요됩니다.
- heap의 pop()을 하면 root node를 제거하게 되죠. 그 다음 동작은 어떻게 되나요?
[내 답변]
heap을 pop하고 root node가 제거 됐을때 그 다음은 아래에 있는 자식 노드 중 더 (Min Heap) 작은 값 or (Max Heap) 큰 값을 가진 노드가 새로운 root node가 됩니다. 이후에 Heap 속성을 유지하기 위해 필요한 재조정 작업을 수행 합니다.(Heapify)
4. 이진 탐색 트리에서 저장된 정보가 256개 일 때, 탐색횟수는 몇번일까요?
[내 답변]
이진 탐색 트리에 저장된 정보가 256개 인 경우에 탐색횟수는 8번 입니다. 이진 탐색 트리에 탐색 횟수는 트리의 높이에 의해서 결정되고, 정확한 횟수는 log₂(256)이므로 최대 8번의 탐색이 필요합니다.
- 탐색의 시간복잡도를 O(logN)으로 가정하신 것 같은데, 최악의 경우에는 시간복잡도가 어떻게 될까요?
[내 답변]
최악의 경우에는 시간 복잡도는 O(N)이기 때문에 256번의 탐색이 필요합니다.
- 어떤 상황에 탐색의 시간복잡도가 O(n)이 되나요?
[내 답변]
이진 트리의 트리가 한쪽으로 편향되어 있는 경우에 시간 복잡도가 O(N)이 됩니다.
- 이를 해결하기 위한 방법을 아시는게 있으신가요
- Java - 레드 블랙 트리 : TreeMap, TreeSet → 삽입, 삭제, 검색 연산 모두 O(logN)의 시간 복잡도를 보장한다.
[내 답변]
이진 트리의 불균형을 해결하기 위해서는 자가 균형 이진 탐색 트리를 이용해야 합니다. 자가 균형 탐색 이진 트리를 이용하면 트리의 높이가 로그 시간에 비례하며, 탐색, 삽입, 삭제 등의 연산의 일정한 시간 복잡도가 보장됩니다.
5. RDB에서 index가 왜 필요할까요?
[내 답변]
RDB에서 index가 필요한 이유에 대해서 설명해 보겠습니다. 기본적으로 DB에 index를 설정해두면 검색 속도를 상향시키는 데 사용됩니다. 테이블의 모든 행을 순차적으로 탐색하는 것이 아니라 인덱스를 사용하여 검색조건에 해당하는 부분만 탐색합니다. 또한 대부분의 DBMS는 인덱스는 데이터를 정렬된 상태로 유지하기 떄문에 그 결과를 빠르게 얻을 수 있습니다. 또한 인덱스를 사용하면 여러 테이블의 조인 작업의 성능에 도움이 됩니다.
- index를 사용하면 검색속도가 빨라진다고 하셨는데, 그럼 모든 column에 index를 생성하면 좋곘네요? 어떻게 생각하세요
[내 답변]
index를 설정하는 것은 DBMS의 메모리나 저장공간을 사용하는 것이기 때문에 신중하게 사용하는 것이 좋습니다. 과도한 index 설정은 갱신 연산에 부하를 줄 수 있으므로 적당한 index를 설정하여 사용해야 합니다.
- 성별 column에 남자 2% 여자98% 비율로 데이터가 있을 때, index를 생성하는게 좋을까요?
[내 답변]
성별 column에 데이터가 남자 2% 여자가 98% 비율로 있다면 index를 생성하지 않는 것이 좋습니다. 해당 column은 고유값의 개수가 적고 데이터 분포가 균일하지 않기 때문에 인덱스의 선택도가 낮아져 인덱스로 인한 성능향상을 기대하기 어렵습니다.
- MySQL에서는 index의 자료구조로 B+Tree를 주로 사용하는데, B+Tree의 검색 시간 복잡도는 어떻게 되나요?
[내 답변]
B+Tree 검색 시간 복잡도는 O(logN)입니다.
- Hash index는 검색 시간이 O(1)인데, 왜 B+Tree를 사용하는거죠?
[내 답변]
Hash index의 검색 시간이 O(1)임에도 불구하고 B+Tree를 사용하는 이유는 균형을 유지하면서 트리의 높이가 일정하게 유지되어 검색 연산이 효율적으로 수행된다는 것입니다. 이로 인해서 범위 검색 및 정렬된 데이터 삽입 및 삭제도 효율적으로 처리할 수 있습니다.
참고로 hash index는 주로 등호 연산에 최적화 되어 있어 범위 검색이나 정렬된 작업에서는 효율성이 떨어집니다.
6. 지원자님께서 저희에게 물어볼 것이 있거나, 못다한 말이 있다면 간단히 해주세요
모의면접 3
1. 3분정도 시간을 드릴테니 편안하게 자기소개를 해주세요.
- 왜 백엔드(또는 그 외 포지션)를 선택하셨나요?
- 백엔드(또는 그 외의 포지션)로 지원하셨는데, 다른 역할이 주어진다면 입사할 생각이 있으신가요?
- 본인의 성격 장단점을 말씀해주세요
2. Linked list에 대해서 간단히 설명해 주세요.
[답변]
LinkedList에 대해 설명 해보곘습니다.
LinkedList는 List의 한 종류로서 각 노드끼리 연결되어 있는 형태의 리스트입니다. 각 노드는 각 노드 값과 전후 노드의 위치 정보를 가지고 있습니다.
따라서 추가 삭제시에는 노드의 위치 값만 바꿔주면 되기 떄문에 효율적입니다. 그러나 검색은 노드 하나씩 순차적으로 스캔하기 때문에 상대적으로 느리다는 단점이 있습니다.
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
2-1. Linked list와 Array를 비교해서 설명해주세요.
[답변]
LinkedList와 Array를 비교해서 설명해보겠습니다.
LinkedList는 노드와 노드간 서로 연결되어 있는 형태이고, Array는 배열의 형태입니다. Array는 위치 정보를 가지고 있기 때문에 검색이 빠르고, LinkedList는 노드를 순회하며 검색하기 때문에 상대적으로 검색이 느립니다. 하지만 Array는 중간에 추가/삭제를 하면 이 후 배열의 인덱스를 조정해야 하지만 LInkedList는 전/후 노드의 위치정보만 수정해주면 되기 때문에 빠르고 편리합니다.
2-2. 어느 상황에 Array보단 Linked list를 쓰는게 좋을까요.
[답변]
수정/삭제가 빈번한 목록의 경우 LinkedList를 쓰는 것이 좋습니다. 이유는 전/후 노드의 위치정보만 수정하는 방식이라 Array보다 수정/삭제가 간편하기 때문입니다.
2-3. Dynamic array에 대해서 간단히 설명해 주세요.
[답변]
Dynamic array란 배열의 크기가 유동적으로 조절되는 배열입니다. 이는 배열의 크기를 미리 정하지 않고 필요에 따라 크기를 동적으로 조절할 수 있는 특징을 가지고 있습니다. 일반적으로 동적 배열은 배열의 크기가 증가 할 때 현재 배열의 두배 크기로 확장하는 방식을 사용합니다.
📌 Java에서는 ArrayList가 대표적인 Dynamic Array을 구현한 예시 입니다. ArrayList는 내부적으로 배열을 사용하며, 배열의 크기를 동적으로 조절합니다.
→ ArrayList의 초기 크기는 10입니다. 이후에 필요할 때 마다 1.5배씩 증가시킵니다.
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
/**
최소한 주어진 최소 용량만큼 큰 용량을 반환합니다.
충분할 경우 50% 증가된 현재 용량을 반환합니다.
주어진 최소 용량이 MAX_ARRAY_SIZE보다 크지 않으면
MAX_ARRAY_SIZE보다 큰 용량을 반환하지 않습니다.
*/
private int newCapacity(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
// >> 비트 오른쪽 시프트 연산자
// 2진수를 오른쪽으로 1비트 시프트 (2로 나눈 것과 동일)
}
3. 웹서비스에서 REST API의 특성에 대해서 갖추야 하는 조건을 생각나는 대로 말씀해주시겠어요?
[답변]
REST API가 갖춰야 할 특성을 설명해보겠습니다.
REST API는 Stateless 해야하고, URI가 자원을 식별할 수 있는 정보를 포함하고 있어야 하며, 적절한 HTTP Method를 사용해서 요청을 주고 받아야 하며, 클라이언트와 서버간 통신에는 자원의 표현이 명시적으로 정의 되어야 합니다. 일반적으로 JSON이나 XML 형식의 데이터를 사용하여 자원의 표현을 전송합니다.
3-1. REST API가 왜 이런 특성들을 갖춰야하나요? 무슨 장점이 있길래,
[답변]
REST API가 이런 특성들을 갖추면 프로그램간 안전하고 빠르고 간편하게 데이터를 주고 받을 수 있는 장점이 있습니다. 또한 REST API는 플랫폼에 독립적이고 확장이 편리합니다. 분산 시스템에 적합한 API 체계 입니다.
3-2. 그럼 모든 웹 API들이 RESTful하게 만들면 좋겠네요?
[답변]
모든 웹 API들을 RESTful하게 만드는 것이 항상 좋다고는 할 수 없습니다. 상황에 따라 효율적인 API가 다를 수 있습니다. 예를 들어 대량의 데이터를 주고 받거나 반복적인 작업이 많은 경우 RESTful한 API는 성능에 영향을 미칠 수 있습니다.
- REST API 외 API
- gRPC - 대규모 시스템에 성능이 중요하고, 효율적이고 빠른 통신이 필요한 경우 (마이크로 아키텍처 서비스 간 통신에 적합)
- GraphQL - 클라이언트가 필요한 데이터를 직접 지정하여 가가져와야 하는 경우. 클라이언트의 요청에 따라 정확한 데이터만을 응답할 수 있음
- WebSocket - 실시간 통신이 필요한 채팅, 실시간 게임. 양방향 통신을 지원하며 연결을 유지하면서 서버 및 클라이언트 간 데이터를 전송함
- SOAP - 기업 간 안정적이고 보안이 중요한 웹 서비스 통신이 필요한 경우 사용. XML 기반 메세지 교환 프로토콜로 보안 및 트랜잭션 처리와 같은 기능을 지원함
4. 가상 메모리에 대해서 간단히 설명해 주세요
- page와 segmentation를 간단히 비교 설명해 주세요.
- 알고계신 page 교체 알고리즘이 어떤게 있나요?
- LRU알고리즘과 LFU 알고리즘을 간단히 비교 설명해 주세요.
5. NoSQL을 프로젝트에서 사용해보신 적 있으신가요?
[답변]
NoSQL은 key-value 스토어 기능을 가지고 있는 DBMS로서 기존의 RDBMS와는 다른 형태의 데이터 베이스 입니다.
5-1. NoSQL의 장점이 어떤게 있을까요?
[답변]
NoSQL은 스키마가 없거나 유연한 스키마를 가지고 있고, 수평 확장이 가능해 대용량 데이터에 대한 쓰기/읽기 처리가 효율적입니다. 또한 비정형 데이터를 저장하고 조회할 수 있으며, 빠른 쓰기/읽기를 지원합니다.
5-2. RDB의 장점은 어떤게 있을까요?
[답변]
RDBMS는 정형화 된 데이터에 적합하고 ACID 트랜잭션을 보장하는데 강점을 가지고 있습니다.
- 지원자님께서 저희에게 물어볼 것이 있거나, 못다한 말이 있다면 간단히 해주세요
모의면접 4
1. 자기소개를 1분정도 간단히 해주세요.
- 언제부터 개발을 하셨나요? 개발 공부를 시작하시게 된 계기가 있을까요?
- 지원자님만의 개발 공부 방법이 있을까요?
- 컴퓨터 공부를 하면서 어려움은 없었나요? 있었다면 어떻게 극복하셨나요
- 지원자님만의 스트레스 해소법이 있으신가요?
2. hash table의 검색 시간복잡도는 어떻게 되나요?
- hash table 검색의 시간복잡도는 O(1)입니다.
- 검색의 worst case의 경우 O(n)이라고 말씀해 주셨는데, 더 자세히 설명해주시겠어요?
- 해시 테이블 검색의 최악의 상황에서 O(N)이 되는 경우는 해시가 충돌이 발생하여 충돌을 처리하는 방식에 따라 사유가 달라집니다. 체이닝의 경우에는 모든 키가 동일한 해시 값을 가지면 연결 리스트가 길어져 O(N)의 성능을 보일 수 있습니다. 오픈 어드레싱의 경우에는 충돌이 계속해서 일어나 모든 슬롯이 사용될 때 O(N)의 성능이 될 수 있습니다.
- hash table에서 hash value가 충돌하는 경우에는 어떻게 해결해야 할까요?
- 해시 테이블에서 해시 값이 충돌되는 경우 오픈 주소법이나 분리 체이닝 방법을 사용합니다.
- seperate chaining에 대해서 자세히 설명해 주세요.
- 분리 체이닝 방법은 엔트리 안에 연결리스트를 구성하는 것입니다. 따라서 같은 해시 값이 충돌나더라도 해당 키 값에 해당하는 엔트리를 순화하며 값을 찾을 수 있습니다.
3. RDB에서 사용되는 JOIN의 종류 아는대로 말씀해주세요
[답변]
RDB에서 사용하는 JOIN의 종류에는 INNER JOIN, OUTER JOIN, FULL OUTER JOIN, CROSS JOIN이 있습니다.
- inner join은 어떤 join인가요
- inner join은 두 테이블의 교집합으로서 조건을 만족하는 경우에만 레코드를 검색하는 조인입니다.
[답변]
- left join은 어떤 join인가요?
- left outer join은 왼쪽 테이블을 기준으로 값을 조회하는 조인을 뜻합니다. 기준 테이블 기준 오른쪽 테이블의 값이 없으면 null 값으로 검색됩니다.
[답변]
4. www.google.com을 주소창에 쳤을 때 화면이 나오기까지의 과정을 설명해 주세요.
[답변]
- 클라이언트 주소창에 www.google.com을 입력하면, 브라우저는 해당 도메인에 대한 IP 주소를 얻기 위해 DNS에 요청을 보냅니다.
- DNS에서 해당 도메인에 해당하는 ip를 찾아 브라우저에 반환합니다.
- 브라우저 캐시 → OS 캐시 → 로컬 DNS → 루트 DNS → TL DNS → IP 획득
- 브라우저는 얻은 IP 주소를 사용하여 해당 서버에 TCP 연결을 요청합니다.
- 서버는 클라이언트의 TCP 연결 요청을 수락하고, 양쪽 간의 신뢰성 있는 데이터 전송을 위해 TCP 연결이 설정됩니다.
- TCP 연결이 설정된 후, 브라우저는 해당 서버에게 HTTP 요청을 전송합니다. (이 요청은 TCP를 통해 안정하게 전송됩니다.)
- 요청 받은 서버는 HTTP 요청에 대한 적절한 응답을 생성하고, 이를 TCP를 통해 클라이언트에게 전송합니다.
- 브라우저는 받은 TCP 응답을 해석하고, HTML을 렌더링하여 사용자에게 보여줍니다.
5. TCP와 UDP를 비교해서 설명해 주세요.
[답변]
TCP는 연결 지향성 프로토콜이고, UDP는 비연결형 프로토콜 입니다. TCP는 데이터 전송이 보장이되는 반면에 UDP는 데이터 전송이 보장되지 않습니다. 이런 차이점 떄문에 TCP에 비해 UDP의 전송 속도가 빠릅니다. TCP는 주로 파일 전송, 이메일 전송, 웹 브라우징에 사용되고, UDP는 실시간 동영상 스트리밍 같이 손실이 생기더라도 속도가 중요한 경우에 사용됩니다.
6. 쿠키와 세션을 비교해서 설명해 주세요.
[답변]
쿠키와 세션을 비교해서 설명하겠습니다.
세션 방식은 서버 측에서 상태를 유지하는 방식입니다. 사용자 정보는 서버의 메모리나 데이터베이스 외부 캐시 서비스에 저장됩니다. 사용자 브라우저는 최초 요청시에 서버로 부터 세션 ID를 받고, 이 후의 각 요청 마다 세션 ID를 헤더에 실어 서버로 전송하여 사용자를 식별합니다. 세션은 서버의 자원을 사용하고, 사용자가 많이 지면 부하가 증가할 수 있습니다.
쿠키 방식은 클라이언트 측에서 상태를 유지하며, 서버에 상태 정보를 저장하지 않습니다. 서버는 각 요청을 독립적으로 처리합니다. 쿠키에 사용자를 식별할 수 있는 값이 암호화 되어 저장되어 있으면 만료 기간이 설정 되어 있습니다. JWT 방식이 쿠키를 이용하여 사용자 상태 갑을 유지하는 방식이라 할 수 있습니다.
7. 지원자님께서 저희에게 물어볼 것이 있거나, 못다한 말이 있다면 간단히 해주세요
Share article