CS 기술 면접 준비

김진회·2022년 12월 4일
2

cs

목록 보기
5/14
해당 포스팅은 CS 기술 면접 대비 핵심 내용을 요약한 포스팅입니다.
자세한 내용은 키워드 검색 혹은 링크를 통해서 확인할 수 있습니다.
카피는 출처를 표기해주세요.

1.RDBMS vs NoSQL

  • RDBMS: 관계 기반으로 데이터를 테이블 형태로 관리한다.
    • 장점: 업무 변화에 대한 적응력이 높아 유지보수 편리, 생산성 향상
    • 단점: 자원 사용과 부하가 높음
  • NoSQL: 테이블과 같은 관계가 없는 DB
    • 장점: 속도가 빠르다. 유연하다.
    • 단점: 중복 데이터를 변경 시, 전부 수정을 해야 함

https://velog.io/@kku64r/db


2. 정규화 vs 역정규화

  • 정규화: 테이블을 분리시켜 중복을 최소화 한다.
    • 1(도메인을 원자 값으로),2(부분 함수 종속 제거),3(이행 함수 종속 제거),BCNF(결정권자가 후보키),4(다치 종속 제거),5(조인 종속 제거)
    • 장점: 이상 현상을 방지. 무결성 유지
    • 단점: 성능 저하
  • 역정규화: 중복을 허용하고 정규화를 위반하는 것
    • 장점: 성능 향상
    • 단점: 이상현상 발생 가능

https://velog.io/@kku64r/normalization


3. 인덱스

컬럼을 색인화하여 검색 속도를 향상시키는 것

  • 장점: 검색 속도 향상
  • 단점: 추가 저장공간 필요. 변경이 잦으면 성능 저하
  • 자료구조: B+트리

https://velog.io/@kku64r/index
https://velog.io/@kku64r/clusteredindex


4. DB 파티셔닝

목적 : 데이터를 분산해서 성능을 향상. 관리 용이

  • 수직 파티셔닝: 자주 사용하는 컬럼을 분리시켜 성능 향상
  • 수평 파티셔닝(샤딩): 샤드키를 기준으로 데이터를 나눠서 저장. 스키마가 같은 테이블을 여러 개 만듦

https://velog.io/@kku64r/partitioning


5. 트랜잭션 설명

데이터베이스 상태를 변화시키는 일련의 작업 단위

  • 특성
    • A 원자성: 모두 반영되거나 안돼야 한다
    • C 일관성: 실행이 끝나면 일관성있는 상태여야 한다
    • I 독립성: 트랜잭션은 다른 트랜잭션 연산에 끼어들 수 없다
    • D 영속성: 실행이 끝나면 영구적으로 반영돼야 한다

https://velog.io/@kku64r/transaction


6. 자바 장단점, 자바8과 11 이전과 바뀐 점

  • 장점
    • GC가 메모리 관리를 편하게 함
    • 플랫폼에 종속적이지 않다
  • 단점
    • 속도가 느림
    • 코드의 길이가 길다
  • 자바8: 람다 표현식 가능. Optional 지원. Date&Time API 지원.
  • 자바11: String 메소드 일부 추가. 람다에 var 사용 가능. HTTP클라이언트 표준 기능화

7. 객체지향 프로그래밍(OOP)

데이터를 추상화시켜 객체를 만들고 객체의 상호작용을 통해 로직을 구성하는 프로그래밍 방법

  • 장점: 코드 재사용 용이. 유지보수 쉬움
  • 단점: 처리 속도가 상대적으로 느림. 설계 시 많은 노력이 필요
  • 클래스: 데이터의 추상화를 거쳐 변수와 메서드로 정의한 것
  • 객체(인스턴스): 클래스에서 정의한 것을 실제 메모리에 할당한 것
  • 특징
    • 추상화: 공통의 속성이나 기능을 묶어서 정의하는 것
    • 캡슐화: 변수와 함수를 하나로 묶는 것. 접근제어자를 통해 정보은닉을 할 수 있음
    • 상속: 부모 클래스가 자식 클래스에게 변수와 메소드를 물려주는 것
    • 다형성: 다양한 형태로 있을 수 있는 성질
  • 객체지향 원칙(SOLID)
    • 단일 책임 원칙: 클래스는 하나의 책임만을 가져야 함
    • 개방-폐쇄 원칙: 확장에 있어서는 열려있고, 변경에 있어서는 닫혀있음
    • 리스코프 치환 원칙: 자식은 부모 클래스의 기능을 수행할 수 있어야 함
    • 인터페이스 분리 법칙: 인터페이스를 클라이언트에 특화되도록 분리
    • 의존관계 역전 원칙: 고모듈은 저모듈에 의존하면 안된다. 구체화에 의존하지말고 추상화에 의존해라.

8. 오버로딩 vs 오버라이딩

  • 오버로딩: 파라미터의 갯수, 타입을 바꾸어 같은 이름의 메소드라도 다양한 로직으로 사용할 수 있는 것
  • 오버라이딩: 부모 클래스의 메소드를 상속받아 변형해서 사용하는 것

https://velog.io/@kku64r/overroading


9. Mvc패턴 설명

프로젝트의 구성요소를 model-view-controller로 나눈 디자인 패턴

  • Model: 애플리케이션의 데이터 (DTO, service)
  • View: 사용자에게 보여지는 인터페이스 요소
  • Controller: 모델과 뷰의 중간 다리 역할. 사용자의 이벤트를 처리
  • 장점: 역할을 나눠 각자 맡은 곳에 집중할 수 있고 효율적이다. 유지보수성 향상. 확장성 증가. 중복 감소.

10. 요청이 들어오고 응답이 가기까지 과정

  1. 클라이언트는 URL을 통해 요청을 전송한다.

  2. 디스패처 서블릿은 핸들러 매핑을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.

  3. 디스패처 서블릿은 핸들러 어댑터에게 요청의 전달을 맡긴다.

  4. 핸들러 어댑터는 해당 컨트롤러에 요청을 전달한다.

  5. 컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다.

  6. 디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾는다.

  7. 디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.

  8. 데이터가 추가된 뷰를 반환한다.

DispatcherServlet : 클라이언트에게 요청을 받아 응답까지의 MVC 처리과정을 통제한다.

HandlerMapping : 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정한다.

HandlerAdapter : HandlerMapping에서 결정된 핸들러 정보로 해당 메소드를 직접 호출해주는 역할을 한다.

ViewResolver : Controller의 처리 결과(데이터)를 생성할 view를 결정한다.

11. RESTful

  • REST: HTTP 메소드(post, get, put, delete)를 통해 자원에 대한 CRUD 연산을 적용하는 아키텍처. 자원을 이름으로 구분해서 해당 자원의 상태를 주고 받는 모든 것.
  • RESTful: REST 아키텍처를 구현한 시스템
  • 장점: Http표준프로토콜을 사용해서 명확함. 해당 표준을 지키는 모든 플랫폼에서 사용 가능. 서버와 클라이언트를 분리.

12. OSI 7 layer

네트워크에서 통신이 일어나는 과정을 7단계로 나눈 것

  • 응용: 최종 목적지에서 응용 서비스를 수행, 사용자 인터페이스 제공. HTTP, FTP, DNS
  • 표현: 어떻게 표현할지 정함. 암복호화, 인코딩을 함. JPEG, MPEG
  • 세션: 양 끝 단의 응용 프로세스가 통신을 관리하기 위한 방법 제공. API, Socket
  • 전송: 종단 간 신뢰성 있고 정확한 데이터 전송을 담당. 포트를 사용. TCP, UDP
  • 네트워크: 데이터를 목적지까지 가장 안전하고 빠르게 보내줌. 패킷. 라우터, IP
  • 데이터링크: 물리 계층을 통해 송수신되는 정보의 오류와 흐름을 관리함. MAC 주소를 이용해 통신. 프레임. 브릿지, 스위치
  • 물리: 전기적, 물리적 신호로 데이터 전송. 케이블,허브

13. 프로세스 vs 스레드

  • 프로세스: 컴퓨터에서 실행되고 있는 프로그램(작업). 메모리에 올라와 실행되고 있는 프로그램의 인스턴스 (= 실행된 프로그램. 작업)
    • 특징
      • 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받음
      • 기본적으로 프로세스당 최소 1개의 스레드를 가지고 있음
      • 다른 프로세스의 자원에 접근할 수 없음. 접근하려면 프로세스 간의 통신 방식을 따로 사용해야 함(파일, 소켓 등)
  • 스레드: 프로세스 내에서 실행되는 여러 흐름의 단위 (=프로세스의 특정한 수행 경로)
    • 특징
      • 프로세스 내에서 각각 Stack만 할당받고 그 외의 영역(Code, Data, Heap)은 공유함
      • 같은 프로세스 안에 있는 여러 스레드들은 힙 공간을 공유
stack: 지역변수, 매개변수, 복귀 번지 등이 저장되어 있는 프로그램이 자동으로 사용하는 임시 메모리
heap: 프로그래머가 동적으로 사용하는 영역. 메모리 할당, 반환되는 영역
data: 전역변수, 정적변수, 배열, 구조체
code: 작성한 코드가 들어가는 부분
  • 멀티 프로세스: 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것
    • 장점: 한 프로세스에 문제가 발생하면 해당 프로세스만 죽고, 다른 것에는 영향이 없다
    • 단점: contextSwitching에서 많은 시간이 걸리고 오버헤드가 발생
      • contextSwitching: CPU에서 여러 프로세스들이 돌아가면서 작업을 처리하는 과정
  • 멀티 스레드: 하나의 응용프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하는 것
    • 특징: 윈도우,리눅스와 같은 OS들이 멀티 프로세스를 지원하지만 멀티 스레드를 기본으로 사용한다. 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.
    • 장점
      • 자원 효율성 증가: 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원 효율이 좋다.
      • 처리 비용 감소: 스레드 사이의 작업량이 작아 ContextSwitching이 빠르다.
      • 응답 시간 단축: 간단한 통신 방법으로 응답 시간 단축
    • 단점
      • 자원 공유의 문제(동기화 문제) 발생
      • 하나의 스레드에 문제가 발생하면 전체가 영향을 받는다.
      • 주의 깊은 설계가 필요하고 디버깅이 까다롭다.

https://velog.io/@kku64r/processthread


14. CI/CD란?

지속적인 통합 및 배포라는 의미로 애플리케이션의 통합~배포 단계를 지속적인 자동화와 지속적인 모니터링을 제공

  • 대표 구현 예시: Jenkins, Travis
  • 장점: 개발의 효율성 증가, 코드 품질 개선, 검토 시간 단축

15. Abstract vs Interface

  • 추상클래스
    • 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스
    • 일부 구현, 일부 미구현 가능
    • 사용 용도가 is a (~는 ~다)
  • 인터페이스
    • implement를 통해서 구현하도록 유도하는 것.
    • 원래는 전부 미구현해야했지만 JAVA8부터 일부 구현 가능 default method
    • 다중 상속이 가능함
    • 사용 용도가 has a (~는 ~의 기능을 갖고 있다)
  • 차이점
    • 사용용도
    • 다중 상속

16. N+1문제

연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 갯수 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상

  • 해결 방법
    • 연관 관계에 대한 설정은 모두 FetchType.LAZY(지연로딩)을 사용하고, 추가로 성능 최적화가 필요한 부분은 FetchJoin이나 QueryBuilder(추천)을 같이 사용

https://velog.io/@kku64r/nplus1


17. 디자인 패턴

  • 싱글톤 패턴: 생성된 하나의 인스턴스를 계속해서 사용하고 새로운 인스턴스 생성을 방지하는 패턴
  • 옵저버 패턴: 상태가 변경되면 다른 객체에게 알림
  • 데코레이터 패턴: 객체를 감싸서 새로운 행동을 제공
  • 팩토리 패턴: 생성할 구상 클래스를 서브클래스에서 결정
  • 빌더 패턴: 제품을 여러 단계로 나눠서 만들 수 있도록 생산 단계를 캡슐
  • 메멘토 패턴: 객체를 이전 상태로 복구해야하는 경우 사용

18. HTTP METHOD

클라이언트가 웹서버에게 사용자 요청의 목적이나 종류를 알리는 수단

  • POST(Create) : 요청 데이터 처리, 주로 데이터 등록에 사용
  • GET(Read) : 데이터 조회
  • PUT(Update) : 리소스를 대체, 해당 리소스가 없으면 생성
  • PATCH(Update) : 리소스를 일부만 변경
  • DELETE(Delete) : 리소스 삭제

19. HTTP 상태 코드

  • 1xx(정보): 요청을 받았으며 프로세스를 계속 진행
    • 100: 진행중
    • 101: 서버가 프로토콜을 변경함
    • 102: 요청을 수신하고 처리 중이나, 아직 응답을 알려줄 수 없음
  • 2xx(성공): 작업 성공
    • 200: OK. 요청을 정상 처리함
    • 201: 결과 성공적. 새로운 리소스를 생성함
    • 202: 올바른 요청을 수신했지만 아직 처리하지 않음
  • 3xx(리다이렉션): 요청 완료를 위해 추가 작업 필요
    • 300: 요청에 대해 여러 응답이 가능함
    • 301: 요청 URI가 변경됨
    • 302: 요청 URI가 일시적으로 변경됨
  • 4xx(클라 오류): 요청이 잘못됨
    • 400: Bad Request. 잘못된 요청
    • 401: Unauthorized. 인증이 필요. ex) jwt 토큰이 잘못됨
    • 403: Forbidden. 인증은 됐지만 권한이 없음
    • 404: Not Found. 요청한 URI를 찾을 수 없음
  • 5xx(서버 오류): 서버 처리 실패
    • 500: Internal Server Error. 서버 문제로 응답 불가
    • 504: Gateway Timeout. timeout으로 처리 불가

20. JWT를 레디스에서 쓰는 이유

  • redis는 인메모리 데이터구조저장소로 ram을 사용해서 빠르다.
  • expire을 redis에서 설정가능해서 토큰 만료를 편하게 할 수 있다.

https://velog.io/@kku64r/redis


21. Union vs Union All 차이점

  • Union: 테이블 A와 B를 합친다. 중복된 row는 제거한다.
  • Union All: 중복값을 포함하여 테이블 A와 B를 합친다. 중복제거를 안하므로 더 빠르다.
    중복의 기준은 '모든 컬럼이 같은지' 이다.

22. List, Map, Set 차이점

  • List: 원소를 중복 허용하고 순서가 있이 값을 삽입한다.
  • Map: key:value 형태로 원소 삽입. Key값은 중복 불가, Value는 중복 허용. 순서가 없다.
  • Set: 순서가 없고 중복이 불가능한 채로 값 삽입. 집합

23. SQL injection

  • 임의의 JQL문을 주입하여 DB가 비정상적인 동작을 하도록 조작하는 행위
  • 해결방안
    • 입력값 검증
    • 에러메세지 노출 금지 (DB의 정보를 노출시키지 않도록)
    • 저장 프로시저 사용
      사용하고자 하는 쿼리에 미리 형식을 지정하는 것. 지정된 형식의 데이터가 아니면 쿼리가 실행되지 않음

24. DB Optimizer

  • SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진
  • 목적: 속도 최적화
  • 한계
    • 통계정보의 부정확성: 100% 정확한 통계정보를 유지하기 힘듦
    • 규칙에 의존하는 CBO: CBO도 부분적으로 규칙에 의존
    • 하드웨어 성능: 개발팀의 하드웨어에 맞춰져 있어 계획을 잘못 수립할 가능성이 있음
  • 종류
    • 규칙 기반 옵티마이저(RBO)
      • 실행 속도가 빠른 순으로 규칙을 먼저 세워두고 우선순위에 따라 선택
    • 비용 기반 옵티마이저(CBO)
      • 실행 계획을 세운 뒤 비용이 최소한인 계획을 선택
규칙 기반 옵티마이저비용 기반 옵티마이저
개념사전에 정의된 규칙 기반최소비용 계산 실행계획 수립
기준실행우선순위(ranking)액세스 비용(cost)
인덱스인덱스 존재 시 가장 우선시 사용cost에 의한 결정
성능사용자 SQL작성 숙련도옵티마이저 예측 성능
장점판단이 매우 규칙적. 실행 예상 가능통계 정보를 통한 현실 요소 적용
단점예측 통계정보 요소 무시최소 성능 보장 계획의 예측 제어 어려움
버전오라클8 이전의 예전 방식오라클10 이후의 최근 방식

25. JWT 구조

  • Json Web Token의 약자로 Json 객체를 이용해 정보를 안정성있게 전달함
  • .를 구분자로 3가지의 문자열(헤더, 내용, 서명)로 구성되어있음.
    • 헤더(header): 토큰 타입과 해싱 알고리즘의 정보를 담음
      • typ: 토큰의 타입. 즉, JWT
      • alg: 해싱 알고리즘. 보통 SHA256 혹은 RSA이 사용됨. 이 알고리즘은 토큰을 검증 할 때 사용되는 서명 부분에서 쓰임
    • 내용(payload): 토큰에 담을 정보가 존재.
      • 토큰 발급자, 제목, 대상자, 만료시간, 발급된 시간 등등...
    • 서명(signature): 헤더의 인코딩값과 정보의 인코딩값을 합친 후 주어진 비밀키로 해쉬를 해서 생성
      • 서명은 메세지가 도중에 변경되지 않았는지 확인하는데 사용됨. 비밀키로 서명된 경우, 송신자도 확인 가능

26. CPU 스케줄링

  • 목적: 운영체제는 CPU를 프로세스 간에 교환함으로써, 작업 효율을 높인다.
  • 평가기준: CPU이용률, 처리량, 반환시간, 대기시간, 응답시간
  • 종류
    • 선점(Preemptive): 진행 중인 프로세스를 중지하고 CPU를 점유할 수 있음
      • SRT 스케줄링 (SRT, Shortest Remaining Time)
      • 라운드 로빈 스케줄링
      • 다단계 큐 스케줄링
      • 다단계 피드백 큐 스케줄링
    • 비선점(Nonpreemptive)
      • 선입선처리 스케줄링 (FCFS, First Come First Served)
      • 최단 작업 우선 스케줄링 (SJF, Shortest Job First)
      • HRN 스케줄링 (HRN, Highest Response Ratio Next)
    • 구현에 따라 둘 다
      • 우선순위 스케줄링

https://velog.io/@kku64r/scheduling


27. 페이지 교체 알고리즘

  • FIFO: 가장 먼저 올라온 페이지를 교체하는 알고리즘
  • OPT: 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체하는 알고리즘
  • LRU: 가장 최근에 사용하지 않은 페이지를 교체하는 알고리즘
  • LFU: 참조된 횟수가 가장 적은 페이지를 교체하는 알고리즘

28. DTO, DAO, VO 차이점

  • DTO: 데이터 교환을 하기 위해 사용하는 객체

  • DAO: db의 data에 접근하기 위한 객체. 로직을 수행한다.

  • VO: 값 오브젝트로 read-Only의 특징을 가진다.

  • SERVICE: 사용자가 요청한 작업을 처리하는 과정을 하나로 묶음

  • DAO: CRUD 작업을 하나씩 분할해 놓은 것


29. 세마포어와 뮤텍스

데이터를 공유하게 되는 경우 문제가 발생할 수 있고, 접근을 제한해서 문제를 해결하도록 고안된 것

  • 세마포어 : 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 여러 Process 혹은 Thread가 접근하는 것을 막아줌(즉, 동기화 대상이 하나 이상)

  • 뮤텍스(Mutex) : 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 하나의 Process 혹은 Thread가 접근하는 것을 막아줌(즉, 동기화 대상이 하나)
    임계영역: 각 프로세스에서 공유 데이터를 접근(Access)하는 프로그램 코드 부분


30. DI, IOC

  • DI(의존성 주입): 객체를 직접 생성하지 않고 외부에서 생성한 후 주입 시켜주는 방식
  • IOC(제어의 역전): 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것
  • 장점: 객체 간의 결합도를 낮추고 유연성이 높아짐

31. 가비지 컬렉션

JVM 힙영역에서 동적으로 할당했던 영역 중 필요없어진 영역을 자동으로 삭제해줌

  • 장점: 개발 편의성 향상
  • 단점: GC가 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생
  • 과정
    • 1) heap영역 안에 young(Eden+survival)과 old 영역이 있는데 객체가 생성되면 young영역(Eden)으로 할당됨
    • 2) Eden에 있다가 시간 지나면 마이너GC에 의해 survival로 이동, survival1...2... 이동하다가 일정 age가 되면 old 영역으로 이동
    • 3) old가 꽉차면 MajorGC에 의해 참조되지 않은 객체는 삭제됨

32. JVM

OS에 종속받지 않고 Java를 실행할 수 있게 하는 가상 컴퓨터
자바 컴파일러가 .java 파일을 JVM이 인식가능한 .class파일로 만들고,
이 .class파일을 os가 인식가능하게 기계어로 바꿔줌


33. Bean 등록 방법

application.xml 추가
java config 추가
어노테이션 등록


참고자료
https://dev-coco.tistory.com/163

profile
SSAFY 7기. HMG. 협업, 소통, 사용자중심

0개의 댓글