[Interview] 면접 관련 정리7
http와 https의 차이
HTTP
HyperText Transfer Protocol는 인터넷 상에서 클라이언트와 서버가 자원을 주고 받을 때 사용하는 통신 규약으로, TCP/IP 위에서 작동한다.
HTTP는 상태를 가지고 있지 않는 Stateless 프로토콜이며, Method, Path, Version, Headers, Body 등으로 구성된다.
HTTPS
HyperText Transfer Protocol Secure는 정보를 암호화하는 SSL 프로토콜을 사용해 클라이언트와 서버가 자원을 주고받을 때 사용하는 통신 규약
차이
HTTP는 암호화 되지 않은 평문 데이터를 전송하기 때문에 정보가 노출될 수 있다.
이런 문제를 해결하기 위해 HTTPS가 등장했으며, 네트워크 상에서 제3자가 정보를 볼 수 없도록 암호화를 지원하고 있다.(공개키 암호화 방식)
대칭키 & 비대칭키(공개키)
대칭키
암복호화에 사용하는 키가 동일한 암호화 방식으로, 해당 키를 아는 사람만이 문서를 복호화해서 볼 수 있다.
공개키 암호화 방식에 비해 속도가 빠르다는 장점이 있지만, 키를 교환하는 중에 탈취 당하거나, 사람이 증가할 수록 전부 따로 키 교환을 해야하기 때문에 관리해야 할 키가 많아진다는 문제가 발생한다.
문제 해결 방법으로는 키의 사전 공유 및 공개키 암호화 방식 등이 있다.
비대칭키(공개키)
대칭키의 키 교환 문제를 해결하기 위해 등장했으며, 키가 공개되어 있기 때문에 키 교환을 하지 않아도 된다.
제3자가 공개키를 얻는다고 해도, 개인키로만 복호화가 가능하기 때문에 기밀성 제공.
다만, 속도가 느리다는 단점이 존재한다.
비대칭키 예시
Ex) A가 B에게 데이터를 보낼 때.
- B의 공개키, 개인키 생성
- 공개키 공개(등록), 개인키는 본인이 소유
- A가 B의 공개키를 받아온다.
- A가 B의 공개키를 사용해 데이터를 암호화한다.
- 암호화된 데이터를 B에게 전송
- B는 암호화된 데이터를 B의 개인키로 복호화
공개키는 모든 사람이 접근 가능한 Key이며, 개인키는 각 사용자만이 가지고 있는 Key이다.
Queue & Stack
Stack
스택은 시간 순서에 따라 자료가 쌓여서 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다는 구조적 특징을 가진 자료구조이다.
스택은 후입선출(LIFO ,Last In First Out) 방식의 자료구조라 한다.
활용
웹 브라우저 뒤로 가기, 역순 문자열 만들기, 연산자 후위 표기법 계산 등
Queue
정해진 한 곳을 통해 삽입/삭제가 이루어지는 스택과는 달리, 양쪽에서 삽입/삭제가 이루어지는 특징을 가지며, 삭제연산이 수행되는 곳을 Front, 삽입연산이 수행되는 곳을 Rear라고 한다.
즉, 큐는 선입선출(FIFO, First In First Out) 방식의 자료구조를 말한다.
활용
버퍼, BFS, 우선순위가 같은 작업 예약(프린터의 인쇄 대기열) 등
N + 1 문제
연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(N) 만큼 조회 쿼리가 추가로 발생하는 문제를 의미.
해결 방법
- Fetch Join
- JPQL을 사용하여 DB에서 데이터를 가져올 때, 처음부터 연관된 데이터까지 같이 가져오는 방법(Ex. SQL JOIN)
- @EntityGraph
@EntityGraph
어노테이션을 사용해서 fetch join을 간단하게 사용 하는 것.- 관계가 복잡해지면 사용하기 힘들다.(추천 X)
- Batch Size
- N+1 문제가 발생해도
select * from user where team_id = ?
가 아닌select * from user where team_id in (?, ?, ?)
방식으로 N+1문제가 발생하게 하는 방법. - 이렇게 하면 쿼리 호출 수가
N+1
->1+1
로 최적화 된다.
- N+1 문제가 발생해도
실무
연관관계에 대한 설정이 필요하다면 성능 최적화를 하기 어려운 즉시 로딩(EAGER)보다는 지연 로딩(LAZY)을 사용하고, 성능 최적화가 필요한 부분에서는 Fetch Join을 사용한다.
또한, 애플리케이션이 견딜 수 있는 순간 부하를 참고해서 Batch Size 값을 1000이하로 설정한다.
DAO(Data Access Object)
- 실제로 DB의 Data에 접근하기 위한 객체
- DB에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용
- Ex) Repository
DTO(Data Transfer Object)
- 계층 간 데이터를 교환하기 위해 사용되는 객체로, 로직을 가지지 않는 순수한 데이터 객체
- getter, setter만 가진 클래스
VO(Value Object)
- read-only 특징
- DTO와 유사하지만 DTO는 setter를 가지고 있어, 값이 변할 수 있다.
BO(Business Object)
- 여러 DAO를 활용해 비즈니스 로직을 처리하는 객체
- Ex) Service
WS & WAS
- WS(Web Server)
- HTTP 기반으로 동작
- 정적 리소스 제공
- 정적 파일 : HTML, CSS, JS, 이미지 등
- 비즈니스 로직을 넣을 수 없다.
- Ex) NGINX, APACHE
- WAS(Web Application Server)
- HTTP 기반으로 동작
- Web Server 기능 포함
- 비즈니스 로직을 넣을 수 있다.
- 동적 HTML, HTTP API(JSON)
- Servlet, JSP, Spring MVC
- Ex) Tomcat, Jetty, Undertow
Servlet
동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다.
Spring MVC에서 Controller로 이용되며, 사용자의 요청을 받아 처리한 후에 결과를 반환해준다.
특징
- 클라이언트의 Request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
- JAVA의 스레드를 이용하여 동작
- MVC 패턴에서 컨트롤러로 이용
- 보안 기능을 적용하기 쉬움
- 컨테이너에서 실행
많은 트래픽 대처 방법
- Scale Up : 서버의 CPU를 업그레이드 하거나, RAM 등을 추가하여 서버의 하드웨어 스펙을 향상시키는 방법.
- Scale Out : 서버를 여러 대 추가하여 시스템을 증가시키는 방법
아파치와 톰캣은 멀티 프로세스/스레드?
아파치는 기본적으로 멀티 프로세스로 구현되어 있다. 하지만 설정에 따라 멀티 스레드를 같이 운용할 수 있다.
톰캣은 요청을 처리하기 위한 스레드 풀을 관리하고 있다. 그리고 요청이 오면 해당 스레드 풀에서 스레드를 꺼내 요청을 처리하도록 한다.
댓글남기기