목록분류 전체보기 (10)
Soyeon Park 님의 블로그
디자인 패턴은 아키텍처 스타일보다 낮은 수준에서 구체화를 위해서 적용된다. 요구사항을 고려하여 아키텍처를 확장한 후 아키텍처의 컴포넌트들을 구현하는 단계에서 적용된다. 컴포넌트 안의 클래스의 역할과 동작이 결정된 후 발생하는 설계 이슈에 대하여 해법이 되는 것이 디자인패턴이다. 최상위 설계(아키텍처 스타일) → 중위 설계(디자인 패턴) → 하위 설계(알고리즘과 자료구조)의 단계이다. 디자인 패턴은 캡슐화, 응집, 추상화와 같은 설계 원리와 객체지향 SOLID 원칙을 잘 지킨 모범 사례이다. 디자인 패턴을 적용한다면 앞서 정리한 설계 원칙을 잘 따를 수 있게 된다. 1. 싱글톤 패턴 객체를 강제적으로 하나만 생성하려는 목적을 가지고 있다. 원래 클래스를 이용하는 클라이언트가 생성자를 접근할 수 있다면 ..
1. 단일책임원칙 Single Responsibility Principle Invoice 클래스는 계산서인데, 세금 계산(calculateTax), 계산서 출력(printInvoice), 데이터베이스 저장(saveToDatabase)를 왜 하냐...다 분리해서 따로 두어야 응집력이 올라간다. 그래서 아래와 같이 4개의 클래스로 분리한다. 각 클래스는 자신의 책임만을 다한다. 2. 개방 폐쇄 원칙 Open Close Principle 클라이언트가 접근하는 부분에 대해서 수정에는 닫혀 있고 확장에는 열려 있어야 한다. 인터페이스 분리가 되어야 하는데, 아래의 코드는 Sorter 클래스에 어떤 소팅 알고리즘을 쓸 것인지에 대한 구현까지 다 들어가 있다. 확장하려면, 다 뜯어 고쳐야 한다. 문제다. 이렇게 ..
객체지향 언어가 도입되면서 전통적 설계 원리인 추상화라는 개념은 인터페이스와 구현의 분리로 확장되었다. 인터페이스는 공개된 메서드의 프로토타입(추상)만을 정의해 놓은 것이다. 대부분의 클래스는 메서드의 구현을 포함하는데 여기에서 공개된 메서드를 인터페이스로 따로 정의하고 이를 구현 상속한 것으로 관계를 맺는다. 객체지향 다형성을 이용하다면, 인터페이스로 상속된 여러 구현을 가질 수 있다. 하나의 추상 개념을 필요에 따라 여러 버전으로 구체화하는 것이다. 컴포넌트의 공개 인터페이스(사용자가 알아야 하는 부분)는 컴포넌트가 어떻게 구현되는지와 분리하자는 것이다. 인터페스와 분리된 구현은 쉽게 변경할 수 있다. 캡슐화 원리는 구현 세부 사항을 숨기도록(정보은닉) 한다. 인터페이스 분리 원리는 추상화를 지시한다..
결합도(Coupling) 1. 자료(Data) 결합도 기본 자료형 데이터만 주고 받는 것이다.주차요금청구서 모듈은 필요한 "주차시간"만 넘겨주고, 주차요금계산기 모듈이 "주차요금"을 계산해서 전달해준다. 2. 스탬프(Stamp) 결합도 배열이나 객체 같은 자료구조를 참조하는 형태이다.주차요금청구서 모듈은 주차시간(time)만 넘겨주면 되는데, "이용기록(record)" 자료구조를 넘긴다.Record를 계속 넘겨주고 있다. 결합력을 낮추기 위해서 Record 자료구조로 넘기기보다는 각자의 멤버변수로 만드는게 좋겠다.만약에 Record 자료구조에서 useTime이 useMin으로 수정이 발생했다고 하자. 그러면 Bill, Fee도 수정되어야 한다. 다른 모듈에 의해서 내 모듈이 고쳐져야 한다면 결합도가 ..
1. 추상화 추상화는 컴포넌트 구현에 대한 자세한 사항을 고려하지 않고, 추상적인 수준으로 컴포넌트를 다루는 도구이다. 컴포넌트는 외부에 서비스를 제공하는데, 이때 내부가 어떻게 동작하는지 상세한 사항에 구애 받으면 안된다. 단지 외부에 보이는 동작을 나타내면 된다. 즉, 추상화란 특정한 목적에 관련된 정보에 집중하고, 나머지 정보는 무시하는 관점이다. 예를 들어, 자동차에 추상화를 적용해보자. 엑셀을 밟으면 속도가 올라가고, 브레이크를 밝으면 멈추는 객체로 추상화할 수 있다. 내부적으로 엑셀과 브레이크가 어떤 구조를 가지고 어떻게 구현되는지는 관심이 없다. "자동차의 동작"이라는 특정한 목적에 집중한 것이다. 추상화는 복잡한 것을 줄이고, 시스템을 효율적으로 다룰 수 있게 해준다. 외부에 보이는 동작을..
1. RAG란? RAG는 Retrieval Augmented Generation의 약자로, 검색 증강 생성으로 해석할 수 있다.대형언어모델(LLM)이 새로운 정보를 검색하고 통합할 수 있도록 하는 기술이다. RAG를 사용하면, LLM이 지정된 문서를 참조하며 기존 데이터의 정보를 보완할 수 있게 된다.이를 통해서 훈련 데이터에서 사용할 수 없는 도메인의 정보나 실시간으로 업데이트되는 정보를 사용할 수 있게 된다.따라서, 할루시네이션을 방지하는 효과가 있다. 예를 들어, LLM 기반 챗봇이 회사 내부 데이터에 접근하여 응답을 생성하게 되는 것이다. 일반적인 LLM은 회사 내부의 데이터를 알 수 없기 때문에 맞춤형 서비스는 제공할 수 없는 반면, RAG를 사용하면 가능해진다. *할루시네이션 : 생성형 AI가..
0. 개요 검색 기술이 어떤 식으로 변화해왔는지에 대한 전반적인 흐름을 알아본다. Google과 같은 검색 엔진을 생각해보자. "DB Vector"라는 검색어를 입력했다. 이는 "DB Vector"라는 쿼리를 검색 엔진에 날렸다는 것과 동일한 표현이다. Google에는 수천만개의 페이지가 있는데, 여기서 "DB Vector"와 관련있는 페이지를 어떻게 뽑아낼 수 있을까? "DB", "Vector"가 등장하는 페이지를 모두 다 가져올 것인가? 일차적으로 드는 생각은, "DB"와 "Vector"라는 단어가 많이 있는 것을 먼저 가져올 것 같다. 각 단어가 등장하는 비율이 다를 때는 또 어떤 페이지를 뽑아야할까? 모든 페이지를 가져오는 것이 아니라, 최대한 사용자가 원하는 것을 가져오는 것이 중요하다. 검색 ..
0. 토픽 모델링이란? 글의 토픽, 즉 주제를 찾아내는 것이다.조금 더 구체적으로 말하자면, 문서 집합 속에 내재된 주제를 통계적으로 추론하는 기법이다. 우리가 일반적으로 글을 읽을 때도 느끼듯, 주제는 문서에 직접적으로 드러나지 않는다. 이 방법 또한 마찬가지로 글에 내재된 주제를 찾아내는 것에 의미가 있다. 따라서, 토픽 모델링에서의 토픽(topic)은 당어들의 동시 출현 패턴으로 표현되는 잠재적 의미 집합(latent semantic group)을 의미한다. Topic #1 이 {"에너지", "탄소", "기후", "정책"} 등의 단어의 묶음이라면 이는 기후 정책으로 해석을 할 수 있다는 뜻이다. 이 그림에서 documents와 words는 관측가능하며, topics는 잠재되어 있다. 앞서 말했듯..
0. 개요 데이터베이스 정규화는 함수 종속성을 제거하는 방향으로 진행된다.따라서, 정규화 전에 함수 종속성에 대해서 먼저 알아보자. 1. 함수 종속성이란? 함수 종속성(Functional Dependency)은 FD로 줄여서 말하기도 한다.디비에서 속성들 간의 종속 관계를 말한다. 테이블 필드들의 종속 관계를 알아야 데이터 중복을 줄이고, 테이블을 논리적으로 만들 수 있다. 속성 A의 값에 따라 속성 B의 값이 유일하게 결정될 때, 속성 B는 A에 함수 종속적이라고 한다. A → B로 표현하며 A가 B를 결정한다는 의미를 가진다. 이때 A를 결정자, B를 종속자라고 한다. 2. 완전 함수 종속 (Full Functional Dependency) 기본키 전체가 다른 속성을 결정할 때 발생하는..
0. 정규화는 왜 필요한가? 결론부터 말하자면 중복을 제거하기 위해서이다. 즉, 비일관성으로 인한 오류를 방지하기 위해서이다.정규화를 하지 않았을 경우에 테이블이 일관적으로 관리되는 것이 어렵다. 참고로, 가용성을 중요하게 생각하는 NoSQL DB는 오히려 중복을 장려한다.하지만 RDBMS의 경우에는 중복을 제거해야한다. 따라서 정규화가 필요하다. 정규화를 말하기 위해서는 함수 종속성이라는 개념이 필수적이다. 함수 종속성에 대해서는 앞서 따로 글을 썼다. 1. 정규화하지 않으면 발생하는 문제 현재 데이터베이스에 이 테이블 하나만 존재한다고 가정해보자.정규화가 되지 않은 상태이다. 아래 3가지 상황에서 각각 어떤 문제가 발생하는지 보면서 정규화의 필요성을 명확하게 알게된다. 1.1 insert 시 ..