면접 준비 자료

created : 2021-12-07T11:32:41+00:00
modified : 2021-12-14T06:19:38+00:00

DevOps

  • 참고 자료:
    • https://oain.tistory.com/155

  • ISP : Interset Service Provider
  • DHCP : Dynamic Host Configuration Protocol
  • Router
  • Subnet : Network Class, CIDR 참고
  • CIDR : Classless Inter-Domain Routing
  • Gateway
  • DNS : Domain Name System
  • TLD Server : Top Level Domain Server
  • ARP : Address Resolution Protocol
  • AP : Access Point
  • Broadcast, Unicast, Multicast
  • OSI 7 Layer : Physical - Data Link - Network - Transport - Session - Presentation - Application
  • TCP : Transmission Control Protocol:
    • 3 way handshake
    • 4 way handshake
  • UDP : User Datagram Protocol
  • HTTP : HyperText Transfer Protocol:
    • GET, POST
    • Session, Cookie
  • TLS/SSL
  • socket
  • segment
  • Memory:
    • static segment : code, data
    • dynamic segment : heap, stack
  • Thread, Process
  • Lock:
    • Semaphore, Mutex, Spin-lock
    • Deadlock, Livelock
    • Critical Section, Race condition
  • Sychronous, Asynchronous
  • Concurrency, Parallelism
  • WAL, Shadow paging
  • Prometheus : 메트릭 정보를 수집하여 시스템을 모니터링 하고 Alerting을 지원하는 오픈소스:
    • Data Model:
      • Metric name : ex) http_requests_total
      • Label : (key, value), ex) method=”POST”, handler=”/messages”
    • Job : 확장성이나 안정성을 위해 복제된 동일한 인스턴스의 모음
    • Instance : 스크랩할 수 있는 엔드포인트 (수집 당하는 곳), 일반적으로 단일 프로세스
    • Recording Rule
    • Storage:
      • 기본적으로 on-disk 의 시계열 DB를 포함하고 있다.
      • remote storage 도 허용
  • InfluxDB : push 방식의 시계열 db
  • Grafana : 시계열 매트릭 데이터를 시각화 하는데 최적화된 대시보드를 제공해주는 툴킷
  • Argo : Kubernetes 용 CI 툴
  • Kubernetes : 추후 공부

    AWS 서비스 종류

  • EC2 : Elastic Computer Cloud
  • Resource Group : 리소스 묶어서 자동화하는 서비스
  • VPC
  • RDS : Relational Database Service
  • ECR : Elastic Container Registry
  • ECS : Elastic Container Service
  • IAM : Identity and Access Management
  • EKS : Elastic Kubernetes Service
  • GWLD : Gateway Load Balancer Endpointer

Linux

  • Directory
    • /etc : global configuration
    • /usr : 대부분의 프로그램들(기본적인거 제외)
    • /dev : device information
    • /proc : process information, hardware information
    • /var : variable files(log, cache)

      CS 기본

      컴퓨터 구조

  • RISC pipeline : IF(Instruction Fetch) - ID(Instruction Decode) - EX (Instruction Execute) - MEM (Memory Access) - WB(Write Back)
  • Cache : L1(CPU 내부), L2(CPU - RAM 사이), L3(메인보드?)

데이터베이스

  • Candidate Key : Tuple 을 유일하게 식별하기 위해 사용하는 속성들의 부분집합:
    • 유일성, 최소성
  • Primary Key : 후보키 중 성택한 Main Key
  • Alternate Key
  • Super Key: 유일성은 만족, 최소성은 만족하지 못하는 키
  • Foreign Key
  • JOIN:
    • INNER JOIN : 교집합을 join (join 안되는건 버림)
    • LEFT OUTER JOIN : 왼쪽을 기준으로 (왼쪽을 기준으로 join 한다.)
    • RIGHT OUTER JOIN : 오른쪽을 기준으로
    • FULL OUTER JOIN : 그냥 둘다 다 나오도록
  • NF:
    • 1NF : 테이블 칼럼이 원자값을 갖도록 테이블을 분리시킨 것
    • 2NF : 테이블의 모든 컬럼이 오나전 함수 종속을 만족해야 한다.
    • 3NF : 이행적 함수 종속이 없어진 것
  • ACID:
    • Atomicity, Consistency, Isolation Durability
  • Isolation Level:
    • Read Uncommitted (Level 0)
    • Read Committed (Level 1)
    • Repeatable Read (Level 2)
    • Serializable (Level 3)
  • Dirty Read, Non-Repeatable Read, Phantom Read:
    • Dirty Read : 커밋되지 않은 수정중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상
    • Non-Repeatable Read : 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서 두 쿼리의 결과가 상이하게 나타나는 일관성이 꺠진 현상
    • Phantom Read : 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상

디자인 패턴

  • SOLID:
    • Single Responsibility Principle
    • Open-Close Principle
    • Liskov Substitution Principle
    • Interface Segregation Principle
    • Dependency Inversion Property
  • 패턴의 분류:
    • Creational Pattern : Factory Method, Abstract Factory, Builder, Prototype, Singleton
    • Structural Pattern : Adapter, Bridge, Composite, Decorator, Facde, Flyweight, Proxy
    • Behavioral Pattern : Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor

Java

  • GC (Garbage Collection):
    • Reference Counting
    • Mark and Sweep
    • Generational Garbase Collection:
      • Young : Eden, Survivor
      • Old : Serial GC(mark-sweep-compact), Parallel GC(=Throughput GC), Parallel Old GC, CMS GC, G1 GC
  • Vector vs ArrayList:
    • Vector : 동기식, 한 쓰레드가 벡터 작업중이면 다른 스레드가 벡터 보유 불가능
    • ArrayList : 비동기식, 여러 쓰레드 동시 작업 가능
  • String vs String Buffer:
    • String : Immutable
    • StringBuilder : 동기화 지원 X
    • StringBuffer : 동기화 지원
  • Serialization
  • JVM Memory:
    • Method Area : Byte code, Global variable, Static variable
    • Stack
    • Heap
  • Java 실행 순서:
    • java - (compiler) -> bytecode
    • bytecode -> Class Loader:
      • 로드-검증-준비-분석-초기화
    • 실행엔진:
      • 인터프린터
      • JIT(Just-In-Time Compiler)
  • JAVA Stream:
    • filter(), distinct(), limit(), skip(), map(), flatmap()
    • allMatch(), anyMatch(), noneMatch(), findAny(), findFirst(), reduct(), collect(), forEach(), count

Python

  • Python의 주요 특징 : 인터프린터, 동적 타이핑 언어
  • list vs tuple : list는 데이터를 변경 가능, tuple은 데이터 변경 불가능
  • 3항 연산자 : [Returning Value on True] if [Conditional Statement] else [Returning Value on False]
  • 리스트에서 음수 인덱스를 사용하면 : 오른쪽부터 검색 시작 (-1은 오른쪽 첫번째 원소)
  • 변수나 함수 식별자 길이 제한 : 딱히 없는데 어짜피 80자 제한 걸림
  • pass : 문법적으로 아무것도 안쓸수 없어서
  • 파이썬의 단점 : 속도, 동적 타이핑
  • 현재 작업중인 디렉토리 : os.getcwd()
  • built-in method : complex(), eval(), filter(), format(), hash(), hex(), len(), open(), min(), max(), abs(), sum()
  • 중복값 제거 : set으로 만들고 다시 변환
  • // : 정수 나누기, % : 나머지, ** : 제곱값

    기본적인 언어지식

  • Overloading vs Overriding:
    • Overloading : 매개변수 다름
    • Overriding : 상속
  • Generic
  • 접근 지정자:
    • public, protected, default, private
  • Call by Value vs Call by Reference
  • C++ 컴파일 과정:
    • 전처리 - 컴파일 - 어셈블 - 링크 - 실행

Spring

  • Dispatcher-Servlet:
    • 서블릿 컨테이너에서 HTTP 프로토콜을 통해 들어오는 모든 요청을 제일 앞에서 처리해주는 프론트 컨트롤러
    • 서버가 요청을 받기전, 공통 처리 작업을 dispatcher-servlet에서 하고 controller로 작업을 위임해준다.
  • Dependency Injection:
    • @Resource: 이름 -> 타입 -> @Qaulifier
    • @Autowired : 타입 -> 이름 -> @Qualifier
    • @Inject : 타입 -> @Qualifier -> 이름
  • AOP(Aspect Oriented Programming):
    • 공통의 관심 사항을 적용해서 발생하는 의존 관계의 복잡성과 코드 중복을 해소해준다.
    • 각 클래스에서 공통 관심 사항을 구혀한 모듈에 대한 의존 관계를 갖기 보단, Aspect를 이용해 핵심 로직을 구현한 각 클래스에 공통 기능을 적용한다.
    • 대표적으로 웹 애플리케이션의 보안, 로깅, 트랜잭션과 같은 공통 관심 사항을 AOP를 이용해 간단한게 적용할 수 있다.
    • 용어:
      • Advice : 언제 공통 관심기능을 핵심 로직에 적용할지 정의
      • Jointpoint : Advice를 적용이 가능한 지점을 의미 (before, after 등등)
      • Pointcut : Joinpoint의 부분집합으로, 실제로 Advice가 적용되는 Jointpoint를 나타냄
      • Weaving : Advice를 핵심 로직코드에 적용하는 것
      • Aspect : 여러 객체에 공통으로 적용되는 공통 관심 사항
  • DAO(Data Access Object):
    • DB에 데이터를 조회하거나 조작하는 기능들을 전담한다.
    • Mybatis를 이용할때 mapper 클래스에서 쿼리를 받아와 DAO에게 넘겨주는 식으로 구현한다.

면접 질문 위주

  • 질문 참고 : https://new-blue.tistory.com/33
  • 가장 인상적이었던 경험:
    제가 xx에서 일을 할 때 제가 처음부터 개발하지 않은, 이미 사용자들이 사용하고 있는 서비스를 배포해볼 경험이 있었습니다. 사실 배포하기 전에는 유닛테스트도 충분히 돌리고 테스트 서버에서 개발자들이 2주정도 사용해본 상황이라 버그가 없을 것이라고, 있어도 크리티컬하지 않을 것이라고 생각 하고 있었는데 배포를 실제로 해보니 문자열 인코딩 문제 때문에 홈페이지가 엉망이 되었었습니다. 예상치 못했던 버그였고, 환경을 더 잘 점검했다면 찾을 수 있었을 것이라고 후회를 했었습니다.
    
  • 가장 많이 성장했던 경험:
    최근 소프트웨어 마에스트로라는 프로그램에 참여해서 프로젝트를 진행해볼 기회가 있엇는데, 이때 가장 많이 성장했던 것 같습니다. 이론적인 공부를 적용해보자라는 생각을 많이 해서 Kafka, Ci/CD 자동화 등 듣기만 했던 것들을 많이 적용했었는데 적용하면서 생각지 못했던 문제를 많이 겪고, 고민해볼만한 포인트들을 많이 배우게 되어서 가장 성장했던 것 같습니다.
    
    • 구체적으로 어떤것을을 고민하게 되었나요? 라는 질문이 들어오면
      kafka를 통해 여러 워커에게 일을 분배하여 질의 성능을 올리는 코드를 짯었는데, 질의자도 여러명, 답변자도 여러명인데, 질의한 서버로 정확하게 응답을 aggregation 해주어야 했습니다. 이때 kafka가 단방향 streaming에는 적용하기 쉬운데, request-response 와 같은 요청을 만들어야 되면 response부분이 처리하기 어렵다라는 것을 알게 되었습니다. 최종적으로는 aggregation server를 두어서 worker들이 이 서버에게 응답을 해주고, 요청자는 이 worker로부터 데이터를 가져가도록 구성되었습니다. 사실 아직도 이런 구조가 맞았는지에 대해서 의문이 많고, 더 좋은 방법이 있지 않았을까 라는 생각을 가지고 있습니다.
      
      • 방금 말한 구조가 어떤 단점이 있는지에 대한 질문이 들어오면
        과하게 아키텍쳐가 복잡하다고 생각하고, 이 구조가 api gateway를 두어 load balancing 하는 것보다 좋은게 무엇인지가 부정확하다고 생각합니다.
        api gateway를 두는 것이 kafka를 사용하는 것보다 비용적, 구조적 복잡성 면으로 더 좋았을 것이라고 생각하고 프로젝트 종료기간을 감안하여 바꾸지 못한게 후회됩니다.
        
  • DB에서 트랜젝션이 무엇인가요?
    DB에서 원자성을 지녀야하는 처리 단위로, 처리 성공 혹은 실패로만 분리됩니다. 컴퓨터 공학 수업에서는 주로 은행 입출금과 같은 예시를 들어 트랜젝션을 설명합니다.
    
  • DB에서 Entity란 무엇인가요?
    객체라고 단순하게 말할 수 있는데 주로 명사로 지칭하는 것들입니다. 위의 답변에서 은행 입출금에서, 계좌같은 것들이 대표적으로 객체라고 생각합니다.
    
  • Javascript에서 call, bind, apply에 대해서 각각 설명해주세요:
    • call과 apply는 개념적으로는 동일하지만, 인자가 다릅니다. call은 this, param1, param2 와 같은 순서로 넣는다면, apply는 this, [param1, param2] 의 구조로 넣습니다.
    • bind는 실제 함수 호출을 하는 시점과 함수와 this를 결정하는 시점이 다를때 사용되는데, bind를 사용하게 된다면 함수 호출이 아닌, 함수 자체가 리턴되게 됩니다.