# interview 예상 질문
# FE (프론트엔드)
# 1. MVVM 프론트의 디자인 패턴에 대해 설명해주세요.
답변: MVVM(Model-View-ViewModel)은 프론트엔드에서 주로 사용되는 디자인 패턴으로, UI(View)와 비즈니스 로직(Model)을 분리하여 테스트 용이성을 높이고 유지보수성을 개선합니다. View는 사용자 인터페이스를 담당하고, ViewModel은 View와 Model 간의 중개 역할을 하며, Model은 데이터를 처리하는 로직을 담당합니다. Flutter에서 이 패턴은 상태 관리와 UI 변경을 명확히 분리하는 데 유용합니다.
# 2. 불변성(Immutable)에 대해 설명해주세요.
답변: 불변성은 객체의 상태가 한 번 생성된 후 변경되지 않는 특성을 말합니다. Flutter에서 Freezed는 불변 객체를 쉽게 만들 수 있도록 도와주는 라이브러리로, 모델 클래스를 선언할 때 불변성을 보장하는 코드 생성을 지원합니다. 이로 인해 상태 변경 시 새로운 객체를 생성하게 되어, 불필요한 사이드 이펙트를 방지할 수 있습니다.
# 3. Flutter에서 Deep Linking 문제를 어떻게 해결하나요?
답변: Deep Linking은 특정 URL을 통해 앱 내 특정 화면으로 직접 연결하는 기술입니다. Flutter에서 Deep Linking을 구현하려면 uni_links 패키지나 firebase_dynamic_links를 사용해 앱 내에서 URL을 처리하고, 앱을 실행한 후 해당 URL에 맞는 화면을 띄워주는 방식으로 처리할 수 있습니다.
# 4. Flutter 라이프사이클의 순서를 설명해주세요.
답변: Flutter 앱의 라이프사이클은 initState(), build(), didChangeDependencies(), dispose()와 같은 메서드로 구성됩니다. initState()는 위젯이 처음 생성될 때 호출되며, build()는 UI를 구성하고, dispose()는 위젯이 제거될 때 호출되어 리소스를 해제합니다. 각 메서드는 위젯의 상태 변화에 따라 자동으로 호출되며, 이에 따라 적절한 처리가 필요합니다.
# 5. Column, Row, Expanded, SizedBox, Flex와 같은 위젯 사용법을 설명해주세요.
답변: Column과 Row는 각각 수직, 수평 방향으로 자식 위젯을 배치하는 레이아웃 위젯입니다. Expanded는 자식 위젯이 부모 위젯의 가용 공간을 모두 차지하도록 확장합니다. SizedBox는 특정 크기의 공간을 만드는 데 사용되며, Flex는 Column과 Row보다 더 유연한 레이아웃 구성을 제공합니다. Flex는 FlexDirection과 Flex 위젯을 조합하여 복잡한 레이아웃을 정의할 수 있습니다.
# 6. Margin과 Border의 차이를 설명해주세요.
답변: Margin은 위젯의 외부 공간을 설정하여 다른 위젯과의 간격을 조정하는데 사용됩니다. 반면, Border는 위젯의 경계선을 설정하는 속성으로, 위젯의 테두리를 그리거나 스타일을 지정할 때 사용됩니다. Margin은 주로 외부 간격을, Border는 내부의 경계를 다룬다고 이해할 수 있습니다.
# 7. Flutter에서 Riverpod을 사용하는 이유는 무엇인가요?
답변: Riverpod은 Flutter에서 상태 관리를 보다 유연하고 안전하게 할 수 있는 라이브러리입니다. 기존의 Provider에 비해, 더 강력한 타입 안전성과 테스트 용이성을 제공하며, 앱의 복잡한 상태 관리 요구 사항을 간결하게 처리할 수 있습니다. 또한, Riverpod은 StateNotifier와 같은 고급 기능을 통해 비즈니스 로직을 깔끔하게 분리할 수 있습니다.
# 8. www.google.com에 들어갔을 때 1초 동안 사용자에게 보이지 않는 뒷단에서 어떤 일이 일어나는지 설명해주세요.
답변: 사용자가 www.google.com에 접속하면, 먼저 DNS 조회가 이루어지고 서버의 IP 주소를 확인합니다. 그 후, HTTP 요청을 통해 서버와 연결되며, 서버는 HTML, CSS, JavaScript 파일을 클라이언트에게 전달합니다. 이 과정에서 서버사이드 렌더링(SSR) 또는 클라이언트사이드 렌더링(CSR)이 이루어지며, 대부분의 페이지는 JavaScript가 클라이언트에서 렌더링됩니다. 이때 서버에서는 데이터를 처리하고 필요한 파일을 전달하여 사용자에게 페이지를 보여줍니다.
# BE (백엔드)
# 1. Layered Architecture의 장점과 특징을 설명해주세요.
답변: Layered Architecture는 소프트웨어를 여러 계층으로 나누어 각각의 책임을 분리하는 아키텍처 패턴입니다. 주로 데이터 접근 계층, 비즈니스 로직 계층, 프리젠테이션 계층으로 나누어 설계합니다. 이 구조는 코드의 유지보수성을 높이고, 각 계층을 독립적으로 개발하고 테스트할 수 있게 해줍니다. 또한, 계층 간 의존성을 최소화하여 코드 변경 시 다른 계층에 미치는 영향을 줄일 수 있습니다.
# 2. DynamoDB에서 트랜잭션을 처리하는 방법은 무엇인가요?
답변: DynamoDB는 트랜잭션을 지원하며, 여러 항목을 한 번에 처리할 수 있는 TransactWriteItems 및 TransactGetItems를 제공합니다. 이 트랜잭션은 ACID 특성을 보장하여, 여러 아이템의 읽기 및 쓰기 작업을 원자적으로 처리할 수 있습니다. DynamoDB의 트랜잭션은 최대 25개의 아이템을 지원하며, 트랜잭션 처리 과정에서 발생할 수 있는 오류를 자동으로 롤백할 수 있습니다.
# 3. RDB와 NoSQL의 차이점에 대해 설명해주세요.
답변: RDB(Relational Database)는 테이블 형식으로 데이터를 저장하며, 데이터 간 관계를 설정하고 SQL을 사용해 쿼리합니다. NoSQL은 다양한 데이터 모델을 지원하며, 주로 비정형 데이터를 처리하는 데 적합합니다. RDB는 데이터 일관성과 정합성을 보장하는 반면, NoSQL은 확장성 및 성능을 중시하며, 대규모 데이터를 효율적으로 처리할 수 있습니다. 선택은 애플리케이션의 요구 사항에 따라 다릅니다.
# 4. Flask의 주요 특징을 설명해주세요.
답변: Flask는 파이썬으로 작성된 마이크로 웹 프레임워크로, 경량화된 설계를 통해 빠르게 웹 애플리케이션을 개발할 수 있습니다. Flask는 라우팅, 템플릿 렌더링, 데이터베이스 연결 등 웹 애플리케이션 개발에 필요한 기본적인 기능만 제공하며, 추가 기능은 플러그인 형태로 확장할 수 있습니다. 이로 인해 필요에 맞는 구조로 애플리케이션을 설계할 수 있어 유연성이 뛰어납니다.
# 5. 현재 어플리케이션에서 동시성 문제를 어떻게 해결하나요?
답변: 동시성 문제는 여러 스레드나 프로세스가 동시에 자원에 접근할 때 발생할 수 있습니다. 이를 해결하기 위해 Flask에서는 threading이나 multiprocessing을 사용할 수 있으며, asyncio를 활용해 비동기 처리를 구현할 수도 있습니다. 또한, 데이터베이스에서는 트랜잭션을 활용해 일관성 있는 상태를 유지하며, 큐 시스템을 사용해 요청을 순차적으로 처리할 수 있습니다.
# DevOps
# 1. GitHub Actions에 대해 설명해주세요.
답변: GitHub Actions는 GitHub의 CI/CD 서비스로, 소스 코드의 변경 사항에 대해 자동으로 빌드, 테스트, 배포 등의 작업을 수행하는 워크플로우를 정의할 수 있습니다. YAML 파일을 통해 정의된 워크플로우는 GitHub 리포지토리 내에서 트리거되어 자동으로 실행됩니다. 이를 통해 개발자는 반복적인 작업을 자동화하고 효율성을 높일 수 있습니다.
# 2. CI와 CD의 구체적 정의는 무엇인가요?
답변: CI(Continuous Integration)는 개발자가 작성한 코드를 자주 통합하여 자동으로 빌드하고 테스트하는 과정입니다. CD(Continuous Delivery)는 CI 후, 코드가 자동으로 배포 환경에 배포되는 프로세스를 의미합니다. CI는 코드의 품질을 높이고, CD는 코드의 빠르고 안정적인 배포를 가능하게 합니다.
# 3. Git의 Branch 전략을 어떻게 사용해봤나요?
답변: Git의 Branch 전략으로는 Git Flow나 GitHub Flow가 많이 사용됩니다. 저는 보통 main 브랜치와 기능별로 feature 브랜치를 생성하여 작업을 진행합니다. 작업이 완료되면 pull request를 통해 main 브랜치에 병합하고, CI/CD 파이프라인을 통해 자동으로 테스트와 배포가 이루어지도록 설정합니다.
# 4. CDN이란 무엇인가요?
답변: CDN(Content Delivery Network)은 웹 콘텐츠를 사용자에게 더 빠르게 제공하기 위해 분산된 서버 네트워크를 통해 콘텐츠를 전달하는 시스템입니다. CDN은 사용자의 위치에 가장 가까운 서버에서 콘텐츠를 제공함으로써 로딩 속도를 개선하고, 서버 부하를 분산시킵니다. 이를 통해 웹 사이트의 성능을 최적화할 수 있습니다.
# 질문 리스트
- 52g 를 지원하게 된 계기
- 👍
- 52g는 어떤 일을 하는 곳으로 알고 있고, 어떤 점이 가장 중요하다고 생각되는가?
- 👍
- 고객이 복잡한 걸 강하게 요구하게 되면 어떻게 대처할 것인가?
- 👍
- Flutter의 라이프 사이클을 설명해주세요.
- 최초 위젯이 생성되면, 해당 위젯은 dirty 상태를 가지고 있습니다. 이를 build 함수가 기본 실행되면서 clean 상태로 변경되어 위젯은 화면에 랜더링이 완료됩니다.
- 위젯을 다시 랜더링을 하기 위해, clean 상태를 dirty 상태로 변경하게 되는데, setState()와 didChanged()를 통해 수행합니다.
- Flutter 내부적으로 Stateful 위젯에서 주로 위 내용으로 랜더링할 수 있으며, Riverpod과 같은 상태관리 Lib으로도 수행 가능합니다.
- stateful 위젯과 stateless 위젯 차이?
- 자체적으로 다시 랜더링을 할 수 있는 위젯을 Stateful 위젯으로 부릅니다.
- 상태관리 Lib을 사용하게 되면 그 둘의 차이는 희석되지만, 이 경우 종속성 문제로 별도 Lib으로 추출할 수 없는 단점이 있습니다.
- MVVM 패턴을 flutter에서 어떻게 구현했는지?
- Model : API와 통신하면서 받아온 데이터를 적재하는 Map Object
- View : 화면 구현을 위한 위젯 트리
- ViewModel : Riverpod의 Provider를 통해 Model과 View를 연결하는 로직
- Riverpod을 왜 사용할까?
- 전역적으로 상태를 관리하여, 모든 화면에서 공통적인 상태를 공유하기 위함.
- GoRouter에서 Deep Linking 문제가 무엇인지? 경험해보거나 해결해봤는지?
- GoRouter에도 interceptor가 있어서, 예외 로직을 넣어 Deep Linking 문제를 해소할 수 있습니다.
- 상태 관리의 개념을 설명해주세요.
- 화면을 랜더링하는데 있어, 개입되는 변수를 상태라고 합니다. 상태 관리는 이러한 변수를 관리하는 개념을 의미하며, 주로 GetX나 Provider, Riverpod 등 Lib을 통해 전역적으로 관리하는 개념을 통칭합니다.
- REST API에서 에러 핸들링과 메소드 활용법
- GET, POST, PUT, DELETE 메소드는 조회, 등록, 수정, 삭제으로 맵핑하여 사용합니다.
- FE 입장에서는 2xx는 성공 코드로, 3xx는 확인이 필요한 코드, 4xx는 오류 코드로 인지하여, 분기로직을 반영하여 에러를 핸들링할 수 있습니다. 5xx는 서버 오류 코드 입니다.
- RESTFul API 가 뭔가요?
- RESTFul API는 HTTP API에 규약을 넣은 개념입니다. 규약으로 인해 개발자간의 의사 소통이 편해지는 장점이 있습니다.
- HTTP Method에 조회, 등록, 수정, 삭제 개념을 부여하고, URI는 /{명사}/{ID} 형태로 작성합니다.
- 이보다 좀더 상세 개념인 HateOS가 있지만, 구현이 복잡하여 잘 사용되지 않습니다.
- Flask 프레임워크는 무엇이고, 왜 사용할까요?
- Python 진영에서 빠른 개발을 위한 경량 프레임워크로, 역사가 오래된 만큼 많은 Lib가 강점으로 사용되고 있습니다.
- CORS는 무엇이고, 경험과 해결한 사례
- 다른 Origin에서의 접근을 차단하기 위해 고안된 HTTP 프로토콜로, 가장 간단한 해결 방안은 CORS가 발생되는 시스템을 하나의 Origin으로 묶으면 된다.
- 그 외로 Access-Control-Allow-Origin 예외를 넣는다던가, CORS Lib을 사용하는 방법도 있다.
- 최근에 흥미로운 프로젝트와 설계
- 👍
- 이전에 Python이나 Dart를 사용한 경험이 있는지?
- 👍
- Flutter의 Freezed
- 프로그램에서 원본 데이터가 다른 로직으로 인해 변조될 수 있습니다. 이 경우 예상치 못한 계산 오류가 발생되며, 이를 방지하기 위한 불변성 개념이 등장합니다.
- Freezed는 원본 데이터 객체의 불변성을 보장하고, Map 형태의 데이터를 Object 형태로 변환하여 사용자의 오류 예방과 편의성을 도모합니다.
- ITM 온보딩 하면서 좋았던 부분과 아쉬웠던 부분은 뭔가요?
- 👍
- 3 Way Merge라는 git 전략을 알고 있나요?
- Base 브랜치(주로 main)에서 개발을 위해 브랜치를 생성하게 된다. 그 생성한 브랜치에서 수정하는 중, Base 브랜치에 수정사항이 발생될 수 있다. 개발 브랜치의 내용을 Base 브랜치에 Merge 하는 방식을 말한다.
- 3 Way는 브랜치가 생성되는 시점과, 개발 브랜치의 HEAD, 그리고 Base 브랜치의 HEAD를 따서 유래되었다.
- 52g 를 지원하게 된 계기
- 👍
- 52g는 어떤 일을 하는 곳으로 알고 있고, 어떤 점이 가장 중요하다고 생각되는가?
- 👍
- 고객이 복잡한 걸 강하게 요구하게 되면 어떻게 대처할 것인가?
- 👍
- Flutter의 라이프 사이클을 설명해주세요.
- 최초 위젯이 생성되면, 해당 위젯은 dirty 상태를 가지고 있습니다. 이를 build 함수가 기본 실행되면서 clean 상태로 변경되어 위젯은 화면에 랜더링이 완료됩니다.
- 위젯을 다시 랜더링을 하기 위해, clean 상태를 dirty 상태로 변경하게 되는데, setState()와 didChanged()를 통해 수행합니다.
- Flutter 내부적으로 Stateful 위젯에서 주로 위 내용으로 랜더링할 수 있으며, Riverpod과 같은 상태관리 Lib으로도 수행 가능합니다.
- Flutter 위젯의 개념을 설명해주세요.
- 화면을 구성하는 단위 요소 입니다.
- 상태 관리의 개념을 설명해주세요.
- 화면을 랜더링하는데 있어, 개입되는 변수를 상태라고 합니다. 상태 관리는 이러한 변수를 관리하는 개념을 의미하며, 주로 GetX나 Provider, Riverpod 등 Lib을 통해 전역적으로 관리하는 개념을 통칭합니다.
- Dio와 Riverpod은 무엇인가요?
- Dio는 HTTP API 호출을 편하게 하기 위한 Lib으로, 주요 기능으로 interceptor와 serializaion 기능을 제공합니다.
- Riverpod은 상태를 전역적으로 관리하기 위한 Lib으로, Provider 패턴을 통해 사용합니다.
- 이전에 Python이나 Dart를 사용한 경험이 있는지?
- 👍
- RESTFul API는 어떤 개념인지 설명해주세요. 도서관리 시스템을 구축한다고 한다면 API를 어떻게 설계하실건가요?
- RESTFul API는 HTTP API에 규약을 넣은 개념입니다. 규약으로 인해 개발자간의 의사 소통이 편해지는 장점이 있습니다.
- HTTP Method에 조회, 등록, 수정, 삭제 개념을 부여하고, URI는 /{명사}/{ID} 형태로 작성합니다.
- 이보다 좀더 상세 개념인 HateOS가 있지만, 구현이 복잡하여 잘 사용되지 않습니다.
- ITM 온보딩 하면서 좋았던 부분과 아쉬웠던 부분은 뭔가요?
- 👍
- Flutter의 Freezed
- 프로그램에서 원본 데이터가 다른 로직으로 인해 변조될 수 있습니다. 이 경우 예상치 못한 계산 오류가 발생되며, 이를 방지하기 위한 불변성 개념이 등장합니다.
- Freezed는 원본 데이터 객체의 불변성을 보장하고, Map 형태의 데이터를 Object 형태로 변환하여 사용자의 오류 예방과 편의성을 도모합니다.
- 현업이 문제 정의를 잘 못할 경우 어떻게 대처할것인가?
- 👍