[Node.js] Email 발송하기[Node.js] Email 발송하기

Posted at 2020. 5. 1. 16:24 | Posted in Node.js
반응형




API : https://nodemailer.com/about/




■ nodemailer 설치



 $ npm install nodemailer









■ Node.js 를 통해 이메일 보내기




# 소스코드

 send_email.js

// @breif nodemailer 모듈추출

const nodemailer = require( "nodemailer" );


// @details 글로벌 범위에서 대기할 수 없으므로 래퍼( wrapper )를 사용해야 함

async function main() {


    // @breif 기본 SMTP 전송을 사용하여 재사용 가능한 전송 개체 생성

    const transporter = nodemailer.createTransport({

          host : "smtp.naver.com"      // @details  네이버(smtp.naver.com), 구글(smtp.google.com), 다음(smtp.daum.net) 등

        , port : 465

        , secure : true                     // @details PORT가 465인 경우 TRUE로 설정, 다른 경우 FALSE

        , auth : {

              user : "보내는 메일 주소"

            , pass : "보내는 메일 비밀번호"

        }

    });


    // @breif 발송할 메일의 컨테츠 정보

    let info = await transporter.sendMail({

          from : "\"Fred Foo 👻\" <saak@wickedmiso.com>"         // @details 보내는 사람 메일주소( user 메일주소와 일치해야함 )

        , to : "받는이1@naver.com, 받는이2@daum.com"                // @details 받는이(들) 메일주소

        , subject : "Node.js 메일전송 테스트 ✔"                           // @details 메일주소

        , text : "HTML 속성이 활성화 되어 있으면 비활성화 됨"         // @details 메일 내용

        , html : "<h1>사악미소의 현대마법의 IT 공방</h1>"            // @details 메일 내용(HTML)

    });


    console.log("Message sent : %s", info.messageId);

}


// @breif main() 함수를 실행

main().catch( console.error );




# 출력결과

 $  node send_email.js

     Message sent: <df2a072a-b321-928f-f543-75e07693ac6c@wickedmiso.com>







반응형
//

[Node.js] Excel 파일 생성하고 데이터 읽기[Node.js] Excel 파일 생성하고 데이터 읽기

Posted at 2020. 5. 1. 13:19 | Posted in Node.js
반응형




API : https://www.npmjs.com/package/xlsx




■ 엑셀 데이터 읽어오기





 $ npm install xlsx









■ 엑셀 데이터 읽어오기



# 엑셀파일




# 소스코드

 excel_file_read.js

// @breif xlsx 모듈추출

const xlsx = require( "xlsx" );


// @files 엑셀 파일을 가져온다.

const excelFile = xlsx.readFile( "wise_life_doctor.xlsx" );


// @breif 엑셀 파일의 첫번째 시트의 정보를 추출

const sheetName = excelFile.SheetNames[0];          // @details 첫번째 시트 정보 추출

const firstSheet = excelFile.Sheets[sheetName];       // @details 시트의 제목 추출


// @details 엑셀 파일의 첫번째 시트를 읽어온다.

const jsonData = xlsx.utils.sheet_to_json( firstSheet, { defval : "" } );


console.log( jsonData );




# 출력결과

 $ node excel_file_read.js







■ 엑셀 파일 작성하기



# 소스코드

 excel_write_file.js

// @breif xlsx 모듈추출

const xlsx = require( "xlsx" );


// @breif 가상의 엑셀파일을 생성한다.

const book = xlsx.utils.book_new();


// --------------------------------------------------------------------


// @breif 1번 시트

// @breif aoa_to_sheet 방식으로 데이터를 생성한다.

const doctors = xlsx.utils.aoa_to_sheet( [

      [ "학과", "직급", "이름", "나이" ]

    , [ "흉부외과", "병원장", "주전", "67" ]

    , [ "흉부외과", "교수", "천명태", "52" ]

    , [ "흉부외과", "치프", "도재학", "39" ]

    , [ "소아외과", "레지던트", "장겨울", "29" ]

    , [ "산부인과", "레지던트", "추민하", "34" ]

    , [ "산부인과", "레지던트", "명은원", "28" ]

    , [ "신경외과", "교수", "민기준", "55" ]

    , [ "신경외과", "치프", "용석민", "33" ]

    , [ "신경외과", "레지던트", "안치홍", "38" ]

    , [ "신경외과", "레지던트", "허선빈", "31" ]

    , [ "응급의학과", "조교수", "봉광현", "40" ]

    , [ "응급의학과", "펠로우", "배준희", "31" ]

] );


// @breif CELL 넓이 지정

doctors["!cols"] = [

      { wpx : 130 }   // A열

    , { wpx : 100 }   // B열

    , { wpx : 80 }    // C열

    , { wch : 60 }    // D열

]


// @breif 첫번째 시트에 작성한 데이터를 넣는다.

xlsx.utils.book_append_sheet( book, doctors, "DOCTOR" );


// --------------------------------------------------------------------


// @breif 2번 시트

// @details json_to_sheet 방식으로 데이터를 생성한다.

const nurses = xlsx.utils.json_to_sheet( [

      { A : "학과", B : "직급", C : "이름", D : "나이" }

    , { A : "흉부외과", B : "PA간호사", C : "소이현", D : "33" }

    , { A : "소아외과", B : "PA간호사", C : "한현희", D : "29" }

    , { A : "산부인과", B : "분만실간호사", C : "한한승주현희", D : "41" }

    , { A : "산부인과", B : "PA간호사", C : "은선진", D : "36" }

    , { A : "간담췌외과", B : "수간호사", C : "송수빈", D : "45" }

    , { A : "간담췌외과", B : "병동간호사", C : "이영하", D : "35" }

    , { A : "간담췌외과", B : "병동간호사", C : "김재환", D : "28" }

    , { A : "간담췌외과", B : "PA간호사", C : "국해성", D : "32" }

    , { A : "간담췌외과", B : "이식코디네이터", C : "함덕주", D : "37" }

    , { A : "신경외과", B : "PA간호사", C : "황재신", D : "39" }

    , { A : "응급의학과", B : "응급실간호사", C : "선우희수", D : "26" }

], { header : ["A", "B", "C", "D"], skipHeader : true } );


// @breif CELL 넓이 지정

nurses["!cols"] = [

      { wpx : 130 }   // A열

    , { wpx : 100 }   // B열

    , { wpx : 80 }    // C열

    , { wch : 60 }    // D열

]


// @details 두번째 시트에 작성한 데이터를 넣는다.

xlsx.utils.book_append_sheet( book, nurses, "NURSES" );


// --------------------------------------------------------------------


// @files 엑셀파일을 생성하고 저장한다.

xlsx.writeFile( book, "dramatis_personae.xlsx" ); 




# 실행결과

 $ node excel_write_file.js







반응형
//

[JAVA] JVM 프로그램의 메모리 영역[JAVA] JVM 프로그램의 메모리 영역

Posted at 2020. 4. 27. 20:19 | Posted in JAVA
반응형




출처 : Do it! 코틀린 프로그래밍




프로그램이 사용하는 메모리 영역에는 여러가지가 있다.


명령어가 들어가는 코드 영역과,


프로그램이 컴파일되면 문자열이나 정적 변수나 문자열 등이 들어가는 정적 메모리 영역인 데이터( Data ) 영역이 존재한다.


JVM에서는 이 영역을 메서드 정적 영역( Method Static Area )으로도 부룬다.


또 실행중 생성되는 객체는 동적 메모리 영역인 힙( Heap ) 이라고 불리는 곳에서 만들어 진다.




추가적으로 코드 블록인 중괄호( { } ) 안에 사용한 변수나 함수 호출 블록은 임시로 쓰이는 메모리 영역인 스택( Stack )에 들어가며,


중괄호 블록이 끝나면 임시로 사용한 변수는 스택에 제거된다.



 

데이터 영역은 정해져 있어서 실행중에 오류가 날 가능성은 적다.


힙과 스택은 프로그램이 동작하는 도중에 위 그림의 화살표 방향으로 채워지기 때문에 너무 많은 메모리를 할당하는 객체가 있다면


Out of Memory 오류가 날 수 있고, 함수 호출이 재귀적으로 너무 많이 일어나면


Stack Overflow 오류가 발생할 수 있다.










JVM을 사용하는 프로그램에는 동적 메모리 영역의 객체가 사용된 뒤 아무 참조가 없으면 자동으로 삭제하는


GC( Garbase Collector )가 존재한다.


GC란 일종의 쓰레기 청소부 역할을 해서, 우리도 모르게 쓸모없는 객체를 치워 주는 일을 한다고 생각하면 된다.







반응형
//

[Kotlin] 코틀린 프로젝트 시작하기[Kotlin] 코틀린 프로젝트 시작하기

Posted at 2020. 4. 27. 00:12 | Posted in Kotlin
반응형




■ 코틀린 프로젝트 시작하기




#01. 코틀린의 main( ) 함수는 프로그램의 실행 진입점




자바 같은 객체 지향 언어에서 프로그램을 실행하려면 최소한 하나의 클래스와 그 안에 main( ) 함구가 있어야 한다.


하지만 코틀린은 선언한 클래스가 없는데도 불구하고 main( )함수와 println( ) 함수를 통해 콘솔에 문자열 "Hello Kotlin"을 출력하고 있다.



코틀린 코드는 JVM에서 실행되며, main( ) 함수가 있는 파일 이름을 기준으로 자바 클래스가 자동 생성된다.



# 소스코드

 helloKotlin.kt

fun main(args:Array<String>) {


println("Hello Kotlin!");

}



위 코드를 저장하고 역컴파일 하면 아래와 같은 결과를 얻을 수 있다.



# 역컴파일


    public final class HelloKotlinKt {


        public static final void main( ) {


            String var0 = "Hello Kotlin!";

            System.out.println( var0 );

        }


        // $FF : synthetic method

        public static void main(String[] var0) {

            main( );

        }

    }





Eclipse 역컴파일 결과


※ 컴파일러 버전에 따라 결과가 다르게 보일 수 있다.






#02. 변환된 main( ) 메서드의 의미



public은 가시성 지시자로 이 메서드의 접근 방법을 가리킨다.


public은 helloKotlinKt 클래스의 외부 어디에서도 접근할 수 있다는 의미이다.


static은 이 메서드 정적 메서드임을 나타내고 있다.


static으로 선언하면 프로그램의 정적 메모리 영역에 객체가 만들어지기 때문에 객체의 생성 없이 호출해 사용할 수 있게  된다.


final은 최종 메서드임을 나타낸다.


void는 메서드가 반환할 것이 없는 경우 지정한다.








#03. 코틀린의 main( ) 메서드에서 매개변수를 사용할 경우



main( ) 메서드에서 매개변수 args : Array<string>을 사용하면 자바에서는 String[] args로 변환된다.


이 args는 main( )에 전달할 외부의 인자들을 가리키고, 명령행에서 입력받은 값을디 차례로 배열에 들어가 된다.


명령행 인자를 사용하기 위해 아래 코드를 작성해보자.



 mainArgs.kt

fun main( args : Array<String> ) {


println( args[0] ); // 외부 첫 번째 인자

println( args[1] ); // 외부 두 번째 인자

println( args[2] ); // 외부 세 번째 인자

println( args[3] ); // 외부 네 번째 인자

}



작성한 코드는 Run > Run Configurations 항목을 선택하여 실행할 수 있다.





프로그램을 실행하면 아래와 같은 결과를 얻을 수 있다.



# 출력결과

 나이트엘프

 언데드

 오크

 휴먼



명령행에서 입력받은 인자를 각각 args[0], args[1], args[2], args[3] 문자열 형태로 저장한 것이다.




※ Eclipse에서 Run Configurations 실행 방법









반응형

'Kotlin' 카테고리의 다른 글

[Kotlin] Eclipse를 이용한 Kotlin 작업환경 구성  (0) 2020.03.01
[Kotlin] 코틀린이란?  (0) 2020.02.12
//