2025의 게시물 표시

Aspect-Oriented Programming의 이해와 적용

객체 지향 프로그래밍(Object-Oriented Programming, a.k.a. OOP)은 코드를 객체라는 독립적인 모듈로 묶어 관리한다. 각 객체는 관심사의 분리 원칙에 따라 만들어져야 하는데, 이는 각 객체가 자신의 특정 책임에 집중해야 한다는 의미다. 그러나 실제 서비스를 개발하다보면 여러 객체나 모듈에 걸쳐 공통적으로 나타나는 기능들을 종종 만나게 된다. 이렇게 여러 모듈에 걸쳐 있는 기능들을 횡단 관심사 (Cross-cutting Concerns)라고 부른다. 횡단 관심사가 가지는 문제점 Scattering 이러한 횡단 관심사들은 OOP만으로 다룰 경우 두 가지 주요 문제를 만든다. 첫 번째 문제는 Scattering 이라고 부른다. Scattering은 특정 기능의 코드가 복사 붙여넣기를 통해 여러 곳에 흩뿌려지는 현상을 말한다. 예를 들어, 모든 함수에 사용자 권한 확인 로직과 로깅 코드를 추가한다고 해보자. 동일한 로깅 및 권한 확인 코드가 각 메서드 내에 반복적으로 나타날 것이다. Tangling 다른 문제는 Tangling 이다. 직역하면 얽힘이라고 할 수 있는데, 이는 비즈니스 로직과 횡단 관심사의 코드가 하나의 모듈이나 함수 안에서 뒤섞여 복잡해지는 현상을 말한다. get_book_info 함수의 주된 목적은 원하는 책의 정보를 찾는 것이다. 하지만 로깅, 권한 확인, 성능 측정 등 다양한 관심사가 그 안에 뒤얽혀 있다. 이 때문에 이 함수의 가독성은 떨어지고 핵심 비즈니스 로직을 파악하기 어려워진다. 이는 마치 지저분한 책상과 같다. 익숙해지면 무엇이 어딨는지 한 번에 알 수 있지만, 익숙하지 않은 사람은 무엇이 어디있는지 찾기 힘들어진다. Aspect-Oriented Programming의 등장 관점 지향 프로그래밍(Aspect-Oriented Programming, a.k.a. AOP)은 이런 문제를 비즈니스 로직 과 횡단 관심사 를 분리하여 해결하려 한다. AOP는 90년대 후반 Xerox PARC...

USB를 이용한 전원 공급 (2) - USB PD

이미지
USB 포트는 원래 데이터 전송을 위한 인터페이스였지만, 시간이 지나면서 전력 공급 수단으로도 활용되기 시작했다. 이를 지원하기 위해 USB BC 가 도입되었고, 기존보다 높은 전류를 제공할 수 있도록 개선되었다. 하지만 USB BC 1.2는 5 V 전압 고정이라는 한계를 갖고 있어, 노트북 같은 고출력 기기를 충전하기에는 부족했다. 이런 제약 조건을 해결하기 위해 제조사마다 별도의 급속 충전 방식을 만들기 시작했고, 이로 인해 특정 브랜드의 디바이스는 해당 브랜드의 충전기에서만 고속 충전이 가능한 호환성 문제도 발생하였다. 이러한 문제를 해결하기 위해 USB-IF는 USB Power Delivery(a.k.a. USB PD)라는 전력 공급을 위한 새로운 표준을 만들었다. USB PD는 전압과 전류를 동적으로 협상하는 방식을 채택하여, 5 V 뿐만 아니라 9 V , 15 V , 20 V 등 다양한 전압을 지원하고 최대 240 W 까지 전력을 공급할 수 있도록 설계되었다. 이를 통해 스마트폰부터 노트북, 모니터, 이론상으로는 일부 데스크톱 기기까지 USB-C 하나로 전원 공급이 가능해졌으며, 장치 간의 호환성과 범용성이 크게 향상되었다. USB PD와 CC 라인 USB PD가 USB BC보다 더 많은 전력을 공급할 수 있었던 것은 Type-C 컨넥터, 특히 CC 핀의 존재 덕분이다. USB Type-C 커넥터는 좌우 대칭 구조를 채택하여 어느 방향으로 꽂아도 동작할 수 있도록 설계되었으며, 이 방향 감지를 담당하는 것이 바로 Configuration Channel(a.k.a. CC) 핀이다. 기본적으로 CC 핀은 케이블의 방향을 감지하고, 연결된 장치가 전력 공급자인지 소비자인지 식별하는 데 사용된다. USB PD에서는 이 CC 핀을 이용해 전력 협상을 위한 디지털 통신을 수행한다. 소스 디바이스(전력을 공급하는 기기)는 자신이 제공할 수 있는 전력 프로파일을 CC 핀을 통해 싱크 디바이스(전력을 소비하는 기기)에게 알리고, 싱크 디바이스는 그 중...

USB를 이용한 전원 공급 (1) - USB BC

이미지
USB는 데이터 전송을 목적으로 설계되었지만, 전원 공급 기능도 포함하고 있다. 이는 USB로 연결된 간단한 저전력 기기를 동작시키기 위한 것이다. 그래서 USB 2.0에서는 5V 전압과 0.5A의 전류를, USB 3.2에서는 5V 전압과 0.9A의 전류 공급이 가능하다. 하지만 이 스펙은 어디까지나 USB를 통한 데이터 통신을 하는 데 필요한 디바이스를 동작시키기 위함이지, USB를 전원 공급을 위해 이용하려는 목적은 아니었다. 따라서 저전력 기기가 아닌 외장 하드 같은 디바이스는 별도의 전원 공급을 필요로 했고, USB를 통한 전원 충전은 USB가 본래 의도했던 기능이 아닌 일종의 부작용에 가까운 일이었다. 하지만 iPod을 비롯한 많은 MP3 플레이어나 PMP 플레이어들이 이를 이용한 충전 기능을 가지고 나왔다. 어차피 데이터 통신을 위해 USB 포트가 필요하니 별도의 충전 포트를 만드는 것보다 USB 포트를 재사용하는 것이 기기를 싸고 가볍고 작게 만들 수 있었기 때문이다. 결국 브랜드마다 독자적인 USB를 통한 전원 충전 규격들이 만들어졌. 사람들은 이런 혼란스러운 상황이 해결되기를 원했고, 결국 2007년 USB-IF는 USB Battery Charging(a.k.a. BC)라는 표준을 만들어 USB 충전기를 표준의 영역으로 가지고 왔다. SDP DCP CDP 데이터 전송 가능 데이터 전송 불가 데이터 전송 가능 최대 0.5A(USB 2.0) 최대 0.9A(USB3.x) 최대 1.5A 최대 1.5A 별도 핸드셰이크 없음 D+/D- 쇼트 D+/D- 라인에 독립적으로 전압을 가해 핸드셰이크 데스크톱, 노트북 등에서 사용 USB 충전기에서 주로 사용 데스크톱, 노트북...

USB 3.x 케이블 무엇을 골라야 하나

3.1? 3.2? 이건 뭐지? Gen 1? Gen 2? 이건 뭐지? USB 케이블이 필요해 인터넷에 검색하면 다양한 케이블이 나온다. 여기서 적당한 케이블을 골라야 하는데 보통은 여기서부터 막막해진다. 3.1과 3.2의 차이는 무엇이고 3.1 Gen 2와 3.2 Gen 2는 무슨 차이가 있을까? 3.2 Gen 1은 3.1 Gen 2보다 좋은 것일까? 사람들에게 혼란을 주는 가장 큰 요인은 USB 3.x의 복잡한 명명 방식이라고 생각한다. USB 3.0, USB 3.1, USB 3.2. 이름만 보면 USB 3.1은 USB 3.0보다 발전됐고, USB 3.2는 USB 3.1보다 발전된 것으로 보인다. 하지만 USB 3.2에서 규정하는 모든 기술이 USB 3.1에서 규정하는 모든 기술보다 발전한 기술은 아니다. 그 이유는 이들 표준이 이전 버전을 포함하는 방식으로 설계됐기 때문이다. 예를 들어, USB 3.1 표준은 USB 3.0 표준 문서에서 정의된 기능과 추가된 기능을 포함하며, USB 3.2 표준은 USB 3.1 표준 문서에서 정의하는 기능과 새로운 기능을 포함하고 있다. 이렇게 포함 구조로 설계된 표준은 표준 문서라는 기술적 측면에서는 합리적인 선택이다. 하지만 이런 이름이 좋은 브랜딩 방식이라고 생각하지 않는다. 예를 들어 이 글에서도 USB 3.x 표준에 기반한 케이블은 정확히 부를 이름이 없어 그냥 USB 3.x라는 이름으로 뭉뜽그려 부르고 있다. 이와 같은 혼란을 해소하기 위해 USB4에서는 모든 표준을 USB4라는 하나의 브랜드로 묶고, 표준 문서에 Version 1과 Version 2라고 버전을 붙이는 방식을 택했다. 이는 소비자들이 버전 간 차이를 명확히 이해할 수 있도록 노력한 것으로 보인다. USB 3.0 우선 USB 3.0이 USB 2.0과 비교해 가지는 가장 큰 장점은 전송속도다. 기존에 사용하던 USB 2.0 케이블은 최대 480 Mbps. 즉, 60 MB/s의 전송 속도를 가졌다. USB 2.0이 도입되던 ...

이 블로그의 인기 게시물

USB 2.0 케이블의 내부 구조

[C++] enum class - 안전하고 쓰기 쉬운 enum

[Web] SpeechSynthesis - TTS API

터미널 출력 제어를 위한 termios 구조체 이해하기

Linux의 clear와 Mac의 clear는 다르다