You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
Gemini 기본 분석
[AST Composite 패턴](https://www.notion.so/AST-Composite-340787384b0a801fa432d9a602903e15?pvs=21)
[인터페이스, 추상 클래스 및 QOM 분석](https://www.notion.so/QOM-340787384b0a8036b835e19e8745914a?pvs=21)
[컴포지트 패턴의 계층적 구조와 적용](https://www.notion.so/340787384b0a80cbae51d8e075f4f729?pvs=21)
컴포지트 패턴이란?
객체 지향 설계에서 트리 구조를 다룰 때 매우 강력한 디자인 패턴이다.
부분-전체 계층을 표현하기 위해 객체들을 트리 구조로 구성하는 패턴이다.
이 패턴의 목적은 클라이언트가 단일 객체(Leaf)와 복합 객체(Composite)를 구분하지 않고 동일한 인터페이스로 투명하게 다룰 수 있도록 만드는 것이다.
즉, 하나를 다루든 여러개를 묶어서 다루든 똑같은 방식으로 명령을 내릴 수 있다.
핵심 구성 요소
Component (컴포넌트)
Leaf (단일 객체/ 잎)
Composite (복합 객체 / 컨테이너)
자신이 포함하고 있는 자식 객체들에게 해당 작업을 위임 한다.
패턴 예시: 파일 시스템
Component: FileSystemNode 파일과 폴터의 공통 인터페이스
Leaf: File
Composite: Folder (내부에 여러 File이나 또 다른 Folder를 가질 수 있음)
JOOQ에서의 컴포지트 패턴
AST (Abstract Syntax Tree)를 컴포지트 패턴를 활용하였다.
Component:
QueryPart 인터페이스Leaf:
Field컬럼Table테이블바인드 변수 값 등Composite
SelectQueryAndConditionOrCondition등 내부에 여러 Field나 또 다른 Condition을 리스트 형태로 가지고 있다.
즉, JOOQ에서는 최종적으로 SQL을 생성할 때, 최상위 QueryPart 객체의 메서드 하나만 호출한다.
그러면 최상위 객체가 자신이 품고 있는 하위 QueryPart 노드들의 렌더링 메서드를 연쇄적으로 호출하며
한줄의 SQL 문자열을 조립해낸다.
장점
새로운 타입 추가시 용이하다.새로운 종류의 Leaf나 Composite 클래스를 추가하더라고 기존 코드를 변경할 필요 없이 Component 인터페이스만 구현하면 트리를 쉽게 결합할 수 있다.
즉, JOOQ에서 새로운 SQL 방언의 함수 노드를 추가할 때 유리한다.
단점
설계의 지나친 일반화모든 객체가 공통 인터페이스를 가져야 하므로, 특정 Leaf 노드에는 의미없는 메서드가 인터페이스에 강제될 수 있다. 이를 막기 위해 인터페이스 분리 원칙을 고민해야한다.
타입 체크의 어려움컴포지트 객체 내부에 특정 타입의 Leaf만 들어가도록 제한하기가 구조적으로 까다롭다.
예를 들어) 폴더 안에 실행 파일을 넣지 못하게 막는 로직 등을 런타임에 별도로 검사해야 한다.
Query (Abstrat Syntax Tree)
주 구성요소
모든 노드는
QueryPart라는 공통 타입을 가지고이를 통해 개별 Leaf와 조립된 Composite를 구분 없이 섞어서 큰 부품들을 만들어 간다.
Field (필드/컬럼)
필드는 단순이 컬럼 이름일 수 있고, 함수나 연산이 포함된 복합 식 일 수 있다.
Leaf:
TableFieldImpl→ (USER.ID),Val→ (1)Composite:
Add (필드 + 필드),Function (함수 + 인자 필드들)적용:
USER.ID.plus(1),ADD(USER.ID, Val(1))라는 새로운 Field 노드를 만들어낸다.Condition (조건식)
조건 식은 필드나 다른 조건을 조합하여 논리 구조를 만들어낸다.
Leaf:
TrueCondition,FalseConditionComposite:
Eq: 필드와 필드를 비교 (Field = Field)And/Or: 조건과 조건을 결합 (Condition AND Condition)적용:
ID.eq(1).and(NAME.like(”A%))는AND(Eq(ID, 1), Like(NAME, “A%”))구조의 Condition이 된다.Table (테이블/소스)
테이블은 물리적 테이블 뿐만 아니라 조인된 결과나 서브쿼리도 포함된다.
Leaf:
TableImplComposite:
JoinTable(왼쪽 Table + 오른쪽 Table + Join Condition)적용:
USER.join(POST).on(USER.ID.eq(POST.USER_ID))는 JoinTable이라는 하나의 Table 노드가 된다.Beta Was this translation helpful? Give feedback.
All reactions