군만두의 IT 공부 일지

신입 개발자 기술면접 예상 질문 정리 - 백엔드(2) 본문

기타/기술면접

신입 개발자 기술면접 예상 질문 정리 - 백엔드(2)

mandus 2024. 11. 7. 23:08

1. 마이크로 서비스와 모놀리틱 서비스의 차이에 대해 설명해 보세요.

모놀리틱 서비스모든 기능이 하나의 코드베이스로 구성된 단일 아키텍처입니다. 이는 개발과 배포가 비교적 간단하지만, 애플리케이션 규모가 커질수록 유지보수와 확장이 어려워질 수 있습니다.

반면 마이크로 서비스각 기능을 독립적인 서비스로 나누어 개발하고 배포하는 방식으로, 독립적인 배포와 확장성에 유리합니다. 각 서비스는 서로 다른 기술 스택을 사용할 수 있으며, 장애 발생 시 다른 서비스에 영향을 덜 주는 장점이 있습니다. 하지만 마이크로 서비스는 서비스 간의 통신과 데이터 일관성 유지, 배포 관리의 복잡성이 증가할 수 있습니다.

마이크로 서비스는 개별 서비스 단위로 개발하는 방식이고, 모놀리틱 서비스는 하나의 통합된 패키지로 개발하는 방식입니다. 마이크로 서비스는 개별 서비스 단위로 나누어져 있어 해당 부분만 수정 및 배포하기에 좋고, 필요한 부분만 확장하기에도 용이하다는 장점이 있습니다.

2. N+1 문제의 발생 이유와 해결 방법에 대해 설명해 보세요.

N+1 문제데이터베이스에서 1개의 쿼리로 조회한 결과에 대해 추가적으로 N개의 하위 쿼리가 실행되어, 총 N+1번의 쿼리가 실행되는 비효율적인 상황을 말합니다. 주로 ORM(Object Relational Mapping)을 사용할 때 발생하며, 예를 들어 연관된 엔티티를 반복적으로 조회할 때 발생합니다.

이를 해결하기 위해 즉시 로딩(eager loading) 또는 패치 조인(fetch join)을 사용하여 한 번의 쿼리로 필요한 데이터를 모두 가져오거나, 배치 사이즈 설정을 통해 효율적으로 데이터를 로드하는 방법을 사용할 수 있습니다.

N+1 문제는 데이터베이스에서 데이터를 가져올 때 주로 발생하는 성능 문제입니다.1번 쿼리에서 N개의 아이템을 가져올 때 아이템의 개수보다 1개 많은 쿼리가 실행되는 문제로, 데이터베이스 쿼리에서 발생하는 비효율적인 상황이라고 할 수 있습니다. 이 때 각 아이템에 대해 각 1개씩의 쿼리가 추가 실행(N+1)되기 때문에 전체 쿼리 수가 비효율적으로 증가합니다.

그렇기 때문에 N+1 문제 해결은 각 상황에 맞게 데이터를 효율적으로 가져올 수 있는 방법은 무엇인지 생각하는 것에서 시작해야 합니다. 성능을 최적화할 수 있는 방법에 대해 말해 보겠습니다.

첫 번째 방법은 Eager Loading입니다. 모든 정보를 한 번에 가져오는 방식으로, 1번 쿼리에서 모든 데이터를 가져올 수 있습니다. 하지만 필요하지 않은 데이터까지 한 번에 가져오게 되어 리소스 낭비가 될 수 있다는 유의점이 있습니다.

두 번째 방법은 Fetch Join입니다. 데이터베이스 쿼리에 이를 사용하여 추가 정보를 한 번에 가져올 수 있는 방법입니다. 

세 번째 방법은 Batch Fetching입니다. 여러 쿼리를 한 번에 일괄 실행하여 추가 정보를 가져오는 방법으로, 일부 ORM 라이브러리에서 지원합니다.

네 번째 방법은 DTO 사용입니다. 필요한 정보만 선택적으로 가져오는 방법으로, N+1 문제를 피하면서 필요한 정보만 가지고 올 수 있다는 장점이 있습니다.

3. 즉시 로딩과 지연 로딩은 각각 언제 사용하면 좋은지 설명해 보세요.

즉시 로딩(Eager Loading)데이터가 필요한지 여부와 상관없이 연관된 모든 데이터를 즉시 로드하는 방식입니다. 이 방법은 데이터베이스 쿼리의 수를 줄여 성능을 최적화할 수 있지만, 불필요한 데이터를 로드하게 되어 메모리 사용량이 증가할 수 있습니다. 따라서 즉시 로딩은 연관된 데이터를 자주 사용하는 경우에 유리합니다.

반면 지연 로딩(Lazy Loading)실제로 해당 데이터가 필요할 때까지 로드를 지연시키는 방식으로, 초기 메모리 사용을 줄일 수 있습니다. 이는 연관 데이터를 사용할 가능성이 낮을 때 적합하며, 필요할 때만 데이터를 로드하여 불필요한 자원 낭비를 줄이는 데 유리합니다.

즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading)은 ORM(Object-Relational Mapping)을 사용하는 애플리케이션에서 데이터를 가져오는 방식입니다. 둘 중 어떤 것을 사용할지는 상황에 따라 다르게 선택할 수 있습니다.

즉시 로딩(Eager Loading)은 관련되어 있는 모든 데이터를 한 번에 가져오는 방식입니다.
연관 엔터티(entity)와 그에 속한 데이터를 한 번에 로딩하여 데이터를 가져오는 쿼리가 실행되는 즉시 함께 가져옵니다.주로 @ManyToOne 또는 @OneToOne 관계에서 사용됩니다. 부가적인 쿼리 비용을 감수해야 하는 경우, 데이터의 양이 작고 성능 영향이 미미한 경우, 데이터베이스의 데이터 무결성 규칙을 지켜야 하는 경우에 사용하는 것이 좋습니다.

지연 로딩(Lazy Loading)은 연관 데이터를 실제로 사용할 때 가져오는 방식입니다.
처음에는 데이터를 가져오지 않고, 필요한 순간에 쿼리를 통해 가져옵니다. 필요할 때만 데이터베이스 쿼리를 실행하기 때문에 초기 데이터베이스 액세스 비용을 절감할 수 있습니다.
주로 @OneToMany 또는 @ManyToMany 관계에서 사용됩니다. 데이터를 필요한 경우에만 가져오고, 불필요한 데이터베이스 액세스를 피하려는 경우, 대규모 데이터베이스에서 데이터의 양이 크고 성능에 민감한 경우, 사용자 요청에 따라 데이터를 동적으로 로드해야 하는 경우에 사용하는 것이 좋습니다.

둘 중 어떤 방식이 좋을지 선택하는 기준으로는 데이터 양, 애플리케이션 요구사항, 성능, 그리고 데이터 무결성이 있습니다. 애플리케이션과 성능 요구 사항에 따라 어떤 방식을 선택할 것인지 결정해야 합니다.

4. Docker에 대해 설명해 보세요.

Docker애플리케이션을 컨테이너(Container)라는 격리된 환경에서 실행할 수 있게 해주는 오픈 소스 플랫폼입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 라이브러리, 종속성을 포함하여 격리된 상태로 동작하며, 이를 통해 일관된 실행 환경을 제공합니다.

Docker는 개발, 테스트, 배포 단계에서 환경의 차이로 인한 문제를 줄여주며, 경량화된 가상화 기술로 서버 자원을 효율적으로 사용할 수 있습니다. 또한, Docker 이미지로 애플리케이션을 패키징하여 이식성을 높이고, 다양한 클라우드 환경에서 쉽게 배포할 수 있습니다.

Docker는 컨테이너화 기술로, 애플리케이션과 그 종속성을 패키지화하여 일관된 실행 환경을 제공합니다. Docker 이미지를 통해 애플리케이션을 배포하고, Docker 컨테이너를 통해 실행합니다.

환경 간의 일관성을 만들 수 있고 애플리케이션 배포 및 관리가 용이하다는 장점이 있습니다. 또한, 리소스 효율성이 높고, 빠른 배포가 가능합니다.

5. REST API와 GraphQL의 차이점이 무엇인지 설명해 보세요.

REST API정해진 엔드포인트를 통해 클라이언트가 서버에 요청을 보내고, 서버는 정해진 자원을 반환하는 방식의 API입니다. REST는 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 CRUD 작업을 수행하며, 클라이언트는 필요한 자원을 여러 번의 요청으로 가져와야 할 수 있습니다.

반면, GraphQL클라이언트가 필요한 데이터를 쿼리로 정의하고, 한 번의 요청으로 필요한 데이터를 모두 가져올 수 있는 방식입니다. GraphQL은 데이터의 과다 요청(over-fetching)과 부족 요청(under-fetching) 문제를 해결하고, 더 유연한 데이터 요청을 가능하게 합니다. REST는 단순하고 널리 사용되는 반면, GraphQL은 데이터의 최적화를 요구하는 복잡한 애플리케이션에 적합합니다.

REST API와 GraphQL은 데이터 통신을 위한 두 가지 접근 방식입니다.

REST(Representational State Transfer) API는 리소스 기반의 접근 방식을 사용합니다.
각 URL이 고유한 리소스를 나타내는데요. HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 리소스를 조작합니다. 데이터는 JSON 또는 XML 형식으로 전송됩니다. 표준화된 방식으로 안정성과 캐싱을 지원이 가능하지만, 복잡한 데이터 요구 사항을 처리할 때 많은 요청이 필요할 수 있다는 단점이 있습니다.

GraphQL은 쿼리 언어를 사용하여 클라이언트가 필요한 데이터만을 요청할 수 있게 합니다. 단일 엔드포인트를 통해 다양한 쿼리를 지원하며, 데이터 구조를 클라이언트가 정의할 수 있습니다. 복잡한 쿼리와 다양한 데이터 요구를 유연하게 처리할 수 있지만, 서버 측에서 쿼리를 해석하고 최적화하는 데 추가적인 부담이 있을 수 있습니다.

⭐참고자료

1) 한빛출판네트워크, "백엔드 기술 면접 TIP: 자바 기본 문법 예상 질문 5가지와 해설", 2024.02.08, https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS1626582373&cate_cd=

2) 제로베이스, "현직자가 말하는 신입 백엔드 개발 면접 질문 | 백엔드 스쿨", https://zero-base.co.kr/event/media_BE_school_qna

3) 스파르타코딩클럽, "2024 백엔드 면접 질문 문제은행 - 개발자 면접 준비 101", 2024.08.22, https://spartacodingclub.kr/blog/2024-backend-jobinterview-question

이 글은 참고자료를 바탕으로 각 질문에 대한 답변을 정리한 것으로, 틀린 부분이 있을 수도 있습니다.
Comments