아론 벤튼은 혁신적인 모바일 애플리케이션 개발을 위한 창의적인 솔루션을 전문으로 하는 숙련된 아키텍트입니다. 그는 10년 이상 ColdFusion, SQL, NoSQL, JavaScript, HTML 및 CSS를 포함한 전체 스택 개발 분야에서 경력을 쌓았습니다. 현재 노스캐롤라이나주 그린즈버러에 위치한 Shop.com의 애플리케이션 아키텍트인 Aaron은 카우치베이스 커뮤니티 챔피언.
FakeIt 시리즈 4/5: 기존 데이터로 작업하기
지금까지 FakeIt 시리즈를 통해 가짜 데이터 생성, 데이터 및 종속성 공유를 사용하여 소규모 모델에 대한 정의. 오늘은 입력을 통해 기존 데이터로 작업하는 FakeIt의 마지막 주요 기능에 대해 살펴보겠습니다.
개발자로서 그린필드 애플리케이션에서 작업하는 이점을 누리는 경우는 드물며, 우리 도메인은 다양한 레거시 데이터베이스와 애플리케이션으로 구성되어 있는 경우가 많습니다. 새로운 애플리케이션을 모델링하고 구축할 때는 이러한 기존 데이터를 참조하고 사용해야 합니다. FakeIt 를 사용하면 JSON, CSV 또는 CSON 파일을 통해 모델에 기존 데이터를 제공할 수 있습니다. 이 데이터는 각 모델의 *run 및 *build 함수에서 입력 변수로 노출됩니다.
사용자 모델
가장 최근에 업데이트한 users.yaml 모델부터 시작하겠습니다. 최근 게시물 사용하려면 주소 그리고 전화 정의.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
이름: 사용자 유형: 객체 키: _id 데이터: 분: 1000 최대: 2000 속성: _id: 유형: 문자열 설명: 그리고 문서 id built by 의 접두사 "user_" 그리고 의 사용자 id 데이터: post_build: "`user_${this.user_id}`" doc_type: 유형: 문자열 설명: 그리고 문서 유형 데이터: 값: "user" user_id: 유형: 정수 설명: An 자동-증분 숫자 데이터: 빌드: 문서_색인 first_name: 유형: 문자열 설명: 그리고 사용자 먼저 이름 데이터: 빌드: faker.이름.이름() last_name: 유형: 문자열 설명: 그리고 사용자 마지막 이름 데이터: 빌드: faker.이름.성() 사용자 이름: 유형: 문자열 설명: 그리고 사용자 이름 데이터: 빌드: faker.인터넷.사용자 이름() 비밀번호: 유형: 문자열 설명: 그리고 사용자 비밀번호 데이터: 빌드: faker.인터넷.비밀번호() 이메일_주소: 유형: 문자열 설명: 그리고 사용자 이메일 주소 데이터: 빌드: faker.인터넷.이메일() created_on: 유형: 정수 설명: An epoch 시간 의 언제 의 사용자 는 생성 데이터: 빌드: new 날짜(faker.날짜.과거()).getTime() 주소: 유형: 객체 설명: An 객체 포함 의 홈 그리고 작업 주소 에 대한 의 사용자 속성: 홈: 설명: 그리고 사용자 홈 주소 스키마: $ref: '#/정의/주소' 작업: 설명: 그리고 사용자 작업 주소 스키마: $ref: '#/정의/주소' 메인_전화: 설명: 그리고 사용자 메인 전화 숫자 스키마: $ref: '#/정의/전화' 데이터: post_build: | 삭제 이.메인_전화.유형 반환 이.메인_전화 추가_전화: 유형: 배열 설명: 그리고 사용자 추가 전화 숫자 항목: $ref: '#/정의/전화' 데이터: 분: 1 최대: 4 정의: 전화: 유형: 객체 속성: 유형: 유형: 문자열 설명: 그리고 전화 유형 데이터: 빌드: faker.무작위.배열 요소([ '홈', '일', '모바일', '기타' ]) 전화 번호: 유형: 문자열 설명: 그리고 전화 숫자 데이터: 빌드: faker.전화.전화 번호().대체(/[^0-9]+/g, '') 확장: 유형: 문자열 설명: 그리고 전화 확장 데이터: 빌드: 기회.bool({ 가능성: 30 }) ? 기회.정수({ 분: 1000, 최대: 9999 }) : null 주소: 유형: 객체 속성: 주소_1: 유형: 문자열 설명: 그리고 주소 1 데이터: 빌드: `${faker.주소.거리 주소()} ${faker.주소.거리 접미사()}` 주소_2: 유형: 문자열 설명: 그리고 주소 2 데이터: 빌드: 기회.bool({ 가능성: 35 }) ? faker.주소.보조 주소() : null 지역: 유형: 문자열 설명: 그리고 도시 / 지역 데이터: 빌드: faker.주소.도시() 지역: 유형: 문자열 설명: 그리고 지역 / 상태 / province 데이터: 빌드: faker.주소.stateAbbr() 우편_코드: 유형: 문자열 설명: 그리고 zip 코드 / 우편 코드 데이터: 빌드: faker.주소.zipCode() 국가: 유형: 문자열 설명: 그리고 국가 코드 데이터: 빌드: faker.주소.국가 코드() |
현재 주소 정의는 임의의 국가를 생성하는 것입니다. 이커머스 사이트에서 195개 국가 중 일부 국가만 지원한다면 어떻게 해야 할까요? 우선 6개 국가를 지원한다고 가정해 보겠습니다: 미국, 캘리포니아, 멕시코, 영국, 에스파냐, 독일. 정의 국가 속성을 업데이트하여 임의의 배열 요소를 가져올 수 있습니다:
(간결성을 위해 다른 프로퍼티는 모델 정의에서 제외했습니다.)
1 2 3 4 5 6 |
... 국가: 유형: 문자열 설명: 그리고 국가 코드 데이터: 빌드: faker.무작위.배열 요소(['US', 'CA', 'MX', 'UK', 'ES', 'DE']); |
이 방법은 작동하지만 동일한 국가 정보에 의존하는 다른 모델이 있다면 이 로직을 복제해야 합니다. countries.json 파일을 만들고 데이터 속성에 입력에 대한 절대 또는 상대 경로가 될 수 있는 inputs 속성을 추가하면 동일한 작업을 수행할 수 있습니다. 모델이 생성되면 countries.json 파일은 inputs 인수를 통해 각 모델 빌드 함수에 inputs.countries로 노출됩니다.
(간결성을 위해 다른 프로퍼티는 모델 정의에서 제외했습니다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
이름: 사용자 유형: 객체 키: _id 데이터: 분: 1000 최대: 2000 입력: ./국가.json 속성: ... 정의: ... 국가: 유형: 문자열 설명: 그리고 국가 코드 데이터: 빌드: faker.무작위.배열 요소(입력.국가); 국가.json [ "US", "CA", "MX", "UK", "ES", "DE" ] |
기존 라인 하나를 변경하고 모델에 다른 라인을 추가함으로써 사용자 모델에 기존 데이터를 제공했습니다. 애플리케이션이 지원하는 국가를 기반으로 임의의 국가를 생성할 수 있습니다. 다음 명령을 사용하여 변경 사항을 테스트해 보겠습니다:
1 |
fakeit 콘솔 --카운트 1 모델/사용자.yaml |
제품 모델
전자상거래 애플리케이션에서 분류를 위해 별도의 시스템을 사용하고 있으므로 유효한 카테고리 정보를 사용할 수 있도록 해당 데이터를 무작위로 생성된 제품에 노출해야 합니다. 여기서는 먼저 FakeIt 시리즈 2/5: 공유 데이터 및 종속성 게시물.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
제품.yaml 이름: 제품 유형: 객체 키: _id 데이터: 분: 4000 최대: 5000 속성: _id: 유형: 문자열 설명: 그리고 문서 id 데이터: post_build: `product_${이.product_id}` doc_type: 유형: 문자열 설명: 그리고 문서 유형 데이터: 값: 제품 product_id: 유형: 문자열 설명: 고유 식별자 대표 a 특정 제품 데이터: 빌드: faker.무작위.uuid() 가격: 유형: double 설명: 그리고 제품 가격 데이터: 빌드: 기회.플로팅({ 분: 0, 최대: 150, 고정: 2 }) 판매 가격: 유형: double 설명: 그리고 제품 가격 데이터: post_build: | let 판매 가격 = 0; 만약 (기회.bool({ 가능성: 30 })) { 판매 가격 = 기회.플로팅({ 분: 0, 최대: 이.가격 * 기회.플로팅({ 분: 0, 최대: 0.99, 고정: 2 }), 고정: 2 }); } 반환 판매 가격; display_name: 유형: 문자열 설명: 디스플레이 이름 의 제품. 데이터: 빌드: faker.커머스.제품 이름() 짧은_설명: 유형: 문자열 설명: 설명 의 제품. 데이터: 빌드: faker.lorem.단락(1) long_description: 유형: 문자열 설명: 설명 의 제품. 데이터: 빌드: faker.lorem.단락(5) 키워드: 유형: 배열 설명: An 배열 의 키워드 항목: 유형: 문자열 데이터: 분: 0 최대: 10 빌드: faker.무작위.단어() 가용성: 유형: 문자열 설명: 그리고 가용성 상태 의 의 제품 데이터: 빌드: | let 가용성 = '재고 있음'; 만약 (기회.bool({ 가능성: 40 })) { 가용성 = faker.무작위.배열 요소([ '선주문', '품절', '단종' ]); } 반환 가용성; availability_date: 유형: 정수 설명: An epoch 시간 의 언제 의 제품 는 사용 가능 데이터: 빌드: faker.날짜.최근() post_build: new 날짜(이.availability_date).getTime() 제품_슬러그: 유형: 문자열 설명: 그리고 URL 친절한 버전 의 의 제품 이름 데이터: post_build: faker.도우미.슬러그파이(이.display_name).toLowerCase() 카테고리: 유형: 문자열 설명: 카테고리 에 대한 의 제품 데이터: 빌드: faker.커머스.부서() 카테고리_슬러그: 유형: 문자열 설명: 그리고 URL 친절한 버전 의 의 카테고리 이름 데이터: post_build: faker.도우미.슬러그파이(이.카테고리).toLowerCase() 이미지: 유형: 문자열 설명: 이미지 URL 대표 의 제품. 데이터: 빌드: faker.이미지.이미지() 대체 이미지: 유형: 배열 설명: An 배열 의 대체 이미지 에 대한 의 제품 항목: 유형: 문자열 데이터: 분: 0 최대: 4 빌드: faker.이미지.이미지() |
기존 카테고리 데이터는 CSV 형식으로 제공되었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
카테고리.csv "category_id","카테고리_이름","카테고리_슬러그" 23,"Electronics","전자" 1032,"사무용품","사무용품" 983,"의류 및 의류","의류 및 의류" 483,"영화, 음악 및 도서","영화-음악-책" 3023,"스포츠 & 피트니스","스포츠 및 피트니스" 4935,"자동차","자동차" 923,"도구","도구" 5782,"가정용 가구","홈 가구" 9783,"건강 & 뷰티","건강 및 미용" 2537,"장난감","장난감" 10,"비디오 게임","비디오 게임" 736,"애완동물 용품","애완동물 용품" |
이제 이 기존 데이터를 사용하려면 products.yaml 모델을 업데이트해야 합니다.
(간결성을 위해 다른 프로퍼티는 모델 정의에서 제외했습니다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
이름: 제품 유형: 객체 키: _id 데이터: 분: 4000 최대: 5000 입력: - ./카테고리.csv pre_build: 글로벌.현재_카테고리 = faker.무작위.배열 요소(입력.카테고리); 속성: ... 카테고리_id: 유형: 정수 설명: 그리고 카테고리 ID 에 대한 의 제품 데이터: 빌드: 글로벌.현재_카테고리.카테고리_id 카테고리: 유형: 문자열 설명: 카테고리 에 대한 의 제품 데이터: 빌드: 글로벌.현재_카테고리.카테고리_이름 카테고리_슬러그: 유형: 문자열 설명: 그리고 URL 친절한 버전 의 의 카테고리 이름 데이터: post_build: 글로벌.현재_카테고리.카테고리_슬러그 ... |
products.yaml 모델을 업데이트한 방법에 대해 몇 가지 주목해야 할 사항이 있습니다.
- 입력: 문자열이 아닌 배열로 정의됩니다. 여기서는 하나의 입력만 사용하지만, 모델에 필요한 만큼의 입력 파일을 제공할 수 있습니다.
- pre_build 함수는 모델의 루트에 정의됩니다. 이는 세 가지 카테고리 속성 각각에 대해 임의의 배열 요소를 가져올 수 없기 때문에 값이 일치하지 않기 때문입니다. 모델에 대한 개별 문서가 생성될 때마다 이 pre_build 함수가 먼저 실행됩니다.
- 각 카테고리 속성 빌드 함수는 모델의 pre_build 함수에 의해 설정된 전역 변수를 참조합니다.
다음 명령을 사용하여 변경 사항을 테스트할 수 있습니다:
1 |
fakeit 콘솔 --카운트 1 모델/제품.yaml |
결론
기존 데이터로 작업할 수 있다는 것은 매우 강력한 기능입니다. FakeIt. 무작위로 생성된 문서의 무결성을 유지하여 기존 시스템에서 작업하는 데 사용할 수 있으며, 기존 데이터를 변환하여 Couchbase Server로 가져오는 데에도 사용할 수 있습니다.