본문 바로가기

개발일지

(19)
소셜 네트워크 앱 개발 프로젝트 아키텍처 고민 및 해결 과정 업체(이하 클라이언트)를 통해 특정 컨셉을 지닌 소셜 네트워크 및 메신저 어플리케이션의 외주를 진행하게 되었다. 이후 최종적으로 계획하고 있는 프로젝트의 규모가 작지 않기도했고, 일정이 타이트하게 구성되는 등의 문제로 나와 지인 한 분이 백엔드 및 인프라 구축을 맡게되었고, 지인을 통해 소개받은 플러터 개발자 분께서 앱개발을 맡아 진행하기로 하였다. 정확한 컨셉을 공개할 순 없지만, 몇몇의 주요한 기능들을 중심으로 어떻게 아키텍처를 설계했는지 이야기해보도록 하겠다. 사진, 동영상의 멀티미디어를 통한 실시간 채팅 (메신저) 소셜 네트워크 서비스 특정 사진, 동영상(멀티미디어)의 AI분석 (추후 개발) TTS 관련 서비스 (개인 사용자 목소리 기반) SNS 간편 로그인(OAuth 2.0) 알림 기능 모놀리식..
JWT 토큰 자동 갱신: 안전한 인증 시스템 구축하기 (React) JWT 토큰 기반 인증의 중요성 및 클라이언트 사이드에서의 관리 올해 대학교 구성원 및 외부 인원들과 함께 팀 활동으로 규모가 그리 크지 않은 시장을 타겟팅하는 새로운 플랫폼 구축을 진행하는 프로젝트를 진행하고 있다. 해당 프로젝트를 진행하며 웹의 클라이언트 사이드를 위주로 맡고 있고, 백엔드의 서브 개발자로 참여하고 있다. 이 프로젝트에서 마찬가지로 사용자 인증 및 로그인 관련 로직은 JWT 토큰 기반 인증 방식을 사용하게 되었고, 그 과정 속 발생한 두가지 문제에 대해 다뤄보려고 한다. (이번 글에서는 JWT(JSON Web Token)에 대한 개념을 정리하기보단 다루면서 생겼던 이슈에 대한 해결 방법을 위주로 다뤄보려고 한다.) 문제정의 만료된 JWT 토큰으로 인한 사용자 경험 저하 문제 JWT 토..
순환 참조 문제 / Go언어(Golang) 게임서버 순환 참조의 개념 순환 참조란 두 모듈이 서로를 직접 또는 간접적으로 참조할 때 발생한다. 이는 컴파일 타임에 해결되지 않으면 런타임 에러로 이어지며, Go에서는 패키지 간 잘못된 의존성 구조로 인해 이런 문제가 발생한다. ( Go에서는 컴파일 타임에 아래와 같은 import cycle not allowed 와 같은 컴파일 에러를 반환하여 알려주긴 한다) 순환 참조가 야기하는 문제점 컴파일 에러 : 컴파일 에러가 난다면 그나마 다행이지 않을까 싶다 단위 테스트가 어렵고 비용이 증가 : 의존적인 모듈들이 함께 테스트 되어야하기 때문에 단위적인 테스트가 어렵고 비용이 증가한다 가독성이 저하되고 유지보수의 어려움 증가 문제 상황 및 배경 Go언어를 이용해 한글을 타이핑하여 스킬 사용 및 공격 등을 진행하는 게..
[Docker] 도커 컴포즈를 통해 도커를 관리하다 생긴 문제들 - (2) (Docker Compose) 이번 방학에 팀으로 프로젝트를 하나 진행하고 있었다. 게임제작과 관련된 부분인데 해당 프로젝트에서 서버 쪽을 담당하게 되었다. 기간은 올해 말까지로 예상중이고, 해당 프로젝트에서 방학에는 인증서버 제작과 Docker를 사용해 보는 것이 목표였다. 저번 포스팅에선 Docker Network를 이용해 컨테이너간의 통신에 관련한 문제를 해결하는 포스팅을 작성하였다. 이번 포스팅에는 Docker Compose를 작성하여 ScyllaDB, redis, 인증서버를 한 번에 컨테이너화 시켜 관리하는 과정과 그 과정에서 생긴 사소한 이슈를 해결하는 과정을 작성했다. 1) 여러 컨테이너를 한번에 관리해 보자 컨테이너는 현재 3개 존재한다. [scylla, redis, 인증서버] 하지만, 이후에 게임에 필요한 서버들과 각..
[Docker] 도커 컴포즈를 통해 도커를 관리하다 생긴 문제들 - (1) (Docker Network) 이번 방학에 팀으로 프로젝트를 하나 진행하고 있었다. 게임제작과 관련된 부분인데 해당 프로젝트에서 서버 쪽을 담당하게 되었다. 기간은 올해 말까지로 예상중이고, 해당 프로젝트에서 방학에는 인증서버 제작과 Docker를 사용해 보는 것이 목표였다 1) 도커로 로컬환경을 공유해보자 아직 도커라는 것에 대해 이론적으로 부족한 부분들이 많았고, 내 로컬환경의 도커에서 사용 중인 ScyllaDB와 Redis 그리고 로컬에서 동작하는 Golang으로 제작된 인증서버도 Dockerfile로 빌드해서 컨테이너로 만든 뒤에 이 3개의 컨테이너를 다른 사람들에게 쉽게 공유할 수 있게 해보고 싶은 막연한 생각으로 시작해 보게 되었다. 2) 인증서버를 Docker로 관리해 보자 기존에는 Docker를 통해 Scylla, Re..
[Go] Go와 http를 이용한 REST API 만들기 - 학식 취향분석 (2) haksik-personalized 저번 스프링 부트를 이용하여, 사용자 취향에 맞는 학식 메뉴를 추천해주는 간단한 프로그램을 구성해보았다. (참고 링크: https://winterlimited.tistory.com/15) 현재는 취향 분석의 여러개의 값이 존재하지 않아 평가된 메뉴 점수의 평균값만으로 취향을 분석하여 추천한다. 학식 메뉴를 제공하고, 사용자가 각 메뉴를 "좋아요", "보통이에요", "싫어요"로 평가할 수 있게끔 기존 프로그램과 동일한 방식으로 동작할 수 있도록 구성해두었다. 다만, 따로 DB를 두고있지 않고, - store의 user.go, menu.go에 배열을 이용해 값을 저장할 수 있도록 임시로 구성해두었고 추후 ScyllaDB와의 연동을 계획하고 있기때문에, NoSQL 형식으로 ..
[Spring] Spring과 JPA를 사용해보기 - 학식 취향분석 프로그램 (1) haksik-personalized 스프링 부트를 이용하여, 사용자 취향에 맞는 학식 메뉴를 추천해주는 간단한 프로그램을 구성해보았다. 이 프로젝트는 이전에 React와 코사인 유사도 알고리즘을 사용하여 만들었던 음식점 추천 시스템을 스프링 부트와 비슷하게 재구성하였다. 현재는 취향 분석의 여러개의 값이 존재하지 않아 평가된 메뉴 점수의 평균값만으로 취향을 분석하여 추천한다. 학식 메뉴를 제공하고, 사용자가 각 메뉴를 "좋아요", "보통이에요", "싫어요"로 평가할 수 있다. 사용자가 평가를 진행하면 각 메뉴에 대한 점수가 데이터베이스에 저장되고, 이후에 사용자에게 새로운 메뉴를 추천할 때 이 점수를 활용하게 되어있다. (repository: https://github.com/WinterLimited/h..
[TypeScript] TypeScript 처음 사용해보기 (2) (React.js) Foodie-finder 취향분석을 통한 음식점 추천 - React와 코사인 유사도 알고리즘을 활용한 애플리케이션 TypeScript를 통해 localStorage에서 간단한 작업을 해봤는데, 그것을 포스팅하기에는 너무 간략하다고 생각되어 최근에 심심풀이로 떠올랐던 아이디어를 구현하여 만든 것을 이어 포스팅하게 되었다. 그리고, 그것은 바로 개인 맞춤형 음식점 추천 시스템이다. (repository: https://github.com/WinterLimited/foodie-finder) GitHub - WinterLimited/foodie-finder Contribute to WinterLimited/foodie-finder development by creating an account on GitHub...
[메모] Spring 원리 (3) 빈 생명주기 콜백, 빈 스코프 - 빈 생명주기 콜백 - 스프링 빈의 이벤트 라이프 사이클 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료 초기화 콜백: 빈이 생성되고, 의존관계의 주입이 완료된 이후 호출 소멸전 콜백: 빈이 소멸되기 직전에 호출 - 초기화, 소멸 인터페이스 - InitializingBean - afterPropertiesSet() DisposableBean - destory() 인터페이스 방식의 단점 스프링 전용 인터페이스라 스프링에만 의존하여 사용가능 초기화, 소멸 메서드의 이름 변경 불가능 코드를 고칠 수 없는 외부 라이브러리에서는 사용 불가능 - 빈 초기화, 소멸 - 메서드 이름을 자유롭게 부여가능 스프링 빈이 스프링 코드에 의존하지 ..
[메모] Spring 원리 (2) 컴포넌트 스캔, 의존관계 자동주입 - 스프링 Annotation - 스프링에서는 컴포넌트 스캔을 통해 자동적으로 의존관계를 주입하도록 할 수 있다. @Controller: 스프링 MVC 컨트롤러로 인식한다. @Repository: 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다. @Configuration: 앞서 보았듯이 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다. @Service: 특별한 처리를 하지 X, 개발자들이 핵심 비즈니스 걔층을 인식하는데 도움을 준다. - ComponentScan FilterType - FilterType은 5가지 옵션이 있다. ANNOTATION: 기본값, annotation을 인식해서 동작 ASSIGNABLE_TYPE: 지정한 타입..