Tech News
[TechNews] 유용한 개발 관련 아티클 및 영상 #17
망나니개발자
2024. 4. 26. 10:00
반응형
1. 유용한 개발 관련 아티클 및 영상 #17
애플리케이션 아키텍처와 객체 지향 (KUSG 조용호님 발표)
- 도메인 레이어를 설계하는 방법
- 절차지향(트랜잭션 스크립트)
- 다루어야 하는 데이터와 데이터를 조작하는 프로세스가 별도로 존재함
- 애너믹 데이터 모델(도메일이 로직이 아닌 속성 만을 가짐)
- 서비스들이 DAO들을 주입받고 절차적으로 작성함
- 테이블과 모델이 1대1로 매칭되는 구조이며, DAO는 테이블 데이터 게이트웨이에 해당함
- 객체지향(도메인 모델)
- 프로세스와 데이터를 하나의 덩어리로 묶어서 생각하는 것
- 객체지향 기반의 도메인 레이어 설계가 필요함
- 주어진 책임을 수행하며 협력하는 객체들의 공동체 집합이며, 메시지로 협력함
- 애플리케이션 계층: 애플리케이션 플로우에 대한 로직을 담당함, 애플리케이션 경계에 해당하며 도메인 로직의 재사용을 촉진함
- 도메인 계층: 비기술적인 순수한 도메인에 대한 로직을 담당함, 보호해야 하는 대상
- 책임 할당은 기본적으로 가장 많은 정보를 갖는 객체에게 이루어져야 함
- 도메인 모델에서도 데이터를 읽고 써야하는 것은 동일함
- 절차지향(트랜잭션 스크립트)
- 도메인 모델을 사용하는 경우
- 객체-관계 임피던스 불일치
- 객체 모델과 DB 스키마 사이의 불일치, 객체 패러다임과 관계 패러다임 간의 불일치
- 데이터 관점에서의 가장 큰 미덕은 중복 제거, 애플리케이션 관점에서의 가장 큰 미덕은 유연성 + 변경 용이성
- 따라서 객체지향적으로 갈수록 불일치가 심해짐
- 데이터 매퍼(ORM)의 필요성
- 객체와 데이터 간의 불일치를 해결하기 위해 존재하는 역할
- 객체 모델과 DB 스키마 간의 독립성을 유지시켜줌, 도메인 객체는 DB에 대해 독립적임
- DB 모델과 객체 모델 간의 간격이 큰데, 객체지향적으로 만들기 위해 도와주는 것이 데이터 매퍼이자 ORM
- 객체-관계 임피던스 불일치
- 무엇을 선택할 것인가?
- 절차지향 방식을 사용할 경우
- 뚱뚱한 서비스(fat service) 문제와 도메인의 재사용이 어려운 문제가 발생할 수 있음
- 이로 인해 테스트가 어려워질 수 있음
- 기존 코드에서 일부를 변경해야 하기 때문에 사이드 이펙트가 발생할 수 있음
- 암묵적으로 도메인 개념이 숨겨질 수 있음
- 객체지향 방식을 사용할 경우
- 컴포지트 패턴 등을 통해 기존 코드를 사용하지 않고 새로운 기능을 추가할 수 있음(OCP)
- 추상화가 높은 수준을 향하여 객체들의 의존 방향이 분리됨(DIP)
- 추상화된 객체들을 대상으로 효율적인 커뮤니케이션이 가능하고, 추상화된 도메인을 바탕으로 도메인 계층이 탄생함
- 클래스를 통해 도메인의 개념이 명시적으로 표현됨
- 변경에 유연하므로 도메인 모델로 구성하는 것이 좋으며, 같이 일하는 동료들의 수준을 고려해야 함
- 절차지향 방식을 사용할 경우
- 현실과 이상의 차이
- 우리는 미래의 요구 사항을 알 수 없으므로, 대부분 현재 코드는 요구 사항 변경에 적합하지 않을 것임
- 최대한 단순하고 깔끔하게 짜고, 요구사항이 들어왔을 때 싹 바꾸는 것은 불가능함
- 따라서 변경이 발생할 때마다 끊임없는 리팩터링을 통해 변경하기 쉽게 개선시켜야 함
도메인 모델은 복잡성을 알고리즘에서 분리하고 객체 간의 관계로 만들 수 있다. 유효성 검사, 계산, 파생 등이 포함된 복잡하고 끊임없이 변하는 비즈니스 규칙을 구현해야 한다면 객체 모델을 사용해 비즈니스 규칙을 처리하는 것이 현명하다
- 마틴 파울러 -
출처: https://www.youtube.com/watch?v=26S4VFUWlJM
크롬의 암호화를 위한 양자컴퓨팅 도입
- Google의 모든 팀은 양자 내성 암호화로의 전환을 위해 웹을 준비하기 위해 준비중임
- Chrome 116부터 TLS에서 대칭 비밀을 설정하기 위해 X25519Kyber768을 지원하기 시작함
- 두 가지 암호화 알고리즘의 출력을 결합하여 TLS 연결의 대부분을 암호화하는 데 사용되는 세션 키를 생성함
- X25519: 현재 TLS에서 키 합의에 널리 사용되는 타원 곡선 알고리즘
- Kyber-768: 양자 내성 키 캡슐화 방법 및 일반 암호화를 위한 NIST의 PQC 우승자
- 에코시스템의 비호환성을 파악하기 위해 TCP 및 QUIC을 통해 Chrome과 Google 서버에 적용하고 호환성 문제가 발생할 수 있는지 모니터링하고 있음
- 지금부터 트래픽 보호를 시작하는 이유는 특정 암호화 사용은 데이터를 지금 수집하고 저장했다가 나중에 암호화 분석이 개선되면 해독하는 'Harvest Now, Decrypt Later' 공격 유형에 취약하기 때문임
- TLS에서 전송 중인 데이터를 보호하는 대칭 암호화 알고리즘은 양자 암호 분석에 대해 안전한 것으로 간주되지만 대칭 키를 생성하는 방식은 그렇지 않음
- 즉, Chrome에서 양자 내성 세션 키를 사용하도록 TLS를 더 빨리 업데이트할수록 향후 양자 암호 분석으로부터 사용자 네트워크 트래픽을 더 빨리 보호할 수 있음
출처: https://blog.chromium.org/2023/08/protecting-chrome-traffic-with-hybrid.html
넷플릭스의 90초
- 넷플릭스는 구독자가 접속하고 관심을 끌 수 있는 시간을 90초라고 주장함, 90초 안에 동영상을 보지 않으면 서비스 해지할 위험이 커짐
- 그래서 넷플릭스는 구독자들이 추천 알고리즘을 사용하지 않으면 10억달러의 손실을 입을 것으로 추정하며, 추천 알고리즘은 넷플릭스의 가장 중요한 자산임
- 2006년 넷플릭스는 추천 알고리즘 경진 대회를 개최했음
- 우승 조건은 기존 넷플릭스의 추천 알고리즘보다 10% 향상된 알고리즘을 만드는 것
- 넷플릭스는 우승한 알고리즘을 사용하지 않았지만, 대회를 통해 “알고리즘이 투자 대비 수익이 더 이상 높아지지 않는 순간”이 있다는 중요한 사실을 발견했음
출처: https://rafikiresearch.blogspot.com/2022/04/column-9020220423.html#google_vignette
Vertical Slice 방식으로 GraphQL 애플리케이션을 TDD로 구현하기
- Vertical Slice 아키텍처란?
- 계층이 아니라 기능별로 구현하는 방식, 각 요청을 개별적인 유스케이스로 취급함
- 레이어를 가로질러 커플링하는 대신 슬라이스를 따라 수직으로 커플링함, 슬라이스 간의 결합은 최소화하고 슬라이스 내 결합은 최대화 함
- 정원 가꾸기를 계속해서 하지 않으면 기술 부채
- TDD로 구현하기
- 기본적으로 실패하는 인수테트 작성 → (실패하는 단위 테스트 작성 → 테스트 통과 → 리팩토링) * N 방식으로 구현함
- 설계를 고려하지 않고 절차적으로 구현해서 테스트 클래스에 구현하기
- 테스트 코드에서 구현을 한 후에 추출해서 모델(프로덕션) 코드로 옮김
출처:
https://www.youtube.com/watch?v=ASSp38BguWI
Top 10 Kotlin Questions 2024(2024 10가지 코틀린 주요 질문들)
- Kotlin에서의 람다 표현식
- 함수를 명시적으로 선언하지 않고도 함수와 유사한 구조를 간결하게 정의할 수 있는 방법
- 이를 통해 함수를 인수로 전달하거나 변수에 저장할 수 있는 코드 블록을 만들 수 있음
- Kotlin에서 고계함수의 개념
- 다른 함수를 매개변수로 받거나 함수를 결과로 반환할 수 있는 함수
- 함수를 1급 시민으로 취급하여 함수형 프로그래밍 패러다임을 가능하게 함
- Kotlin에서 확장함수의 개념
- 소스 코드를 변경하지 않고도 기존 클래스에 새 함수를 추가할 수 있는 기능을 제공함
- 상속을 사용하거나 원본 클래스를 직접 수정하지 않고도 클래스의 기능을 확장할 수 있음
- Kotlin에서 Sealed 클래스의 개념
- 상속 계층 구조를 그 안에 정의된 제한된 하위 클래스 집합으로 제한하는 클래스로
- 모든 서브클래스를 미리 알고 처리해야 하는 제한된 유형 계층 구조를 표현하려는 경우에 특히 유용함
- Kotlin에서 object 표현식의 개념
- Kotlin의 object 표현식을 사용하면 사용자 지정 동작 및 속성을 가진 익명 개체를 만들 수 있음
- 새로운 named 클래스를 명시적으로 선언하지 않고 일회성 객체를 생성해야 할 때 특히 유용함
- Kotlin에서 reified object 표현식의 개념
- reified 키워드를 제네릭 타입 파라미터에 inline과 함께 적용하면, 런타임에 일반 매개 변수의 유형 정보에 액세스할 수 있음(보통 타입 소거로 인해 타입 정보는 런타임 중에 사용할 수 없음)
- 이를 통해 프로퍼티를 확인하거나 함수를 호출하는 등 유형에 대한 작업을 수행할 수 있음
- Kotlin에서 delegates의 개념
- 프로퍼티 또는 함수의 구현을 다른 개체에 위임하는 메커니즘을 제공함
- 상속을 사용하지 않고도 공통 동작을 재사용하거나 기존 개체에 추가 기능을 쉽게 추가할 수 있음
- Kotlin에서 연산자 오버로딩의 개념
- 연산자 오버로딩을 통해 연산자에 대한 사용자 지정 동작을 정의할 수 있음
- 이를 통해 +, -, *, / 등과 같은 연산자에 대한 특수한 구현을 제공할 수 있음
- Kotlin에서 꼬리 재귀의 개념
- 꼬리 재귀는 재귀 함수가 최종 연산으로 자신을 호출하는 기술임, 이를 통해 컴파일러가 재귀를 효율적인 루프로 최적화하여 스택 오버플로 오류를 방지할 수 있음
- 꼬리 재귀 최적화를 트리거하려면 재귀 함수에 tailrec 키워드를 선언해야 함
- Kotlin에서의 클로저
- 프로그래밍에서 클로저는 해당 범위의 실행이 끝난 후에도 해당 범위를 둘러싼 범위의 변수 및 매개변수에 대한 접근 권한을 유지하는 함수를 의미함
- 클로저는 필요한 변수를 캡처하여 저장하고 나중에 함수가 호출될 때 액세스할 수 있고, 캡처된 변수는 그 상태를 유지하며 클로저 내에서 변수에 대한 모든 수정 사항이 보존됨
출처: https://medium.com/@mohit2656422/top-10-kotlin-questions-2024-365bc020198f
반응형