이번 교내대회인 모바일 콘텐츠개발대회를 하게 되면서 처음으로 앱을 만들기 시작했다. 기존에는 c++이용해서 소켓을 한 두번 했을까 말까고 웹서버 그리고 통신쪽을 잘 안했는데 어쩔 수 없이 백앤드를 맡았다. 기존에 써봤던 PHP를 이용해 볼까도 생각했고 요즘 핫한 Node.js 그리고 학교에서 많이쓰는 Django Flask도 몇번 생각을 해봤었는데 영... 마음에 들지 않았었다. (C++이나 Rust로 해볼까 생각해보기도..... 결국 미친짓이라 판단하고 넘어갔었다)

그 와중 결국 찾은게 Go 언어의 Martini라는 framework였다. 다른 프레임 워크들에 비해 직관적인 구현과 필요 한건 다 있는 Middle ware들 그리고 Go 언어의 쉬운 문법들이다. 6월달부터 약 한달간 서버를 개발 했는데 나름 괜찮은것 같아서 쭉 사용하고 있다.


프로젝트를 진행하면서 내가 느낀 Go언어의 장점들이다.


1. 언어가 쉽다.

사실 C++을 기존에 해서 그런거 일수도 있는데 일단 언어가 간결하다. 필요한 것만 딱 들어간 기분이다. 전체적으로 느낌은 C언어 같은 느낌인데 클래스를 사용 가능한 느낌. 상속같은것도 생각 해줄 필요가 없고 interface를 만들어 준후 메서드만 구현 해주면 클래스(struct)간 의존성이 굳이 상속 없이도 코드를 쉽게 작성할 수 있구나 라는걸 느끼기도 했다. 또한 포인터가 없고 레퍼런스도 이중으로는 안되게 해놔서 복잡함이 한결 덜어졌다.


2. 생산성이 높다.

사실 파이썬이 생산성이 높다고 해서 쓰고 싶다는 생각은 전혀 든 적이 없었다. 오히려 시간이 좀 걸리더라고 C++을 이용하는게 훨씬 좋다고 생각 해왔고 소스 코드 관리도 생산성이 높은 언어보다는 더좋다고 생각했었다. 근데 사람들이 왜 파이썬을 쓰는지 조금은 이해가 갈것 같은 기분이 들긴 했다. 개발이 좀 즐거워 진달까? 생각하는 대로 코드를 바로 짤 수 있어서 좋았다. 최근 소스 코드가 600줄이 좀 넘어가기 시작했는데 경험상 C++로 이정도 양의 코드를 짜려면 아마 두 배는 걸렸을 것 같다.


3. 라이브러리 추가

아마 라이브러리 관리면에서는 가장 Modern한 언어가 아닐까 생각이 든다. 기본 라이브러리 안에 대부분 필요한게 다 들어있고 필요한 것이 있으면 go get Link 해서 라이브러리를 다운로드 받은 후 바로 로드해 주면 된다. 의존성 문제도 없다. 프로젝트 하면서 가장 편했던 점이 아닐까 생각이 든다. 그리고 필요한 것들은 역시 거의 다 있다. 구글의 힘이 느껴지는 부분이였다.


아쉽게도 이번 프로젝트에는 Go Lang의 가장 큰 장점인 Concurrency부분은 사용해 본적이 없다.. 이부분은 추후에 다시 Concurreny만 따로 글을 올려야지


장점이 있으면 항상 단점들도 있다.


1. 에러처리의 불편함

Go언어는 에러를 매번 함수마다 리턴해서 if문으로 비교해야 한다. try catch문이 매우 그리워지는 순간이다. 프로그램을 종료해야할 수준의 에러가 아니라면 check_err같은 함수를 하나 만들어서 사용하는게 편하다.


2. 소스코드 관리

Go언어는 struct와 메서드를 따로 정의해야 한다. 그래서 한 파일에 struct와 method를 많이 정의해야 한다면 소스코드가 불어나서 나중에는 좀 보기 힘들어 지는 것 같다.(경험 부족이라 그런 것 일 수도 있다.)



+ 견습프로그래머로써 실력향상 방법

BOB에서도 느끼고 이번 모콘을 하면서도 느꼇지만 견습 프로그래머로써 실력 향상하는 방법은 책을 많이 읽는 것도 좋고 연습용으로 코드를 짜는 것도 좋지만 가장 좋은건 어디 내놓을 수 있을 만한 수준의 제품 코드를 작성해 보는 것 같다. (물론 지금 코드도 어디 내놓으라고 하면 매우 부끄럽지만..)

제품을 만들 때면 여러가지를 생각해 보게 된다. 그게 보안적으로가 되었든 사용자 경험이던 코드 관리 등등 다양한 부분에서 고민을 해야하고 그걸 코드로 표현해야 한다. 사실 막상 개발에 들어가면 어려운 코드 보다는 그냥 잘 알고 있는 if문 혹은 함수, 라이브러리 가져다 쓰기 그정도 선에서 끝난다. 하지만 점점 늘어나는 소스코드 줄 수를 보면 유지보수에 대해 생각해보게 되고 재사용 그리고 프로그램의 구조에 대해서 한 번 쯤 생각해 보게 된다. 또 그 과정에서 만나는 야생의 오류들은 검색능력과 다양한 지식을 쌓을수 있게 도와준다. 아마 나보다 프로그래밍을 늦게 시작 한 후배들이 프로그래밍 느는법을 가르쳐 달라고 하면 어디 내놓을만한 제품을 만들어 보라고 얘기해 줄것 같다


저작자 표시 비영리 변경 금지
신고
Creative Commons License
Creative Commons License

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글  3개가 달렸습니다.
  1. 크 1따봉남기고 갑니다
  2. 2 따봉 ㅇㅈㅇㅈ
  3. 1. 에러처리의 불편함

    Go언어는 에러를 매번 함수마다 리턴해서 if문으로 비교해야 한다. try catch문이 매우 그리워지는 순간이다. 프로그램을 종료해야할 수준의 에러가 아니라면 check_err같은 함수를 하나 만들어서 사용하는게 편하다.

    --> 본인은 이미 이 문제 때문에 Go가 "이론증명"을 위한 언어라고 느낄정도로 피해를 봤습니다..
    물론 try catch 같은건 panic-> recover()를 이용하여 해결할 수 있다쳐도, 원 문제점을 파악하지 못하는 상황이 발생했을땐 진짜 어떻게 trace해야할지 답이 안나오기도 하져.. 실제로 저같은 경우엔 Goroutine이 꼬여서 처음엔 잘 되다가 몇시간 뒤에 갑작스럽게 데드락이 걸려버리는 현상이 발생해서 원인 파악만 1주일이 걸렸던거 같네요.. 공개적으로 perf 체크툴을 통해 leak이 발생하거나 문제가 있는걸 보여준다해도 사용방법도 은근 난감하기때문에... ㄱ-
secret

Go에는 database를 편하게 사용 할 수 있는 Gorp라는 라이브러리가 존재한다. (https://github.com/go-gorp/gorp)

일단 여러가지 디비를 지원하고 기본적으로 go에 포함되어있는 sql라이브러리 보다 훨씬 편하다.

제일 좋은점은 struct를 만들어 두고 addtable하면 자동으로 테이블도 만들어주고 디비랑 맵핑해준다.

그런데 막상 이용해보면


Panics if any interface in the list has not been registered with AddTable

라고 뜨면서 화나게 만든다...


국내에는 Go lang을 질문해서 대답해 줄만한 곳이 없어서 stackoverflow에 질문했더니 역시나 바로 달아주신다.

Go 에서는 대문자로 변수를 선언 하면 Export 소문자로 변수를 선언하면 unexport상태가 된다.

아래 코드를 보면 더 이해가 쉬울꺼다.



reflect오류는 변수가 unexported되면서 생기는 문제인데 내 코드상에서 문제는 satus를 소문자로 선언하면서 발생한 문제

status를 Status로 변경해 주자 잘 돌아갔다.

언어는 부딪히면서 배우는것 같다. 시간나면 go도 제대로 배워야지..


신고
Creative Commons License
Creative Commons License

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret