반응형

■ 파일로 로그 관리

내장 패키지 log, os, time 를 활용하여

로그를 작성할 파일을 생성하고, 파일에 로그를 작성

 


■ 작업 내용

일별로 로그를 관리할 수 있도록 파일을 생성하고 로그 작성

func main() {
	// 현재시간
	startDate := time.Now().Format("2006-01-02")
	// log 폴더 위치
	logFolderPath := "./log"
	// log 파일 경로
	logFilePath := fmt.Sprintf("%s/logFile-%s.log", logFolderPath, startDate)
	// log 폴더가 없을 경우 log 폴더 생성
	if _, err := os.Stat(logFolderPath); os.IsNotExist(err) {
		os.MkdirAll(logFolderPath, 0777)
	}

	// log 파일이 없을 경우 log 파일 생성
	if _, err := os.Stat(logFilePath); os.IsNotExist(err) {
		os.Create(logFilePath)
	}
	// log 파일 열기
	logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		panic(err)
	}
	defer logFile.Close()
	// log 패키지를 활요하여 작성할 경우 log 파일에 작성되도록 설정
	log.SetOutput(logFile)

	// log 작성
	log.Println("Test")
}

■ 결과

1. 로그 파일 생성 확인

2. 로그 확인

반응형
반응형

■ SMTP

간이 우편 전송 프로토콜(Simple Mail Transfer Protocol)의 약자. 이메일 전송에 사용되는 네트워크 프로토콜이다.

인터넷에서 메일 전송에 사용되는 표준이다. 1982년 RFC821에서 표준화되어 현재는 RFC5321에서 정의된 ESMTP(Extended SMTP; 확장 SMTP)로 2008년 갱신되었다. SMTP는 보안과 호환성의 문제로 그대로는 사용하지 않는 경우가 많다. 일반적으로 쓰이는 확장 프로그램은 SMTP-AUTH(송신자 인증 서비스), ESMTP(SASL을 이용한 보안 연결), MIME(non-ascii 데이터 전송 포맷)가 있다.

SMTP는 25/tcp와 587/tcp 포트를 사용하며 SMPTS는 465/tcp 포트를 사용한다.

출처 : 나무위키


■ Google Gmail SMTP 설정 방법

1. Gmail 설정 화면으로 이동

  • 설정(톱니바퀴 모양) 버튼 클릭
  • 모든 설정 보기 버튼 클릭

2. IMAP 엑세스 상태를 [IMAP 사용] 으로 수정

  • [전달 및 POP/IMAP] 탭으로 이동
  • IMAP 엑세스 상태를 [IMAP 사용] 으로 수정
  • 변경사항 저장 버튼 클릭

3. Google 계정 보안 설정 화면으로 이동

  • Google 계정 관리 화면으로 이동
  • [보안] 탭으로 이동
 

Google 계정

Google은 사용자마다 원하는 개인정보 보호 설정이 다르다는 사실을 인지하고 있습니다. 그래서 Google 계정에서는 사용이 간편한 컨트롤과 개인정보 보호 진단 같은 도구를 제공합니다. 이런 도구

www.google.com

4. Google에 로그인 [2단계 인증] 사용

  • [2단계 인증] 클릭

  • [시작하기] 버튼 클릭

  • 사용자의 전화번호 입력
  • 코드를 받을 방식 선택
  • [다음] 버튼 클릭

  • 인증코드 입력
  • [다음] 버튼 클릭

  • [사용] 버튼 클릭

5. Google에 로그인에 추가된 [앱 비밀번호] 생성

  • Google에 로그인 [앱 비밀번호] 클릭

  • 앱 선택에서 [기타(맞춤 이름)] 선택

  • 기기 이름을 사용자에 맞게 작성(*필자의 경우 GMAIL-SMTP)
  • [생성] 버튼 클릭

  • 자동 발급된 기기용 앱 비밀번호를 확인(* 비밀번호는 메일 발송시 필요하기 때문에 저장해둔다)
  • [확인] 버튼 클릭  


■ GO 언어에서 SMTP를 활용하여 메일 발송

  • 1 : 앱 비밀번호를 생성한 사용자의 이메일 주소
  • 2 : 앱 비밀번호
  • 3 : smtp.gmail.com [고정 값]
  • 4 : 발신자 주소
  • 5 : 수신자 주소 [복수 입력 가능]
  • 6 : 메일의 제목 
  • 7 : 메일의 형식을 지정할 수 있다. 예시로 html 본문을 발송하기 위해서 [Content-Type: text/html;\n] 로 설정하면 된다.
  • 8 : 메일의 본문
  • 9 : smtp.gmail.com:587 [고정 값]

소스 코드

func SendMail() {
	auth := smtp.PlainAuth("", "hyenmin@gmail.com", "fsdajklfdslak", "smtp.gmail.com")
	from := "hyenmin@gmail.com"
	to := []string{"hyenmin@gmail.com"} // 복수 수신자 가능

	// 메시지 작성
	headerSubject := "Subject: [제목] 메일 테스트 발송\r\n"
	headerBlank := "\r\n"
	body := "[본문] 메일 테스트 발송"
	msg := []byte(headerSubject + headerBlank + body)

	// 메일 보내기
	err := smtp.SendMail("smtp.gmail.com:587", auth, from, to, msg)
	if err != nil {
		log.Fatalln("Error")
		return
	}
	log.Fatalln("Success")
}
반응형
반응형

■ get 명령어 정의

GO 언어에서 사용하는 get 명령어는 자신의 프로젝트에서 기본적으로 제공하는 패키지를 제외하고 사용하고 싶은 외부 패키지를 불러와서 사용할 수 있도록 해주는 명령어이다.


!!! 확인

해당 작업은 Go가 설치 되어 있다는 가정하에 진행된다.

설치가 안되어있는경우 아래 페이지에서 확인하길 바란다.

 

[Go] Go 언어 개발 환경 구축

1. Go 설치 사이트로 이동 The Go Programming Language Download Go Binary distributions available for Linux, macOS, Windows, and more. // You can edit this code! // Click here and start typing. packag..

hyunmin1906.tistory.com

 작업 과정

1. GOPATH 정의

GOPATH는 자신의 프로젝트 루트 경로이며, 기본적으로 3개의 폴더를 갖는다.


  • src : 외부 패키지의 소스 및 자신의 프로젝트가 저장될 위치
  • pkg :  외부 패키지의 컴파일이 끝난 오브젝트 파일들이 저장될 위치
  • bin : 실행파일, 바이너리 파일들이 저장될 위치

2. GOPATH 확인

GOPATH는 외부 패키지를 활용하여 자신의 프로젝트를 진행할 위치가 된다.

따라서 자신의 GOPATH를 확인하고 진행한다.

 

2.1 go env 명령어로 GOPATH의 경로를 확인하는 방법

  • 커멘드(cmd)창 실행
  • go env 명령어 입력

2.2 시스템 변수로 확인하는 방법

  • [제어판 > 모든 제어판 항목 > 시스템] 경로 이동
  • 고급 시스템 설정 클릭 

  • 시스템 속성창
  • 고급 탭으로 이동
  • 환경 변수 버튼 클릭

  • 사용자 변수 GOPATH 편집 또는 없을 경우 새로만들기 버튼 클릭

  • GOPATH 변수 값 확인 또는 변경 가능
  • 확인 버튼 클릭


3. get 명령어로 외부 패키지 활용

3.1 개인 프로젝트의 루트 경로로 이동

  • 커멘드(cmd)창 실행
  • GOPATH 경로로 이동

3.2 GO111MODULE 설정값 확인 또는 변경

3.2.1 GO111MODULE 정의

  • on : 루트 경로의 src 폴더에 외부 패키지 소스 파일 생성 안됨, pkg 폴더에 외부 컴파일된 파일 생성됨
  • off : 루트 경로의 src 폴더에 외부 패키지 소스 파일 생성 됨, pkg 폴더에 외부 컴파일된 파일 생성됨
  • auto : on/off를 자동으로 설정됨

3.2.2 GO111MODULE 확인

  • 커멘드(cmd)창 실행
  • [go env] 명령어 입력
공백이라고 해서 off 라고 확정할 수 없다. 따라서 정확하게 작업하기 위해서 
3.2.1 GO111MODULE 정의를 참조 하여 지정하고 작업을 진행하길 바란다.

 

3.2.3 GO111MODULE 수정

go env 의 환경 설정은 커멘드창이 실행되고 있는 동안에 유지되는

일회성 환경 설정과 커멘드창이 종료되어도 설정이 유지되는 영구 환경 설정이 있다.

영구 환경 설정이라고해서 수정이 불가능 한것이 아니니 걱정하지 않아도 된다.

  • 커멘드(cmd) 창 실행
  • 일회성 환경 설정 : [set GO111MODULE= (on 또는 off 또는 auto )] 입력
  • 영구 환경 설정 : [go env -w GO111MODULE= (on 또는 off 또는 auto)] 입력

3.2.3.1 일회성 환경 설정

명령어 : set GO111MODULE= (on 또는 off 또는 auto)

 

3.2.3.2 영구 환경 설정

명령어 : go env -w GO111MODULE =(on 또는 off 또는 auto)

 

3.3 get 명령어 실행

  • GO111MODULE 설정값 확인. (필자의 경우 src와 pkg 를 생성하기 위해 off로 설정)
  • 설치하고자 하는 외부 패키지 지정(필자의 경우 gin 프레임워크를 설치하고자 한다.)
  • go get [외부 패키지] 입력 (get 명령어는 부가 옵션 [-u, -d 등] 여러개가 있지만 필자는 사용하지 않는다.)
  • GOPATH/src 또는 GOPATH/pkg 에서 설치된 외부 패키지 확인

3.3.1 GOPATH/src 폴더 확인

3.3.2 GOPATH/pkg 폴더 확인


반응형
반응형

Go 언어 함수

func는 여러 프로그래밍 언어(JavaScript, Python 등)에서 일반적으로 사용하는 함수형태와 유사하지만, Go 언어에서는 특별하게 다수의 리턴값을 가질 수 있으며, 또한 리턴할 변수를 미리 선정하고 리턴시킬 수 있다.


1) 한개의 값을 리턴하는 함수

예시) 자료형이 string인 한개의 값을 리턴하는 함수
func SingleReturn(name string) string {
    return name
}

2) 다수의 값을 리턴하는 함수

예시) 자료형이 int, string인 다수의 값을 리턴하는 함수
func ManyReturn(name string) (int, string) {    
    return len(name), name
}

3) 변수를 지정해서 리턴하는 함수

예시) 자료형이 int, string인 변수를 지정하여 값을 리턴하는 함수
func FixReturn(name string) (lenName int, upperName string) {   
      lenName = len(name)    
      upperName = strings.ToUpper(name)    
      return
}

4) 다수의 값을 인자로 받는 함수

예시) 자료형이 string인 다수의 값을 인자로 받는 함수
func ManyArgument(names ...string) {    
      fmt.Println(names)
}

Go 언어 메소드

메소드는 리시버(receiver)에 접근하여 작업이 가능하다. 또한 메소드는 같은 패키지에 있는 리시버만을 선언할 수 있으며, 주로 리시버는 구조체(Struct) 이다. 쉽게 말해 함수에 리시버가 있으면 메소드이다.


1) 벨류 리시버(Value Receiver)로 필드 접근

* Value Receiver는 리시버에 해당하는 새로운 객체를 복제하기 때문에 실제 객체에는 영향이 없다.

예시) person 구조체의 모든 필드에 값을 삽입하고, 출력하시오.
type Person struct {    
    name    string    
    age     int    
    address string
}

func (p Person) searchPerson() {    
     fmt.Println(p.name, p.age, p.address)
}

func main() {
    myInfo := Person{"hyunmin", 28, "서울시 용산구"}
    myInfo.searchPerson()
}
// 출력결과 : hyunmin 28 서울시 용산구

2) 포인터 리시버(Pointer Receiver)로 필드 접근

* Pointer Receiver는 실제 객체에 접근하여 작업이 가능하다.(수정, 검색 등)

예시) person 구조체의 모든 필드에 값을 수정하고 출력하시오.
type Person struct {
	name    string
	age     int
	address string
}

func (p *Person) searchPerson() {
	fmt.Println(p.name, p.age, p.address)
}
func (p *Person) changePerson() {
	p.name = "donghun"
	p.age = 27
	p.address = "서울시 강서구"
}

func main() {
	myInfo := Person{"hyunmin", 28, "서울시 용산구"}
	// 수정 전
	myInfo.searchPerson()
	// 수정 작업
	myInfo.changePerson()
	// 수정 후
	myInfo.searchPerson()
}

// 출력 결과
// hyunmin 28 서울시 용산구
// donghun 27 서울시 강서구

반응형
반응형

■ Go 언어 구조체

Struct는 Object와 같이 여러 자료형의 데이터를 저장할 수 있는 자료구조이다.

쉽게 말해 Map의 경우 key의 자료형과 value의 자료형을 설정하고 해당 자료형의 데이터만 저장할 수 있다. 하지만, Struct는 string, int, slice등 다양한 자료형의 데이터를 class와 유사하게 저장할 수 있다. 또한, Struct를 생성하고 필드에 데이터를 삽입하는 작업은 다양하게 가능하며 기호에 맞게 사용할 수 있다.


Struct

예시) 이름과 나이, 주소를 저장하는 Struct를 선언하고, 임의의 데이터를 저장하여 
Struct에 저장된 모든 데이터를 호출하시오.

 * Struct를 생성하고 필드에 데이터를 삽입하는 작업은 다양하게 가능하며 기호에 맞게 사용할 수 있다.
type person struct {    
       name    string    
       age     int    
       address string
}

func main(){
        // 1. 모든 필드 데이터 저장
        myInfo1 := person{name: "hyunmin", age: 28, address: "서울시 용산구"}

        // 2. 모든 필드명을 생략하고 선언한 필드 순서대로 데이터 저장
        myInfo2 := person{"hyunmin", 28, "서울시 용산구"}

        // 3. 공백 Struct를 생성하고 모든 데이터 저장
        myInfo3 := person{}    
        myInfo3.name = "hyunmin"    
        myInfo3.age = 28    
        myInfo3.address = "서울시 용산구"

        fmt.Println(myInfo1)
        fmt.Println(myInfo2)
        fmt.Println(myInfo3)
}

// 출력 결과
// {hyunmin 28 서울시 용산구}
// {hyunmin 28 서울시 용산구}
// {hyunmin 28 서울시 용산구}

반응형
반응형

■ Go 언어 맵

Map은 중복되지 않는 key와 중복이 가능한 value를 갖는 자료구조이며,

일반적으로 key에 해당하는 value를 도출하고 싶을때 사용한다.

즉, name이라는 key에 해당하는 value값 hyunmin을 호출할 수 있다.

Map은 배열과 달리 순서가 없는 자료구조이기 떄문에 반복문을 통해 데이터를 호출할 경우 호출할때마다 다른 순서로 데이터가 호출된다.


예시) key와 value의 데이터 타입이 string인 map을 선언하고 key로 'name'과 'age'를 갖고, value로 'hyunmin', '28'을 갖는 map을 생성하여 전체 데이터를 호출하시오.
data := map[string]string{"name": "hyunmin", "age": "28"} 
   
for key, value := range data {        
      fmt.Println(key, value)    
}

/*
※ 출력 결과
name hyunmin
age 28
 
또는

age 28
name hyunmin
*/

반응형

+ Recent posts