첫번째 면접

1. 프로세스와 스레드의 차이점

프로세스는 실행 중인 프로그램으로 디스크로부터 메모리에 적재되어 CPU 의 할당을 받을 수 있는 것을 말한다.

스레드는 프로세스의 실행 단위라고 할 수 있다. 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유할 수 있다.

2. 데드락이 무엇이고 어떻게 해결하나

교착상태(Dead Lock)은 상호 배제에 의해 나타나는 문제점으로, 둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상을 의미합니다.

  • 예방
  • 회피
  • 회복
  • 발견
이유 설명
상호배제(Mutual Exclusion) 한번에 한개의 프로세스만이 공유 자원을 사용할 수 있어야 합니다.
점유와 대기(Hold and Wait) 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용되고 있는 자원을 추가로 점유하기 이해 대기하는 프로세스가 있어야 합니다.
비선점(Non-preemption) 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야합니다.
환형 대기(Circular Wiat) 공유자원과 공유자원을 사용하기 위해 대기하는 프로세스들이 원형으로 구성되어 있어 자신에게 할당된 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구해야 합니다.

3. TCP와 UDP의

TCP

  • 연결형 서비스로 가상 회선 방식을 제공한다.
  • 3-way handshaking과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제한다.
  • 흐름 제어 및 혼잡 제어.
  • 높은 신뢰성을 보장한다.
  • UDP보다 속도가 느리다.
  • 전이중(Full-Duplex), 점대점(Point to Point) 방식.

UDP

  • 비연결형 서비스로 데이터그램 방식을 제공한다
  • 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다.
  • UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출한다.
  • 신뢰성이 낮다
  • TCP보다 속도가 빠르다

두번째 면접

Django

DRF(Django RestFramework)의 기본적인 동작 방식은?

--업데이트

AWS 배포 구조

--업데이트

ORM의 문제점 / 주의해야할 점

ORM은 데이터베이스의 테이블을 객체지향 프로그래밍에서 흔히 사용하는 객체(Class)처럼 사용할 수 있도록 해주는 기술입니다.

N+1 Problem

lazy loading
ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아니라 모든 명령 처리가 끝나고 실제로 데이터를 불러와야 할 시점이 왔을 때 데이터베이스에 쿼리를 실행하는 방식을 의미합니다.

  • 매 단계마다 쿼리를 실행하지 않기 때문에 쿼리 요청을 최소화 할 수 있다는 것입니다.
  • 하지만 이 방식이 성능에 악영향을 미칠 수도 있습니다.

해결법

Eager Loading
Eager Loading은 Lazy Loading의 반대 개념으로 사전에 쓸 데이터를 포함하여 쿼리를 날리기 때문에 비효율적으로 늘어나는 쿼리 요청을 사전에 방지할 수 있습니다.

  • prefetch_related : 복잡한 관계를 가지고 있는 테이블간에 사용할 수 있는 메서드입니다. 하나의 row에 대해 관계가 이루어진 여러개의 row들이 존재할 때 (many=True 옵션이 적용되는 경우) 사용될 수 있습니다. 이 메서드가 쿼리로 치환될 때 WHERE … IN 구문으로 치환됩니다.

  • select_related : 가장 간단하게 Eager Loading을 구현할 수 있는 메서드입니다. 이 메서드를 사용하면 쿼리상으로는 SQL Join을 수행하게 됩니다.

ViewSet과 View의 차이점

  • View 클래스와 거의 비슷하지만, get과 put 메서드는 지원하지 않고 read와 update 메서드를 지원합니다.
  • Router 클래스를 사용하여 복잡한 URL 설정을 처리합니다.

ViewSet의 주요 기능

  • Pagination
  • Filtering & Search
  • Authentication & Permission

효율적으로 객체에서 반복적으로 여러개의 모델에서 비슷한 영역의 데이터를 가져오려 할때 작성해야하는것 은 무엇인가?

Middleware
http 요청 / 응답 처리 중간에서 작동하는 시스템이다.
장고는 http 요청이 들어오면 미들웨어를 거쳐서 해당 URL 에 등록되어 있는 뷰로 연결해주고, http 응답 역시 미들웨어를 거쳐서 내보낸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
def my_middleware(get_response):
# 최초 설정 및 초기화

def middleware(request):
# 뷰가 호출되기 전에 실행될 코드들

response = get_response(request)

# 뷰가 호출된 뒤에 실행될 코드들

return response

return middleware

render 와 redirect 의 차이

render 는 템플릿을 불러오고
redirect 는 URL로 이동합니다.

만약 서버에 요청을 보냈을 때 응답시간이 너무 오래걸리면 무엇을 고려해야하나?

반복문을 확인해서 잘못된것이 없는지 확인 하는것은 컴퓨터 성능의 발전으로 많은 차이가 나지 않지만
데이터베이스에 접근하는 부분이나 호출하는 부분에 코드를 중점적으로 확인해 정확한 영역을 접근하는지 중복된 코드가 있는지를 확인 해야한다.

HTTP와 HTTPS 와의 차이는 무엇인가?

HTTP
HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다.

HTTP 의 문제점
HTTP 는 평문 통신이기 때문에 도청이 가능하다.
통신 상대를 확인하지 않기 때문에 위장이 가능하다.
완전성을 증명할 수 없기 때문에 변조가 가능하다.
위 세 가지는 다른 암호화하지 않은 프로토콜에도 공통되는 문제점들이다.

보안 방법

통신 자체를 암호화
SSL(Secure Socket Layer) or TLS(Transport Layer Security)라는 다른 프로토콜을 조합함으로써 HTTP 의 통신 내용을 암호화할 수 있다.
SSL 을 조합한 HTTP 를 HTTPS(HTTP Secure) or HTTP over SSL이라고 부른다.

콘텐츠를 암호화
말 그대로 HTTP 를 사용해서 운반하는 내용인, HTTP 메시지에 포함되는 콘텐츠만 암호화하는 것이다.
암호화해서 전송하면 받은 측에서는 그 암호를 해독하여 출력하는 처리가 필요하다.

HTTPS
HTTP 에 암호화와 인증, 그리고 완전성 보호를 더한 HTTPS

HTTPS는 SSL 의 껍질을 덮어쓴 HTTP 라고 할 수 있다. 즉, HTTPS 는 새로운 애플리케이션 계층의 프로토콜이 아니라는 것이다.
HTTP 통신하는 소켓 부분을 SSL(Secure Socket Layer) or TLS(Transport Layer Security)라는 프로토콜로 대체하는 것 뿐이다.
HTTP 는 원래 TCP 와 직접 통신했지만, HTTPS 에서 HTTP 는 SSL 과 통신하고 SSL 이 TCP 와 통신 하게 된다.
SSL 을 사용한 HTTPS 는 암호화와 증명서, 안전성 보호를 이용할 수 있게 된다.

HTTPS 의 SSL 에서는 공통키 암호화 방식공개키 암호화 방식을 혼합한 하이브리드 암호 시스템을 사용한다. 공통키를 공개키 암호화 방식으로 교환한 다음에 다음부터의 통신은 공통키 암호를 사용하는 방식이다.

HTTPS 의 SSL 은 무엇이 가장 중요한가?

SSL은 Secure Socket Layer이라는 약자로 보안 소켓 레이어이다.

공개키 암호화 방식

  1. 사이트에서 인증기관(CA: Certificate Authority)에 인증요청
  2. 인증기관에서 검증후에 사이트의 공개키와 정보를 인증기관의 개인키로 암호화, 인증기관의 공개키는 브라우저에 제공
  3. 사용자가 사이트로 접속 요청시 사이트는 인증서 전송
  4. 사용자는 브라우저에 내장된 공개키로 인증서를 복호화 -> 사이트의 공개키로 대칭키를 암호화하여 전송
  5. 사이트는 전송받은 암호화된 대칭키를 사이트의 개인키로 복호화 -> 사용자, 사이트 같은 대칭키 획득
  6. 전송시 해당 대칭키로 암호화하여 전송

하루를 기록하다