2020/08 11

[airflow] DAG schedule_interval에 timezone 세팅

airflow 버전은 1.10.10 을 사용중이다. (현재 기준 최신버전은 1.10.12) 유지보수를 용이하게 하기 위해 execution_date에 어떻게든 timezone에 맞춰 설정하려 했는데 몇가지 방법을 써도 전혀 되지 않았다. 알고보니 스케쥴을 실행할 때 run_id라는게 있는데, 이게 execution_date 과 달리 움직이기 때문이었다.(내부 문제인듯 싶은데....) 그래서 결론만 말하자면 UTF 기준으로 설정해야 하고, timezone은 설정되지 않는다.(화면에서 보이는 것 등은 설정이 되는거 같더만...) 아래는 과정이다. 그럼 시작. 테스트를 위해 schedule_interval 설정을 새벽 1시로 설정했다. 그래야 timezone 설정 테스트에 부합하기 때문이다. 예를들어 9월 1..

공부/데이터 2020.08.31

[airflow] Mysql 데이터를 GCS(Google Cloud Storage)로 저장하기(mysql_to_gcs, 한글깨짐, 날짜포멧 수정)

Data lake 를 구축하기 위한 1단계인 원본데이터를 GCS로 이동하는 것을 다뤄보려 한다. embulk를 쓸까도 했었는데, JAVA 1.8 버전 이후부터는 지원을 안하기도 했고, 관리포인트를 늘리는 것도 좋아보이지 않아 찾아보다가 airflow에서 자체적으로 할 수 있는것을 확인해 이걸로 하기로 결정했다. 아래 github을 들어가면 mysql_to_gcs.py파일이 있는데, 이걸 이용하면 mysql에 질의한 쿼리대로 나온 결과를 GCS로 저장이 가능하다. https://github.com/apache/airflow/blob/1e79dae06e/airflow/contrib/operators/mysql_to_gcs.py apache/airflow Apache Airflow - A platform to..

[aws,ses] SES(Simple Email Service)서비스로 메일전송하기(springboot)

AccessToken을 이용해 전송할 것이기 때문에 IAM에서 계정에 따른 KEY를 받아두어야 한다. 해당계정에 다음 권한이 포함되어 있어야 한다. 그럼 이제 연동을 시작하자 # application.properties에 등록 및 AWS SES에 Email 인증하기 application.properties에 다음항목을 추가하자. # AWS SES(이메일) 액세스 Key aws.ses.credentials.access-key: [accessKey] aws.ses.credentials.secret-key: [secretKey] # AWS SES 인증 이메일이자 전송시 보낸이의 이메일이어야 함 aws.ses.veritied.email=[이메일 주소] 전송할 이메일을 등록할 경우, 사전에 확인된 메일만 등록할 ..

공부/프로그래밍 2020.08.27 (2)

[intellij] 검색에 불필요한 것들 안나오게 폴더제외하기(react, next)

react + next로 개발하다보니 실행을 위해 파일을 생성하는 것을 봤다. 문제는 필요한 문구를 검색하다보면 이것들이 같이나와서 정작 내가 수정해야하는 파일이 한참밑에 있는 것이다. 예를들어 다음과 같은 경우다. line 이라고 검색했는데 불필요한 파일이 대거 검색된 경우다. 다행히 검색할 때 특정폴더를 제외한 검색결과를 나오게 하는 방법이 있었다. Project Structure -> Modules 를 클릭한 뒤에 검색에 제외할 폴더를 마우스 우클릭한 다음 Excluded 를 클릭한다. 끝.

[springboot] Dynamodb, Local로 연결하여 연동테스트 및 기능살펴보기

이번글은 평소 자주 보는 창천항로님 글을 많이 참조했습니다. 늘 그렇지만 좋은글 많이 올려주시는 창천항로님에게 감사의 말씀드립니다. 참조사이트: https://jojoldu.tistory.com/484 [DynamoDB] Spring Data DynamoDB와 Embedded 개발 환경 구축하기 모든 코드는 Github에 있습니다. 이번 시간엔 로컬 개발 환경에서 DynamoDB를 Embedded로 활용하는 방법에 대해서 알아보겠습니다. 이미 도커를 적극적으로 테스트와 개발에 사용하고 계신 분들이라면 jojoldu.tistory.com 도커를 사용할 수도 있겠지만 도커없이도 DynamoDB Embedded를 통해 테스트가 가능하다. 만약 도커로 이미 DynamoDB 테스트 환경을 설정했다면 DynamoD..

[react] hook 에서 componentDidMount, componentWillUnmount 기능 구현하기

react가 16.8 버전에서 hooks이 추가되면서 useEffect를 사용하면 라이프사이클의 다음을 대체한다. componentDidMount, componentDidUpdate, componentWillUnmount 그럼 다음 샘플을 보면서 간단히 알아보자 ... useEffect(() => { console.log("컴포넌트 시작") return () => { console.log("컴포넌트 종료 ") } }, []) ... 감지 부분을 빈상태([]) 로 두면 처음 componentDidMount와 비슷한 기능을 한다. 그래서 이 컴포넌트를 호출하면 로그를 다음과 같이 보여준다. return을 사용하면 componentWillUnmount 와 같은 기능을 한다 컴포넌트가 종료되면 설정한 로그를 표..

[springboot] @valid 테스트하기(Controller에 입력되는 객체 테스트)

Controller 에서 Valid를 사용하고 있는데 잘 작동하는지 확인하고 싶은데 확인할 방법이 없었다. 그러다 방법을 찾게되서 정리. 테스트 방법은 두가지가 있다. 1) Validator 를 주입받아 체크하는 방법 2) WebMvcTest와 MockMvc 를 이용해 호출하여 체크하는 방법 각각의 방법에 차이점이 있는데, 2번의 경우 ControllerAdvice를 이용해 Exception을 핸들링하는 경우 전자방법보다 정해진 틀에 맞춰 테스트를 해야한다. Valid에 맞지 않는 것을 배열에 담아 리턴하는데, 내 경우엔 화면에 보여질 걸 생각해서 ExceptionHandler에서 1개의 메세지만 추려 리턴한다. 때문에 Assertion를 할때 내가 예상하는 문구가 나오지 않을 수 있다. 혹은 에러케이스..

[junit5] Mock을 이용한 단위 테스트 (@InjectMocks 과 @Mock 차이)

Mockito를 이용하면 좀더 작은 단위까지 테스트가 가능하다. 무엇보다 데이터를 컨트롤해야하는 상황에서 DB연결없이 임의로 주고받을 수 있기 때문에 유용하다. 이번에는 그 테스트에 관한 내용과 각 어노테이션의 사용법에 대해 나열한다. 그럼 한번 시작해보자. 테스트 편의성을 위해 Lombok을 사용했다. 다음과 같이 Member 엔터티가 있다. @Entity @Table(name = "Member") @Getter @ToString @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @GeneratedValue private Long id; @Column(name = "name") private String name; ..

[gradle] 외부 jar파일 추가하기

libs 폴더에 다음과 같이 파일을 추가한다 root 폴더에 넣는다(src와 같은 레벨 위치) build.gradle 파일을 열어 다음과 같이 추가한다. dependencies { ... compile files("libs/ksnet/kspg_eclient.jar") compile files("libs/ksnet/kspg_m1000.jar") ... } 혹시 다음과 같이 에러가 난다면 오타를 확인하자 내 경우 compile file 이라고 써서 에러가 났다 A problem occurred evaluating root project 'kinspayconnector'. > Cannot convert the provided notation to an object of type Dependency: /User..

[springboot] ControllerAdvice를 이용해 정해진 폼으로 리턴하기

API서버를 통해 데이터를 주고받을 때 정해진 규격으로 전달하는 것은 중요하다. 그래야 요청하는 쪽에서도 그 폼을 기준으로 개발할 것이기 때문이다. 그런데 의외로 이것을 많이 간과하고 넘어가는 경우가 있다. Controller 안에 들어온 후에는 결과 폼을 지정해서 내보내는건 규칙적으로 한다. 그런데 Contoller로 진입하지 못하고 실패했을 때는 Spring의 기본 form에 맞춰서 리턴되는 경우가 있다. 예를들면 다음과 같은 경우다 Controller에 접속하고 난 후의 결과 format { "resultCode": "SUCCESS", "resultMsg": "정상" } 진입에 실패한 후의 format (trace는 내용이 너무 길어 생략) { "timestamp": "2020-08-04T23:04..

[aws] Jenkins + CodeDeploy 로 로드밸런스 환경 자동배포하기

이전 글에서는 Jenkins와 CodeDeploy를 이용해 배포를 하긴 했지만 수동배포를 포스팅 했었다. 이번에는 jenkins 플러그인 중 하나인 Deploy an application to AWS CodeDeploy를 이용해 자동 배포하는 방법에 대해 알아보려 한다. 이전글: https://lemontia.tistory.com/945 [aws] Jenkins + S3 + CodeDeploy 를 이용해 배포하기(수동배포) 이번에는 Jenkins를 이용해 Build & Test를 진행하고 완성된 파일을 S3에 올린 후 CodeDeploy를 이용해 배포하는 방법을 알아보겠다. 이번 설정은 S3에 올리는 것을 jenkins에 설정했고, CodeDeploy는 AWS 콘솔을 lemontia.tistory.com..