백엔드 기술면접 질문(Python, Django)

Joohyung Park·2024년 5월 2일

기술면접

목록 보기
1/3
post-thumbnail

기술 면접에서 들었던 질문에 대해서 정리해보는 시간을 가져보겠습니다.

1. DB index

DB에서 데이터를 더 빠르게 찾을 수 있도록 도와주는 데이터 구조다.

  • 종류
    1. 기본 인덱스(Primary Index): 테이블의 주 키(PK) 컬럼에 자동으로 생성되는 인덱스. 유일한 값이다.
    2. 유니크 인덱스: 컬럼의 모든 값이 유일해야 하는 조건을 갖는 인덱스. 중복을 허용하지 않음
    3. 복합 인덱스(Composite index): 두 개 이상의 컬럼을 조합하여 생성하는 인덱스.
    4. 외래 키 인덱스(Foreign Key Index): 외래 키 컬럼에 생성되는 인덱스, RDB에서 참조 무결성을 유지하는데 사용
  • 단점
    1. 인덱스는 추가적인 디스크 공간을 사용한다.
    2. 데이터 변경 시 인덱스도 갱신되어야 하며 이러한 작업이 자주 일어난다면 성능 저하

index 자료구조(B-Tree)

이진트리에서 발전되어 모든 리프노드들이 같은 레벨을 가질 수 있도록 자동으로 밸런스를 맞추는 트리

인덱스의 자료구조는 여러가지가 있지만, 제일 보편적인 것이 B-Tree index이다. 정렬된 순서를 보장한다는 특징이 있다.

검색 동작 방식

Index가 수정, 삭제가 많이 일어나는 테이블에 맞지 않는 이유

인덱스는 또 다른 기존 테이블외에 인덱스 테이블을 가지고 있기에 검색속도가 빨라진다. 그러나, DML(insert, update, delete)이 자주 일어나는 테이블의 경우에는 오히려 성능이 떨어진다.

기본적으로 인덱스는 데이터를 삭제하더라도 사용안함 표시를 해주고 실제로 사라지는 것이 아니다. 또한, update 문으로 수정하는 경우에도 내부적으로는 delete 후에 다시 insert 하는 로직을 따르고 있다.

따라서 DML이 자주 일어나는 테이블에는 오히려 인덱스 테이블이 원래 테이블보다 크기가 커지는 경우가 발생하고, 사용하는 의미가 사라진다.

2. Django에서 DB의 읽기, 쓰기 성능을 향상시키는 방법

  1. 캐싱: 캐싱 프레임워크를 사용하여 자주 조회하는 데이터를 캐시에 저장
  2. 인덱스
  3. 쿼리 최적화: ORM으로 작성된 쿼리가 의도한 대로 효율적인지 확인하고 필요없는 쿼리를 제거
  4. DB 분리: 읽기와 쓰기 작업을 다른 DB 서버에 할당하여 성능 개선
  5. 배치 처리
  6. 비동기 처리: 비동기 ORM 지원을 통해 비동기 작업
  7. 커넥션 풀링: DB의 연결을 재사용함으로써 연결 설정 및 해제에 소요되는 시간 감소

3. 멱등성이란?

동일한 연산을 반복적으로 적용해도 결과가 달라지지 않는 특성이다.

HTTP 메서드의 GET, PUT, DELETE가 해당된다. 이러한 멱등성은 네트워크의 불안정성이나 장애로 인해 동일한 요청을 여러 번 보내야 하는 상황에서, 멱등성을 보장하는 요청은 시스템의 부작용 없이 안전하게 처리가 가능하다.

4. 도커란?

코드, 런타임, 시스템 툴, 시스템 라이브러리 및 설정을 포함한 애플리케이션과 그 종속성을 하나의 패키지로 묶어주는 가벼운, 격리된 환경을 통해 다양한 환경에서 동일하게 실행되도록 해주는 오픈소스 플랫폼이다.

  1. 경량성: 자원 소모 적음
  2. 이식성: 종속성을 일관된 환경으로 쉽게 이동 가능
  3. 버전 관리 및 확장성: 이미지를 통한 공유 및 확장의 용이
  4. 환경 분리
  5. 자동화: 앱 빌드, 테스트, 배포 과정을 자동화하여 CI/CD 파이프라인을 용이하게 구성 가능

5. 파이썬

  1. 인터프리터 언어: 소스 코드를 기계어로 미리 번역하지 않고, 실행시간에 소스 코드를 직접 해석하고 실행하는 프로그래밍 언어
  2. 간단한 문법: 코드를 더 쉽게 작성하고 유지보수할 수 있음
  3. 높은 수준의 추상화: 메모리 관리와 같은 저수준 운영을 자동 처리
  4. 폭넓은 표준 라이브러리: 다양한 라이브러리 제공
  5. 동적 타이핑: 변수를 사용할 때 데이터 타입을 명시할 필요 없음. 때때로 타입 에러를 발생시킬 수 있음.
  6. 활발한 커뮤니티
  • 특징
    • 즉각적인 실행
    • 플랫폼 독립성
    • 유연성
    • 성능 저하: 컴파일 언어에 비해 속도가 느림

6. 파이썬에 대해 아는대로 설명

이터레이터, 데코레이터, 제너레이터, 정규표현식, 클래스, 등등 배웠지만 실제로 사용해본 것은 중급 문법에서 클래스 정도라고 대답했었다.

7. OOP

Object-Oriented Programming 즉, 객체 지향 프로그래밍으로 프로그램을 객체 단위로 구성하여 개발하는 방식이다. 여기서 객체란, 데이터(속성)와 이 데이터를 처리하는 데 사용하는 함수(메서드)를 하나로 묶은 것이다.

  • 특징
    1. 캡슐화: 관련 있는 데이터와 메서드를 객체로 묶고, 객체의 일부 구현 세부 사항을 숨겨 외부에서 직접적인 접근을 제한하는 것이다.
    2. 상속: 한 클래스가 다른 클래스의 속성이나 메서드를 물려받는 것
    3. 다형성: 하나의 인터페이스나 메서드가 다양한 타입의 객체에 대해 다른 방식으로 동작할 수 있게 하는 원리
    4. 추상화: 필요한 정보와 기능만을 추출하여 인터페이스에 정의함으로써, 사용자가 복잡한 내부 구현을 몰라도 객체를 사용할 수 있게 함

Java, C++, Python, Ruby 등이 이를 지원한다.

8. 이진트리

각 노드가 최대 두 개의 자식 노드를 가질 수 있는, 계층적으로 조직된 데이터 구조이다. 데이터의 효율적인 검색, 정렬, 삽입, 삭제 등을 위해 사용된다.

  1. 정 이진 트리(Full Binary Tree): 모든 노드가 0개 혹은 2개의 자식 노드를 가짐
  2. 완전 이진 트리: 모든 레벨이 노드로 완전히 채워져 있으며, 마지막 레벨은 왼쪽부터 오른쪽으로 채워짐
  3. 균형 이진 트리: 모든 노드의 왼쪽과 오른쪽 서브트리의 높이 차이가 1 이하인 이진 트리이다.
  4. 이진 탐색 트리(Binary Search Tree): 모든 노드는 그 왼쪽 서브트리에는 자신보다 작은 값, 오른쪽 서브트리에는 자신보다 큰 값을 가지는 트리이다.

대량의 데이터를 다루는 경우 상당한 성능 향상을 기대할 수 있다.

9. 해시테이블

키와 값 쌍으로 데이터를 저장하는 자료구조 중 하나로, 효율적인 검색, 삽입, 삭제가 가능하다.

  • 특징
    1. 빠른 검색 속도: 평균적인 경우 O(1)
    2. 충돌 처리
    3. 동적 할당: 일부 구현에서 해시테이블이 가득 차면, 더 큰 크기의 해시테이블에 데이터를 재할당하여 저장 공간을 확장 가능

파이썬의 딕셔너리와 집합이 해당된다.

10. DFS, BFS

그래프나 트리를 탐색할 때 사용되는 기본적인 알고리즘

DFS(깊이 우선 탐색)

모든 노드를 방문할 때까지 깊이 들어가 탐색하며, 마지막 분기점에서 더이상 갈 곳이 없을 때 이전 분기점으로 돌아가 새로운 경로를 찾는다.

주로 스택, 재귀 호출을 사용한다. 미로 찾기, 퍼즐 게임 등에 활용할 수 있다.

BFS(너비 우선 탐색)

시작 노드에서 가까운 노드부터 차례대로 모든 노드를 탐색하고자 할 때 사용된다.

큐를 사용하여 시작 노드에 인접한 노드를 모두 방문한 후, 그 인접 노드들의 인접 노드를 차례로 방문하는 형식이다.

최단 경로 찾기, 소셜 네트워크 친구 찾기 등에 유용하다.

11. BFS는 큐밖에 못쓰는가

리스트나 다른 구조로도 구현이 가능하지만 큐의 선입선출을 모방하는 과정에서 비효율적이다. 따라서 탐색의 명확성과 효율을 위해 주로 큐를 사용한다.

12. OSI 7계층 모델과 각 기능

Open Systems Interconnection의 약자로, 서로 다른 시스템 간의 통신을 가능케 하는 표준화된 모델이다.

데이터가 전송 과정에서 상위 계층에서 하위 계층으로 순차적으로 내려가며 각 기능을 수행하고, 수신 측에서는 하위 계층에서 상위 계층으로 순차적으로 올라가며 처리된다.

물리 계층

네트워크의 가장 낮은 계층으로, 데이터를 전기적 신호로 변환하여 전송하는 기능을 담당한다.

데이터 링크 계층

물리 계층에서 송수신된 정보의 오류를 감지하고, 프레임 단위로 데이터를 전송한다. MAC 주소를 사용한다.

네트워크 계층

다양한 경로를 통해 패킷을 목적지까지 전송한다. IP 주소를 사용하며, 라우팅 기능도 수행한다.

전송 계층

End-to-End 신뢰할 수 있는 데이터 전송을 보장하기 위한 계층이다. TCP/UDP 프로토콜이 작동하며, 세그먼트나 데이터그램 단위로 데이터를 관리한다.

세션 계층

통신 세션구성, 관리, 종료하는 기능을 담당한다.

표현 계층

데이터 표현 형식을 관리한다. 서로 다른 시스템 간에 데이터를 교환할 수 있도록 형식을 변환하는 역할을 수행한다.

응용 계층

네트워크 소프트웨어와 사용자 간의 인터페이스를 제공한다. HTTP, FTP 같은 프로토콜이 작동한다.

13. TCP, UDP 차이점

인터넷에서 데이터를 전송하는 데 사용되는 두 가지 주요 프로토콜이다.

  1. 연결 지향성
  • TCP: 연결 지향, 3-way handshake를 통해 연결을 확립하며, 데이터 전송의 신뢰성을 보장
  • UDP: 비연결 지향, 바로 데이터 전송, 신뢰성 감소
  1. 신뢰성
  • TCP: 데이터의 정확한 전송을 보장
  • UDP: 손실이나 오류를 자동으로 처리하지 않음
  1. 헤더 크기와 처리 속도
  • TCP: 더 큰 헤더, 속도 느림
  • UDP: 작은 헤더, 속도 빠름
  1. 사용 사례
  • TCP: 이메일, 웹 페이지, 파일 전송 등
  • UDP: 실시간 스트리밍, 온라인 게임, VoIP(음성 통신) 등

14. HTTP, HTTPS 차이점

웹 페이지와 웹 서버 간의 데이터를 교환하는 데 사용되는 프로토콜

HTTP

데이터를 암호화하지 않고 평문으로 전송한다. 80번 포트가 기본이다.

HTTPS

SSL, TLS을 추가한 HTTP이다. 443포트가 기본이며, 신뢰성을 보장하기 위해 디지털 인증서를 사용한다.

15. IP 주소와 MAC 주소 차이

네트워크상에서 장치들을 식별하는 데 사용되는 두 가지 주소 유형이다.

IP 주소

인터넷과 같은 TCP/IP 네트워크에서 데이터의 목적지를 지정하는 데 사용된다. 장치나 네트워크의 위치를 기반으로 할당된다.

MAC 주소

네트워크 인터페이스 카드에 고유하게 할당된 물리 주소이다. 6개의 16진수 쌍으로 표시되며 (01:23:45:67:89:ab) 전 세계적으로 고유하며, 일반적으로 변경이 불가능하다.

16. IPv4와 IPv6 차이점

IPv4는 32비트 주소(192.168.0.1)를 사용하며 v6는 128비트 주소(2001:0db8:85a3:0000:0000:8a2e:0370:7334)를 사용한다. 또한, v6는 보안이 기본적으로 포함된다.

17. DNS 정의

Domain Name System의 약자로 사람이 읽을 수 있는 도메인 이름을 기계가 읽을 수 있는 IP 주소로 변환하는 시스템이다.

18. 포트의 정의

네트워크 상에서 통신을 하기 위해 사용되는 가상의 접점을 의미한다.

IP 주소와 함께 사용되어, 특정한 IP 주소의 특정한 서비스나 어플리케이션에 데이터가 전송될 수 있도록 한다.

19. NAT의 정의

Network Address Translation의 약자로 로컬 네트워크 상의 개별 기기가 인터넷과 같은 외부 네트워크상의 리소스와 통신하도록 IP 주소를 변환해주는 기능이다.

주로, 개인 IP 주소를 공용 IP 주소로 변환하는데 사용되며, 내부 네트워크를 외부로부터 보호하는 데 중요한 역할을 한다.

20. 데이터 패킷이 이동하는 과정

21. Nginx, Gunicorn

Nginx

고성능 웹 서버, 리버스 프록시, 이메일 프록시 등 다양한 기능을 제공하는 오픈 소스 소프트웨어이다.

  1. 리버스 프록시와 로드 밸런싱
  • 리버스 프록시로서의 역할을 통해 외부에서 오는 요청을 내부 네트워크의 여러 서버로 분산시키는 로드 밸런싱 기능 제공
  1. 정적 컨텐츠 처리: Nginx는 정적 파일을 매우 효율적으로 처리하며, 이를 통해 웹 사이트의 응답 속도를 개선 가능

Gunicorn

파이썬 WSGI(Web Server Gateway Interface) 애플리케이션을 위한 HTTP 서버이다. 동적 컨텐츠를 처리한다.

  1. WGSI 서버
  • 파이썬의 WSGI 규약을 구현한 서버로, 파이썬 애플리케이션과 웹 서버 사이의 인터페이스 역할을 한다. 이를 통해 효율적인 통신을 한다.
  1. 프리포크 워커 모델
  • 마스터 프로세스가 여러 워커 프로세스를 관리한다. 각 워커 프로세스는 독립적으로 클라이언트의 요청을 처리 가능하며, 동시에 여러 요청을 효율적으로 처리할 수 있다.

22. 깃허브 협업 시 코드 리뷰 여부

23. 린터(Linter)

코드를 분석해서 프로그래밍 오류, 버그, 스타일 오류, 의심스러운 구조 등을 찾아내는 도구이다.

JS의 ESLint, 파이썬의 Pylint, Java의 Checkstyle 등이 있다.

24. 포매터(Formatter)

코드의 스타일을 일관되게 유지하기 위해 포맷을 자동으로 조정하는 도구이다.

  • 들여쓰기 조정
  • 줄바꿈 조정
  • 코드 블록 정렬
  • 스타일 가이드 적용

등의 기능을 하며, JS의 Prettier, 파이썬의 Black, Java의 Google Java Format 등이 있다.

25. Django의 장점

파이썬으로 작성된 풀스택 프레임워크로, 빠른 개발과 깔끔하고 실용적인 디자인을 목표로 한다.

장점

  • 빠른 개발: DRY(Don't Repeat Yourself) 원칙을 따르며 중복을 최소화하고 개발 시간을 단축
  • 다양한 추가 기능 내장: 인증, 관리자 페이지, ORM, 템플릿 시스템 등을 쉽게 구현 가능
  • 보안: SQL 인젝션, 크로스 사이트 스크립팅 등의 문제를 기본적으로 방지
  • 상세한 문서: 매우 상세하고 잘 구성된 문서 제공

26. Django와 Lightsail을 같이 사용해도 되는가

저렴한 가격에 간편하게 가상 서버를 설정하고 운영할 때 사용한다.

잠재적인 단점

  • 성능 제한: 상대적으로 제한된 리소스를 제공하므로, 대규모 트래픽이나 데이터 집약적인 Django 애플리케이션에서 성능 문제 발생 가능
  • 확장성: 소규모 프로젝트, 개발/테스트 환경에 적합하게 설계되어 트래픽이 급증하는 상황에서 빠르게 확장이 어려움
  • 비용: 초기에는 저렴해 보이지만, 트래픽 증가나 추가 리소스 요구로 인해 비용이 예상보다 높아질 수 있음

27. 동기, 비동기

동기

순차적으로 작업이 이루어 진다.

한 작업이 완료될 때까지 다음 작업이 대기 상태에 있다. 그러나 리소스 활용 측면에서 비효율적일 수 있다.

비동기

작업이 동시에 진행된다.

리소스를 효율적으로 활용할 수 있고, 전체적인 응답 시간을 단축할 수 있다. 이는 복잡한 로직을 필요로 하며, 콜백 함수나 프로미스, async/await 같은 기술이 사용된다.

28. 비동기 사례

소셜 미디어 피드 로딩, 챗봇 등에 사용된다.

29. 테스트 코드

TestCase 클래스를 사용하여 테스트한다.

  • TestCase 클래스: 파이썬의 unittest.TestCase를 확장한 것으로, 테스트가 끝나면 변경사항은 롤백되어 다른 테스트에 영향을 주지 않는다.

  • Client 객체: django.test.Client 객체를 사용하여 Get, Post 요청을 생성하고, 응답을 검사하는 등의 작업 수행

  • SimpleTestCase 및 TransactionTestCase: 데이터베이스를 사용하지 않는 테스트

30. 최근 공부한 내용 설명

31. 개발자로서 본인의 강점

참고

OSI 7계층
데이터 패킷
index
B-Tree

profile
익숙해지기 위해 기록합니다

0개의 댓글