모의 면접 질문

정석·2024년 10월 12일
0

IOC와 DI 란 ?

객체 지향 프로그래밍에서는 하나의 객체가 다른 객체를 사용해야 할 때, 객체를 직접 생성하지 않고 외부에서 주입받는 방식이 더 유연합니다. 이를 의존성 주입(DI)라고 하며, 객체 간의 결합도를 낮추어 변경에 유연하게 대처할 수 있게 해줍니다.

IoC(Inversion of Control)는 객체의 생성과 주입을 개발자가 아닌 프레임워크(Spring)가 대신 처리하는 개념입니다. 스프링은 IoC 컨테이너를 통해 객체를 생성하고 주입하여, 개발자가 객체 관리에 신경 쓰지 않고 비즈니스 로직에 집중할 수 있도록 돕습니다.

결합도가 높으면 안좋은건가요?

결합도가 높을 때도 장점이 존재한다고 생각합니다.
이유 ->
전에 AI 의료 솔루션 개발 회사에서 파이썬을 활용해 인공지능을 개발한 경험이 있습니다. 당시 스타트업의 특성상 빠른 개발과 결과 도출이 중요했기 때문에, 처음에 개발을 착수할 때 모든 인공지능 프로세스를 하나의 큰 모듈로 개발했습니다. 이렇게 개발함으로써 빠르게 MVP 까지 구현할 수 있다는 장점을 보았습니다. 다만, 클라이언트의 새로운 요구사항이 추가될 때마다 수정해야 할 범위가 점점 넓어지는 것을 느꼈습니다.
이 과정에서 모든 로직이 하나의 모듈에 강하게 결합되어 있어 유지보수의 복잡도가 증가한다는 문제를 깨달았습니다. 이를 해결하기 위해 큰 모듈을 작은 모듈의 단위로 나누기 시작했고 각 모듈마다 고유한 특정 기능만 담담할 수 있도록 리팩토링 하였습니다. 그 결과 요구사항 변경에 떠 빠르게 대응할 수 있었고 유지보수의 효율성이 높아져 개발 퀄리티가 향상됨을 느꼈습니다.
따라서 결합도가 높을 때 무조건 단점만 존재하진 않고 이러한 장점도 존재한다는 것을 알게되었습니다.
물론 구현뿐만 아닌 유지보수까지 생각한다면 느슨한 결합도가 보다 실용적이라고 생각합니다.

DB 이중화가 뭔가요?

DB 이중화는 데이터베이스의 가용성과 안전성을 높이기 위해 두 개 이상의 데이터베이스 인스턴스를 운영하는 방식입니다. 주로 마스터-슬레이브 구조로 이루어지며, 마스터는 쓰기와 읽기를 담당하고, 슬레이브는 읽기 작업을 처리하며, 마스터의 데이터를 실시간으로 복제받습니다.
이런 이중화방식은 장애 발생시 서비스 중단 시간을 최소화하고, 데이터 손실을 방지할 수 있는 장점이 있습니다.

고가용성이 뭔가요?

고가용성이란 장애 발생 시 슬레이브가 자동으로 마스터 역할을 대체해 서비스의 연속성을 보장하는 것을 말합니다.

부하 분산이 뭔가요?

부하 분산이란 읽기 작업을 슬레이브에서 처리하며 마스터의 부하를 줄여 성능을 최적화할 수 있습ㄴ디ㅏ.

DB 이중화의 단점은요?

DB 이중화는 읽기 성능을 향상시키고 고가용성을 제공하는데 유리하긴하지만, 쓰기 성능에 한계가 있을 수 있습니다. 왜냐하면 마스터가 모든 쓰기 작업을 담당하기에 트래픽이 증가하면 마스터 노드에 쓰기 병목 현상이 발생할 수 있다고 생각합니다.

하나의 API 에 대규모 트래픽이 집중될 경우 어떻게 할 건가요?

여러 방법이 존재하겠지만, 우선 떠오르는 해결책은 로드 밸런싱입니다.
로드 밸런스를 통해 트래픽을 여러 서버로 분산하여 트래픽을 나누게 되면 특정 서버에 과부화 걸리는 문제를 완화할 수 있습니다. (AWS ELB) 로드 밸런서가 존재합니다.

두번째로 캐싱을 활용하여 DB 나 서버의 부담을 줄일 수 있습니다. 자주 조회되는 데이터를 Redis 나 인메모리 캐시 시스템에 저장해 API 호출 시마다 DB 나 서버에 데이터를 다시 가져오는 대신 캐시에서 빠르게 응답할 수 있습니다.

동기 비동기가 무엇인가요?

프로그램 실행시 작업의 실행 흐름과 응답을 기다리는 방식에서 차이가 있습니다.
우선 동기 방식은 작업이 완료될 때까지 기다리는 방식입니다. 따라서 하나의 작업이 끝나기 전까지 다음 작업을 시작하지 않습니다. 즉, 순차적으로 작업이 실행되고, 현재 실행중인 작업이 끝나야만 다음 작업이 실행됩니다.
비동기 방식은 작업이 완료될 때까지 기다리지 않고, 바로 다음 작업을 수행합니다. 따라서 작업을 동시에 병렬로 처리할 수 있어서 성능 향상에 이점이 있습니다. 다만, 비동기 처리 흐름으로 복잡성이 증가해 오류 추적과 디버깅이 어려워 진다는 특징이 있습니다. -> 그래서 파일 읽기 쓰기 같은 오래 걸리는 작업에서 유리함.

동시성 문제란 무엇인가요?

동시성 문제는 여러 개의 트랜잭션이나 프로세스가 동시에 동일한 데이터에 접근하고 수정할 때 발생하는 문제입니다. 이러한 상황에서 데이터 불일치, 데이터 손실, 중복 처리 등이 발생할 수 있습니다. 예를 들어, 두 사용자가 동시에 은행 계좌의 잔액을 조회하고 각기 다른 금액을 입금하려고 할 때, 처리 순서에 따라 데이터가 잘못될 수 있습니다. 이를 방지하기 위해 트랜잭션 격리 수준 설정, 락(Lock) 사용, Optimistic Locking이나 Pessimistic Locking과 같은 동시성 제어 메커니즘을 사용합니다.

그럼 동시성과 병렬성이 같은 건가요?

다릅니다. 동시성은 여러 작업이 교대로 처리되면서 동시에 실행되는 것처럼 보이고
병렬성은 실제로 여러 작업이 동시에 실행되는 것을 말합니다.

낙관적 락과 비관적 락이 무엇인가요?

낙관적 락은 데이터가 수정될 때 데이터를 잠그지 않고 다른 트랜잭션과 동시에 접근하도록 허용하는 방식입니다. 이를 통해 수정 중에 데이터가 충돌이 발생했는지 확인하고 발생했다면 롤백하는 방식으로 작동됩니다. -> 상품 재고 관리 시스템
비관적 락은 트랜잭션이 데이터를 수정하기 전 데이터에 잠금을 걸어 다른 트랜잭션의 접근을 차단합니다. 따라서 잠금이 되어 있는 동안 다른 트랜잭션은 수정하기까지 대기합니다. -> 은행시스템

쓰레드는 무엇인가요?

쓰레드는 프로세스 내에서 실행되는 최소 실행 단위를 말합니다.
프로세스는 운영체제에서 실행 중인 프로그램을 말하고 쓰레드는 프로세스 내에서 자원을 공유하면서 독립적인 실행 흐름을 가집니다.

쓰레드 풀이 무엇인가요?

쓰레드 풀이란 미리 생성된 쓰레드 들의 집합을 말합니다. 따라서 필요할 때마다 새로운 쓰레들 생성하는 대신 미리 준비된 쓰레드를 재사용하는 방식입니다.

대용량 트래픽에서 캐시를 어떻게 사용할 건가요?

자주 조회되는 데이터를 메모리에 저장해 빠르게 응답합니다.
또한 TTL 설정을 통해 캐시의 유효기간을 설정하여 오래된 데이터는 갱신되도록 합니다.
그리고 캐시 적중률을 높이는 설계를 고려해야 할 거 같습니다.

메시지 큐란 무엇인가요?

비동기 작업 처리를 위한 메시지 기반의 통신 시스템입니다.
이를 통해 서로 다른 시스템이나 컴포넌트가 비동기적으로 통신할 수 있으며 주로 대규모 트래픽이나 비동기 작업을 처리할 때 사용됩니다.
메시지 큐는 ‘생산자’와 ‘소비자’ 간의 메시지 전달을 중개하는 역할을 하며 메시지들이 큐에 저장되고 필요할 때 처리 됩니다.
단점 -> 비동기식으로 진행되므로 큐에 메시지가 많아지면 작업 대기 시간이 발생할 수 있습니다.
주요 사례 -> 이메일 전송 시스템

Bean 이 무엇인가요?

Spring 컨테이너가 관리하는 객체를 의미합니다. 따라서 해당 객체의 생성부터 소멸까지 모든 생명주기를 Srping 에서 관리합니다.

배치란 무엇인가요?

대용량 데이터를 일괄 처리할 때 효율적으로 처리하기 위한 프레임 워크 입니다. 주로 대량의 데이터 처리나 정기적인 배치 작업에서 사용됩니다.
배치를 왜 써야 됨?

대량의 데이터를 한 번에 처리하는데 효율적이기 때문입니다. 실시간으로 대용량 데이터를 처리하게 되면 시스템에 과부화가 걸릴수 있으며 성능 저하나 응답 지연이 발생할 수 있습니다. 따라서 배치를 사용하면 데이터를 일정한 주기 또는 시간대에 일괄 처리할 수 있어 실시간 트래픽 영향을 주지 않으며 부하 분산을 할 수 있습니다.

교착상태란 무엇인가요?

두 개 이상의 트랜잭션이 서로 자원을 기다리며 무한정 대기하는 상황입니다. 이를 방지하기 위해 자원에 접근하는 순서를 동일하게 유지하거나, 트랜잭션 타임아웃을 설정하여 일정 시간 후에 트랜잭션을 중단하는 방법이 있습니다.

데이터베이스에서 인덱스란 무엇인가요?

인덱스는 데이터베이스에서 테이블의 특정 컬럼에 대한 빠른 검색을 가능하게 하는 자료 구조입니다. 책의 색인과 같은 역할을 하며, 데이터를 정렬된 방식으로 유지하여 쿼리 성능을 향상시킵니다. 인덱스는 주로 WHERE 절, JOIN 또는 ORDER BY에서 자주 사용하는 컬럼에 적용됩니다.

인덱스의 장점은 무엇인가요?

인덱스는 테이블에서 데이터를 검색할 때 탐색 속도를 크게 향상시킵니다. 특히, 대용량 데이터를 처리할 때 인덱스를 사용하면 데이터베이스가 테이블의 모든 행을 스캔하지 않고도 원하는 데이터를 빠르게 찾을 수 있습니다.

인덱스의 단점은 무엇인가요?

인덱스는 삽입, 삭제, 업데이트 시 성능을 저하시킬 수 있습니다. 인덱스를 사용하면 해당 작업 시마다 인덱스를 갱신해야 하기 때문에, 데이터 변경이 빈번한 테이블에서는 오버헤드가 발생할 수 있습니다. 또한, 너무 많은 인덱스는 저장 공간을 많이 차지할 수 있습니다.

AOP(Aspect-Oriented Programming)의 주요 개념은 무엇인가요?

AOP는 관점 지향 프로그래밍으로, 애플리케이션의 핵심 로직과 부가적인 관심사를 분리하여 모듈화하는 방법입니다. AOP의 주요 개념은 Aspect, Advice, Join Point, Pointcut, Weaving입니다.
Aspect: 부가적인 관심사를 모듈화한 것.
Advice: Aspect에 포함된 구체적인 행동(예: 로깅, 트랜잭션).
Join Point: Advice가 적용될 수 있는 지점(메서드 호출 등).
Pointcut: Join Point를 선택하는 기준.
Weaving: Aspect를 실제 코드에 적용하는 과정.

JVM 이 무엇인가요?

자바 어플리케이션을 실행하기 위한 가상 머신입니다. 자바 프로그램은 바이트코드로 컴파일되며, JVM은 이 바이트코드를 실행하여 프로그래을 운영체제와 하드웨어에 종속되지 않고 동작하도록 돕습니다.

가비지 컬렉터란?

JVM의 메모리 관리 기증 중 ㅏ나로, 더 이상 사용되지 않는 객체를 자동으로 메모리에서 해제하는 역할입니다. 가비지 컬렉터는 힙 메모리에서 더 이상 참조되지 않는 객체를 찾아 자동으로 제거합니다. 이렇게 함으로써 메모리 누수를 방지합니다.

0개의 댓글