GitHub OAuth 구현하기 (3)

2020/07/04 - GitHub OAuth 구현하기 (1) 2020/07/07 - GitHub OAuth 구현하기 (2) 에서 이어집니다. GitHub OAuth 구현을 실제 소스코드를 통해서 설명하려고 합니다. ( 사용한 언어는 Golang 이지만, 다른 언어를 사용하더라도 비슷한 방식으로 구현할 수 있습니다. ) 먼저 init() 함수에서 OAuth관련 설정을 해 줍니다. 여기서 만든 설정은 전체 앱에서 사용합니다. var OAuthConf *oauth2.Config func init() { OAuthConf = &oauth2.Config{ ClientID: "{{ oauth app client id }}", ClientSecret: "{{ oauth app client secret }}", Re..

나는 언제 은퇴를 해야 할까?

불과 몇 년 전까지만해도 노후에 대해서 깊게 생각해보지 않았습니다. 회사에 속해 있으면서, 꾸준히 월급이라는 수익이 들어오고, 그걸 가지고 먹고 살기에 넉넉하지는 않을지라도, 굶어죽지 않을 만큼은 되고 하니깐 진지하게 생각할 필요를 못 느꼈습니다. 올해는 나이도 많아지기도 했고, 회사에서도 이제 (아직 마음은 신입사원이라 생각하지만) 올라갈 수 있는 직급이 올라왔던 직급보다 많아졌고, 예상하지 않았던 팬데믹 상황에서 경제도 어려워지니, 꾸준히 들어왔던 월급이 꾸준하지 않을 수도 있겠구나 싶은 불안감이 들기 시작하니, 노후에 대해서 슬슬 진지하게 준비해야겠다 생각이 들고 있습니다. 그래서 궁금했습니다. 언제 은퇴를 해야 노후에 자식한테 의지 하지 않고, 지금 생활하는 (가끔 외식도 하고, 분기에 한번이라도..

기업의 적정 가치 측정하기.

주식 투자에서 이익을 내는 방법은 간단합니다. 싸게사서 비싸게 파는 것입니다. 그러면 얼마에 사야 싸게 사는 것일까요? 이것을 알기 위해서는 투자하려는 기업의 가치를 측정할 수 있어야 합니다. 측정된 가치를 발행 주식수로 나누면 적정 주가를 판단할 수 있는 것입니다. 과거에 이러한 시도는 많이 있었습니다. 최근에 읽었던 여러 가치투자 관련 책들을 보면, 주당이익율, 현금흐름, 영업이익율 등 다양한 지표들을 이용해 기업의 가치를 산정하고, 이를 기반으로 투자하는 것을 설명합니다. 마법공식이라는 것도 존재해서 특정 주식을 산출하고 이에 투자하는 방식도 많이 있습니다. 이러한 것을 퀀트 투자라고 하는데, 이 투자법의 대부분은 적정 주가를 계산하기 보다는 저평가된 주식 목록에 투자하고 그것을 리밸런싱 함으로써 ..

[Go] cookie에 object 저장하기.

gorilla 웹 툴킷이라는 Go의 서드파티 라이브러리가 있습니다. 그 중에 session 이라는 패키지는 쿠키, 세션등을 편리하게 이용할 수 있는 기능을 제공합니다. 이 글에는 session 패키지를 이용해서 사용자 정보를 쿠키에 저장하다가 알게 된 것을 기록해 두려고 합니다. 구현하려던 기능은 이렇습니다. 사용자가 접속하면 로그인 정보를 확인합니다. 로그인 되지 않은 경우, 로그인을 요청합니다. 로그인 후 사용자 정보를 쿠키에 저장합니다. 일정 시간동안은 브라우져를 종료하더라도 쿠키에서 사용자 정보를 읽어 로그인하지 않도록 합니다. 그렇게 하기위해 다음과 같은 사용자 정보를 보관할 구조체를 선언합니다. type User struct { Name string Email string } 그리고 main...

왜 http.handleFunc가 두번 호출될까?

Go로 간단한 테스트 페이지를 만들었는데, http.HandleFunc가 두번 호출되는 현상을 발견했습니다. 전부가 그런건 아니었고, 한 개의 핸들러만 두 번씩 호출되었는데, 그 원인은 의외로 간단했습니다. 먼저 코드는 대충 이렇게 생겼습니다. func main() { http.HandleFunc("/", RenderMainView) log.Fatal(http.ListenAndServe(":8000", nil)) } func RenderTemplate(w http.ResponseWriter, name string, data interface{}) { tmpl, _ := template.ParseFiles(name) tmpl.Execute(w, data) } func RenderMainView(w http..