웹사이트에 접근했을 때 발생하는 일련의 과정에 대해 설명해 주세요.
·
백엔드 면접
사용자가 특정 도메인 네임을 브라우저에 입력하면, 브라우저는 HTTP 프로토콜을 사용해 웹 서버와 통신하려고 합니다. HTTP는 OSI 7 계층 중 애플리케이션 계층(응용 계층)에서 동작하는 프로토콜입니다. 이때 브라우저는 요청한 도메인 네임에 대한 IP 주소를 알아야 하기 때문에 DNS(Domain Name System) 서버에 질의합니다. 이 질의 과정 또한 애플리케이션 계층에서 이루어지며, DNS 서버는 해당 도메인에 대한 IP 주소를 응답합니다. IP 주소를 얻은 후, 브라우저는 구글 서버와 통신을 시작합니다. HTTP는(HTTP/1.1 기준) TCP/IP를 기반으로 작동하기 때문에 TCP 3-way handshake 과정이 필요합니다. 이 과정은 전송 계층에서 이루어집니다. TCP 연결이 성립된..
스레드, 프로세스, 코어는 많을수록 좋을까요?
·
백엔드 면접
스레드, 프로세스, 코어의 수가 많을수록 시스템 성능 향상을 기대할 수 있지만, 실제로는 그렇지 않을 확률이 큽니다. 스레드가 많으면?스레드가 지나치게 많아지면 운영체제가 스레드 간 컨텍스트 스위칭을 자주 수행해야 해 CPU 자원이 스레드 관리에 소모됩니다. 이로 인해 실제 작업 수행 효율이 떨어질 수 있으며, 많은 스레드가 동시에 실행될 경우 메모리나 캐시, 락 등의 자원을 경쟁하게 되어 성능 저하나 데드락이 발생할 가능성이 높아집니다. 또한, 스레드가 많아지면 동기화와 상태 관리가 복잡해져 버그 발생 가능성도 커집니다. 프로세스가 많으면?각 프로세스는 독립된 메모리 공간을 가집니다. 그래서 많은 프로세스가 동시에 실행되면 메모리 사용량이 급격히 증가할 수 있습니다. 또한, 프로세스를 생성하고 관리하는..
단위 테스트와 통합 테스트의 차이점은 무엇인가요?
·
백엔드 면접
단위 테스트는 소프트웨어의 가장 작은 단위, 즉 개별 메서드나 함수의 기능을 검증하는 테스트입니다. 특정 기능이 올바르게 동작하는지 확인하기 위함이며 독립적이고 빠르게 실행됩니다. 반면 통합 테스트는 개별 모듈들이 결합되어 전체 시스템이 올바르게 동작하는지 검증하는 테스트입니다. 모듈 간의 상호작용이 올바르게 동작하는지 확인하기 위함이며 실제 데이터베이스, 네트워크 등의 외부 시스템과의 통합을 테스트합니다.  슬라이스 테스트는 무엇인가요? 슬라이스 테스트는 특정 레이어(컨트롤러, 서비스, 레포지토리 등)에 대한 테스트입니다. 애플리케이션의 특정 슬라이스가 올바르게 동작하는지 확인하기 위해 작성됩니다. 스프링의 특정 컴포넌트만 로드하여 테스트하므로 상대적으로 빠르게 실행됩니다. 관련 어노테이션으로 @Web..
TCP 3-way handshake에 대해서 설명해 주세요.
·
백엔드 면접
TCP 3-way handshake는 TCP/IP 네트워크에서 안정적이고 연결 지향적인 통신을 설정하기 위해 사용되는 절차입니다. 이 절차는 클라이언트와 서버 간에 신뢰할 수 있는 연결을 설정하기 위해 세 개의 메시지(세그먼트)를 교환하는 과정을 포함합니다. 우선 클라이언트는 서버에 연결을 요청하는 SYN 세그먼트를 보냅니다. 이 세그먼트에는 초기 순서 번호와 윈도우 크기 정보가 포함되어 있습니다. 이후 서버는 클라이언트의 요청을 수락하고, SYN과 ACK 플래그가 설정된 세그먼트를 클라이언트에 보냅니다. 이 세그먼트는 서버의 초기 순서 번호와 클라이언트의 초기 순서 번호에 대한 응답(ACK = 클라이언트의 초기 순서 번호 + 1)을 포함합니다. 클라이언트는 서버의 응답을 확인하고, ACK 플래그가 설정..
동기 방식으로 외부 서비스(API)를 호출할 때 외부 서비스 장애가 나면 어떻게 조치할 수 있나요?
·
백엔드 면접
외부 서비스 장애로 인해 응답이 오래 걸리게 되면 외부 API 응답으로 대기하는 자원들이 운영 서버 내부에 쌓이면서 성능에 영향을 줄 수 있습니다. 이를 해결하기 위한 가장 기본적인 방법은 타임아웃을 설정하는 것입니다. 타임아웃에는 크게 커넥션 타임아웃과 리드 타임아웃, HTTP 커넥션 풀 타임아웃 설정이 있습니다.  다음과 같이 특정 서비스의 장애가 전체 서비스에 영향을 주는 경우 어떻게 해결할 수 있을까요?1. A 서비스, B 서비스, C 서비스 연동 코드가 HTTP 커넥션 풀을 공유한다. 2. A 서비스의 장애로 응답 시간 지연이 발생하는 경우      2-1. 풀에 남은 커넥션이 점점 줄어든다.      2-2. 풀에서 커넥션을 구하는 대기 시간이 증가한다.     2-3. B, C 서비스에 대한..
@Component, @Controller, @Service, @Repository의 차이에 대해서 설명해주세요.
·
백엔드 면접
이 애노테이션들은 각각의 클래스를 특정 역할을 수행하는 Spring Bean으로 등록할 때 사용합니다. 각 애노테이션은 클래스가 어떤 역할을 하는지를 명시적으로 나타내며, Spring의 @ComponentScan 기능을 통해 자동으로 Bean으로 등록됩니다. @Controller, @Service, @Repository 애노테이션은 내부적으로 @Component 애노테이션을 포함하고 있습니다. @Component 애노테이션은 가장 일반적인 형태의 빈 등록 애노테이션으로, 특정 역할에 종속되지 않는 일반적인 Spring Bean을 나타냅니다. 공통 기능을 제공하는 유틸리티 클래스나 특정 계층에 속하지 않는 일반적인 컴포넌트를 정의할 때 사용됩니다. @Service 애노테이션은 비즈니스 로직을 수행하는 클래..
동일성과 동등성에 대해서 설명해 주세요.
·
백엔드 면접
동일성과 동등성은 객체 지향 프로그래밍에서 객체를 비교할 때 중요한 개념입니다. 자바에서는 이 두 개념을 equals() 메서드와 == 연산자를 통해 구분할 수 있습니다. equals()는 객체의 내용을 비교하고,  ==는 객체의 참조를 비교합니다. 따라서 두 객체의 내용이 같더라도 서로 다른 객체라면 equals()는 true를 반환하고, ==는 false를 반환합니다.  동등성(Equality)은 무엇인가요?동등성은 논리적으로 객체의 내용이 같은지를 비교하는 개념입니다. 자바에서는 equals() 메서드를 사용하여 객체의 동등성을 비교합니다. 커스텀 객체의 동등성 비교를 위해서는 equals() 메서드의 오버라이딩이 필수적입니다. 왜냐하면, Object 클래스의 equals() 메서드는 == 연산자를..
equals와 hashCode는 왜 함께 재정의해야 할까요?
·
백엔드 면접
equals와 hashCode 메서드는 객체의 동등성 비교와 해시값 생성을 위해서 사용할 수 있습니다. 하지만, 함께 재정의하지 않는다면 HashSet, HashMap과 같은 해시값을 사용하는 자료구조를 사용할 때 문제가 발생할 수 있습니다. 해시값을 사용하는 자료구조는 hashCode 메서드의 반환값을 사용합니다. 이 메서드를 오버라이딩 하지 않으면 기본적으로 Object 클래스의 hashCode 메서드를 사용합니다. 문제는 Object 클래스에서는 객체의 참조값을 기반으로 해시 코드를 반환합니다. 따라서 동일한 필드값을 갖더라도 모두 다른 해시코드를 반환하므로, 서로 다른 객체라고 판단합니다. hashCode 메서드를 재정의하여 같은 값의 필드에 대해서 항상 같은 해시코드를 반환하도록 해야 합니다. ..
로그와 메트릭에 대해서 설명해 주세요.
·
백엔드 면접
로그는 서버가 동작할 때 서버의 상태와 동작 정보를 시간 경과에 따라 기록된 결과입니다. 시스템의 오류와 문제들을 쉽게 찾아낼 수 있도록 도와줍니다. 메트릭은 시스템의 성능과 상태에 대한 통계적인 정보를 의미합니다. 메트릭을 잘 수집하면 시스템의 현재 상태를 손쉽게 파악할 수 있습니다. 예를 들어 CPU 사용량, 메모리 사용량, DB 커넥션 풀의 상태를 확인할 수 있습니다.  로그와 메트릭을 수집해 보신 적이 있나요?직접 수집해 본 적은 없지만, 스프링 부트 액츄에이터를 사용해 메트릭을 생성하고 프로메테우스에 저장한 다음 그라파나로 시각화를 할 수 있다는 원리는 파악하고 있습니다. 중요한 정보로서 수집할 수 있는 지표는 [CPU, 메모리, JVM 힙 사용량], [톰캣 스레드 풀과 데이터베이스 커넥션 풀 ..
얕은 복사와 깊은 복사에 대해서 설명해 주세요.
·
백엔드 면접
얕은 복사(Shallow Copy)는 주소 값을 복사한다는 의미하며, 깊은 복사(Deep Copy)는 실제 값을 새로운 메모리 공간에 복사하는 것을 의미합니다. 얕은 복사의 경우 주소 값을 복사하기 때문에 원본 객체와 복사된 객체가 같은 메모리 공간의 데이터를 참조합니다. 즉, 복사된 객체에서 값을 변경하면 원본 객체도 변경이 됩니다. 주로 직접 참조 대입('=')으로 수행됩니다. 깊은 복사의 경우 원본 객체의 모든 데이터를 복사하여 새로운 메모리 공간에 저장하기 때문에 원본 객체와 복사된 객체는 서로 독립적이며, 한쪽의 변경은 다른 쪽에 영향을 주지 않습니다. clone() 메서드, 복사 생성자, 복사 팩토리 등으로 깊은 복사를 할 수 있습니다.