해당 포스팅은 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. 요청이 들어오고 응답이 가기까지 과정
-
클라이언트는 URL을 통해 요청을 전송한다.
-
디스패처 서블릿은 핸들러 매핑을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.
-
디스패처 서블릿은 핸들러 어댑터에게 요청의 전달을 맡긴다.
-
핸들러 어댑터는 해당 컨트롤러에 요청을 전달한다.
-
컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다.
-
디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾는다.
-
디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.
-
데이터가 추가된 뷰를 반환한다.
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