루센트 블록 면접
질문
0. 대학교 수강 중 남은 수강과목과 지금 쓰고 있는 메인 언어
1. os에서 process와 thread의 차이
2. jdk와 jre의 설명과 차이점
3. flutter를 이용하여 앱을 사용하면서 다양한 사용자에 맞게 변경해야 할 때, 일반적으로 좋은 구조로 짜기 위해 어떻게 해야 할까?
4. flutter에서 데이터를 받아오거나 로딩되는 과정에서 느리거나 버벅거릴 때 이 성능을 개선시키 위해 무엇을 보고 판단하며 개선할까?
느낀점
편입하고 와서 학교 공부에 대한 중요성을 다시 한번 환기시키는 경험이었다. 학교 공부라 하면 누가 더 암기를 잘하고 시간을 쓸 수 있냐의 느낌이 아니라 어떤 누군가가 보았을 때(회사입장) 이사람이 어떤일을 맡았을 때 어떤 잠재력을 가지고 있고 이 일에 임하는 태도를 판단할 수 있는 수단임을 다시 한번 실감했다. 물론 그것으로 그 사람을 단정지을 수 없지만 적어도 얼마나 내 직군에 얼마나 열정적으로 임하냐의 태도는 볼 수 있다고 생각했다. 자신이 활용해야하는 직군의 공부는 더더욱! 이 면접을 계기로 어떠한 공부를 하더라도 얕게 말고 깊게 나의 모든 일들이 나의 태도와 잠재력을 보여 줄 수 있다는 것을 기억하며 더 제대로 공부해야 겠음을 깨달았다.
또 대화 몇번으로도 그 사람의 수준을 파악할 수 있다는 것도 기억하자....
이런 경험을 지금겪어 다행이라 생각한다.
아쉬운점
면접도 경험이기 때문에 내가 잘하지 못한 질문들의 답이나 접근법을 알려달라 했으면 앞으로의 공부에 도움이 되지 않을까 싶었다.
0. 컴퓨터와 인간의 상호작용, 자바
3. Flutter 앱을 다양한 사용자에 맞게 변경해야 할 때, 일반적으로 좋은 구조로 짜기 위해 고려해야 할 몇 가지 원칙
- Widget 분리: Flutter는 위젯 트리로 구성되어 있기 때문에 위젯을 재사용하고 조합하는 것이 중요합니다. 사용자에 따라 변경해야 할 부분을 식별하고, 해당 부분을 독립적인 위젯으로 추출하여 재사용 가능한 구성 요소로 만드는 것이 좋습니다.
- 조건부 렌더링: 사용자에 따라 표시해야 하는 콘텐츠 또는 동작이 다를 수 있습니다. 이를 위해 조건부 렌더링을 사용하여 특정 조건에 따라 위젯 트리의 일부를 변경하거나 대체할 수 있습니다. 조건에 따라 다른 위젯을 렌더링하는 방법으로 if-else문, switch-case문, 삼항 연산자 등을 활용할 수 있습니다.
- 상태 관리: 사용자에 따라 앱의 상태가 달라질 수 있습니다. 이러한 상태를 관리하기 위해 상태 관리 패턴을 사용하는 것이 좋습니다. Flutter에서는 Provider, BLoC, MobX, Redux 등 다양한 상태 관리 패키지와 패턴을 제공합니다. 이러한 패턴을 사용하여 앱의 상태를 관리하고 사용자에 따라 필요한 상태 변경을 적용할 수 있습니다.
- 로컬라이제이션: 다국어 지원을 위해 앱의 텍스트를 동적으로 변경해야 할 수 있습니다. Flutter에서는 다국어 지원을 위한 패키지인 flutter_localizations를 제공합니다. 이를 사용하여 앱의 문자열을 다국어로 변환하고, 사용자의 언어 설정에 따라 앱의 언어를 변경할 수 있습니다.
- 환경 변수 사용: 사용자에 따라 앱의 동작을 변경해야 할 때, 환경 변수를 사용하여 유연하게 대응할 수 있습니다. 예를 들어, 다른 API 키 또는 서버 엔드포인트를 사용하도록 앱을 설정하는 등의 기능을 구현할 수 있습니다.
- 확장성 고려: 앱의 사용자 기능이 점점 확장될 수 있다면, 확장성을 고려하여 유연한 구조를 만드는 것이 중요합니다. 예를 들어, 사용자에 따라 다른 데이터를
환경 변수에 따라 앱의 동작을 조정해야 할 때, 일반적으로 환경 변수를 사용하는 구조를 만들어야 한다. 다음은 해당 상황에서 유용한 구조와 패턴
- 환경 변수 관리: 환경 변수를 효율적으로 관리하기 위해 flutter_dotenv와 같은 패키지를 사용할 수 있습니다. 이 패키지를 사용하면 .env 파일을 통해 환경 변수를 정의하고, 앱에서 이를 읽어와 사용할 수 있습니다.
- 환경 변수로 앱 설정 구성: 환경 변수를 사용하여 앱의 설정을 구성할 수 있습니다. 예를 들어, API 키, 서버 엔드포인트, 로깅 수준 등의 설정을 환경 변수로 정의하고, 앱의 동작에 이를 반영할 수 있습니다. 이를 위해 설정 관련 클래스나 파일을 만들어 환경 변수에서 값을 읽고, 앱 전체에 적용되도록 구성합니다.
- 런타임에 환경 변수 변경: 앱이 실행 중인 동안에도 환경 변수를 변경해야 할 수 있습니다. 이 경우, 앱 내부에서 환경 변수를 감지하고, 해당 변경 사항을 적용할 수 있는 구조를 구성해야 합니다. 이를 위해 상태 관리 패턴인 Provider, BLoC, Redux 등을 사용하여 앱의 상태를 관리하고, 환경 변수 변경 시 해당 상태를 업데이트하도록 구현할 수 있습니다.
- 조건부 로직 구현: 환경 변수에 따라 다른 동작을 수행해야 하는 경우, 조건부 로직을 구현해야 합니다. 조건문(if-else)을 사용하여 환경 변수 값을 확인하고, 해당하는 동작을 수행하는 로직을 작성합니다. 이를 통해 환경 변수에 따라 앱의 동작을 변경할 수 있습니다.
- 환경 변수에 따른 외부 서비스 연결: 환경 변수를 사용하여 외부 서비스와의 연결을 조정해야 할 때도 있습니다. 예를 들어, 특정 환경 변수 값에 따라 다른 데이터베이스 또는 API에 연결해야 하는 경우, 환경 변수 값을 읽고 해당 서비스에 연결하는 로직을 구현합니다.
- 테스트 환경 관리: 테스트 시에도 다른 환경 변수를 사용해야 할 수 있습니다. 테스트 환경에서는 실제 서비스와 연결하지 않고, 가짜 데이터 또는 모의 객체를 사용하는 것이 일반적입니다. 이를 위해 환경 변수를 통해 테스트 환경임을 인식하고, 테스트 환경에 필요한 설정을 적용하는 로직을 추가할 수 있습니다.
4. Flutter 앱에서 데이터를 받아오거나 로딩되는 과정에서 성능 문제가 발생할 때, 다음과 같은 요소들을 확인하고 개선할 수 있다.
- 네트워크 속도: 데이터를 받아오는 데 걸리는 시간은 네트워크 속도에 영향을 받습니다. 네트워크 연결의 안정성과 속도를 확인하고, 데이터를 가져오는 API 또는 서버의 응답 시간을 분석해야 합니다. 문제가 있다고 판단되면 네트워크 연결을 개선하거나, API 요청 및 응답 시간을 최적화할 필요가 있을 수 있습니다.
- 비동기 작업 관리: 데이터를 받아오거나 로딩하는 과정에서 비동기 작업을 사용해야 합니다. 비동기 작업은 앱의 UI를 멈추지 않고 데이터를 처리할 수 있게 해주므로 성능 개선에 도움이 됩니다. async와 await 키워드를 사용하여 비동기 작업을 관리하고, 데이터를 로딩하는 동안 앱의 상태를 표시하는 로딩 인디케이터 등을 활용할 수 있습니다.
- 데이터 양 최적화: 받아와야 하는 데이터 양이 많거나, 데이터 구조가 복잡할 경우 성능 문제가 발생할 수 있습니다. 필요한 데이터만 받아오도록 API 요청을 최적화하고, 데이터 구조를 단순화하는 등의 방법을 고려해야 합니다. 불필요한 데이터를 제거하거나 압축하여 네트워크 트래픽을 줄이는 것도 성능 향상에 도움이 됩니다.
- 캐싱 사용: 동일한 데이터를 반복해서 받아와야 할 경우, 캐싱을 사용하여 이전에 받아온 데이터를 재사용할 수 있습니다. 캐시된 데이터를 사용하면 네트워크 요청을 줄이고, 로딩 시간을 단축할 수 있습니다. Flutter에서는 shared_preferences나 hive와 같은 캐싱 라이브러리를 사용하여 데이터를 캐시할 수 있습니다.
- 리스트 뷰 최적화: 많은 양의 데이터를 표시하는 경우, 리스트 뷰의 성능에 주목해야 합니다. ListView.builder나 ListView.separated와 같은 위젯을 사용하여 필요한 만큼만 아이템을 렌더링하고, 스크롤 동작에 따라 필요한 아이템만 동적으로 로드하는 방식을 적용할 수 있습니다.
- 프로파일링 도구 사용: Flutter 개발 도구에서 제공하는 프로파일링 도구를 사용하여 성능 문제의 원인을 분석할 수 있습니다. Flutter의 DevTools를 활용하거나, 다른 프로파일링 도구를 사용하여 앱의 성능 프로파일을 측정하고, 병목 현상을 발견하여 개선할 수 있습니다.