Flutter 45일차

은성·2026년 1월 30일

Flutter 본캠프

목록 보기
47/57
post-thumbnail

Clean Architecture (심화 1-12,1-13)

  • 클린아키텍쳐
  • 소프트웨어를 관심사에 따라 계층으로 분리해서 개발 하는 것

Entities

  • 엔티티는 비즈니스의 핵심 개념을 나타내는 객체
  • 예) User, Product 클래스

Use Cases

  • 유스케이스는 사용자가 시스템을 어떻게 사용할지를 정의하는 애플리케이션의 특정 기능
  • 예) 회원가입, 상품등록

Interface Adapters

  • Use CasesFrameworks and Drivers 사이의 중간 연결 역할
  • 예) Controller, Presenter, ViewModel

Frameworks and Drivers

  • 시스템 핵심 업무와는 상관없는 계층
  • 예) Web, Database, UI, 외부 API 등

Flutter에 적용

레이아웃으로 나누기

Presentation Layer

  • UI와 같은 화면 표시 및 사용자 입력 처리 계층
  • ViewModel, Widget

Domain Layer

  • 시스템의 비즈니스 로직을 담고 있는 핵심 계층
  • Entity : 데이터 모델 클래스 (예. User 클래스)
  • UseCase : Entity로 해야할 일 정의(예. 회원가입, 정보수정)

Data Layer

  • 데이터 소스(예: 데이터베이스, API)와 관련된 작업을 처리하는 계층
  • Repository : 데이터 처리 방식 결정, Entity 전달
  • DataSource : 네트워크 통신, 내부DB와 연동 등을 통해서 데이터 CRUD

왜?

  • 유지보수가 용이함

  • 테스트가 용이함
    의존성이 단방향이기 때문에 가짜데이터로 테스트 가능 - Mocking

    • 각각의 계층을 데이터 서버로 부터 가지고오는 등의 외부의 의존성으로부터 독립적으로 로직만 테스트 가능
  • Flutter 에서 적용

    • 책 검색 앱의 플로우를 레이어로 나누어보면

  • 관심사별로 계층을 구분해 보면
    - View : 검색하기 버튼
    - ViewModel : 검색하기 요청해서 상태 업데이트
    - UseCase : 검색하기 비즈니스 로직
    - Entity : 책 정보
    - DataSource : OpenAPI와의 통신
    - Repository : DataSource를 통하여 책정보 가져오기

  • 실행 순서
    1. 버튼 클릭하면 뷰모델에 요청
    2. 뷰모델은 UseCase 요청
    3. UseCase는 Repository에 데이터 달라고 요청
    4. Repository는 DataSource에 통신 요청
    5. 리턴받은 데이터를 Entity로 가공해서 뷰모델에 전달
    - 이 방식으로 하면 UseCase 는 Repository에 의존하고 있으므로 클린하지 않음!
    - Repository를 직접 참조하고 있기 때문

  • 의존하고 있는 부분에 Interface를 두어 의존성 단방향으로 흐르게 수정
  • DTO : DataTransferObject. DataSource에서 Entity에 의존하지 않게 하기 위해 구현


ChatBot App 만들기

UI (심화 1-14)

Gemini 연동 (심화 1-15)

API Key 관리

- API Key를 소스코드에 직접 넣지 않을거에요~!
    - Github Repository에 업로드 방지
    - 따로 관리하면 API키 변경 시 코드 수정 불필요
    - 개발환경, 배포환경 각각 다른 API KEY로 실행가능
- 시스템 환경변수에 등록하지 않고 사용하기 별도의 파일로 관리할거에요
  • 프로젝트 최상단 파일에 .env 파일 생성

--dart-define-from-file 옵션을 사용하여 .env 파일을 지정하면, 이 파일에 정의된 변수들이 애플리케이션에 전달

  • 프로젝트 파일 최상단 폴더에 .vscode > runch.json < 파일 생성해서 아래 코드 넣기
{
  "version": "0.2.0",![](https://velog.velcdn.com/images/eus0207/post/fcbe22bd-8c28-4bbb-8964-deb83b5b9c07/image.png)

  "configurations": [
    {
      "name": "flutter_env",
      "request": "launch",
      "type": "dart",
      "toolArgs": ["--dart-define-from-file", "./.env"]
    }
  ]
}

가지고 올때

String.fromEnvironment('GEMINI_API_KEY');

0개의 댓글