분류 전체보기 269

Docker In Action 3. Software Installation Simplified

소프트웨어 식별하기 Named Repository 이름을 가진 저장소image를 모아둔 저장소. 이미지 저장소에 대한 주소는 위 예시 처럼 url 형식으로 표현된다.registry가 공개된 Docker Hub를 가리킬 경우 예시로 docker.io 호스트 이름을 가진다.{RegistryHost}/{UserName}/{ShortName}:{Tags} Tags각 이미지에 대한 빌드 태그(이름), git의 브랜치처럼 특정 기능 혹은 날짜에 대한 별칭을 의미.latest라는 특별 태그는 항상 최신으로 빌드된 이미지를 뜻 함.ex) nginx:latest 어디서 설치 하는가Repositories는 Registry에서 검색하여 이미지를 확인하고 설치할 수 있다.Docker Inc에서 관리하는 Docker Hub는 ..

Cloud/Docker 2023.10.16

Docker In Action 2. 도커 컨테이너에 실행하기

도커 컨테이너에 실행하기도커 명령어 docker help도커 명령어 리스트와 간단한 설명을 보여준다.Common Commands : run, exec, ps, build, pull, pushManagement Commands: builder, compose, container, image, networkSwarm Commands: swarmCommands: attach, commit, cp, create, diff, kill, start, stopdocker help cp자세한 명령어 사용법을 알 수 있다.웹 사이트 모니터 구축 예제웹 서버 nginx, 메일 전송 담당하는 mailer 그리고 이 두 어플리케이션을 모니터링하는 watcher 시스템을 구축해본다.nginx 웹 서버 : 80 port를 사용하..

Cloud/Docker 2023.10.15

Docker In Action 1. 도커 소개

Docker프로그램을 빌드에서 배포, 실행까지 편하게 실행할 수 있는 오픈 소스 프로젝트 docker run dockerinaction/hello_world 예시의 docker run 명령어는 다음을 실행한다.1. "dockerinaction/hello_world" 이미지를 찾는다.2. 로컬에 이미지가 설치되어 있지 않다면, Docker Hub라는 공용 이미지 보관소에서 해당 이름에 해당하는 이미지를 찾는다.3. 로컬로 이미지를 다운로드 한다.4. 컨테이너를 새로 실행하고 이미지에 명시된 프로그램을 실행한다. *Docker Hub는 Docker Inc.에 의해 제공되는 공개 레지스트리 (이미지 보관소)  도커의 컨테이너화실행되는 프로그램과 시스템 자원을 컨테이너로 제한 및 보호.일반적인 프로그램 실행CL..

Cloud/Docker 2023.10.15

[C#] Provider(공급자) - Observer(관찰자) 패턴

Provider - 이벤트를 발생시키면서(제공하면서) Observer를 관리하는 개체 자신이 관리하고 있는 Observer에 대하여 Subscribe하는 방법을 갖고 있고 이벤트 발생 함수를 invoke 한다. Observer - Provider가 발생시키는 이벤트를 구독한다. Observer는 Provider에 Subscibe 함수로 구독을 실행하고 그 반환 Unsubscribe 클래스 개체를 소유한다. Observer는 원할 때 Unbsubscribe 개체 인스턴스를 이용하여 구독을 취소한다. C# Provider는 IObserable 인터페이스를 구현한다. public interface IObservable { IDisposable Subscribe(IObserver observer); } IDis..

[단위 테스트] 데이터베이스 테스트

통합 테스트에서 중요한 의존성으로 취급되는 데이터베이스를 효과적으로 테스트하는 방법을 알아본다. 통합 테스트를 위한 데이터 베이스 준비 - 개발을 위한 데이터 스키마 관리 데이터베이스 스키마는 버전별로 항상 형상관리에 저장되어야 한다. - 데이터베이스 배포 방식 상태 기반 데이터 베이스 배포 방식 vs 마이그레이션 기반 데이터 베이스 배포 방식 상태 기반 방식 개발 내내 관리 되는 모델 데이터베이스가 존재. 배포 중 비교 도구가 스키마 차이를 인식하여 차이에 대한 업데이트를 운영 데이터베이스에 적용하기 위한 스크립트를 만들어낸다. 비교 도구는 불필요한 테이블을 삭제하고 새 테이블을 생성하고 컬럼명을 바꾸는 등 모델 데이터베이스와 동기화하는데 필요한 작업을 수행한다. 마이그레이션 기반 방식 데이터베이스 기..

[단위 테스트] 목 활용하기

테스트 대상 시스템과 외부 의존성간 상호작용을 검증하기 위해 사용되는 목 활용 모범 사례를 알아본다. CRM 예제에서 목의 사용 TEST(TestUserController, 통합_테스트_이메일_변경_사내도메인에서_외부도메인으로) { // given auto db = new Database(string("connection")); auto insertUser = User::CreateUser("user@mycorp.com", UserType::Employee); auto insertCompany = Company::CreateCompany("mycorp.com", 1); db->SaveUser(insertUser); db->SaveCompany(insertCompany); auto messageBusMoc..

[단위 테스트] 통합 테스트

통합 테스트 단위 테스트가 아닌 모든 테스트 ex) 여러 의존성을 걸친 로직을 테스트 하는 것 vs 단위 테스트 : 빠르게 수행되는 단일 동작 단위를 검증 좋은 통합 테스트는 높은 회귀 방지율과 훌륭한 리팩토링 내성을 가진다. 테스트 피라미드 단위 테스트로 갈 수록 테스트 개수가 많아야한다. 위로 갈수록 만드는 비용이 커지지만 잘 만든 테스트는 시스템 전체의 정확성을 보장한다. 빠른 실패 원칙과 통합 테스트 지난 테스트를 위한 리팩토링 예제의 마지막에서 변경될 이메일 주소가 같은 경우 이메일을 변경할 필요가 없으므로 이른 확인을 통해 Company 데이터 베이스 접근을 안하게 하는 로직으로 최적화 하였다. bool UserController::ChangeEmailV3(int userId, string n..

[단위 테스트] 단위 테스트 리팩토링

어떤 코드를 리팩토링 할 것인가? -> 어떤 코드가 중요한 지 파악한다. 복잡도 혹은 도메인 유의성 - 코드의 분기가 얼마나 많은가 - 프로젝트의 문제 도메인에 대해 얼마나 의미 있는가 협력자 수 - 클래스 또는 메서드가 가진 협력자 수 - 가변 의존성 혹은 외부 의존성 리팩토링 목표 지나치게 복잡한 코드를 리팩토링 하여 협력자수를 줄이거나 복잡도를 줄이는 방향으로 함 험블 객체 험블 객체 : 테스트 하기 어려운 부분을 험블 객체로 이동하여 의존성을 분리 -> 지나치게 어려운 코드를 만드는 의존성을 테스트 로직에서 제거해야함 -> 험블 객체라는 얇은 래퍼 클래스를 통해 의존성을 분리 함수형 아키텍처에서 코드 유형 분류 도메인 모델 및 알고리즘 : 함수형 코어 및 도메인 계층 컨트롤러 : 가변 셸 및 어플..

[단위 테스트] 단위 테스트 스타일

단위 테스트 스타일 출력 기반 테스트 상태 기반 테스트 통신 기반 테스트 출력 기반 스타일 테스트 대상 시스템 SUT에 입력을 넣고 생성되는 출력을 점검하는 방식 "함수형 프로그래밍" -> 사이드 이펙트가 없는 방식 상태 기반 스타일 작업이 완료된 이후 상태를 확인하여 검증하는 방식. SUT, 협력자 혹은 데이터 베이스나 파일 시스템과 같은 외부 의존성 등의 상태를 확인. 통신 기반 스타일 테스트 대상과 협력자간의 통신을 검증한다. 출력 기반 vs 상태 기반 vs 통신 기반 출력 기반이 가장 단순하고 유지 보수하기 쉽다. 구현 세부사항과 결합이 거의 없다. 상태 기반은 거짓 양성이 되기 쉽다. 테스트 코드와 제품 코드의 결합도가 높아지기 때문. 통신 기반 규모가 있고 복잡하여 유지 보수하기 어렵다. 출력..