포워드 프록시와 리버스 프록시의 차이에 대해 설명해 주세요.
·
백엔드 면접
포워드 프록시(Forward Proxy)는 주로 클라이언트 측에 위치하여, 사용자가 인터넷에 접근할 때 중개자 역할을 합니다. 예를 들어 회사 내부 네트워크에서 외부 웹사이트에 접속할 때, 포워드 프록시 서버를 통해 요청이 전달됩니다. 이 과정에서 사용자의 실제 IP 주소는 숨겨지고, 프록시 서버의 IP 주소가 대신 사용됩니다. 포워드 프록시의 핵심 기능 중 하나는 익명성 제공입니다. 사용자의 실제 IP를 숨김으로써 개인정보 보호와 보안 측면에서 큰 장점을 제공합니다. 또한 캐싱을 통해 네트워크 성능을 향상시킵니다. 자주 요청되는 웹 페이지나 파일을 프록시 서버에 저장해 두면 동일한 요청이 다시 들어올 때 빠르게 응답할 수 있어 네트워크 대역폭을 절약할 수 있습니다. 마지막으로 보안 강화 기능도 포워드 ..
CORS란 무엇인가요?
·
백엔드 면접
CORS(Cross Origin Resource Sharing)는 출처가 다른 곳의 리소스를 요청할 때 접근 권한을 부여하는 메커니즘입니다. 리소스를 주고받는 두 곳의 출처가 다르면 출처가 교차한다고 합니다. 이때 출처에는 프로토콜, 호스트, 포트가 포함됩니다. 만약 클라이언트의 출처가 허용되지 않았다면 CORS 에러가 발생할 수 있습니다.CORS는 왜 필요한가요?과거에는 CSRF(Cross Site Request Forgery)라는 사이트 간 요청 위조 문제가 있었습니다. CSRF는 피해자를 사칭해 피해자의 브라우저에서 다른 애플리케이션으로 원치 않는 작업을 수행하게 만드는 공격 기법입니다.CSRF를 예방하기 위해 브라우저는 SOP(Same Origin Policy)라는 동일 출처 정책을 구현했습니다...
갭락과 넥스트키 락은 무엇이며, 어떻게 팬텀 리드를 방지하나요?
·
백엔드 면접
먼저 팬텀 리드(Phantom Read)란, 트랜잭션이 동일한 조건의 쿼리를 반복 실행할 때 나중에 실행된 쿼리에서 처음에는 존재하지 않았던 새로운 행이 나타나는 현상을 의미합니다. 이는 주로 읽기 일관성을 유지하는 과정에서 발생할 수 있는 문제로, 데이터의 삽입이나 삭제가 다른 트랜잭션에 의해 이루어질 때 발생합니다.-- 트랜잭션 A 시작START TRANSACTION;-- 트랜잭션 A 첫 번째 조회SELECT * FROM orders WHERE amount > 150;-- 트랜잭션 B 시작START TRANSACTION;-- 트랜잭션 B 새로운 행 삽입INSERT INTO orders (customer_id, amount) VALUES (4, 250);-- 트랜잭션 B 커밋COMMIT;-- 동일한 조..
데이터베이스 시스템에서 동시성을 제어하는 방법에 대해서 설명해주세요.
·
백엔드 면접
대표적인 동시성 제어 방법으로는 MVCC와 Lock-Based Concurrency Control이 있습니다. MVCC (Multi-Version Concurrency Control)MVCC는 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식입니다. 각 트랜잭션은 자신만의 일관된 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항에 영향을 받지 않습니다. 데이터의 각 버전을 유지하여 읽기 작업과 쓰기 작업이 독립적으로 이루어질 수 있습니다. 트랜잭션은 시작 시점의 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항을 보지 못합니다. MVCC는 읽기 작업 시 잠금을 사용하지 않아 높은 동시성을 제공합니다. 읽기 작업이 잠금에 의해 지연되지 않아 읽기 ..
HTTP 메서드에서 멱등성이란 무엇인가요?
·
백엔드 면접
동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때 해당 HTTP 메서드가 멱등성을 가졌다고 말합니다. 대표적으로 멱등한 메서드는 GET, HEAD, PUT, DELETE, OPTIONS가 있습니다. 멱득성은 오직 사용자 요청에 의한 리소스만을 고려합니다. 구현에 따른 부작용은 고려하지 않습니다. 또한, 재요청 중간에 리소스가 변경된 것도 고려하지 않습니다.PATCH 메서드가 멱등하지 않은 이유는 무엇인가요? PATCH 메서드는 대상 리소스를 대체해버리는 PUT 메서드와 달리 대상 리소스의 일부만 변경할 때 사용되는 메서드입니다. PATCH 메서드는 꽤 범용적으로 사용됩니다. 기존 리소스에 응답을 추가하는 경우에도 PATCH가 사용될 수 ..
웹사이트에 접근했을 때 발생하는 일련의 과정에 대해 설명해 주세요.
·
백엔드 면접
사용자가 특정 도메인 네임을 브라우저에 입력하면, 브라우저는 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..
공유 락과 배타 락에 대해서 설명해 주세요.
·
백엔드 면접
공유 락과 배타 락은 비관적 락(Pessimistic Lock)의 데이터 일관성과 무결성을 위해 사용하는 락 유형입니다. 공유 락(Shared Lock)은 읽기 락(Read Lock)이라고도 하며, 공유 락이 걸린 데이터는 읽기(SELECT) 연산만 가능하고, 쓰기(UPDATE, DELETE)는 불가능합니다. 공유 락이 걸린 데이터에 대해서 다른 트랜잭션에서도 공유 락을 획득할 수 있지만, 배타 락은 획득할 수 없습니다. 즉, 공유 락을 사용하면 트랜잭션 내에서 조회한 데이터가 변경되지 않는다는 것을 보장합니다. FOR SHARE를 사용하여 공유 락을 설정할 수 있습니다.SELECT * FROM table_name WHERE id = 1 FOR SHARE;  배타 락(Exclusive Lock)은 쓰기 ..
동기와 비동기의 차이점은 무엇인가요?
·
백엔드 면접
동기와 비동기는 호출하는 함수의 작업 완료를 기다리는지 여부의 차이가 있습니다. 함수 A가 동기로 함수 B를 호출하면 A는 B의 작업이 완료될 때까지 기다려야 합니다. 따라서 작업이 순차적으로 진행됩니다.반면, 함수 A가 비동기로 함수 B를 호출하면 A는 B의 작업 완료를 신경 쓰지 않고 따로 동작합니다. 따라서 작업이 순차적으로 진행되지 않습니다.  블로킹과 동기는 어떤 차이가 있나요? 두 개념은 유사하면서도 다릅니다. 동기 호출에서는 호출된 함수가 작업을 완료할 때까지 호출한 함수가 기다립니다. 즉, 작업이 순차적으로 진행되는 것을 의미합니다. 반면, 블로킹은 함수가 호출된 후, 호출한 함수의 결과를 기다리기 위해 실행을 멈추는 상태를 의미합니다. 즉, 제어권이 반환되지 않고 대기하는 상황입니다.  ..