면접용

이성준·2022년 4월 12일
0

면접

목록 보기
1/6

Controller Repository Service란

Repository는 추상화된 DB 역할
Http 통신에 대한 책임은 Controller가 지고, 도메인 로직에 대한 책임을 Service가 갖는다

기술면접

네트워크

  • HTTP란?
    주로 브라우저와 서버간의 통신을 하기 위해 자주 사용하는 TCP/IP 기반의 신뢰적인 프로토콜입니다. 무상태와 무연결이라는 특징이 있습니다.
  • TCP/UDP 차이?
    UDP는 비신뢰적이고 비연결형 서비스를 제공하는 프로토콜이고 TCP는 신뢰적이고 연결형 서비스를 제공하는 프로토콜입니다. 빠른속도가 필요할때는 udp를 사용하고 신뢰성이 요구되어질때는 TCP를 사용합니다.
  • 쿠키와 세션
    쿠키(Cookie)란 클라이언트의 로컬에 저장되는 Key-Value가 들어있는 작은 데이터 파일을 의미하구요 세션은 클라이언트의 정보를 서버 메모리에 저장하는 기술을 의미합니다. 쿠키와 세션의 가장 큰 차이점은 “어디에서 데이터를 관리하느냐”의 차이일 것 같습니다. 쿠키는 클라이언트 쪽에서 데이터를 관리하구요, 세션은 서버 쪽에서 데이터를 관리합니다.

디자인 패턴

  • 디자인 패턴 : 여러 개발자들이 개발을 하다가 설계 노하우를 패턴으로 정리해놓은것입니다.
  • 싱글톤 패턴 : 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴입니다.
    테스트하기가 어렵고 클라이언트가 구현 클래스에 의존한다는 특징이 있습니다.
  • 팩토리 패턴 : 객체를 직접 생성하지 않고 객체를 생성하는 팩토리 객체를 사용하는 패턴입니다.
    직접 객체를 생성하는 것을 막아줘서 결합도를 낮춰줍니다.

알고리즘

알고리즘을 배우는 이유?
알고리즘을 배우면 문제를 효율적으로 해결할수 있습니다. 사람들이 많이 사용하는 서비스에서 더 효율적인 알고리즘으로 로딩속도를 줄이거나 하면 그것 바로 사용자에게 좋은 경험을 선사하기때문입니다.

자료구조

  • 자료구조를 배우는 이유?
    특정문제를 해결하는데에 상황에 가장 적합한 자료구조를 빠르게 찾아 데이터를 정리하고 활용하면 문제를 빠르고 정확하게 해결할 수 있기 때문입니다. 만약 전화번호부가 있는데 번호 없이 이름만 사용해서 전화를 걸려면 해쉬 자료구조를쓰면 됩니다.

  • 시간복잡도 : 어떠한 알고리즘의 로직이 얼마나 오랜시간이 걸리는지 나타는데 쓰이며, 보통 빅오 표기법으로 나타냅니다. n을 입력했을때 필요한 시간이 10n^n+n이라고 시간복잡도는 O(n^2)입니다.

  • 공간복잡도: 공간복잡도는 프로그램을 실행시켰을때 필요로하는 자원 공간의 양을 말합니다. 동적으로 재귀적인 함수로 인해 공간을 계속 필요로 할 경우도 포함합니다.

  • 배열: 같은 타입들의 변수들로 이루어져있고, 크기가 정해져있으며, 인접한 메모리 위치에 데이터를 모아놓은 집합입니다. 중복을 허용하고 순서가 있습니다. 탐색은 O(1)이 되어 랜덤 접근이 가능합니다. 삽입과 삭제에는 O(n)이 걸립니다. 따라서 탐색을 많이 할 경우 배열로 하는것이 좋습니다.

  • 연결리스트: 각각 데이터는 자신의 다음원소가 무엇인지만 기억하고있습니다. 데이터 추가 및 삭제는 연결리스트가 빠르고 배열은 느립니다. 배열은 모든 상자를 앞으로 옮겨야 추가가 가능하지만 연결리스트는 선을 바꿔서 연결해주기 때문에 추가 및 삭제가 더 빠릅니다.

  • 벡터 : 동적으로 요소를 할당할 수 있는 동적 배열입니다. 컴파일 시점에 갯수를 모른다면 벡터를 씁니다. 탐색과 맨뒤에 요소를 삭제하거나 삽입하는데 O(1)이 걸립니다.

  • 스택 : 가장 마지막으로 들어간 데이터가 가장 첫번째로 나오는 성질을 가진 자료구조 입니다. 삽입 삭제에 O(n) 탐색에 O(n)이 걸립니다.

  • 큐: 먼저 집어 넣은 데이터가 먼저 나오는 성질을 지닌 자료구조이며, 삽입 삭제에 O(1), 탐색에 O(n)이 걸립니다.

  • 그래프: 정점과 간선으로 이루어진 집합을 트리라 그런다. 간선과 정점 사이에 드는 비용을 가중치라고 한다.

  • 트리: 그래프의 특징처럼 정점과 간선으로 이루어져있고, 계층적 관계를 표현하는 자료구조입니다. 루트 노드 : 최상위에 있는 노드
    단말 노드 : 하위에 다른 노드가 연결되어 있지 않은 노드
    내부노드 : 단말 노드를 제외한 모든 노드

  • 이진트리: 자식 노드가 두개 이하인 트리를 의미합니다.

  • 정이진트리 : 자식 노드가 0개 아니면 2개

  • 완전 이진 트리 : 왼쪽 부터 채워져있는 이진 트리

  • 균형 이진 트리 : 왼쪽과 오른쪽 노드의 높이 차가 1이하인 이진트리

  • 이진 탐색 트리 : 오른쪽 하위 트리에는 노드값 보다 큰 값만 포함되고 왼쪽 하위 트리에는 노드값보다 작은값이 들어있는 트리 요소를 찾을대 O(logn)이 걸리고 최악의 경우 O(n)

  • 레드 블랙 트리 : 균형 이진 트리로 탐색 삽입 삭제 시간복잡도가 O(logn)이다. 각노드는 색상을 나타내는 추가비트를 저장하며, 삽입 및 삭제중에 트리가 균형을 유지하도록 하는데 사용합니다.

  • 힙:최솟값 최댓값을 빠르게 찾아내기 위해 완전이진트리로 만들어진 자료구조입니다.
    최대힙 : 루트노드는 모든 자식보다 가장 커야 합니다.

  • 우선순위큐 : 우선순위가 제일 높은것들을 제일먼저 삭제하는 자료구조,힙을기반으로 구현된다.

  • 맵 : 특정 순서에 따라 키와 매핑된 값의 조합으로 이루어진 자료구조, 레드 블랙 트리 자료구조를 기반으로 형성되고, 삽입하면 자동으로 정렬됩니다.

  • 셋 : 중복되는 요소는 없고 순서도 없다.

  • 해쉬테이블 : 무한의 가까운 데이터들을 유한의 개수의 해시 값으로 매핑한 테이블이다. O(1)의 시간 복잡도

프로세스와 스레드

  • 프로세스 : 컴퓨터에서 실행되고 있는 프로그램을 말한다.
    프로그램이 메모리에 올라가면 프로세스가 되는 인스턴스화가 일어나고, 이후 운영체제의 cpu 스케줄러에 따라 cpu가 프로세스를 실행시킵니다. 코드 데이터,힙은 스레드끼리 공유하지 않습니다.

  • 싱글스레드 : 스레드는 프로세스 내 작업의 흐름 말합니다. 스레드는 코드.데이터,힙은 스레드끼리 공유, 동기화를 신경쓰지 않아도 됩니다.

  • 멀티 스레드 : 콜스택이 하나 더생기고 스레드 끼리 서로 자원을 공유하기 때문에 효율이 높다. 컨텍스트 스위칭을 통해서 이루어진다. 데이터나 힙을 공유하기때문에 엉뚱한 값을 읽어올수있다.

동시성 : 동시에 실행되는것 같이 보이는것 컨텍스트 스위칭 발생
병렬성 : 실제로 동시에 여러작업이

알고리즘

  • 선택정렬 -> 기준값을 정하고 기준값 뒤 배열중에서 제일 작은값을 기준값과 교체한다 이걸 반복
    즉, 시간 복잡도는 O(N^2)이 된다. 최악의 경우, 최선의 경우, 평균적인 경우 모두 시간 복잡도는 O(N^2)이 된다. 공간 복잡도는 주어진 배열 안에서 교환을 통해 정렬이 수행되므로 O(N)이다.

  • 거품정렬 -> 1회전에 첫 번째 원소와 두 번째 원소를, 두 번째 원소와 세 번째 원소를, 세 번째 원소와 네 번째 원소를, ... 이런 식으로 마지막 - 1 번째 원소와 마지막 원소를 비교하여 조건에 맞지 않으면 서로 교환한다. O(N^2)이다.

  • 합병정렬 : 연결리스트로 구현 쪼개고 다시 합병하는 식으로

  • 퀵정렬 : 배열 가운데서 하나의 원소를 고른다. 이렇게 고른 원소는 피벗(pivot)이라고 한다.
    피벗 앞에는 피벗보다 값이 작은 모든 원소들이 오고, 피벗 뒤에는 피벗보다 값이 큰 모든 원소들이 오도록 피벗을 기준으로 배열을 둘로 나눈다. 이렇게 배열을 둘로 나누는 것을 분할(Divide)이라고 한다. 분할을 마친 뒤에 피벗은 더 이상 움직이지 않는다.분할 된 두 개의 작은 배열에 대해 재귀적으로 이 과정을 반복한다. 주어진 배열 안에서 교환을 통해 정렬이 수행되므로 O(N)이다.

  • 이분탐색 : 탐색 범위를 두 부분으로 분할하면서 찾는 방식 O(N) O(logN)

  • 동적 계획법 : 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법

  • dp를 이용한 특정한 정점에서 다른 모든 정점으로 가는 최단 경로를 구하는 알고리즘

객체지향

객체 지향이란?
객체들이 공동 목표를 통해 각각의 객체가 메시지를 주고받으면서 협력하며 주어진 역할과 책임을 다하는 과정이라고 생각합니다.
1. 추상화
공통점을 취하고 차이점을 버리는 일반화를 통해 단순화하는것입니다.
2. 캡슐화
송신자가 수신자를 몰라도 요청이 가능하게 되면서 수신자의 외부처리와 내부처리를 분리하는것입니다.객체들의 공통적인 특징들을 뽑아내는 것입니다.
3. 상속
부모 객체의 기능을 그대로 물려받는것을 상속이라고 합니다.
4. 다형성
객체가 동일한 메세지에 대해 서로 다른 메서드를 이용해 메세지를 처리한다는 것을 다형성이라고 하는것같습니다. 서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유한다는것을 말합니다.

  • SRP(Single Responsibility) - 단일 책임 원칙
    클래스는 단 한 개의 책임을 가져야 한다.
    클래스를 변경하는 이유는 단 한개여야 한다.
    변경이 있을때, 파급 효과가 적게 만들어야된다

  • OCP(Open-Closed) - 개방-폐쇄 원칙
    확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.

  • LSP(Liskov Substitution) - 리스코프 치환 원칙
    다형성에서 하위클래스는 인터페이스 규약을 다 지켜야 한다는 것인ㅂ니다.
    자동차 인터페이스에서 엑셀은 앞으로 가라는 기능인데 뒤로가게 구현하면 lsp 위반입니다.
  • ISP(Interface Segregation) - 인터페이스 분리 원칙
    큰 덩어리의 인터페이스를 구체적이고 작은 단위로 분리시키라는 원칙을 말합니다.
    각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 각 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 한다.

  • DIP(Dependency Inversion) - 의존 역전 원칙
    구현클래스에 의존하지 말고, 인터페이스에 의존해야 한다는 그래야 유연하게 구현체를 변경할수가 있습니다. 역할에 의존하게 해야 한다.

  • 프레임워크랑 라이브러리의 차이점은?
    프레임워크는 특정한 문제 해결을 위해 어느 정도의 뼈대 즉, 구조를 제공해주는 것을 의미하구요, 라이브러리는 특정 기능 사용을 위한 도구나 함수들의 모음을 의미합니다.

라이브러리와 프레임워크의 차이는 프로그램의 전체 흐름에 대한 제어권에서 차이가 발생합니다. 프레임워크는 프로그램의 전체적인 흐름을 자체적으로 가지고 있으며 프레임워크가 사용자가 작성한 코드를 호출해서 사용합니다. 하지만 라이브러리는 사용자가 프로그램의 전체적인 흐름을 제어하며 사용자가 코드로써 라이브러리의 특정 기능을 직접 가져다 쓰는것을 의미합니다.

스프링

  • 스프링이란?
    스프링란 자바이란 위한 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크입니다. 객체를 관리할수 있는 컨테이너를 제공 해주고 의존성 주입과 제어의 역전을 통해 결합도를 낮춰준다는 특징이 있습니다.

  • 스프링과 스프링부트의 차이
    스프링부트는 스프링을 더욱 편리하게 사용할수 있도록 도와주고, 톰캣같은 웹 서버를 내장하고 있고 jar 파일을 통해 손쉽게 배포가 가능합니다. 그리고 starter를 통해서 의존성과 설정을 자동으로 해줍니다.

  • DI란?
    클래스 사이의 의존 관계를 빈(Bean)설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말한다. 결합도가 낮아지는 장점이 있습니다.
    di 방식 세가지 생성자 주입 autowired setter주입

-생성자 주입을 쓰는이유?
생성자 호출 시점에 1회를 생성하는 것이 보장되고, 컴파일 시점에 객체를 주입받아 테스트 코드를 작성 할수 있습니다. 그리고 순환참조를 방지 할 수 있습니다.

  • IOC란?
    개발자가 작성한 코드의 제어권이 프레임워크에 넘어가서. 인스턴스의 생성 및 소멸을 개발자 대신 스프링 컨테이너가 한다. 따라서 낮은 결합도를 유지한다
  • IOC컨테이너란?
    IoC Container에서 관리하는 객체의 생성과 관계설정, 사용, 제거 등의 전체 Lifecycle을 관리해주는 작업을 하는 컨테이너를 IoC 컨테이너라고 부릅니다.

  • AOP란?
    핵심 비즈니스 로직과 (비즈니스 메소드마다 반복해서 등장하는) 공통 로직을 떼어내서 분리하고, 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 모듈화 하는 기술을 AOP의 사용 예로는 로깅, 트랜잭션, 인증 등이 존재합니다

  • 웹흐름
    요청된 URL을 dispatcher-servlet에 전달하고 핸들러 매핑은 해당 URL에 매핑된 컨트롤러가 있는지 검사 후 컨트롤러에 전달합니다 그리고 해당 컨트롤러가 로직을 처리하고 결과를 ModelAndView 객체에 담아 dispatcher-servlet에 전달 합니다 그리고 뷰 리졸버가 뷰를 찾아서 서블릿에게 주고 모델앤뷰 객체를 뷰와 함께 렌더링한후 최종적으로 컨텐츠를 클라이언트에게 전달.

  • @Autowired
    의존 객체의 타입에 해당하는 빈(Bean)을 찾아 주입하는 역할을 한다.

  • 빈의 라이프 사이클
    스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(다른 함수가 작동을 끝마친 후에 작동하도록 되어있는 함수) -> 사용 -> 소멸 전 콜백 -> 스프링 종료

  • ORM
    RDB를 객체지향적으로 조작할수 있도록 매핑해주는 개념, 프레임워크

  • MVC패턴이란
    Model View Controller로 나누어 애플리케이션의 시각적인 요소와 비즈니스 로직을 서로의 영향 없이 수정이 가능한 구조적 패턴이다.
    컨트롤러: HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
    모델: 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
    뷰: 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중합니다.

  • 필터와 인터셉터의 차이가 뭔가요
    Filter는 Spring Context 외부에 존재하여 필터가 호출된 후에 서블릿이 호출됩니다. Interceptor는 인터셉터는 DispatcherServlet에서 핸들러 매핑을 지나, 컨트롤러로 요청을 전달할 때 중간에 요청을 가로채서 특별한 처리를 해줄 수 있다.

데이터베이스

  • 인덱스란 무엇인가요?
    db 인덱스는 데이터베이스 테이블의 동작 속도를 높여주는 자료 구조를 의미합니다. 책의 목차처럼 해당 컬럼이 어디에 있는지 정하여, 해당부분만 검색할 수 있게 하여 검색속도를 향상 시킵니다.

  • 어떠한 경우에 사용하나
    테이블에 저장된 데이터의 양이 많고, select가 잦고 경우 성능 개선의 효과를 볼수 있습니다.

  • 트랜잭션이란?
    데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위 입니다.
    한 트랜잭션 내에서 실행한 작업은 모두 성공하거나 실패해야되고 일관성있게 유지시키고 동시에 실행되는 트랜잭션은 서로 영향을 미칠수 없고 트랜잭션이 완료가 되면 결과는 영구적으로 반영됩니다.

  • NOSQL
    Not only SQL 의 약자로 전통적인 관계형 모델에서 벗어나서 다양한 데이터 모델을 사용하여 데이터의 관리와 접근을 지원하는 데이터베이스를 의미합니다, 데이터 스펙이 자주 변경되는 경우나, 수평확장이 필요할때 사용하면 좋습니다.

  • B+ Tree란?
    DB의 인덱스를 위해 자식 노드가 2개 이상인 Binary Tree를 개선시킨 자료구조로서 아래와 같은 특성을 가진다.
    Leaf 노드만 인덱스와 함께 데이터를 가지고 있고, 나머지 노드(인덱스 노드)들은 데이터를 위한 인덱스만을 갖습니다.

  • 파티셔닝
    테이블을 컬럼단위로 나누는 방법입니다. 업데이트나 인서트 같은 작업이 분산되어서 성능이 향상되고 단점은 index별로 파티셔닝을 할수가 없습니다.

  • 샤딩
    테이블을 row단위로 분산하여 저장하는 방법
    장점은 서버의 수평적 확장이 가능하고 스캔범위를 줄여서 쿼리 반응 속도가 빨라집니다
    단점 적절히 분리 하지못하면 샤딩의 의미가 없어질수 있다.

Web

  • Rest api란?
    자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든것을 의미합니다. 정보의 각 요청이 어떠한 동작이나 정보를 위한 것인지를 그 요청의 모습 자체로 추론이 가능하다는 특징이 있습니다.
    url은 자원을 표현해야되고 행위는 http메소드로 표현합니다.

  • api란?
    클라이언트가 리소스를 요청할수 있도록 서버측에서 제공된 인터페이스를 말합니다.

  • 상태코드
    2xx : 클라이언트 요청이 성공적으로 수행됨
    4xx : 클라이언트의 잘못된 요청
    5xx : 서버 내부의 오류로 발생하는 상태코드입니다.

  • get과 post의 차이
    get은 서버에서 데이터를 조회할때 쓰고, post는 서버의 리소스를 새로 생성하거나 업데이트할때 사용합니다.
    그리고 데이터를 헤더에 포함하며 전송하고 캐싱(레지스터에 데이터를 저장시켜 놓는것)이 가능합니다 그리고 그리고 body가 비어있다는 특징이 있고 멱등합니다 post는 전송해야할 데이터를 body에 담아서 보냅니다

자바

  • 메모리 누수
    힙영역에 할당된 부분이 참조되지 않는데도 해제되지 않은 채로 메모리를 계속 점유하고 있는 것입니다.
  • 리플렉션
    구체적인 클래스 타입을 몰라도 run time에 동적으로 특정 클래스의 정보를 추출해 내는것 입니다. 동적으로 클래스를 사용해야 할때 필요합니다.
  • 자바
    옛날에는 운영체제마다 코드를 다르게 짜주었는데 자바가 JVM을 이용해서 개발자들이 운영체제별로 다른 코드를 짤 필요가 없어졌다.
  • JVM
    자바와 운영체제 사이에서 중재자 역할을 해주고 자바가 운영체제에 구애받지않고 프로그램을 실행 할수 있게 도와줍니다. 가비지 컬렉션을 통한 메모리 관리도 자동으로 수행합니다.
    컴파일러가 자바소스를 바이트코드로 변환합니다 그리고 클래스 로더가 바이트 코드를 런타임 데이터 영역에 로드시키고요 로딩된 바이트코드를 실행엔진에 의해서 실행되게 합니다.
  • 가비지컬렉션
    JVM이 메모리를 관리해주는 모듈입니다. heap 메모리를 재활용하기 위해서 더이상 참조되지않는 객체를 메모리에서 제거됩니다. 처음에 eden 영역에 올라간후 서바이버 영역을 통해 오래 살아남은 객체는 old 영역으로 이동합니다 old 영역에 있는 모든 객체들을 검사하여 참조되지 않고있는 객체들을 한번에 삭제합니다.
  • 컬렉션 프레임워크
    자바에서 Collection이란 데이터의 집합과 그룹을 의미하며 이를 저장하고 연산할 수 있는 집합을 Collection Framework라고 합니다. List, Set, Map 등이 있습니다.
    리스트는 객체를 일렬로 늘어 놓은 구조를 가지고 있고, 객체의 주소를 저장합니다. 그리고 동일한 객체를 중복 저장할 수 있습니다. 인덱스로 관리하고 thread-safe를 만족시켜야하는 환경이면 vector를 사용하고
    셋은 : 객체를 중복 저장할수 없고 저장 순서가 유지 되지 않습니다. 구현클래스는 어떻게 중복을 제거하는거가 차이다 해쉬는 어떤 데이터가 있는데 이 데이터를 어떤 숫자로 변환하는것을 해쉬라고 한다 hashcode()로 비교를 하고 해쉬값이 같으면 equals 메소드로 또 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다.트리셋은 compareto로 비교하고 이진탐색트리로 저장한다
    맵은 : 키와 밸류로 저장하는데 키는 중복이 안됩니다. 해쉬코드는 따라서 키와 값을 저장한다
    해쉬 테이블은 쓰레드세이프하고 쓰레드세이프 하지 않다

인프라

블루그린 방식을 이용했습니다. 로드밸런서를 통해 모든 트래픽을 한번에 신버전 쪽으로 전환합니다.

  • 로드 밸런서란
    하나의 인터넷 서비스가 발생하는 트래픽이 많을 때 여러 대의 서버가 분산처리하여 서버의 로드율 증가, 부하량, 속도저하 등을 고려하여 적절히 분산처리하여 해결해주는 서비스입니다. 서버의 인스턴스 성능을 올리는 스케일-업(Scale-up) 과 서버를 여러대로 나눠서 트래픽을 처리하는 스케일-아웃(Scale-out) 방식이 있습니다/

  • 리버스 프록시
    엔진엑스 외부의 요청을 통해 백엔드 서버로 요청을 전달하는것인데

-vpc
사용자가 정의하는 가상의 네트워크 입니다.

  • 보안규칙
    보안규칙을 지정해주어서 ec2 인스턴스로 들어오고 나가는 트래픽을 세부적으로 제어할수 있도록 도와주는것

0개의 댓글