foreunwoo / dreamofcleanarchitecture Goto Github PK
View Code? Open in Web Editor NEW클린 아키텍처 독서 스터디
클린 아키텍처 독서 스터디
날짜: April 4, 2022
증명(proof)라는 수학적인 원리 적용 → 문제 해결 시도
유클리드 계층구조를 사용하여 프로그래머도 사용 가능하다고 믿음
goto 문장
이러한 제어구조는 순차 실행과 결합 할때 특별함을 알게 됨
단순한 열거법을 이용해 순차 구문이 올바름을 입증할 수 있다는 사실 보여줌
분기
반복
불변성에서 가장 타협되는 것중 하나는 애플리케이션
애플리케이션 내부의 서비스를 가변 컴포넌트와 불변 컴포넌트롤 분리
불변 컴포넌트에서
불변 컴포넌트는
상태 변경은
애플리케이션을 제대로 구조화하려면 변수를 변경하는 컴포넌트와 변경하지 않는 컴포넌ㄴ트를 분리
현명한 아키텍트라면 가능한 한 많은 처리를 불변 컴포넌트로 옮겨야 하며, 가변 검포넌트에서는 가능한 많은 코드를 빼내어야 한다
다형성이라는 게 구조적 프로그래밍에서 기반은 캡슐화나 상속에 대해서는 기반은 그대로나
쉽게 바꿔주는 부분이다. 이 파트는 다형성을 가장 중요하게 다룬 것 같다.
함수 포인터의 영역을 지정해준다는 게 위험하다는 사실이 인상 깊었다.
함수형 프로그래밍에 대해서
동시성이나 비동기에서 영향이 있다는 것이 새롭게 느껴졌다.
안드로이드 패러다임이 상태값에 따라서 화면을 변경해주고 처리되는 로직으로 바뀌고 있는데,
요새 왜 그런 패러다임으로 바뀌는지 알게 되었다.
가변 변수를 보호하기 위해서 가는 게 아닐까 생각하게 됨.
세 개의 프로그래밍 방식을 알아야지만 아키텍처 이해가 가능해서 이 개념들을 짚고 넘어가는 게 아닐까? 하는 생각이 들었다.
다수의 스레드와 프로세스를 사용하는 애플리케이션에서 발생하는 모든 문제는 가변 변수가 없다면 절대 생기지 않는데,
그렇다면 불변성은 정말로 실현 가능할지 궁금해졌다.
이벤트 소싱에서 트랜잭션을 저장한다는 얘기가 나오는데, 예로 소스 코드 버전 관리 시스템을 같이 든다.
소스 코드 버전 관리 시스템에서 커밋 로그 하나가 트랜잭션이 아닐지 생각해봄.
컴포넌트라는 개념이 아직 생소하다.
지금은 이론적인 것만 배운 것 같고, 적용하기엔 아직 어렵다.
직접 만들고 사용을 할 때 정리한 것들을 다시 참고해서 응집도나 결합을 다시 체크해 봐야 할 것 같다.
컴포넌트 단위가 배포 단위라는 거라고 할 때 jar 파일이라고 하니 조금 더 이해가 되었다.
이걸 실질적으로 어떻게 프로젝트에 녹일 수 있을까? 고민하게 되었다.
지금 할 수 있는 건 ui 컴포넌트 정도인데, 그걸로 좀 더 내 걸로 만들 수 있지 않을까 싶은 기대감이 있음.
이 장은 컴포넌트 내에서의 SOLID 원칙을 얘기하는 것 같다.
모듈과 컴포넌트의 차이? 컴포넌트는 좀 더 동적인 개념이고, 그에 비해 모듈은 좀 더 정적이다.
컴포넌트 == 독립적인 실행 프로그램
예를 들어서, 네트워크면 네트워크를 관장하는 모듈, 즉 그 집합 자체가 컴포넌트가 아닐지
응집도와 결합도에 대한 이해가 조금 부족하지 않나? 그것들을 생각하면서 개발했던 경험이 부족한 것 같다.
그 전 장에서는 클래스에 대한 개념을 주로 다뤘는데 컴포넌트는 그에 비해서 더 큰 개념인 것 같다.
컴포넌트 == 패키지라고 생각했는데, 패키지보다는 더 큰 개념인 것 같음.
컴포넌트 < 패키지(모듈의 집합) < 모듈(함수들의 집합)
빠른 이해를 돕기 위해 패키지라고 생각하자면, 만약 탈퇴 로직을 작성해야 할 때 Leave 패키지를 만들어 관련 클래스들을 모아놓는데 그런 부분에서 여기서 설명하는 개념(REP, CCP)들이 적용되지 않나 싶었다.
릴리즈와 재사용성의 연관성?
소프트웨어 컴포넌트가 릴리스 절차를 통해 추적 관리되지 않거나 릴리스 번호가 부여되지 않는다면 해당 컴포넌트를 재사용하고 싶어도 할 수도 없고, 하지도 않을 것이다.
p.113 다이어그램에 대해 좀 더 얘기가 필요할 듯.
14장 컴포넌트 결합 쪽을 읽으면서 SOLID 개념을 확장해서 설명하고 있다는 느낌이 들었다.
개념들간 연결되어 있다는 생각이 들었음.
이전 장에서나 이 장(SDP, SAP)에서도 의존성 역전을 강조하는데 인터페이스를 좀 잘 활용해야겠다고 생각.
인터페이스를 어떻게 잘 설계할 수 있을지 고민하게 되었다.
단일 책임 원칙 (SRP)
퍼사드(Facade) 패턴?
개방-폐쇄 원칙 (OCP)
개방-폐쇄 원칙 (기존 코드를 수정하기보다 반드시 새로운 코드를 추가하는 방식으로 시스템을 확장하는 원칙) 지키기가 가장 어려운 것 같다.
기존 코드 수정할 일이 없도록 처음부터 기반을 잘 만드는 법은?
유지보수까지, 확장 가능성까지 생각하며 시스템 설계가 필요함.
시스템을 컴포넌트 단위로 분리하고, 저수준 컴포넌트에서 발생한 변경으로부터 고수준 컴포넌트를 보호할 수 있는 형태의 의존성 계층구조가 만들어지도록 해야 한다.
리스코프 치환 원칙 (LSP)
인터페이스를 잘 설계하는 것이 중요하다.
그에 맞춰 예외 처리에 힘쏟을 필요가 없는 구현체가 만들어지기 때문에
ios 프로토콜과 자바의 인터페이스가 비슷한 개념
인터페이스 분리 원칙 (ISP)
하나의 구현체는 한 가지의 인터페이스를 가져야 한다는 것을 깨달음.
의존성 역전 원칙 (DIP)
변동성이 큰 구체에는 의존하면 안 된다는 사실. 변동성이 낮은 인터페이스에 의존해야 함.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.