CS 면접

Backend 정리

Louis.T.Kim 2021. 1. 29. 21:39

______________________________________________________________________________________________________________________________

 

1. Hadoop

 - What is Hadoop? [m.blog.naver.com/PostView.nhn?blogId=acornedu&logNo=220957220179&proxyReferer=https:%2F%2Fwww.google.com%2F

  • HDFS : 하둡은 여러개의 컴퓨터를 하나로 묶어 대용량데이터를 처리하는 기술로 , 수천대의 분산된 x86장비에 대용량 파일을 저장할 수 있는 기능을 제공하는 분산파일 시스템과,
  • MapReduce : 저장된 파일을 분산된 서버의 CPU와 메모리 자원을 이용하여 빠르게 분석하는 맵리듀스 플랫폼으로 구성되어 있다.
  • Spark : 빅데이터를 빠르게 처리 (RDD 이용)

 

 

2. Git

 

3. HTTP 동작 원리

 

______________________________________________________________________________________________________________________________

 

4. node.js npm typescript ECMA6

 

4.5. JVM

- Java ByteCode를 실행할 수 있는 주체

 1) Class Loader

    - javac이 xxx.java -> xxx.class를 컴파일

    - 이 Class file들을 엮어서 Runtime Data Area에 적재하는 역할

   

 2) Execution Engine

   - ByteCode들을 기계어로 변경해 명령어 단위로 실행

   - 명령어를 하나하나 실행하는 인터프리터방식, JIT 컴파일러를 이용하는 방식

   - JIT 컴파일러는 적절한 시간에 전체 바이트코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일 코드를 실행할 수 있게 해줌

 

 

3) Garbage Collector

   - Heap 영역에 생성된 객체중 참조되지 않는 객체를 제거

   - GC가 언제 일어날지는 모름 (참조가 없어지자마자 Memory 해제 x)

 

  4) Runtime Data Area

   [1] Method : static, final, Class 메타 정보

   [2] Heap : new로 생성됨. GC 대상

   [3] Stack : 

   [4] PC Registger : Thread가 생성될 때마다 생성. 현재 쓰레드의 PC(Program Counter)를 저장

   [5] Native Method Stack : 자바 언어 외의 네이티브 코드를 위한 메모리. C/C++ 등 

 

 

 

5. JVM, JRE, JDK (.jar)

wikidocs.net/257

www.itworld.co.kr/t/62076/%EA%B0%80%EC%83%81%ED%99%94/110768

ko.wikipedia.org/wiki/JAR_(%ED%8C%8C%EC%9D%BC_%ED%8F%AC%EB%A7%B7)

  • JAR(Java Archive, 자바 아카이브)는 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼 응용 소프트웨어 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다.[3]
  • JAR 파일은 자바 런타임이 효율적으로 애플리케이션을 배치(디플로이)할 수 있는 수단으로 설계되었다. 자바 애플리케이션을 구성하는 클래스와 관련 리소드들을 단일 파일로 묶어 압축된 형태인 JAR 파일은, 한 차례의 요청으로 애플리케이션 전체를 다운로드할 수 있게 해준다.
  • Class, 리소스, 메타데이터를 하나의 파일로 생성 -> 자바 플랫폼에 소프트웨어, 라이브러리를 배포하기 위한 파일 포맷. 내부 적으로는zip으로 압축된 파일.

6. GC ( https://d2.naver.com/helloworld/1329)

 

  • Garbage Collection(GC) : JVM에서 명시적이지 않게 메모리를 Free하는 과정
    • Stop-the-world : GC thread 실행을 위해 JAVA의 모든 thread를 중단하는 것. 이 명령어를 자주 발생시키지 않도록 하는게 opt
    • Weak generational hypothesis
      • 1) 대부분 객체는 금방 접근 불가능 상태가 된다.
      • 2) 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
    • 대부분 금방 접근 불가능(참조당하지 않는 객체)이 되기 때문에, Young 영역과 Old 영역으로 나누고, Young에서 Minor GC, Old에서 Major GC를 한다.
    • Old -> Young 참조는 적기 때문에, 이러한 참조는 테이블을 만들어 관리하고, Young 영역의 GC 실행할 때에는 Old 영역에 있는 모든 객체의 참조를 확인하지 않고, 카드 테이블만 뒤져서 GC 대상인지 식별한다.
  • Minor GC : 
  • Major GC : Mark & Sweep -> Memory 재정렬 (빈공간이 생겼기 때문) 

   - Mark : Stack 영역을 스캔해 참조하고 있는 객체를 Mark

   - Sweep : Mark안된 메모리를 Heap에서 제거

________________________________________________________________________________________________________________________________________________

- Minor GC : New 영역에서 일어나는 GC

1. 최초에 객체가 생성되면 Eden영역에 생성된다.

2. Eden영역에 객체가 가득차게 되면 첫 번째 CG가 일어난다.

3. survivor1 영역에 Eden영역의 메모리를 그대로 복사된다. 그리고 survivor1 영역을 제외한 다른 영역의 객체를 제거한다.

4. Eden영역도 가득차고 survivor1영역도 가득차게된다면, Eden영역에 생성된 객체와 survivor1영역에 생성된 객체 중에 참조되고 있는 객체가 있는지 검사한다.

5. 참조 되고있지 않은 객체는 내버려두고 참조되고 있는 객체만 survivor2영역에 복사한다.

6. survivor2영역을 제외한 다른 영역의 객체들을 제거한다.

7. 위의 과정중에 일정 횟수이상 참조되고 있는 객체들을 survivor2에서 Old영역으로 이동시킨다.

- 위 과정을 계속 반복, survivor2영역까지 꽉차기 전에 계속해서 Old로 비움

 

- Major GC(Full GC) : Old 영역에서 일어나는 GC

1. Old 영역에 있는 모든 객체들을 검사하며 참조되고 있는지 확인한다.

2. 참조되지 않은 객체들을 모아 한 번에 제거한다.

- Minor GC보다 시간이 훨씬 많이 걸리고 실행중에 GC를 제외한 모든 쓰레드가 중지한다.

 

* Major GC(Full GC)가 일어나면,

Old영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거하게 된다.

그러면서 Heap 메모리 영역에 중간중간 구멍(제거되고 빈 메모리 공간)이 생기는데 이 부분을 없애기 위해 재구성을 하게 된다. (디스크 조각모음처럼 조각난 메모리를 정리함)

따라서 메모리를 옮기고 있는데 다른 쓰레드가 메모리를 사용해버리면 안되기 때문에 모든 쓰레드가 정지하게 되는 것이다.

________________________________________________________________________________________________________________________________________________

 

7. Web Server / Web Application Server(WAS)

  • Web Server : 파일 기반으로 돌아간다. (Apache HTTP server, nginx)
  • WAS : 코드 기반으로 돌아감 (Apache Tomcat, Spring Boot)

8. Network Socket

  • 대부분 네트워크 소켓은 인터넷 프로토콜 기반의 인터넷 소켓
  • 소켓을 이용한 TCP/IP 프로그래밍을 소켓 프로그래밍이라 함
  • 소켓을 활용해 웹서버를 구현가능

9. JAVA Servlet

  • HTTP를 쉽게 사용하기 위한 자바 언어 스펙
  • Jakarta EE에 포함 (Java Enterprise Edition) : Java언어 안에 포함됨 -> http 어렵게 쓰지마라.
  • Servlet Engine을 사용해서 Servlet <-> Http 처리
  • Http Server 기능을 가지고 있지만 더 강력한 http 서버를 추가 설치하는 경우가 많다.
  • 빠르게 구동하기 위한 엔진을 쓴다. (ex TomCat)
  • get url 했을 때 Text를 Java Object로 Parse
  1. Web Socket으로 서버를 짤 수 있다. 
  2. (but) Socket 통신 규약 때문에, Text Parsing이 어렵다.
  3. Servlet이 등장해서, Text를 Object로 Parsing해준다.
  4. (but) 고성능, 대용량 처리가 어렵기 때문에 Servlet Engine이 등장. (Tomcat)
  5. (URL mapping, 관리, 웹에 필요한 기능)들이 필요해서 Web Framework이 채워준다.
  6. 설치도 어려우니 Maven으로 관리

 

10. RESTful

  • 모든 리소스에 대해 1대1대응되는 URI로 표현하고, 해당 URI에 대한 기능을 4+2=6가지의 method로 나누어서 대응하는 API를 RESTful API라 한다. 
  • 그리고 이렇게 함으로써 리퀘스트들을 완전히 독립적으로, API 유저의 맥락으로부터 자유롭고 stateless하게 만드는 것이 REST 철학이다.
  • 예를들면 페이지가 옮겨가는데도 URI가 바뀌지 않는 사이트들도 있는데 이는 리퀘스트 처리가 유저의 맥락에 의존적이게 되므로 RESTful하지 않은 API를 가진 시스템인 셈이다. 이는 요청과 응답이 URI에 1대1대응되지 않기 때문에 발생하는 일이다.
  • RESTful API 만듦으로써 이점은 유저의 맥락을 생각하지 않아도 되므로 하나의 리퀘스트에 대해 응답이 정해져 있고, 따라서 응답을 서버쪽에 캐싱해두고 같은 리퀘스트가 올때마다 캐싱한 데이터로 대응할 있게 된다는 점이 있다.
  • 유저의 맥락을 고려하지 않은 개발이 가능해지기 때문에 개발의 자유도가 아주 높아지고 API 설계가 훨씬 깔끔 쉬워진다.
  • 그리고 결정적으로 세션을 사용하지 않기 때문에 하나의 클라의 요청을 여러대의 서버가 돌아가며 처리해도 무방하고 따라서 로드밸런싱이 매우 자유롭고 효율적이다.
  • 다만 단점은 클라이언트쪽에서 사용자 인증이나 맥락을 직접 관리해야 한다는 오버헤드가 있다는 점이고,
  • 리퀘스트 헤더에 auth token 붙여서 인증해야 한다. 서버는 api 토큰 키를 발급하고 폐지하는 관리 기능을 가져야 한다는 오버헤드도 있다.
  • REST API
    • Resource / HTTP Method / Verb
    • GET : 읽기
    • POST : collection 생성
    • PUT : document 수정/생성
    • DELETE : 삭제
    • PATCH : 부분 수정
    • meetup.toast.com/posts/92

 

* handlbar : ?

*gRPC?

 

 

11. NoSQL 

 

SQL NoSQL
엄격한 스키마 유연한 스키마 (key, value)
Join 필요 Join이 없어 Query가 빠름
수직적 확장 (서버 업그레이드) 수직 / 수평적 확장 (서버 늘리기)
무결성 보장 수정 시 중복 데이터 때문에 모든 컬렉션에서 수정이 일어나야함.

1. 관계를 맺고 있는 데이터가 자주 변경(수정)되는 애플리케이션일 경우

(NoSQL에서라면 여러 컬렉션을 모두 수정해줘야만 합니다.)

 

2. 스키마가 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우

1. 정확한 데이터 구조를 알 수 없거나 변경 / 확장 될 수 있는 경우

 

2. 읽기(read)처리를 자주하지만, 데이터를 자주 변경(update)하지 않는 경우 (즉, 한번의 변경으로 수십 개의 문서를 업데이트 할 필요가 없는 경우)

 

3. 데이터베이스를 수평으로 확장해야 하는 경우 ( 즉, 막대한 양의 데이터를 다뤄야 하는 경우)

 

 

 

12. Callback, Promise, async await, Observable, ReactJS : ?

 

 

 

13. 쿠키/세션

  • 쿠키
    • 클라이언트 측에서 관리되는 정보
    • 세션과 달리 브라우저를 종료한다고 해도 생존 기간이 지정되면 생존 기간 동안 데이터가 사라지지 않는다.
    • 하드디스크에 저장 -> 보안 취약
  • 세션
    • 서버 측에서 관리됨

14. 스트림(stream)

 자바에서 입출력을 수행하려면,  어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무엇가가 필요한데 이것을 스트림(stream)이라고 정의했다.

 스트림은 연속적인 데이터의 흐름을 물에 비유해서 붙여진 이름인데 여러 가지로 유사한 점이 많다. 물이 한쪽 방향으로만 흐르는 것과 같이 스트림은 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다. 그래서 입력과 출력을 동시에 수행하려면 입력을 위한 입력스트림(input stream)과 출력을 위한 출력스트림(output stream), 모두 2개의 스트림이 필요하다.

 

15. 직렬화(serialization)

 직렬화(serialization) 객체를 데이터 스트림으로 만드는 것을 한다. 다시 얘기하면 객체에 저장된 데이터를 스트림에 쓰기(write)위해 연속적인(serial) 데이터로 변환하는 것을 말한다. 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화(deserialization)라고 한다. ( 객체의 인스턴스 변수들의 값을 일렬로 나열하는 것 )

 * 객체는 클래스에 정의된 인스터스 변수의 집합이다. 객체에는 클래스변수나 메서드가 포함되지 않는다. 객체는 오직 인스턴스 변수들로만 구성되어 있다.

 

 

16. Servlet

16_1) Servlet이란?

 - Servlet은 웹에서 Java 프로그래밍을 구현하기 위해서 탄생했다. (웹 개발을 위해 만든 표준)

 - Java로 구현된 (CGI – Common Gatway Interface) 라고 말한다.

 - HTTP Protocal 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속하여 개발하며, Servlet Container에 의해서 실행되고 관리된다.

- HTML 변경 시 Servlet을 재컴파일 해야하는 단점이 있다. (코드 수정 -> 컴파일 -> 클래스 파일)

 

16_2) Servlet Container?

- HTTP 요청을 받아서 Servlet을 실행시키고, 그 결과를 사용자 브라우저에게 전달해주는 기능을 제공하는 컴포넌트이다.

- Servlet을 실행하고, 생명주기를 관리하는 역할을 한다.

- Servlet과 웹 서버(Apache, ngin )가 서버 통신을 할 수 있는 방법을 제공한다.

- 멀티쓰레드를 지원하여 클라이언트의 다중 요청을 자동적으로 처리해준다.

- 대표적인 Container에는 Tomcat, JBoss 등이 있다.

 

16_3) Servlet 실행 순서

1. 사용자가 URL을 클릭하면 HTTP Request Servlet Container에 보낸다.

2. Servlet Container HttpServletRequest, HttpServletResponse 두 객체를 생성한다.

3. 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다. (DD를 참조하여 분석)

4. 컨테이너는 서블릿 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.

5. doGet() or doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.

6. 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.

*DD (배포서술자, Deployment Descriptor) = web.xml

 

 

17. 다형성(Polymorphism)

  • 여러가지 형태를 가질 수 있는 능력
  • 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함.
  • JAVA에서는 interface로 만들어짐.

 

 

 

 

 

 

 

_______________________________________________________________________________________________________________________________________________________________

 

  • HTTP 프로토콜에 대해 설명해 보세요
    • 헤더가 있고 리퀘스트 할 떄는 메소드가 있고 그 아래 컨텐츠가 있다 이렇게 설명했습니다. 더 디테일하게 물어봤지만 답하지 못했습니다.
  • Restful API에 대해 설명해 보세요.
    • 자원의 상태를 표현하는 기법으로 현재 대부분의 웹서버에 적용되는 규칙이라고 설명했습니다.
  • 우리가 웹서비스에 접근할 때 어떤 경로를 거치는 지 아는 만큼 설명해 보세요
    • 클라이언트가 url 입력 -> 도메인 서버 -> 도메인 서버가 가지고 있는 실제 서버 주소 -> 서버의 로드밸런서 -> 실제 서버 -> 응답. 이정도로 설명했습니다. 더 물어보지는 않았습니다.
  • 서버에 트래픽이 주어졌을 때 어떻게 응답속도를 개선할 수 있는가?
    • 솔직히 실제로 개선시켜 본 경험이 없어서 원론적인 이야기를 한 것 같습니다. 응답하는 로직을 개선한다~ 이렇게 두리뭉실하게 설명한 것 같습니다.
  • MVC 패턴에 대해서 설명해 보세요.
    • 모델, 뷰, 컨트롤러로 대부분의 웹 프레임워크에서 사용하고 있는 개념입니다. 모델은 DB와 통신하고 컨트롤러는 모델에서 받아 온 결과를 뷰와 매칭시킵니다. 뷰는 사용자에게 실제 보여줄 화면입니다.
  • Java 버젼 8에서는 어떤 변화가 있었는지?
    • 모르는 내용이라서 넘어갔습니다.
  •  

JVM에서 가비지 컬렉터가 어떻게 작동하는지?

  • Java의 메모리 영역은 어떻게 생겼지?
    • Java는 JVM 이라는 가상머신을 이용해서 OS의 메모리에 간접적으로 접근한다. 따라서 OS Level에서 Memory Leak이 발생하지 않는다.
    • Stack
      • 지역변수와 같이 스코프별로 할당되는 영역
    • Heap
      • 긴 생명주기를 가진 데이터 저장
  • 가비지 컬렉터는 왜 필요하지?
    • ,
  • 어떻게 작동하지?
    • 프로그래머는 힙 영역을 마음대로 사용하고 더 이상 사용하지 않는 오브텍트들은 가비지 컬렉터가 메모리에서 제거한다.
    • Heap 영역의 오브젝트 중 stack 에서 도달 불가능한 (Unreachable) 오브젝트들은 가비지 컬렉션의 대상이 된다.
    • 스택의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 레퍼런스 하고 있는지 찾는과정이 Mark 다. Reachable 오브젝트가 레퍼런스하고 있는 오브젝트 또한 marking 한다. 그리고 나서 mark 되어있지 않은 모든 오브젝트들을 힙에서 제거하는 과정이 Sweep 이다.