본문 바로가기

분류 전체보기560

[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.
[Clean Architecture 정리] 4장. 구조적 프로그래밍 구조적 프로그래밍 증명 다이크스트라는 수학적 원리의 증명을 프로그래밍에 적용했다. 프로그래머는 입증된 구조를 이용하고 이를 코드와 결합해 코드가 올바르다는 사실을 스스로 증명하는 방식으로 동작할 수 있다고 믿었다. 그는 단순한 알고리즘에 대한 증명을 작성할 수 있는 기법을 연구하면서, goto 문장 대신 분기(if/then/else)와 반복(do/while)의 단순한 제어구조만을 사용함으로써 재귀적으로 증명가능한 모듈로 세분화할 수 있다는 사실을 발견했다. 이러한 발견은 구조적 프로그래밍의 기반이 되었고, 구조적 프로그래밍으로 인해 거대한 문제 기술서도 고수준의 기능으로, 다시 저수준의 함수들도 분해가 가능해졌다. 따라서 프로그래머는 구조적 프로그래밍을 통해 대규모 시스템을 모듈과 컴포넌트로, 더 나아가.. 2022. 7. 16.
[Clean Architecture 정리] 3장. 패러다임 개요 구조적 프로그래밍(Structured Programming) - 제어흐름의 직접적인 전환에 대해 규칙을 부과 객체 지향 프로그래밍(Object Oriented Programming) - 제어흐름의 간접적인 전환에 대해 규칙 부과 함수형 프로그래밍(Functional Programming) - 할당문에 대해 규칙을 부과 패러다임과 아키텍처 - 패러다임은 권한을 부여하는 것이 아닌 권한을 박탈하는 것 - 아키텍처 경계를 넘나들기 위해 다형성(Object Oriented Programming)을 이용하고 데이터의 위치와 접근 방법에 대한 규칙(Functional Programming)을 부과하고 모듈의 기반 알고리즘(Structured Programming)으로 사용한다. 서적 : http://www.yes2.. 2022. 7. 10.