[Interview] 면접 관련 정리16
웹 동작 방식
- 사용자가 브라우저에 URL을 입력
- 브라우저는 DNS를 통해 서버의 진짜 IP 주소를 찾음
- HTTP 프로토콜을 사용하여 HTTP 요청 메세지를 생성함
- TCP/IP 연결을 통해 HTTP 요청이 서버로 전송됨
- 서버는 HTTP 프로토콜을 활용해 HTTP 응답 메세지를 생성함
- TCP/IP 연결을 통해 요청한 컴퓨터로 전송
- 도착한 HTTP 응답 메세지는 웹 페이지 데이터로 변환되고, 웹 브라우저에 의해 출력되어 사용자가 볼 수 있게 된다.
공인 IP/ 사설 IP
- 공인 IP
- 전세계에서 유일한 IP로 ISP(인터넷 서비스 공급자)가 제공하는 IP 주소
- 외부에 공개되어 있기 때문에 인터넷에 연결된 다른 장비로부터 접근이 가능하다.
- 그에 따라 방화벽 등과 같은 보안 설정을 해줘야 한다.
- 사설 IP
- 어떤 네트워크 안에서 사용되는 IP 주소
- IPV4의 부족으로 인해 모든 네트워크가 공인 IP를 사용하는 것은 불가능하기 때문에 네트워크 안에서 라우터를 통해 할당받는 가상의 주소이다.
- 별도의 설정 없이는 외부에서 접근이 불가능하다.
메모리
메모리는 컴퓨터에서 작업을 수행하기 위해 처리 대상이나 결과 등을 저장하기 위한 공간.
프로그램을 실행하기 위한 정보들은 메모리에 저장되어 처리된다.
B + Tree
- 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조이다.
- BTree의 리프노드들을 LinkedList로 연결하여 순차 검색을 용이하게 했다.
- 해시 테이블보다 나쁜 O(logn)의 시간복잡도를 갖지만 해시 테이블보다 흔하게 사용된다.
DB 락의 종류
DB 락은 여러 개의 트랜잭션들이 하나의 데이터로 동시에 접근하려고 할 때 이를 제어해주는 도구이다.
- 공유락(LS, Shared Lock)
- 데이터를 변경하지 않는 읽기 명령에 대해 주어지는 락
- 여러 사용자가 동시에 데이터를 읽어도 데이터의 일관성에는 영향을 주지 않기 때문에, 공유 락끼리는 동시에 접근이 가능하다.
- 공유 락이 걸려있는 행에 베타 락을 걸 수는 없다.
- 즉, 해당 공유 락이 해제될 때까지 쓰기 불가능
- 베타락(LX, Exclusive Lock)
- 데이터에 변경을 가하는 쓰기 명령들에 대해 주어지는 락
- 다른 세션이 해당 자원에 접근(SELECT, INSERT) 하는 것을 막는다.
- 이런 점에서 베타 락은 멀티 스레드 환경에서, 임계 영역을 안전하게 관리하기 위해 활용되는 뮤텍스와 유사하다고 볼 수 있다.
- 베타 락은 트랜잭션 동안 유지된다.
StringBuffer / StringBuilder
- StringBuffer
- 동기화 지원
- 속도가 느리지만 병렬 상황에서 안전하다.
- StringBuilder
- 동기화 지원 X
- 속도는 빠르지만 병렬 상황에서 안전하지 않다.
synchronized
Java에서 지원하는 synchronized 키워드는 여러 스레드가 하나의 자원을 이용하고자 할 때, 한 스레드가 해당 자원을 사용중인 경우, 데이터에 접근할 수 없도록 막는 키워드이다.
synchronized 키워드를 이용하면, 병렬 상황에서 자원의 접근을 안전하게 하지만, 자원을 이용하지 않는 스레드는 락에 의한 병목 현상이 발생하게 된다.
- 메소드 synchronized : 한 시점에 하나의 스레드만이 해당 메소드를 실행할 수 있다.
- 변수 synchronized : 한 시점에 하나의 스레드만이 해당 변수를 참조할 수 있다.
try-with-resources
try-with-resources란 Java7에서 추가된 기능으로, 리소스를 다 사용한 객체를 자동으로 반납(close)해준다.
try-with-resources를 사용하면 코드가 try-finally보다 유연해지며, try-finally와 달리 누락없이 모든 자원을 반납할 수 있다.
try-with-resources를 통해 객체가 자동으로 반납되기 위해서는 AutoCloseable
인터페이스를 구현하고 있어야 한다.
사용 예시
try (SomeResource resource = getResource()) {
use(resource);
} catch(...) {
...
}
try에 자원 객체를 전달하면, try 코드 블록이 끝나면서 자동으로 자원을 종료해주는 기능이다.
즉, 따로 finally 블록이나 모든 catch 블록에 종료 처리를 하지 않아도 된다.
다음과 같이 try()
안에 복수의 자원 객체를 전달할 수 있다.
try(Something1 s1 = new Something1();
Something2 s2 = new Something2()) {
} catch(...) {
...
}
GC 작동의 문제를 진단하는 방법과 해결 방법
Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다.
만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 시스템이 정상적인 상황이 아니라고 보면 된다.
추가적으로, GC에 대한 로그를 확인하여 옵션을 수정할 지 코드를 수정할 지 정해야 한다.
CORS
CORS(Cross-Origin-Resource-Sharing)란 도메인이 다른 2개의 사이트가 데이터를 주고 받을 때 발생하는 문제다.
예를 들면, kangtaegong.com에서 taegong.com으로 데이터를 요청한다고 하면, 따로 설정을 해주지 않는 한 CORS 에러를 만나게 된다.
CORS가 생기게 된 이유는 서버 내에서 요청이 허락된 도메인에만 데이터를 주기 위해서인데, 요청을 허락하기 위해서는 Access-Control-Alow-Origin: {도메인}
과 같은 내용을 Response의 헤더에 추가해주어야 한다.
만약 도메인을 *
으로 설정하면 모든 도메인에 대해 요청을 허락할 수 있다.
- Access-Control-Allow-Origin : 요청을 보내는 페이지의 출처 [*, Domain]
- Access-Control-Allow-Methods : 요청을 허용하는 메소드. (Default : GET, POST)
- Access-Control-Max-Age : 클라이언트에서 preflight 요청(서버의 응답 가능 여부에 대한 확인) 결과를 저장할 시간
- Access-Control-Allow-Headers : 요청을 허용하는 헤더
Spring WebFlux
Blocking + 동기 방식으로 동작하는 Spring MVC의 한계점을 극복하기 위해 Spring5에 처음 등장하게 되었다.
기존의 Spring MVC에서는 HTTP 요청들을 큐에 넣어두고, 멀티 스레드를 기반으로 동작하고 있는데, 이런 방식은 응답성이 상대적으로 떨어지기 때문에 비동기적으로 요청을 처리하기 위한 방법이 필요하게 되었다.
Reactive 프로그래밍을 통해 비동기 데이터 스트림으로 Non-Blocking 애플리케이션을 개발하기 위한 Spring WebFlux 프레임워크가 등장하게 되었다.
댓글남기기