본문 바로가기

Go

(19)
golang 상속 (상속아님) Go 언어에서는 상속이라는 개념이 없지만 그걸 유사하게 구현할수 있는 방법은 임베딩이 있다. 하지만 임베딩을 한다고 해서 그건 상속과는 다르다. 상속은 내 표현으로 얘기하자면 직접연결이지만 고 언어에서 임베딩은 직접연결이 아니다. 하지만 겉으로 보기엔 직접연결을 하고 있는것처럼 보인다. 위와 같이 상속된 객체는 인스턴스 하나를 생성하지만 고랭에서 임베딩을 한다고 하면 임베디드 된 객체 하나와 임베딩한 객체가 각각 생성된다. 그러니 상속과 임베딩은 엄연히 다른 의미이지만 위에서 얘기했듯이 Syntatic Sugar 로 인해 직접연결한 것처럼 보이고 그런식으로 사용된다. 한국 민속놀이중 하나인 스타크래프트로 예를 들어 보겠다. 저그의 유닛은 저글링과 히드라가 있다. (더 있는거 아는데 조용좀 해줄래?) 저글..
golang 추상팩토리 패턴(Abstract Factory with golang) 목적 추상 팩토리 패턴은 구상 클래스를 명시하지 않고도 서로 연관되거나 의존하는 객체들을 생성할 수 있도록 하는 패턴이다. 문제 여러 프로덕트군들간 공통적인 변수들을 가지고 있는 클래스들이 있다면 개별 객체들의 기존 코드들을 변경하지 않고 새로운 프로덕트를 관련된 프로덕트군에 추가하고자 한다. 해결책 프로덕트들의 개별 프로덕트에 대한 인터페이스를 명시한다. 그 이후 각 프로덕트들이 해당 인터페이스를 따르도록 한다. 모든 프로덕트에 대한 생성 메서드의 목록을 가지는 인터페이스를 선언한다. 구조 추상 프로덕트는 개별 프로덕트를 위한 인터페이스를 선언한다. 추상 팩토리 인터페이스는 각 추상 프로덕트를 생성하는 메서드의 집합을 선언한다. 구상 프로덕트는 변수들로 그룹화되는 추상 프로덕트를 다양하게 구현한다. 구..
golang 싱글톤 패턴(Singleton Pattern with golang) 목적 싱글톤 패턴은 클래스가 하나의 인스턴스만 갖도록 하는 동시에 이 인스턴스에 대한 전역 접근 지점을 제공한다 문제 싱글톤 패턴은 단일 책임 원칙을 위반하여 다음 2가지 문제를 해결한다 클래스에 인스턴스가 하나만 있는지 확인한다 클래스에 있는 인스턴스 수를 제어하려는 사람이 있는 일반적인 이유는 일부 공유 리소스(예: 데이타베이스 또는 파일)에 대한 엑세스를 제어하기 위한 것이다. 작동 방식은 객체를 생성한 이후 새로운 객체를 재생성했을 때, 새로운 객체를 반환받지 않고 이미 생성된 객체를 반환받는 것과 같다. 생성자 호출은 반드시 항상 새 객체를 의도적으로 반환해야 하므로 이 동작은 일반 생성자로 구현할 수 없다 해당 인스턴스에 대한 전역 접근 지점을 제공한다 일부 필수 객체를 저장할 때 사용했던 전..
고에서 에러 제어 프로그래밍에서 에러란 운영하고 있는 서비스에서 의도되지 않은 상태가 발생하는 걸 말한다. 에러가 발생하면 우리는 문제를 해결하기 위한 디버깅이라는 개 ㅈ같은 작업을 하게된다. 고에서는 기본적으로 아래와 같이 error 인터페이스가 Error() 메서드를 담고있는 형태로 내장이 되어있다. type error interface { Error() string } error 는 보통 함수나 메서드에서 두번째 인자값에서 표현한다. str := "kkk" num , err := strconv.Atoi(str) if err != nil { panic(err) } 위에서는 kkk 를 int 타입으로 변경하는 strconv.Atoi() 를 사용하는데 kkk 는 숫자가 아니므로 에러를 뱉는다. 대부분의 패키지에서 저런형식..
golang 구글 Oauth 인증 구현 1. OAuth Applciation 등록 GCP Console (https://console.cloud.google.com/) 외부를 클릭하여 만들고 앱 이름 , 사용자 지원 이메일, 개발자 연락처 정보만 기입하고 나머지는 빈칸으로 둔다. 그 후 사용자 인증정보를 OAuth 클라이언트 ID 를 선택해서 생성한다. 테스트 해볼 용도이니 출처는 localhost:5000 으로 리디렉션도 마찬가지로 localhost:5000/auth/google/callback 으로 했다. 이때 생성되는 클라이언트 ID 와 비밀번호를 잘 보관하자 이 키를 기반으로 구글인증을 진행할수 있다. 2. golang handler 작성 이제는 위의 저장된 정보를 기반으로 고 핸들러를 작성해보자. 현재 쓰고있는 프레임워크는 긴이라 긴..
golang Gracefully Shutdown (위대한 쇼다운맨 ) Gracefully shutdown 이란 말은 좀 잘만든거 같음 적어도 Good Shutdown 보다는 낫자나 그래서 Gracfully Shutdown 이 뭐냐? 서버에서 돌아가는 OS 나 소프트웨어가 꺼질때 안전하게 끄는것 (A graceful shutdown is when a computer is turned off by software function and the operating system (OS) is allowed to perform its tasks of safely shutting down processes and closing connections) 읭? 이게 뭔 소리 예를 들어 유튜브를 운영하는 백엔드 서버가 있다고 가정해보자 유튜브에서 야심차게 새로운 기능을 넣어서 (박)새로이 배..
Golang TDD (테스트 주도 개발) 유닛테스트 루트 절대경로 설정 Golang TDD를 도입하려는 도중 이슈가 발생해 적어봤습니다. TDD의 기본은 유닛 테스트입니다.말 그대로 함수 하나를 테스트를 한다는 말인데요. TDD의 설명은 많은 분들이 적어놓으셨기 때문에 생략하겠습니다. 제가 궁금했던 문제는 이겁니다. 유닛테스트 즉, 함수 하나를 테스트하는데 환경변수는 어떤 식으로 초기화해서 써야 할까? TDD 를 도입하기 이전에는 디비접근,센트리URL,JWT TOKEN,PASSWORD 등등을 루트 디렉터리의. env로 긁어와서 초기화한 후 실행하면 끝이었습니다. TDD 도입을 하면서도 별 생각이 없었습니다. 테스트 코드를 만들고 기존에 있는 환경변수 초기화 함수를 테스트 코드 안에 넣고 ( 필자는 .env 사용 ) go test ./... 를 하면? panic: open ...
고(golang) 메일보내기(google) from := "보낼사람의 지메일" password := "비밀번호" toList := []string{"받는사람 메일주소","받는사람 메일주소2"} host := "smtp.gmail.com" port := "587" msg := "Hello myungsworld" body := []byte(msg) auth := smtp.PlainAuth("", from, password, host) err := smtp.SendMail(host+":"+port, auth, from, toList, body) // handling the errors if err != nil { panic(err) } fmt.Println("따봉")