본문 바로가기

웹/Go

[Go] Go와 http를 이용한 REST API 만들기 - 학식 취향분석 (2)

haksik-personalized

저번 스프링 부트를 이용하여, 사용자 취향에 맞는 학식 메뉴를 추천해주는 간단한 프로그램을 구성해보았다.
(참고 링크: https://winterlimited.tistory.com/15)
현재는 취향 분석의 여러개의 값이 존재하지 않아 평가된 메뉴 점수의 평균값만으로 취향을 분석하여 추천한다.
학식 메뉴를 제공하고, 사용자가 각 메뉴를 "좋아요", "보통이에요", "싫어요"로 평가할 수 있게끔 기존 프로그램과 동일한 방식으로 동작할 수 있도록 구성해두었다.
다만, 따로 DB를 두고있지 않고, - store의 user.go, menu.go에 배열을 이용해 값을 저장할 수 있도록 임시로 구성해두었고 추후 ScyllaDB와의 연동을 계획하고 있기때문에, NoSQL 형식으로 DB구조를 구성하기 위해 user.go에 menu_score type을 넣어두는 형식으로 DB 구조를 구성하였다.

(repository: https://github.com/WinterLimited/haksikbot-personalized)

 

GitHub - WinterLimited/haksikbot-personalized

Contribute to WinterLimited/haksikbot-personalized development by creating an account on GitHub.

github.com

 

시스템 구조

기존 스프링으로 구축해둔 서버와 거의 동일한 방식으로 구성해두었고, 기존 파일 하나를 이용해 main.go에 모든 코드를 다 넣어두었지만코드를 기능에 따라 분리해두어 각각 관리할 수 있도록 프로젝트 폴더 구조를 구성하였다.

- cmd/
  - main.go
- api/
  - routes.go
  - handler/
    - menu_handler.go
    - user_handler.go
  - model/
    - menu.go
    - user.go
  - store/
    - menu.go
    - user.go
- services/
  - menu_service.go
  - user_service.go
  • cmd 폴더
    • main.go : 어플리케이션의 진입점이 존재
  • api 폴더
    • routes.go : API endpoint의 라우팅을 설정하는 코드를 포함
    • handler 폴더 : API의 요청을 처리하는 핸들링 함수를 포함
      • menu_handler.go
      • user_handler.go
    • model 폴더 : DB구조, Entity 정보
      • menu.go
      • user.go
    • store 폴더 : DB를 저장 (임시로 구성)
      • menu.go
      • user.go
  • service 폴더 : 각 기능을 구현하기 위한 비즈니스 로직들 구성
    • menu_service.go
    • user_service.go

 

코드

Golang을 이용해 기존 프로젝트를 만들어보며 문법에 대해 이해하였고,
net/http의 http 통신을 이용한 REST API 서버를 간략하게 구성하여 통신을 주고받을 수 있는 서버를 구성하였다.

 

메뉴 점수를 반환하는 API

// GET /api/menus
http.HandleFunc("/api/menus", getMenusHandler)

 

메뉴 이름과 사용자 ID를 통해 메뉴에 대한 평점을 삽입, 갱신

// POST /api/menus/score
http.HandleFunc("/api/menus/score", postMenuScoreHandler)

 

사용자 ID를 통해 사용자의 이름과 메뉴별 평점을 반환

// GET /api/users/{userId}
http.HandleFunc("/api/users/", getUserHandler)

 

 

느낀점

Golang을 이용해 기존 프로젝트를 만들어보며 문법에 대해 이해하였고, Golang의 장단점에 대해서 많은 것들을 느낄 수 있게 되었다.

 

장점

  • 단순성과 명확성: Golang은 구문이 단순하고 이해하기 쉽다는 점을 알게 되었다. 이는 코드의 가독성을 향상시키며, 언어의 복잡성으로부터 오는 버그를 줄일 수 있다는 느낌을 받았다.
  • 표준 라이브러리와 도구의 풍부함: Go는 풍부한 표준 라이브러리와 도구(net/http와 같은)를 제공한다. 이를 통해 네트워킹, 데이터 조작, 테스트 등 다양한 작업을 쉽게 처리할 수 있었다.
  • 함수형 프로그래밍과 객체 지향 프로그래밍의 결합: Go는 객체 지향 프로그래밍과 함수형 프로그래밍 사이의 효율적인 조화를 제공한다. 이를 통해 코드를 더욱 효과적으로 조직화하고 모듈화하는데 도움이 되었다.
  • 적은 메모리 소비: Go는 메모리 관리에 효율적인 점도 좋았다. 스프링에 비해 Go 애플리케이션이 더 적은 메모리를 소비하고, 응답 시간도 빠르다는 것을 확인하였다.
  • 병행성 처리: Go의 병행성 처리 기능은 매우 강력하고 간단하게 활용할 수 있다는 것을 기본적인 언어의 특징을 공부하며 알게되었고 이를 백엔드 서버에 활용하면 상당한 장점이 될 수 있다는 것을 알게되었다.

단점

  • 프레임워크의 부족: 스프링처럼 완전히 통합된 웹 개발 프레임워크가 부족하다고 생각된다.
  • 커뮤니티와 지원: Go의 커뮤니티는 스프링보다 작다. 따라서 문제가 발생했거나 새로운 정보를 찾는 것에 시간이 많이 소요되었다.
  • ORM의 부재: JPA 같은 ORM 도구가 없다. 따라서 DB 연동에는 시간이 꽤 걸릴 수 있을 것 같다.