취업 관련 준비

기술 면접 대비 예상 질문 모음 - 11/14 ~ 11/17

iksadnorth 2023. 11. 17. 13:33

39. CI/CD에 대해서 설명해주세요.

my)
CI/CD는 각각 "Continuous Integration"과 "Continuous Deploy"의 줄임말로서 
소프트웨어의 개발 및 배포를 자동화함으로서 더 빠르고 Human Error가 개입할 가능성을 
차단해 신뢰성을 높이는 기술 개념입니다.
CI는 개발자들이 공유 코드 저장소에 통합할 때마다 빌드 및 테스트를 수행하는 과정을 의미하며,
이것을 통해 코드 통합을 더 자주하게 되어 코드 병합 충돌을 줄여갈 수 있고
버그를 조기에 발견할 수 있다는 이점이 생깁니다
CD는 테스트를 통과한 코드의 프로덕션으로의 배포를 자동화 시키는 것을 의미하며,
이것을 통해 Human Error에 의해 배포할 수 없는 상황이 일어나지 않게 해줍니다.

 

40. TDD에 대해서 설명해주세요.

my)
TDD는 Test Driven Development의 약어로서, 소프트웨어 개발론 중 하나입니다.
핵심 아이디어는 코드를 짜기 이전에 먼저 테스트 케이스를 먼저 설계하고
해당 테스트 케이스를 통과하는 코드를 작성할 때까지 코드를 작성하는 것을 의미합니다.
TDD를 수행함으로서 테스트 코드를 강제적으로 작성할 수 있게 되므로 코드에 신뢰성을 담아낼 수 있고
코드 작성자의 의도를 쉽게 파악할 수 있어 가독성이 좋아집니다.
뿐만 아니라 코드를 리펙토링을 수행해도 테스트 코드가 작성되어 있기 때문에 
오류를 초기에 파악할 수 있어 안심하고 리펙토링을 수행할 수 있습니다.

 

41. 프로세스와 쓰레드에 대해서 설명하고 그 차이에 대해서 설명해주세요.

my)
프로세스는 프로그램이 OS로부터 메모리, CPU 등등을 할당받아 동작하는 프로그램 인스턴스를 의미하며
쓰레드는 프로세스 내에서 업무를 병렬적으로 수행하기 위해 구분되어진 작업의 단위를 의미합니다.
프로세스는 OS로부터 메모리를 할당받게 되는데 이 때, 프로세스 각각의 독립된 메모리를 보장받게 됩니다.
때문에 다른 프로세스에 의해 메모리 내용이 훼손되는 경우가 없어 안정적입니다.
하지만 각각에 대해 메모리를 따로 할당하는 것이다보니 메모리 낭비가 심하고 자유로운 정보 공유가 어렵습니다.
쓰레드는 프로세스 내의 Stack 메모리 부분을 제외한 나머지 부분을 공유하게 됩니다. 
때문에 한 프로세스 내의 쓰레드들은 자유롭게 메모리값을 공유할 수 있으며 메모리 낭비도 적습니다.
하지만 이 때문에 한 쓰레드에서의 오류가 다른 쓰레드로 전파될 위험이 존재하기에 안정성은 떨어집니다.

 

42. 멀티프로세스와 멀티쓰레드의 특징에 대해 설명해주세요.

my)
멀티프로세스는 말 그대로 하나의 응용 프로그램을 위해
여러 개의 프로세스들을 운용하는 것을 의미하며
멀티쓰레드에 비해 Context Switching 비용이 큰 편입니다.
아무래도 모든 자원이 분리되어 관리되다 보니 하나의 프로세스에서 다른 프로세스로
바꿀 때, 모든 메모리를 다시 초기화 시키다 보니 프로세스를 변환하는 것만으로 비용이 커집니다.
하지만 철저히 분리되어 있다보니 하나의 프로세스가 장애를 일으켜도
해당 프로세스만 문제를 일으킨다는 장점이 있습니다.
반면 멀티쓰레드는 멀티프로세스에 비해 Context Switching 비용이 적은 편입니다.
Stack을 제외한 나머지 메모리들을 공유하고 있기에 굳이 모든 메모리를 갈아끼울 필요가 없기 때문입니다.
하지만 메모리를 공유하다보니 한 쓰레드에서의 장애가 다른 쓰레드로 전염될 수도 있기에
주의깊은 설계가 필요합니다

43. 쿼리 최적화에 대해 설명해주시고 방법에 대해 설명해주세요.

my)
데이터 검색, 생성, 갱신 등등을 위한 SQL 쿼리문의 성능을 보다 빠르고 효율적으로 수행하기 위한 
작업을 의미합니다. 같은 내용의 쿼리여도 트랜잭션 범위에 따라 혹은 인덱스 사용 여부에 따라 
쿼리의 성능이 달라질 수 있습니다.
쿼리를 최적화하는 방법은 여러 가지가 있기에 하나하나 말씀을 드리면,
1번째로 인덱스를 활용하는 것이 있습니다.
인덱스는 데이터를 보다 빠르게 검색하기 위해 만든 장치로서 
데이터의 갱신 속도를 희생시켜서 데이터 조회 속도를 향상시킬 수 있습니다.
2번째로 Join 연산을 줄이는 방향으로 추가적인 칼럼을 설계하는 것 입니다.
정규화를 통해 테이블의 상태 이상을 제거할 수는 있지만 데이터가 매우 많아지게 되면
'좋아요 갯수'와 같은 연산을 매번 수행하게 되어 데이터 로딩 속도를 떨어뜨릴 수 있습니다.
때문에 마찬가지로 데이터 갱신 속도를 희생시키지만 반정규화를 통해 미리 특정 값을 계산해둔다면
조회 속도를 크게 늘릴 수 있습니다.
3번째는 트랜잭션 범위를 줄여서 데이터 잠금 상태 시간을 줄이는 것 입니다.
반복되는 집계 조회 쿼리 혹은 데이터 수정 쿼리 등등의 쿼리가 아닌 나머지 쿼리에도 
트랜잭션을 적용해 불필요하게 데이터를 잠궈버려 다른 트랜잭션이 개입하지 못하게 만드는 상황을
제거해 쿼리를 최적화할 수 있습니다.

 

44. DB 로직 최소화를 하려면 어떻게 해야 할까요?

my)
43와 동일.

 

45. 테스트코드에 대해서 아는대로 설명해주시고 활용 경험에 대해서 답변해주세요.

my)
테스트 코드는 실제로 작성한 코드가 의도된 대로 작동하는지 않하는지 확인하기 위해 작성하는
코드입니다. 오류들은 컴파일 단계에서도 충분히 해결할 수도 있지만 몇몇 오류에 대해서는
컴파일 단계에서도 걸러내지 못하는 경우가 존재하기 때문에 실제로 서비스 서버에 올리기 전에
테스트 코드를 통해 런타임에서도 오류가 발생하는지를 확인할 수 있습니다.
저의 경우, 주로 코드 리펙토링을 위해 테스트 코드를 작성하는 편입니다.
테스트 코드를 작성하기 이전에는 코드 구조는 최적화하기 위해 정상적으로 작동하는 코드를
수정해 아예 작동하지 않는 경우가 생겼던 경험이 있습니다.
하지만 테스트 코드를 통해 필수적으로 통과해야 하는 테스트 케이스를 만들어 
코드 리팩토링 후에도 해당 케이스를 통과시키는지 확인함으로서 코드 안정성을 높인 적이 많았습니다.

 

46. Array, LinkedList에 대해 설명해주시고 각각 어떻게 사용하는지 말씀해주세요.

my)
Array는 물리적으로 연속한 메모리에 데이터들을 나열하는 자료구조를 의미합니다.
순차, 랜덤 조회가 빠르다는 장점이 있는 반면, 배열에 요소가 추가될 때마다
새로운 메모리 리스트를 탐색해야 할 수도 있어서 빈번한 추가, 삭제가 있는 경우
사용하지 않는 것이 좋습니다.
LinkedList는 물리적으로 연속하지 않아도 배열의 순서를 지킬 수 있는 자료구조입니다.
각 요소들은 메타 정보란에 다음 메모리 주소값을 가지고 있어서 특정 요소의 근접 요소로 이동할 수 있습니다.
이 자료구조는 단순히 새로 삽입할 요소를 임의의 장소에 할당하고 맨 마지막 요소의 주소값을 이전 요소에
기입하면 됩니다. 하지만 순차, 랜덤 조회 성능이 떨어진다는 단점이 있습니다.

 

47. AWS S3, EC2를 사용하는 이유와 사용 경험에 대해서 답변해주세요.

my)
AWS S3는 각종 파일, 이미지, 비디오, 로그 등등의 파일을 저장할 수 있는 저장소입니다.
S3는 필요에 따라 공간을 무제한으로 늘릴 수 있어서 용량 걱정할 필요가 없습니다.
뿐만 아니데이터를 여러 가용 영역에 복제하여 데이터 손실을 방지하고 고가용성을 제공합니다.
AWS EC2는 AWS에서 제공하는 클라우드 컴퓨팅 서비스로서 다양한 OS를 제공하고
필요에 따라 컴퓨터 사양과 크기를 조절할 수 있습니다.

S3는 의류 중고 거래 웹사이트 제작 프로젝트 당시, 상품들의 이미지를 저장하기 위해 사용했고
서버 스토리지 용량 걱정없이 서비스를 운용하기 위해 사용했었고
EC2는 재빠른 서버 복구를 위한 서버 구축을 위해 해당 플랫폼을 사용한 적이 있었습니다.

 

48. 정렬 알고리즘에 대해서 아는대로 설명해주세요.

my)
정렬 알고리즘에 여러 알고리즘이 있지만 대표적인 정렬 방법 6가지에 대해 설명하겠습니다.
1. 버블 정렬
인접한 요소 2개를 비교하고 큰 요소가 오른쪽에 위치되지 않으면 swap해서 
정렬하는 방법입니다. 2차함수의 시간 복잡도를 가지고 있습니다.
2. 선택 정렬
특정 범위 내의 리스트 중 가장 작은 요소를 찾아 맨 앞에 위치시키며 정렬하는 방법입니다.
2차함수의 시간 복잡도를 가지고 있습니다.
3. 삽입 정렬
손 안의 카드를 정렬하는 방식의 정렬 방법으로 특정 요소를 인접한 요소부터
검색해 적절한 위치에 다시 위치시키는 방법으로 정렬하는 방식입니다.
2차함수의 시간 복잡도를 가지고 있습니다.
4. 병합 정렬
배열을 절반씩 재귀적으로 분리시킨 후에 차근차근 2개씩 짝지어 정렬시키는 방법입니다.
n logn 시간 복잡도를 가지고 있습니다.
5. 퀵 정렬
피벗 요소를 정한 이후, 해당 요소를 기준으로 큰 요소는 오른쪽으로 작은 요소는 왼쪽으로 옮기며
정렬하는 방법입니다.
n logn 시간 복잡도를 가지고 있습니다.
6. 힙 정렬
힙 자료구조를 이용해서 정렬하는 방법입니다.
n logn 시간 복잡도를 가지고 있습니다.