🙏🏻 velog-server clone to Golang (Gin)
일단 오늘은 데이터베이스 orm을 변경했다. 내가 이걸 변경하는 이유는 개발을 진행하면서 gorm에서 모델간의 관계와 model의 필수값 nullable을 표시하는게 상당히 불편했다. 그리고 무엇보다 변경을 하자고 생각한 이유는 뭔가 유지보수가 안되는 것 같았다. 그래서 변경을 결심했고 ent로 변경을 했다.
현재 User 모델만 생성을 했지만 계속 변경해 나갈 예정이다.
- ent orm 적용
- gin server 구조 변경및 docker 파일 분리 (redis, postgresql)
entgo에서 대해서 조금 찾아봤는데 code frist로 개발되어서 그런지 원시적으로 raw query를 지워하지 않는다. 만약에 사용할려면 빌드인 sql 모듈과 연동해서 사용해야 한다.
이메일 발송 API를 생성했는데 아주 잘 작동하고 있다.
- ent orm (emailAuth, User, UserProfile) 모델 구현
- ent orm에서 raw query가 지원이 안되기 때문에 빌드인 sql을 연동해서 사용
- sendEmail API 생성
오늘은 유저 회원가입및 코드 인증부분을 구현했다. 일단 코드로 register token을 발급 받는 부분은 정상적으로 실행을 하고 있지만 로그인 부분은 오류가 있을 것 같다.
왜냐하며 로컬 회원가입중 authToken 테이블을 생성하는 부분에서 sql 에러가 발생했다.
insert node to table "auth_tokens": pq: insert or update on table "auth_tokens" violates foreign key constraint "auth_tokens_users_auth_token"
내가 table 설계를 잘못한 것 같다.... 음... 정상적으로 한 것 같은데... 이건 다음에 수정해야겠다.
- 로컬 회원가입 API
- 코드 인증 API
오늘은 저번 이야기에서 유저 토큰이 발급이 안되는 이슈를 해결했다. 이슈의 원인은 entgo에서는 1:N N:M등 다대다 관계에서는 column을 설정할 때 s를 붙여야하고 user 모델에서 토큰을 추가해줘야하는 이슈였다.
하지만 한가지 이슈가 더 발생했는데, authToken을 생성하면 fk_user_id에 값이 들어가야하는데 왠지 모르게 값이 안들어간다... 내가 생각했을 때는 내가 잘못한 것 같은데 한번 더 이유를 찾아봐야겠다.
- 로컬 회원가입 API - (저번 이야기 이슈 처리)
아직도 유저 인증부분을 하고 있다.... authToken 모델과 관련 에러로 오래 작업하고 있는데, 그 이유를 찾았다. 지금 authToken 모델을 생성하고 User 모델에 등록하는 것에서 에러가 발생하고 있다. 그 이유는 테이블이 생성될 때 내가 생각하는 테이블간 관계가 잘못 설정되는 것 같다. 뭔가 entgo 처음이라 이런 실수를 많이하는 것 같다. 이유는 찾았지만 아직 해결하지 못했다. 이걸 빨리 고쳐야 포스트 작성 부분을 진행 할 텐데...
- 로컬 회원가입 / 로그인 API - (저번 이야기 이슈 처리)
토큰 발급에 대한 이슈를 처리했다. 너무 어렵게 생각했다. 괜히 관계를 만들려다가 더 복잡해지는 것 같아서 column에 그냥 user id를 생성하고 나중에 조회 할 때 join를 하면 되는걸 생각하지 못했다. 그래도 성공적으로 인증이 된다.
그리고 소셜 로그인을 준비하고 있다. 아마 페이스북 깃헙 카카오 구글을 도입 할 예정인데... 아직은 확실하지 않다
- 로컬 인증 API 구현 완료
- 소셜 인증 테이블 생성
- 소셜 API 준비
오늘은 소셜 인증 API를 구현하였다. facebook, github를 구현하였고 추가적으로 kakao난 구글을 구현 할 예정이다. 작업을 진행하면서 golang에서 multiple type을 구현이 가능한지 시도해 볼려고 했는데 힘든것 같아서 일단 쉽게 구현하는 방법으로 구현
- 소셜 callback 구현
오늘도 어김없이 소셜 인증을 구현하고 있다. 일단 페이스북 깃헙에 대해서는 accessToken, profile 정보를 가져오고 있지만 카카오 로그인의 경우에는 token을 못가져오고 있다. 일단 네트워크에서 정보를 가져오는 것은 성공한 것 같은데... 조금 더 로깅이 필요한 것 같다. 그리고 원래 소셜 로그인시 대게 코드 중복, switch문을 사용을 했었는데, 이번에 패턴매칭을 구현한 라이브러리가 있어서 사용을 하였다, 매운 만족스럽다.
- 페이스북 token, profile
- 깃헙 token, profile
- kakao
오늘도 똑같이 소셜 인증을 구현하고 있다. 일단 kakao로 부터 token과 유저 profile 정보를 정상적으로 가져오고 있다. 그런데 한가지 문제가 있다. 소셜 profile 정보가 전부 타입이 달라서 공통적인 처리가 어렵게 되었다. 그래서 profile들을 각각 파싱 후 공통된 타입으로 재정의를해서 리턴해줘야겠다. 그러면 실제 소셜 회원가입및 로그인 구현이 가능해 질 것 같다.
- kakao token, profile
이제 소셜 인증이 거의 끝나간다.... 정말 길었다... 이제 API를 테스트하면서 유저를 생성하고 로그인하는 테스트만 작업하면 끝이다. 그럼 작성 페이지를 작업하면 될 것 같다.
- 소셜 인증 기능 (1)
정말 소셜 인증이 정말 길제 진행하는 것 같다. 뭔가 예외처리를 생각하고 좀 더 쉽고 이해하기 쉬운 코드를 생각해서 더 오래 걸리는 것 같다. 그래도 정말 거의 다 끝나간다. 이제 소셜 회원가입만 처리하면 정말 끝이다.
소셜 회원 가입 다음에는 포스트 작성 페이지를 작업하게 된다. 여기서 발생하는 이슈는 아마 태그 처리가 될 것 같다. gorm에서는 구현은 했는데 뭔가 부족한 느낌을 많이 받았는데 이번에는 효율적으로 처리 할려고 한다.
- 소셜 인증 기능 (1)
- 소셜 token으로 profile 정보 가져오기
소셜 회원가입 완료!!!
- 소셜 회원가입
오늘은 gorm 으로 작성한 미들웨어를 entgo 로 변경하는 작업을 진행했다. 중간에 서버가 실행이 안되는 이슈가 있있어는데 database/sql 을 사용해서 entgo 를 실행하면 sql driver가 없는다는 이슈가 있었는데, entgo 문서에 github.com/jackc/pgx/v4/stdlib 이 라이브러리를 사용하면 된다는 내용을 보고 수정했다.
- 미들웨어
오늘은 드디어 포스트 작성 API를 작업했다. 하지만 작업중 상당히 귀찮은 버그들이 많았는데, 첫번째는 import cycle not allowed이다.
해당 오류는 Go는 순환 종속성을 지원하지 않기 때문에 컴파일 시간 동안 import cycle not allowed 오류가 발생하는 이슈가 있었고 두번째는 UrlSlug내용이 이상하게 저장되는 이슈이다. 이건 다음번에 수정해야겠다.
- import cycle not allowed이한 폴더 구조 변경
- 포스트 작성 API 추가
오늘은 어제 있었던 버그들을 수정하고 태그 테이블을 생성해서 포스트 작성시 추가하는 로직을 작성하고 있다. 전에 비슷한 작업을 했었는데 이번에는 좀 더 golang 스러운 방법으로 작업을 할려고 한다. 무엇보다 전에 구현한 코드는 중복및 쓸데없는 작업도 같이 한 것 같아서 그 부분을 수정 할 예정이다.
- 태그 모델 생성
- 포스트 작성 API 이슈 처리 (urlSlug)
- 포스트 작성 API에서 태그 연결 (1)
오늘은 포스트 작성하는 API 작업이 끝났다. 드디어 이제 업데이트하는 API, 상세 API를 만들면 대략적인 포스트 작업이 끝나고 리스트까지 완성하면 되겠다
- 포스트 작성