Seed Data 종류 구분

테스트 및 동작 각 상황에 따라 필요한 데이터

Seed 종류 4가지

  • factory seed data: 데이터베이스 초기화 후 애플리케이션 실행에 필요한 데이터
  • scenario seed data: 각 기능별 시나리오에 따라 필요한 최소한의 데이터
    (필수: factory)
  • dummy seed data: 새 사용자 가입 또는 클라이언트 개발시 목록을 테스트하는 용도
    (필수: factory, 보조: unit, integration, uat)
  • replica seed data: 실제 운영서버 배포전 민감정보 제거된 실데이터 테스트
    (필수: factory)

각 환경에서 seed 데이터 사용

  • unit test: factory, scenario
  • dev_local: factory, scenario
  • dev_server: factory, scenario
  • dev_spot: integration 테스트용도로 임시로 띄우는 환경
    factory, scenario 두가지
  • uat: factory, scenario, dummy
  • stg: replica seed data
  • prd: factory seed data 서비스 초기에 사용, dummy seed data 테스트 계정에 사용

대강 정리 해 보니 factory, scenario는 테스트 시에는 계속 사용될 것 같고
dummy도 필요할 때 지속적으로 쓰일 것 같다

연동테스트는 dev_spot?과 stg에서 주로 이뤄질 것 같고
회원가입부터 테스트 코드가 작성되어 있으면 factory seed만 있어도 될듯?

SEED 설명

factory seed

보통 서비스 운영중에는 새로 넣을 필요가 없지만
1 납품하는 서비스
2 테스트 환경을 구성하는 경우
반복적으로 사용

거래소 개발인 경우라고 가정하면

  • 코인 메타데이터
    • BTC
    • ETH

integration test seed data

연동서비스시 필요한 데이터
자동화 테스트

Scenario

dummy 데이터와 비슷하기도 한데
integration 테스트를 회원가입 단계부터 차례로 진행할 경우 생기는 데이터와 같은 형태

dummy seed data

초기 사용자 가입시 또는 클라이언트 사용시
상황에 따라 추가할 수 있는 데이터

UI를 확인할 때 필요하다.

ex) SNS에서 친구 프로필 목록 화면인 경우

  • 이름
  • 전화번호
  • 이메일
  • 주소
  • 회사

replica seed data

실제 환경에서 테스트를 하는 경우

production -> 데이터 복제 후 민감정보 제거

MySQL batch insert

CREATE TABLE t_user_logs (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(30) NOT NULL,
  action_ts TIMESTAMP NOT NULL,
  action_type VARCHAR(30) NOT NULL,
  KEY `idx_user_logs_uniq` (`username`,`action_ts`)
);

Upsert

INSERT INTO t_user_logs
  (username, action_ts, action_type)
VALUES
  ('user1', now(), 'LOGIN'), ('user2', now() 'LOGIN)
ON DUPLICATE KEY UPDATE
  action_type=VALUES(action_type);

Replace

REPLACE INTO t_user_logs
  ( username, action_ts, action_type)
VALUES
  ('user1', now(), 'LOGIN');

Insert ignore

대용량 넣을 때 반복데이터가 들어올 때가 간혹 있는 경우

INSERT IGNORE INTO t_user_logs
  (username, action_ts, action_type)
VALUES
  ('user1', '2000-01-01 11:30:10', 'LOGIN'), ('user2', '2000-01-01 11:30:11', 'LOGIN');

Insert Batch

ignore안하고 해도 됨

INSERT INTO t_user_logs   (username, action_ts, action_type) VALUES   ('user1', '2000-01-01 11:30:10', 'LOGIN'), ('user2', '2000-01-01 11:30:11', 'LOGIN');

참고

  • https://stackoverflow.com/questions/2714587/mysql-on-duplicate-key-update-for-multiple-rows-insert-in-single-query
  • https://chartio.com/resources/tutorials/how-to-insert-if-row-does-not-exist-upsert-in-mysql/
  • https://www.techbeamers.com/mysql-upsert/
  • https://number1.co.za/mysql-insert-if-not-exists/

Apache Storm 사용기 -> 포기(Flink로 전환)

Clojure로 코어를 만들었다는데서관심을 가졌으나최신버전인 2.0.0에서는 Java로 컨버팅 되어 버렸다는 슬픈 소식

python, clojure, java, shell script 폴리글랏이라고 했으나python코드는 별로 쓸모없는 포인트만 먹고 있다. 빼버리면 좋겠는데
실행 파라미터체크하는 정도 코드만 있다. 스톰 토폴로지를 파이썬으로도 만들 수 있다고되어 있는 것 같은데… 별로 그럴 생각은 없어서..
이 부분을 제외하고 자바와 설정파일을 이용하는게 여러 환경에 배포하는데도 편리하고 좋을 것 같다

intellij로 열려고 하는데 잘 안열린다.uber-jar 돼지자르를 만들 때 사용하는 shade-deps로 인한 임포트오류가 발생

Storm에서 한개의 실행단위를 topology라고 하는데 이걸 로컬에서 실행테스트도 해보고 디버깅도 해보고 로그도 찍어보고 하고싶은데… 다 쉽지 않다.
유닛테스트, 로컬실행, 디버깅 환경부터 만들어야 뭘 제대로 쓸 수 있을 것 같다.

문서…
이것저것 써 있기는 한데
고인물파티같은 느낌
한국 커뮤니티도 없다.
Flink만 쓰는건가
인터페이스단위로 분석해놓은 문서조차 없다
튜토리얼이나 예제가 있긴한데 딱 맞는 분석사례만 있는게 아니니까.. 결국 분석해서 써야된다

코틀린도 그랬지만… 초기에는 불만이 많은 편이라
좀 더 써 봐야지 판단할 수 있겠다


프로젝트에 적용을 시도했으나

Flink로 전환하려고 한다

  • 유닛테스트 지원안됨
  • 연동테스트 지원안됨
  • 로컬 데몬이 자꾸 죽음
  • Flink보다 업데이트가 안되고 있음
  • Flink보다 커뮤니티가 약함
  • 1에서 2로 메이저 업데이트 되면서 도큐먼트 링크가 다 죽음(2버전이지만 invator나 마찬가지인 상태)
  • 실행스크립트에 파이썬이 혼용되는 등 불필요한 프로젝트 복잡도가 증가함.
  • ide에서 실행이 안됨(디버깅 불가. flink에서는 되는지는 모르겠다)
  • maven-shade와 fat-jar(uber-jar)사용으로 배포 불편.
    — 이게 java jar –classpath로 실행하면서 storm.jar와 {user-topology}.jar를 실행시켜서 shade도 필요하고 그런건데 굉장히 쨔증난다 .설계가 잘못됐다고 본다.
  • 마찬가지로 maven-shade와 fat-jar(uber-jar) 사용으로 ide에서 본 프로젝트가 열리지도 않음
    — 억지로 열려면 mvn package한 다음에 shade에서 생성된 jar를 ide에서 합치면 됨
    —- 이런 문제가 있으면 프로젝트를 분리해놓던가 해야될 것 같은데 개발진들 열의가 별로 없어보임. 메이븐 의존성도 다 옛날거라 kafka client 0.8.0이었나
  • 로깅이 잘 안되는걸 빼먹을 뻔 했군
    토폴로지 jar에 포함시켜놓을 수 있으면 좋겠는데 그런 부분이 잘 안되는 것 같다
  • 로컬테스트용과 리모트배포용 코드를 아예 따로 작성해야된다. 이건 진짜 문제있다. ifelse로 분기 할 수도 있지만… 좀 참기힘든 부분이자너

또 다른 선택지

  1. Apache Flink
  2. Apache Apex
  3. Apache Spark – Streaming
  4. Apache Heron
  5. Uber AthenaX
    https://github.com/uber/AthenaX

아파치에서만 몇개야…. Storm은 죽은 프로젝트다. Heron(Incubator)이 스톰 뒤를 이어서 개발중인 것으로 보인다.

관련기술

  1. Apache Druid
    https://druid.apache.org/
  2. Apache Calcite
    https://calcite.apache.org/

PostGIS 기초 사용법

PostGIS의 사용법은 그리 어려울게 없다.

그냥 데이터를 사용하기 위한 기반 지식이 많이 필요하다.

기술적으로 알아야 할 것은 geometry 인덱싱, st_프로시저 정도로 많지 않고 지도 데이터, 좌표계 변환 등의 지식을 많이 알아야한다.

설치

http://postgis.net/install/

-- Enable PostGIS (includes raster)
CREATE EXTENSION postgis;
-- Enable Topology
CREATE EXTENSION postgis_topology;
-- Enable PostGIS Advanced 3D 
-- and other geoprocessing algorithms
-- sfcgal not available with all distributions
CREATE EXTENSION postgis_sfcgal;
-- fuzzy matching needed for Tiger
CREATE EXTENSION fuzzystrmatch;
-- rule based standardizer
CREATE EXTENSION address_standardizer;
-- example rule data set
CREATE EXTENSION address_standardizer_data_us;
-- Enable US Tiger Geocoder
CREATE EXTENSION postgis_tiger_geocoder;

 

인덱싱

 

ST_프로시저

많이 사용되는 것만 대강 기억하고 PostGIS doc를 찾아서 쓰면 된다.

https://postgis.net/docs/reference.html

폴리곤 문자열 좌표계로 변환
select st_geomfromtext('POLYGON ((206150.488 464470.391000001,206220.011 464532.584000001,206341.442 464351.384, 206150.488 464470.391000001))', 5174)
좌표계와 겹치는 좌표계 검색
select st_astext(geom) from t_mapdata from st_intersects(st_geomfromtext('POLYGON ((206150.488 464470.391000001,206220.011 464532.584000001,206341.442 464351.384, 206150.488 464470.391000001))', 5174));
지도의 좌표계를 4243좌표로 변환
select st_transform(geom, 4243) from t_mapdata;

 

ST_Intersects – 겹침

ST_Within – 완전포함

ST_Contains – 포함 within하고 비슷한데 확인필요

ST_Area – 넓이 구하기

ST_Buffer – 좀 넓게 잡기

초기데이터 설정

insert into public.spatial_ref_sys (srid, auth_name, auth_srid, srtext, proj4text) values(
105188,'USER',105188,'PROJCS["Korea 2000 / East Sea Belt 2010",GEOGCS["Korea 2000",DATUM["Geocentric_datum_of_Korea",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6737"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4737"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",38],PARAMETER["central_meridian",131],PARAMETER["scale_factor",1],PARAMETER["false_easting",200000],PARAMETER["false_northing",600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","5188"]]','+proj=tmerc +lat_0=38 +lon_0=131 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs'
);

insert into public.spatial_ref_sys (srid, auth_name, auth_srid, srtext, proj4text) values(
105187,'USER',105187,'PROJCS["Korea 2000 / East Belt 2010",GEOGCS["Korea 2000",DATUM["Geocentric_datum_of_Korea",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6737"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4737"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",38],PARAMETER["central_meridian",129],PARAMETER["scale_factor",1],PARAMETER["false_easting",200000],PARAMETER["false_northing",600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","5187"]]','+proj=tmerc +lat_0=38 +lon_0=129 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs'
);

insert into public.spatial_ref_sys (srid, auth_name, auth_srid, srtext, proj4text) values(
105186, 'USER', 105186 ,'PROJCS["Korea 2000 / Central Belt 2010",GEOGCS["Korea 2000",DATUM["Geocentric_datum_of_Korea",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6737"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4737"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",38],PARAMETER["central_meridian",127],PARAMETER["scale_factor",1],PARAMETER["false_easting",200000],PARAMETER["false_northing",600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","5186"]]','+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs'
);

insert into public.spatial_ref_sys (srid, auth_name, auth_srid, srtext, proj4text) values(
105185, 'USER', 105185, 'PROJCS["Korea 2000 / West Belt 2010",GEOGCS["Korea 2000",DATUM["Geocentric_datum_of_Korea",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6737"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4737"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",38],PARAMETER["central_meridian",125],PARAMETER["scale_factor",1],PARAMETER["false_easting",200000],PARAMETER["false_northing",600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","5185"]]',
'+proj=tmerc +lat_0=38 +lon_0=125 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +units=m +no_defs'
);

 

 

PostgreSQL 9.5 초기설정

기본설정은 버전이 변경되도 크게 바뀌지 않는다

설정파일

postgresql.conf

https://www.postgresql.org/docs/9.5/static/runtime-config-connection.html

사용자가 늘어서 튜닝을 해야한다 하는상황이 아니라면 
이거말구 크게 바꿀게 없다.
listen_addresses = 'localhost'
listen_addresses = '*'
listen_addresses = '192.168.0.2,localhost'
listen_addresses = '127.0.0.1'

pg_hba.conf

  • https://www.postgresql.org/docs/9.1/static/auth-pg-hba-conf.html
개발용이면 보통은 이거한줄 추가하지 않을까
host    all             all             127.0.0.1/0             md5
운영서버라면 서버 ip를 명시하면 되고

서버 범위 지정하는거면 ip주소 쓰는칸에
192.168.0.0/24

터미널접속

sudo -u postgres psql -U postgres -w

사용자 관리

사용자 목록보기
postgres=# \deu
postgres=# \du

create user ${my-user} with password '${my-password}';
create database ${my-database};
grant all privileges on database ${my-database} to ${my-user};

권한문제 나올 때
create user --superuser ${my-user}
alter role ${my-user} superuser;
관리자권한 줘버리는거나 껄쩍지근하기도 한데...
완료후 권한축소
alter role ${my-user} nosuperuser;

GIS 분석 인프라 구성 – Ubuntu16.04, Postgresql9.5, PostGIS2.2

설치

sudo apt install -y postgresql postgis postgresql-9.5-dbg postgresql-common postgresql-9.5-postgis-2.2 postgresql-9.5-postgis-scripts

설치는 별거 손댈게 없다.

서버에서 스크립트를 돌릴 일이 있을 수 있으니

sudo apt install python3 python3-dbg python3-dev python3-dbf python3-pip
pip3 install psycopg2

설정

Postgresql

원격접속 가능하게 설정 – 필요한 경우

postgresql.conf

listen_addresses = 'localhost'

pg_hba.conf

postgres    all    all  0.0.0.0/24    md5

개발테스트용이 아닌 서비스용이라면 초기 설정할 때만 오픈해놨다가 접근권한을 127.0.0.1이나 허용된 서버만으로 제한하도록 한다.

계정 설정

root 생성

sudo -u postgres psql -U postgres
alter user postgres with encrypted password 'dkfldk3$';
\q

Postgis

디비 생성후

create database gis_db;
\connect gis_db;
create extension postgis;

postgis 설치가 완료되면

gis_db.public.spatial_ref_sys 테이블이 생성된다.

확인

select * from pg_catalog.pg_tables;

초기 데이터 준비

spatial_ref_sys에 표준 좌표계는 다 입력되어 있는편인데

공공기관에서 제공해주는 변태좌표계에 필요한 설정을 넣어준다.

id값이 충돌하지 않도록 주의.

 

GIS 너무 쉬운거 아니야?

아직 지옥문을 막 열었을 뿐.. 문이 닫히기 전에 돌아가라

 

RAW데이터를 수집해야한다.

 

공공기관의 데이터

정권이 바뀔때마다 지들 기분날 때 마다 데이터의 제공주체나 생산주체 담당자가 수시로 바뀌니 그때그때 확인을 해 봐야한다.

데이터 포맷 정보가 없는 경우도 많고 통일성도 없다.

따져도 소용없다. 그 사람들도 문제의식은 가지고 있는데.. 이게 장관급에서 프로젝트가 내려오지 않으면 어쩔 수 없는 부분이 있다. 여러 기관이 얽히고 얽혀서

데이터 제공 기관

행정표준코드 관리시스템 : https://www.code.go.kr/jsp/index.jsp

환경공간정보서비스 : https://egis.me.go.kr
생태자연도

국립생태원 : http://www.nie.re.kr/

국토환경정보센터 : http://www.neins.go.kr

국토지리원 : http://www.ngii.go.kr
수치지도, DEM(래스터)

국가공간정보포털 : http://www.nsdi.go.kr
연속지적도, 개별공시지가, 토지등급, 건물정보 …

주소, 행정동, 지적도, 건물정보, 등 넣어줘야하는데

국가교통정보센터 : http://www.its.go.kr/

교통정보공개서비스 : http://openapi.its.go.kr

기상청 : http://www.kma.go.kr

NASA 수치 데이터 : 한국 데이터는 없다고도 하고 잘 못 찾겠다.

GIS 관련 정보 2017

데이터 소스

국토지리정보원 www.niii.go.kr
기상청 www.kma.go.kr
환경공간정보서비스 https://egis.me.go.kr
국가수자원관리종합정보시스템 http://www.wamis.go.kr
도로명주소안내시스템 http://www.juso.go.kr
표준노드링크 http://nodelink.its.go.kr
– 지능형 교통체계 관리 시스템
부동산 공시지가 http://www.realtyprice.kr/notice
부동산 실거래가 http://rt.molit.go.kr/
서울지도 http://gis.seoul.go.kr
data.go.kr
한국전력
LURIS 토지이용규제서비스

통계지리정보서비스
https://sgis.kostat.go.kr/contents/shortcut/shortcut_05.jsp

학습/커뮤니티

공간정보중앙교육센터 https://necgis.go.kr
http://www.biz-gis.com/

데이터 변환

pdf to shp
cad to shp

관련툴 몰랐던거

QGIS – 지형분석
– wheel shade
– relief
– roughness index

QGIS2 3JS – 브라우저 연동

추가지식

http://www.nsdi.go.kr/?menuno=2926
http://www.dcvelocity.com/articles/20111128top_10_reasons_for_implementing_wms_wfm_together/

 

R로 GIS 이미지 만들기

https://github.com/Robinlovelace/Creating-maps-in-R

http://spatial.ly/wp-content/uploads/2013/12/intro-spatial-rl-3.pdf

 

gdal

http://www.gdal.org/gdal_grid.html

http://www.gdal.org/frmt_xyz.html

 

좌표 재투영/매핑

http://www.biz-gis.com/index.php?document_srl=51342&mid=GISFAQ

http://docs.qgis.org/2.2/ko/docs/training_manual/vector_analysis/reproject_transform.html

 

지적도 작업

“qgis 지적도 오차”

http://archjang.tistory.com/431

 

지형도 작업 – SHP,DEM

http://www.qgistutorials.com/ko/index.html

http://www.qgistutorials.com/ko/docs/credits.html

http://www.qgistutorials.com/ko/docs/working_with_terrain.html

http://www.qgistutorials.com/ko/docs/interpolating_point_data.html

http://www.qgistutorials.com/ko/docs/raster_mosaicing_and_clipping.html

http://www.qgistutorials.com/ko/docs/working_with_attributes.html