전체 글562 [Clean Architecture 정리] 14장. 컴포넌트 결합 (1) 컴포넌트 결합 의존성 비순환 원칙 (ADP, Acyclic Dependency Principle) "컴포넌트 의존성 그래프에 순환(cycle)이 발생하면 안 된다." 개발팀에서 프로젝트를 진행하다보면, 오늘 정상적으로 실행되던 내 코드가 다음날 갑자기 오류가 발생하는 경우가 있다. 여러가지 이유가 있지만, 그 중 하나는 내 코드가 의존하는 어떤 것에 변경이 발생했기 때문이다. 책에서는 이를 '숙취 증후군(the morning after syndrome)' 이라 표현했는데, 아마도 변경에 대한 후유증으로 해석하면 될 것 같다. 이러한 문제의 해결책으로 두 가지를 제시한다. 첫번째는 '주 단위 빌드(Weekly Build)'로 독립된 환경해서 개발을 진행하다가 일주일에 한 번 통합하는 과정을 거친다는 것이다.. 2022. 7. 27. [Clean Architecture 정리] 13장. 컴포넌트 응집도 컴포넌트 응집도 컴포넌트 응집도의 세 가지 원칙 - 재사용/릴리스 등가 원칙 (REP, Reuse/Release Equivalence Principle) - 공통 폐쇄 원칙 (CCP, Common Closure Principle) - 공통 재사용 원칙 (CRP, Common Reuse Principle) 재사용/릴리스 등가 원칙 (REP, Reuse/Release Equivalence Principle) - "재사용 단위는 릴리스 단위와 같다." - 컴포넌트가 릴리스 절차를 통해 추적 관리되지 않거나 릴리스 번호가 부여되지 않으면 재사용할 수 없고, 컴포넌트들이 서로 호환되는지 보증할 수 없다. - 또한, 릴리스 번호를 통해 새로운 버전이 언제 출시되고 무엇이 변했는지 개발자가 알 수 있어야 한다. - .. 2022. 7. 25. [Clean Architecture 정리] 12장. 컴포넌트 컴포넌트(Component) 개발하면서 컴포넌트라는 말은 여러가지 의미로 엄청 많이 사용하는 것 같다. 클라이언트 언어에서 컴포넌트, 아키텍처에서 컴포넌트, 또는 그냥 요소라는 의미에서 컴포넌트, 어쩌면 비슷한 의미이면서 정확하게 구분하면 다른 의미. 클린 아키텍처를 읽고 아키텍처에서 컴포넌트가 의미하는 바는 무엇일까 컴포넌트는 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위이다. 자바에서는 jar 파일, 루비에서는 gem, .net에서는 DLL을 컴포넌트로 취급한다. 컴파일형 언어에서는 컴포넌트가 바이너리 파일의 집합체이고, 인터프리터형 언어에서는 소스 파일의 결합체이다. 컴포넌트는 서로 링크해 실행 가능한 단일 파일로, 묶어서 .war 파일과 같은 단일 아카이브로, 각각을 .jar나 DLL 같이.. 2022. 7. 24. 2022.07 회고록 [2022.07 회고록] 2022년도 절반이 흘러간 시점에 오랜만에 회고록을 작성한다. 2022년 7월에 나는 21년 10월에 분석 파트로 파트 변경이 된 후, 분석 어플리케이션 및 서버 개발을 맡고 있다. 적성에 맞는 업무와 좋은 파트원을 만나 행복한 나날을 보내고 있었다. 그러다가 지난 한두 달 사이 너무나 많은 일들이 생겼고, 직장 생활을 시작한 후 처음으로 힘들다는 생각을 해본 것 같다. 첫 번째는 믿고 따르던 수석님의 파트 이동이다. 어렴풋이 짐작하고 있었지만, 이렇게 빨리 수석님이 떠날지 몰랐다. 회사 생활을 시작하면서 처음으로 일하는 방법을 알려주셨던, 늘 같은 눈높이에서 고민해주고 믿어주셨던 수석님, 너무 존경하고 좋아했었다. 수석님이 가신다는 얘기를 들었을 때는 "예상은 했지~"라고 쿨하.. 2022. 7. 24. [Clean Architecture 정리] 11장. DIP 의존 역전 원칙(DIP, Dependency Inversion Principle) - 의존 관계를 맺을 때, 변화하기 어려운 것, 변화가 거의 없는 것에 의존해야 한다. - '유연성이 극대화된 시스템'이란 소스코드 의존성이 추상(Abstraction)에 의존하며, 구체(Concretion)에는 의존하지 않는 시스템을 말한다. - 정적 타입 언어에서는 인터페이스나 추상 클래스 같은 추상적인 선언만을 참조해야 한다. - 동적 타입 언어에서는 소스 코드 의존 관계에서 구체 모듈은 참조해선 안된다. - 하지만, 소프트웨어 시스템은 이러한 규칙을 적용하기는 현실적으로 어렵다. - 따라서, 모든 구체적인 요소를 의존하지 않는 것은 어렵지만 '변동성이 큰 구체적인 요소'는 의존하지 않도록 설계를 해야한다. 안정된 추.. 2022. 7. 23. [Clean Architecture 정리] 10장. ISP 인터페이스 분리 원칙 (ISP, Interface Segregation Principle) - 인터페이스는 클라이언트에 특화되도록 분리시키는 설계 원칙 왜 인터페이스 분리 원칙이 필요한가? - 위의 그림의 클래스 설계에서 Client1은 Ops 클래스의 ops1 메서드를, Client2는 ops2, Client3은 ops3 메서드를 사용한다고 가정하자 - Ops 클래스가 정적 타입의 언어로 작성되었을 때, Client1이 ops2(), ops2() 메서드를 사용하지 않아도 Clinet1은 두 메서드를 의존하게 된다. - 이러한 의존성은 ops2()가 변경되어도 Client1을 다시 컴파일 후 배포해야함을 의미한다. - 이렇게 사용하지 않는 메서드를 의존하는 문제를 인터페이스를 분리함으로써 해결할 수 있다.. 2022. 7. 23. XGBoost Algorithm - ing 이번 신규 아이템을 진행하면서 설비 생산량을 예측하는 Rest API를 개발하게 되었다. 학습 모델을 만들면서, 자격증 취득을 위해 학습 알고리즘들을 열심히 공부했다고 생각했지만 모델 선택과 하이퍼 파라미터 튜닝에 있어서는 기술의 부재가 상당히 컸고 학습 알고리즘을 정확하게 이해하지 못한 채 결과값에 의존하고 있다는 생각을 하게 되었다. 모델 평가와 선택 과정에서 많은 경우에 대해 XGBoost가 좋은 성능을 보여주었고, 해당 알고리즘을 정확하게 이해할 필요성을 느꼈다. XGBoost(Extreme Gradient Boosting) - 분산환경에서 실행할 수 있도록 구현한 라이브러리 - 회귀(Regression), 분류(Classification) 모두를 지원 - 앙상블(Ensemble) 기법 중 성능과.. 2022. 7. 23. [Clean Architecture 정리] 9장. LSP 리스코프 치환 원칙 (LSP, Liskov Substitution Principle) 바바라 리스코프가 정의한 하위 타입 "하위 타입에서 필요한 것은 치환 원칙이다. S타입의 객체 o1 각각에 대응하는 타입 객체 o2가 있고, T타입을 이용해서 정의한 모든 프로그램 P에서 o2의자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입이다." 리스코프 치환 원칙 - 상위 타입의 객체를 호출하는 동작에서 하위 타입의 객체가 상위 타입의 객체를 완전히 대체할 수 있어야(치환 가능해야) 한다. 정사각형/직사각형(Square/Rectangle) 문제 - LSP를 위반하는 전형적인 문제 class Rectangle(): def __init__(self, width=0, height=0): se.. 2022. 7. 20. [Clean Architecture 정리] 8장. OCP 개방 폐쇄 원칙(OCP, Open-Closed Principle) - 소프트웨어 개체(artifact)는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다. 컴포넌트 계층구조 - 모든 컴포넌트 관계는 단방향으로 이루어진다. - 변경으로부터 보호하려는 컴포넌트에 의존하도록 해야한다. - 위 그림에서 Interactor 처럼 어떤 변경도 영향을 주지않는, 보호받는 '특별한 위치'에 있는 컴포넌트는 업무 규칙을 포함하는 등의 가장 높은 수준의 정책을 포함한다. - 컴포넌트 관계에서 보호의 계층구조가 '수준(Level)'이라는 개념을 바탕으로 가장 높은 수준의 개념이 최고의 보호를 받고 가장 저수준의 개념이 거의 보호를 받지 못한다. - 컴포넌트 계층구조는 아키텍처에서 OCP가 동작하는 방식이 된다. - .. 2022. 7. 19. [Clean Architecture 정리] 7장. SRP 설계 원칙 - SOLID 원칙은 함수와 데이터 구조를 클래스로 배치하고 클래스 간 결합하는 방법 - 여기서 클래스는 객체 지향 프로그래밍에서 말하는 클래스 이상의 의미를 가진 함수와 데이터를 결합한 집합 - SOLID 원칙의 목적은 중간 수준의 소프트웨어 구조가 '변경에 유연하고', '이해하기 쉽고', '많은 SW 시스템에 사용될 수 있는 컴포넌트의 기반'이 되는데 목적을 둔다. - '중간 수준'이라고 하면 코드 수준보다는 상위에서 적용되며 모듈과 컴포넌트 내부에서 사용되는 SW 정의하는데 도움을 준다는 의미 SOLID 단일 책임 원칙(SRP, Single Responsibility Principle) - 각 소프트웨어 모듈은 변경의 이유가 단 하나 개방-폐쇄 원칙(OCP, Open-Closed Prin.. 2022. 7. 17. [Clean Architecture 정리] 6장. 함수형 프로그래밍 함수형 프로그래밍(Functional Programming) 함수형 프로그래밍(FP, Functional Programming) - 람다 계산법이 패러다임의 기반 - 함수형 프로그래밍에서 변수는 변하지 않는다(불변성) 불변성과 아키텍처 - 멀티 스레드 또는 프로세스에서 발생하는 경합 조건(race condition), 교착 상태(deadlock), 동시 업데이트(concurrent update) 등의 문제들은 변수의 가변성으로 인해 발생 - 불변성이 실현 가능한지는 저장 공간과 프로세서의 속도가 무한하다는 가정 하에 긍정적일 수 있다 - 따라서, 불변성은 저장 공간과 프로세서 속도와의 타협이 필요하다 가변성의 분리 - 불변성의 타협 포인트 중 중요한 하나는 서비스 내 컴포넌트 중 '가변 컴포넌트'와 '불.. 2022. 7. 17. [Clean Architecture 정리] 5장. 객체 지향 프로그래밍 객체 지향 프로그래밍 좋은 아키텍처를 만드는 것을 객체 지향 설계 원칙을 이해하고 응용하는 데서 출발한다. 객체 지향(OO, Object Oriented)이란? 객체 지향이란 무엇일까? 데이터와 함수의 조합? 현실 세계의 사물을 객체로 인식하고 그 객체로부터 특징을 뽑아와 프로그래밍 하는 것? 객체 지향을 설명하려면 '캡슐화(Encapsulation)', '상속(Inheritance)', '다형성(Polymorphism)'의 객체 지향의 본질 세 가지를 이해해야 한다. 캡슐화(Encapsulation) 캡슐화는 연관된 데이터와 함수를 클래스로 묶는 것으로 캡슐화를 통해 응집도(Cohesion)은 높이고 결합도(Coupling)은 낮출 수 있다. OO언어는 데이터와 함수를 쉽고 효과적으로 캡슐화하는 방법을.. 2022. 7. 17. 이전 1 2 3 4 5 6 7 ··· 47 다음