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)
시스템 구조
기존 스프링으로 구축해둔 서버와 거의 동일한 방식으로 구성해두었고, 기존 파일 하나를 이용해 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 연동에는 시간이 꽤 걸릴 수 있을 것 같다.