blog
Articles of July Week 3
2025년 7월 23일·4분 읽기
- Go 는 다른 OOP 언어와 달리 상속이 없는 대신 합성(composition)과 인터페이스 임베딩(interface embedding) 을 사용한다.
- 구조체(struct)는 데이터 타입의 합성체인 동시에, 모델링 또는 구조화된 경량 컨테이너 역할을 하여 애플리케이션의 데이터 구조를 정의한다.
- 메서드(method)는 특정 타입과 연관된 함수로, 구조체의 행동을 정의해야 할 때 사용된다. (그래서 리시버가 붙어 구조체의 행동을 정의하는 듯)
- 인터페이스는 어떠한 타입(구조체)가 수행해야 할 메서드의 시그니처를 정의한다. 다른 OOP 언어와 달리 Go 의 인터페이스는 암시적이므로 구조체가 명시적으로 특정 인터페이스를 구현한다고 선언하지 않아도 된다.
그럼 어떻게 구조체는 특정 인터페이스를 구현하느냐? 그저 인터페이스에 정의된 모든 메서드를 구현하기만 하면 자동으로 해당 인터페이스를 충족하는걸로 간주된다.
- 벡터 DB 란 문장을 벡터 값(숫자 배열)으로 변환해서 저장하는 DB. 사용자가 안녕하세요 키워드 입력 시 해당 문장을 벡터 값으로 변환하여 기존에 저장돼 있던 벡터들과 유사도를 계산한다.
유사도의 임계값(threshold)에 충족되면 미리 준비된 응답을 반환하는 형태.
chromem-go 라는 임베디드 벡터 DB 를 사용하여 네트워크 지연이나 추가 인프라 비용을 절감함. (인메모리 DB 를 사용한 격)
- 벡터 DB 에 미리 문장 세트를 준비하기 위해 DBSCAN 이란 밀도 기반의 알고리즘 채택 -> 비슷한 문장들이 많이 모여있으면 하나의 그룹으로 묶고, 혼자 떨어져 있는 이상한 문장은 노이즈로 분류.
미리 수집한 문장을 유사한 그룹으로 분류하여 캐싱
- pydantic 이 항상 최선의 선택이 아니다. request 뿐 아니라 request output, object creation 에도 pydantic 이 적용돼 다중 검증으로 인한 런타임 오버헤드가 커짐.
OLX 개발팀은 pydantic 을 request 에만 적용하고 나머지는 dataclasses 의 slots 옵션을 사용하도록 전환. slots=True 는
__dict__ 제거로 메모리 효율성이 향상된다.
일반적인 클래스는 객체에 __dict__ 포인터를 활용하여 값을 참조하지만 slots=True 옵션을 사용하면 __dict__ 포인터를 제거하고 객체에 직접 값을 저장한다.
__dict__ 가 사라져 메모리 효율성 뿐만 아니라 접근 속도도 개선됨.