전체 글 (71) 썸네일형 리스트형 Clean Architecture 정리 – 5부 15장 아키텍처 아키텍처란시스템의 형태이다.어떤 컴포넌트들로 구성되어있고, 컴포넌트들이 어떻게 배치되며, 상호작용하는지 등을 정의한다.이러한 형태는 단순한 구조적 정보 이상을 담는다.개발, 배포, 운영, 유지보수의 모든 흐름에 영향을 준다. 개발 측면에서 본 아키텍처초기에는 아키텍처를 고려하는 것이 오히려 방해가 될 수 있다.그러나 프로젝트가 커지거나 오래 살아남는 시스템일수록 아키텍처의 진가가 드러난다. 배포 측면에서 본 아키텍처처음부터 배포를 고려하지 않으면,서비스는 코드 완성과는 무관하게 “배포하기 번거롭거나 심하게는 배포 할 수 없는 상태”에 빠질 수 있다.서비스가 하나의 단위로 배포 가능한지, 분리된 기능이 독립적으로 배포 가능한지 등을 아키텍처에서 고민해야 한다. 운영 측면에서 본 아키텍처대부분의 운영 문제는.. Clean Architecture 정리 - 컴포넌트 원칙 (2) 지난 글에 이어서 정리.https://goto-helloworld.tistory.com/120SDP (Stable Dependencies Principle) — 안정된 의존성 원칙더 안정된 컴포넌트에 의존하라[ 안정적인 컴포넌트는 쉽게 변경되지 않기 때문이다. ] 컴포넌트의 크기, 복잡도, 간결함 등 변경을 쉽게 하지 못하게 하는 다양한 요소가 있지만, 여기서는 "얼마나 많은 컴포넌트들이 의존하고 있는가"에 주목한다. 많은 컴포넌트가 의존한다는 건, 사소한 변경에도 연쇄적으로 영향을 준다는 뜻이다. 결과적으로 해당 컴포넌트는 변경이 어렵다. (= 안정적인 컴포넌트다. ) 안정성 지표: 컴포넌트의 수치화된 안정성 안전성 지표는 들어오고 나가는 의존성의 개수를 계산한다.Fan-in: 다른 컴포넌트가 이 컴.. 인공지능 기반 카메라 감지 프로젝트: 백그라운드 동작 이슈 해결기 현재, 인공지능 툴을 활용해 카메라로 행동을 감지하고 유의미한 결과를 제공하는 프로젝트를 진행 중이다.이 프로젝트에서 중요한 포인트는 지속적으로(끊임없이) 카메라의 정보를 분석해야 한다는 점이었다. 하지만 실제 구현 과정에서 브라우저 탭이 비활성화되거나 다른 프로그램을 사용하면 감지 분석 및 결과 알림이 작동하지 않는 문제가 발생했다.문제 상황 1: requestAnimationFrame의 한계 💡 추론브라우저 탭이 백그라운드로 전환되면 requestAnimationFrame이 멈출 것 같다. 실제로 다음과 같이 작성한 코드에서 문제가 발생했다:window.requestAnimationFrame(() => this.predictWebcam()); 공식 문서에 따르면:"requestAnimationFra.. 왜 memo에서 객체 리터럴은 리렌더링되고, useState 객체는 리렌더링되지 않을까? React.memo는 전달된 props가 이전과 얕은 비교(shallow equal) 시 같다면, 컴포넌트를 리렌더링하지 않는다.JavaScript의 얕은 비교는 === 연산자로 판단되며, 객체는 참조값이 같아야 === 연산자의 결과가 true가 된다.객체 리터럴 사용 시 문제'use client'import { memo, useState } from "react";const Test = () => { const object = { count: 0 }; // 매 렌더마다 새 객체 생성 const [count, setCount] = useState(0); return ( setCount(c => c + 1)}>Click {count} .. Clean Architecture 정리 - 4부 컴포넌트 원칙(1) 이 단원에서 말하는 컴포넌트는 '릴리즈 단위'를 의미한다.어떤 컴포넌트에 어떤 클래스, 모듈을 포함시켜야 할까?책에서는 세 가지 원칙을 제시한다.REP (Reuse/Release Equivalence Principle): 재사용/릴리즈 등가 원칙CCP (Common Closure Principle): 공통 폐쇄 원칙CRP (Common Reuse Principle): 공통 재사용 원칙 REP: 재사용/릴리즈 등가 원칙하나의 컴포넌트로 묶인 클래스는 반드시 함께 릴리즈되어야 한다.클래스 하나만 변경되더라도, 전체 컴포넌트를 릴리즈해야 한다.모든 클래스는 같은 버전 번호로 관리되어야 하며, 동일한 릴리즈 문서에 포함되어야 한다.이 원칙을 따르면:릴리즈 버전으로 동일한 시점의 코드를 사용 중인지 확인할 수 있.. Clean Architecture 정리 - 3부 11장 의존성 역전 원칙 의미기본적으로 컴포넌트는 다른 컴포넌트를 직접 참조하여 사용한다.예) A -> B (A가 B를 직접 참조)하지만 DIP에서는 다음과 같은 구조를 권장한다:A -> Interface 즉, 구체 클래스가 아닌 추상 인터페이스를 사이에 두고 의존한다.why? 구체 클래스보다 추상 인터페이스가 변동성이 낮다. 이 방향 전환, 즉 구체가 추상에 의존하는 구조가 바로 "의존성 역전(Dependency Inversion)"이다.의존성 역전을 고려하지 않아도 되는 경우매우 안정적이고 변동성이 없는 요소들에는 DIP를 적용하지 않아도 된다.예: String, int 같은 기본 타입, 운영체제 API, 플랫폼 API 등 변경될 가능성이 없다면 의존해도 된다.따라서 우리가 보통 개발하는 대부분의 비즈니스 로직 관련 클래스는.. Clean Architecture 정리 - 3부 10장 인터페이스 분리 법칙 정의인터페이스가 다양한 역할(≠기능)을 처리하게 만드는 청사진이 되지 않도록, 역할 단위로 잘게 나누어야 한다는 뜻이다.인터페이스가 지나치게 클 때 발생하는 문제여러 객체가 하나의 인터페이스를 채택해 기능을 구현한다고 하자. 그런데 모든 객체가 그 인터페이스의 모든 기능을 사용하는 것은 아니다. 이런 상황에서 인터페이스가 일부 수정되면, 그 수정된 부분이 논리적으로 어떤 객체에는 전혀 필요 없는 것일 수 있다. 하지만, 해당 객체는 인터페이스를 구현하고 있기 때문에 코드상으로는 그 변경을 반영해야 한다. 결과적으로, 불필요한 의존성과 변경 전파가 발생하게 된다. 이는 유지보수를 어렵게 만든다.아키텍처 수준에서의 인터페이스 분리 법칙이 원칙은 단순히 객체의 메서드 인터페이스에만 국한된 이야기가 아니다. 모.. Clean Architecture 정리 - 3부 9장 리스코프 치환 원칙 정의1988년 바바라 리스코프는 다음과 같은 치환 원칙을 제시했다.S 타입의 객체 o1 각각에 대응하는 T 타입 객체 o2가 있고, T 타입을 이용해서 정의한 모든 프로그램에서 o2의 자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입이다.쉽게 말하면, 부모 클래스의 객체가 사용되는 자리에 자식 클래스의 객체를 넣거나, 인터페이스를 구현한 객체가 사용되거나, REST API에서 계약된 포맷을 따르는 구현체가 사용되거나 하는 등, 특정 계약이나 역할을 정의하는 상위 존재를 따라 구현한 경우에는 그 치환이 시스템 동작에 영향을 주지 않아야 한다는 것이다.원칙을 지키지 않은 구조: 알림 전송기 예제아래는 알림을 전송하는 Notifier 클래스와 이를 확장한 EmailNotifier,.. 이전 1 2 3 4 ··· 9 다음