오늘 한일

IT인프라

  • 인프라(infra)
    • '기반' 이라는 의미로 우리 생활을 지탱하는 바탕이나 토대
    • 지하철이나 버스와 같은 인프라의 구조 자체는 복잡하지만 전문가에 의해 관리되며 사용자는 이해하지 않아도 됨
  • 인프라 아키텍처
    • 아키텍처는 '구조'라는 의미
    • 자동차는 종류가 많지만 구조 자체는 거의 같음, 즉 자동차의 구조 또는 아키텍처가 확립돼 있어서 이미 공통화돼 있음
    • IT 인프라 아키텍처
      • IT 인프라의 구조
      • 우리가 사용하는 IT 서비스는 이용 방법이나 사용자가 다르지만 IT 인프라 위에서 동작
      • 이 인프라 아키텍처는 공통점이 많아 거의 같은 구조로 동작하고 있음
  • 집약형 아키텍처
    • 대형 컴퓨터에서 모든 업무 처리하여 구성이 간단하며 안정성과 성능이 높음
    • 주요 부품 다중화, 유한 리소스 관리 등이 필요
    • 도입 비용 및 유지 비용이 높으며 확장성에 한계가 있음
  • 분할형 아키텍처
    • 여러 대의 컴퓨터를 조합해서 하나의 시스템을 구축하여 비용이 낮고 확장성이 높음
    • 장비의 수가 늘어나면 관리 구조가 복잡해지며, 고장에 따른 영향을 최소화하기 위한 구조 검토 필요
  • 수직 분할형 아키텍처
    • 클라이언트 - 서버형 아키텍처 (C/S)
      • 소프트웨어를 물리 서버 상에서 운영
      • 클라이언트 측에 전용 소프트웨어가 필요하며 정기적 업데이트가 필요
      • 소수의 서버로 다수의 클라이언트를 처리할 수 있지만 확장성에 한계가 있음
    • 3계층형 아키텍처
      • 프레젠테이션 - 애플리케이션 - 데이터로 계층 분할
      • 프레젠테이션 계층에서는 사용자 입력을 받고 화면을 표시
      • 애플리케이션 계층에서는 사용자 요청에 따른 업무 수행
      • 데이터 게층에서는 요청에 따라 데이터 입출력 작업 수행
      • 서버의 집중 부하를 개선하며 브라우저를 사용하기 때문에 클라이언트의 정기적인 업데이트가 불필요
      • 구조가 비교적 복잡

운영체제: 6일 차

  • day3, day5 복습
    • day3: 운영체제의 서비스, 운영체제의 구조
    • day5: 스레드의 개념과 상태 변화, 스레드의 구현
  • day6 학습
    • 병행 프로세스
      • 프로세서 하나는 한 번에 하나의 프로세스만 실행
      • 병행 프로세스는 운영체제가 프로세서를 빠르게 전환하여 마치 여러 개를 동시에 실행하는 것처럼 보이게 하는 것
      • 독립 프로세스
        • 단일 처리 시스템에서 독립적으로 작업을 수행
      • 협력 프로세스
        • 다른 프로세스와 협력하며 특정 기능을 수행하는 비동기적 병행 프로세스
        • 예: A 프로세스가 파일에서 읽기를 수행하는 동안 B 프로세스가 파일에 쓰기를 수행
        • keyword: 경쟁 관계, 개체공유에 따른 협력, 통신, 상호배제
    • 프로세스 간의 충돌을 해결하는 방법
      • 운영체제의 지원 없이 상호배제를 책임지는 소프트웨어적인 방법들
      • 선형 그래프
        • 프로세스는 프로세스 집합과 선행 제약 두 가지 요소
        • 선행 제약은 프로세스 B를 수행하려면 프로세스 A의 작업이 반드시 끝나야 한다는 의미
        • 프로세스 간의 선행 제약이 없으면 독립적으로 수행 가능
        • 선형 그래프는 선행 제약을 논리적으로 표현한 것
      • 병행 프로그램
        • fork와 join 구조
          • 최초로 병행을 언어적으로 표현
          • fork는 단일 연산을 독립 연산 2개로 분리
          • join은 병행 연산 2개를 하나로 결합
          • fork의 수행 효과가 구조적 프로그래밍에서 사용을 자제하는 goto 문장과 비슷하여 제어 구조가 어색
        • 병행 문장
          • 하나의 프로세스가 여러 개의 병렬 프로세스로 퍼졌다가 다시 하나로 뭉쳐지는 것을 나타내는 언어 구조
          • parbegin S1; S2; .......; Sn; parend
          • S0; parbegin S1; S2; .......; Sn; parend; Sn + 1;
          • Ex) a := x + y; b := z + 1; c := a - b; w := c + 1
            • parbegin;
              • a := x + y;
              • b := z + 1;
            • parend;
              • c := a - b;
              • w := c + 1;

불필요한 추상화, 미활용 추상화

  • 추상화 악취 4가지 복습
    • 누락된 추상화
    • 명령 추상화
    • 불완전한 추상화
    • 다면적인 추상화
  • 불필요한 추상화
    • 실제로는 요구되지 않아 충분히 피할 수 있는 추상화
    • 할당된 책임이 거의 없음, 추상화를 불필요하게 도입한 사례
    • 잘 정의된 의미있는 단일 책임 할당 추상화 기술 요소 위반
    • 상수 인터페이스가 주로 등장
  • 미활용 추상화
    • 사용하지 않은 채로 남겨진 추상화
      • YAGNI (You Aren't Gonna Need It) 위반
    • 미참조 추상화(어느 누구도 사용하지 않음), 고아 추상화(단독으로 존재하는 인터페이스, 추상 클래스)의 형태로 드러남
    • 잘 정의된 의미있는 단일 책임 할당 추상화 기술 요소 위반

플러터 1/4/7/14 앱: 메인화면 개발

어제 List Drag & Drop 위젯을 발견하고 사용해봤는데, 위젯 자체에 테스트 코드가 있어서 사용법을 익히기에는 좋았다. 그러나 단순 ListView에서 이동만 가능한 위젯이라 내가 원하는 기능과는 조금 거리가 멀다.

플러터는 아직 등장한 지 얼마 안돼서 그런지 위젯 패키지가 많이 없는 것 같다. 그래도 이리저리 찾아본 결과 reorderables라는 구세주를 찾을 수 있었다.

class _CardsState extends State<Cards> {
  final double _iconSize = 150;
  List<Widget> _tiles;

  
  void initState() {
    super.initState();
    _tiles = <Widget>[
      createCard(1, '컴퓨터 구조', Colors.blue, '4 일차', '4 days ago'),
      createCard(2, '알고리즘', Colors.green, '21 일차', '3 month ago'),
      createCard(3, '자료구조', Colors.purple, '10 일차', '2 weeks ago'),
      createCard(4, 'subject', Colors.blue, '10 일차', '2 weeks ago'),
      createCard(5, 'subject2', Colors.blue, '10 일차', '2 weeks ago'),
      createCard(6, 'subject3', Colors.blue, '10 일차', '2 weeks ago'),
      createCard(7, 'subject', Colors.blue, '10 일차', '2 weeks ago'),
    ];
  }

  SizedBox createCard(id, subjectText, subjectColor, daysText, agoText) {
    // ...
  }

  
  Widget build(BuildContext context) {
    void _onReorder(int oldIndex, int newIndex) {
      setState(() {
        Widget row = _tiles.removeAt(oldIndex);
        _tiles.insert(newIndex, row);
      });
    }

    return Expanded(
      child: ReorderableWrap(
        children: _tiles,
        onReorder: _onReorder,
        maxMainAxisCount: 2,
      ),
    );
  }
}

ReorderableWrap, ReorderableRow, ReorderableColumn 등 여러 가지 위젯을 제공한하며, 사용법도 상당히 쉽다. Widget 타입의 리스트를 사용하고 key만 잘 지정해주면 된다.

참고로 ReorderableWrap를 Expanded로 래핑하지 않으면 수직 스크롤이 안된다.

위의 그림처럼 잘 동작한다. 오늘은 임시 데이터를 사용하여 메인 화면의 뼈대만 구현해봤다.

오늘 느낀점

오늘 플러터 앱을 개발하면서 원하는 레이아웃을 구현하기가 정말 힘들었다. 고작 저 화면 뼈대만 만드는데 3~4시간이 걸린 정도..... 개인적인 의견으로는 공식 문서가 초보 개발자에게는 그닥 도움이 되지 않는 것 같다. '내가 모르는 내용이 무엇인가'는 알고 있는데, 그 내용을 어디서 찾아야 하는 지를 모르겠다. (구글에 영어로 검색하면 대부분 나오긴 하더라...)

내일 할일

  • 플러터 1/4/7/14 앱: 메인화면 개발
    • in-memory db 적용해보기
  • IT인프라, 리팩토링, 운영체제 학습
  • 백준 DP 2문제 풀이