능히 해낼 수 있다

230914 Flutter: BLoC 참조와 의존성 주입 본문

개발🌐/Flutter | Dart

230914 Flutter: BLoC 참조와 의존성 주입

roni_eo 2023. 9. 14. 14:35
반응형
더보기

✍️✍️✍️ 위 글은 작성자의 지식습득에 따라 추후 퇴고 될 수 있음을 알려드립니다(피드백 환영).


BLoC은 Business Logic Component의 약자로 Flutter에서 상태 관리를 위한 중요한 패턴 중 하나이다.
BLoC 패턴을 구현할 때, BLoC 인스턴스의 참조와 의존성 주입은 핵심적인 역할을 하는데, 이번에 글을 정리해 보면서 BLoC 참조와 의존성 주입에 대한 정의와, 그들의 역할과 차이를 알아보려한다.


BLoC 참조

BLoC 참조는 BLoC 인스턴스를 직접 생성하고 다른 부분에서 그 인스턴스에 직접 접근하는 방식을 의미하는데, 이는 전역적으로 BLoC 인스턴스를 사용하거나 싱글톤(Singleton)패턴을 활용하는 경우에 주로 사용된다. BLoC참조를 사용하면 어디서든 해당 BLoC인스턴스에 접근이 가능하나, 이로 인해 코드의 유연성과 테스트 용이성이 감소할 수 있다.

// CounterBloc: 카운터의 비즈니스 로직을 관리하는 클래스
class CounterBloc {
  int _counter = 0;  // _counter: 초기값을 0으로 설정된 카운터의 현재상태를 저장하는 private 변수

// increment: _counter값을 증가시키는 메서드. 카운터 증가 핵심 로직
  void increment() {
    _counter++;      // 카운터 값 1씩 증가
  }

  int get counter => _counter;  // counter 변수를 외부에서 읽을 수 있도록 하는 getter 함수
}

// main: CounterBloc 클래스의 새 인스턴스를 생성 및 bloc 변수에 할당
void main() {
  final bloc = CounterBloc(); 
  // BLoC 인스턴스를 직접 생성하는 부분!!!

  bloc.increment();  // BLoC 인스턴스의 increment 메서드를 호출해 카운터를 1 증가
  print(bloc.counter);  // BLoC 인스턴스의 counter 값을 읽어와 출력
}

BLoC 의존성 주입

의존성 주입은 BLoC 인스턴스를 다른 클래스로 주입하거나, 필요한 곳에서 외부에서 제공받는 방식으로 이를 통해 코드의 유연성과 테스트 용이성을 향상시킬 수 있다. 주로 provider 패키지나 get_it과 같은 의존성 주입 패키지를 사용하여 구현된다.

// CounterBloc: 카운터의 비즈니스 로직을 관리하는 클래스
class CounterBloc {
  int _counter = 0;  // _counter: 초기값을 0으로 설정된 카운터의 현재상태를 저장하는 private 변수

// increment: _counter값을 증가시키는 메서드. 카운터 증가 핵심 로직
  void increment() {
    _counter++;      // 카운터 값 1씩 증가
  }

  int get counter => _counter;  // counter 변수를 외부에서 읽을 수 있도록 하는 getter 함수
}

// main: CounterBloc 클래스의 새 인스턴스를 생성 및 bloc 변수에 할당
void main() {
  final bloc = CounterBloc(); 
  // BLoC 인스턴스를 직접 생성하는 부분!!!
  
  // 위젯에서 BLoC 인스턴스를 의존성 주입
  runApp(
    MaterialApp(
      home: BlocProvider( // BlocProvider: BLoC 인스턴스를 주입
        bloc: bloc, 
        child: MyWidget(), 
        //MyWidget: 화면 구성 위젯. BuildContext통해 BLoC 인스턴스를 의존성으로부터 얻어와 사용
      ),
    ),
  );
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // BLoC 인스턴스를 의존성으로부터 얻음
    final bloc = BlocProvider.of<CounterBloc>(context);
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Counter: ${bloc.counter}'), // BLoC 인스턴스의 카운터 값 출력
            ElevatedButton(
              onPressed: () {
                bloc.increment();// BLoC 인스턴스의 increment 함수를 호출하여 카운터 증가시킴
              },
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }
}

참조와 의존성 주입의 차이

특성 BLoC 참조 BLoC 의존성 주입
BLoC 인스턴스 생성방식 직접생성 외부주입
전역(global)접근 가능 제한적
코드유지 보수성 낮음 높음
테스트 가능성 제한적 용이

 

반응형