본문 바로가기
728x90

language64

[Python] AWS SES + MIME을 이용한 메일 기능 구현 소 AWS SES(Simple Email Service)란? Outbound만 가능한 AWS의 이메일 전송서비스이다. SES를 사용하는 목적은 회원들에게 프로모션 전송, 회원가입 시 이메일 확인 인증, 비밀번호 전송 등을 수행하기 위해서이며, 프리티어 기준 매일 2,000통을 보낼 수 있다. 이처럼 SES는 대량의 이메일을 발송하기에 적절한 서비스이며 발송한 이메일의 수와 데이터 전송에 대해 요금이 부과되기 때문에 저렴한 비용으로 이용이 가능 SMTP를 사용 SMTP(Simple Mail Transfer Protocol)란? 메일 전송 프로그램이 서버로 메일을 보낼 때 사용하는 프로토콜 오직 텍스트만 전송이 가능하다. 스트림 방식을 이용하여 전송한다. 한 개의 메시지를 해당 서버의 여러 수신자에게 보낼 수 .. 2023. 11. 25.
[Python] Boto3 + Airflow로 특정 기간 지난 S3 데이터 삭제하기 업무를 하면서 개인정보 데이터에 대해서 6개월이 지나면 자동으로 파기가 되는 로직을 구현해야되는 일이 있었습니다. 따라서 하루단위 배치로 6개월이 지났는지 검사하고, 지났으면 데이터를 삭제하는 로직을 구현한 것에 대해 정리해보겠습니다. 요구사항, 상세정보 및 코드 사용 라이브러리 : boto3 배치 스케줄링 주기: 매일 00:05 요구사항: 6개월이 지난 개인정보 포함된 데이터는 파기가 되어야 함 해결 방법: s3 uri경로가 s3:bucket/~~/history 혹은 latest로 되어 있고 이후에 stnd_ymd=yyyy-mm-dd 파티션으로 구별 됨 → stnd_ymd 기준 6개월이 지나면 매일매일 검사하여 삭제하는 로직 구현 코드 from airflow import DAG import boto3 .. 2023. 11. 20.
[Python] Logging 라이브러리 정리, Airflow에서 Logging사용하기 Airflow에서 PythonOperator를 실행할 때 로그가 나오지 않아서 테스크가 잘 진행되고 있는지 확인하기가 어려웠던 상황이 있었습니다. logging 라이브러리를 사용해도 airflow UI에서 확인 할 수가 없었는데 관련해서 정리를 해보고자 합니다. 1. Logging The only time that print is a better option than logging is when the goal is to display a help statement for a command line application. Shell과 같은 커맨드 인터페이스에서 --help 옵션을 받아 사용법 도움말을 출력할 때 이외에는 항상 logging이 print보다 낫다는 뜻으로, 사실상 웬만한 상황에서는 prin.. 2023. 11. 20.
[Scala] 스칼라 배우기 7. 스칼라 기본 문법6(반복문, 정렬, 그룹핑, 필터링) 반복문 for to는 이하의 리스트를 생성하고, until은 미만의 시퀀스를 생성 // 0에서 3이하의 시퀀스 for (num "v5") for ((k, v) List(1, 2, 3), "B" -> List(4, 5, 6), "C" -> List(7, 8, 9)) maps.mapValues(_.sum).foreach({ case (k, v) => printf("key: %s, value: %s\n", k, v) }) // 결과 key: A, value: 6 key: B, value: 15 key: C, value: 24 정렬 sort 정렬은 sorted, sortWith, sortBy 세가지 메소드를 이용 // sorted 사용방법 val list = List( 4, 6, 1, 6, 0) val l_so.. 2023. 6. 11.
[Scala] 스칼라 배우기 6. 스칼라 기본 문법5(collection,배열,리스트,튜플,맵) Collection 배열(array) 길이가 고정된 고정된 자료구조(값을 변경 할 수 있는 순서가 정해진 시퀀스) val array1 = Array(1, 2, 3) // 배열의 데이터 접근 scala> array1(0) res0: Int = 1 // 배열의 데이터 변경 scala> array1(1) = 10 scala> array1(1) res5: Int = 10 val array2 = Array(3, 4, 5) // 배열 연결하기 ++ val array3 = array1 ++ array2 // 배열의 앞에 데이터 추가 val array4 = 0 +: array3 // 배열의 뒤에 데이터 추가 val array5 = array3 :+ 100 리스트(list) 가변적인 길이의 데이터를 저장하기 위한 자료구.. 2023. 6. 11.
[Scala] 스칼라 배우기 5. 스칼라 기본 문법4(trait, singleton object) Trait(트레잇)트레잇(trait)은 자바의 인터페이스와 유사메소드를 정의만 해놓을 수도 있고, 기본 구현을 할 수도 있음추상 클래스와 달리 생성자 파라미터는 가질 수 없음트레잇에서는 가변 변수, 불변 변수 모두 선언 가능트레잇을 구현하는 클래스에서 가변 변수는 수정이 가능하지만, 불변 변수는 수정할 수 없음트레잇의 기본 메소드는 상속되고, override 키워드를 이용하여 메소드를 재정의 할 수 있음트레잇은 extends를 사용하여 상속가능하고, 여러개의 트레잇을 with 키워드로 동시에 구현 가능멤버변수를 가질 수는 없음추상클래스는 하나만 상속할 수 있지만, 트레잇은 여러개를 상속 할 수 있음생성자 멤버변수가 필요하면 추상클래스를 이용하는 것이 좋고, 멤버 변수가 필요 없다면 트레잇을 이용하는 것이.. 2023. 6. 11.
[Scala] 스칼라 배우기 4. 스칼라 기본 문법3(클래스) 클래스(class) 클래스는 class를 이용하여 생성 // 클래스 선언 class Person(name:String, age:Int) // 클래스 생성 val p = new Person("David", 30) // 멤버 변수 생략 가능 class A 클래스 멤버 변수 가변 변수는 컴파일러가 클래스 내부에 자동으로 getter, setter 메소드를 생성 가변 변수로 선언된 값은 읽고, 쓰는 것이 가능 불변 변수는 컴파일러가 getter만 생성,. 불변 변수로 선언된 값은 읽는 것만 가능 가변 변수, 불변 변수로 선언되지 않은 변수는 getter, setter 가 생성되지 않기 때문에 클래스 내부에서만 사용할 수 있음 // 기본형 class Animal(name: String) { println(s"${.. 2023. 5. 23.
[Scala] 스칼라 배우기 3. 스칼라 기본 문법2(함수) 함수(function) def으로 선언 함수를 선언할 때 리턴문과 리턴 타입은 생략이 가능하고, 매개변수의 파라미터 타입은 생략할 수 없음 리턴값이 없는 함수를 선언할 때는 Unit을 이용 함수의 매개변수는 불변 변수이기 때문에 재할당 할 수 없음 리턴 타입을 생략하면 컴파일러가 반환값을 이용하여 자동으로 추론 리턴문이 생략되고, 리턴 타입이 Unit이 아니면 함수의 마지막 값을 리턴 // 함수 선언 def add(x: Int, y: Int): Int = { return x + y } // x는 val 이기 때문에 변경 불가 def add(x: Int): Int = { x = 10 } // 리턴 타입 생략 가능 def add(x: Int, y: Double) = { x + y } // 리턴 타입이 Uni.. 2023. 5. 22.
[Scala] 스칼라 배우기 2. 스칼라 기본 문법1(진입점, 객체, 자료형, 문자열, 변수) Scala의 진입점 싱글톤 객체(object)가 main 함수를 구현하는 방법 // main 함수를 생성App 을 상속하여 실행하는 방법 object S01_HelloWorldObject { def main(args: Array[String]): Unit = { println("Hello World main") } } 싱글톤 객체(object)가 App 트레잇을 상속하는 방법 App 트레잇을 상속하는 방법은 extends로 App 트레잇을 상속하고, 실행하고자 하는 코드를 작성하면 순차적으로 실행 object S01_HelloWorld extends App { println("Hello World") } App 트레잇이 내부적으로 main() 함수를 구현해 주기 때문에, 첫번째 방법과 동작 방식의 차이는.. 2023. 5. 14.
728x90