운영 중인 서비스
-
다양한 Oauth2 Provider 들을 다룰 수 있는 코드 만들기운영 중인 서비스/Coconut. 2024. 5. 7. 20:08
Oauth2 관련 작업을 하면 어딘가 비슷한 패턴이 계속 반복되기 때문에 어떻게 코드를 써야될지 고민을 많이 하게됩니다.이번에는 작성해둔 코드가 어딘가 아쉬움이 느껴져서 나름대로 개선을 해봅니다.사용측 코드가 완성된 상태가 아니기 때문에 흐름을 참고하는 용도로 봐주시면 좋겠습니다. 이번 글은 다음의 순서로 작성되었습니다.1. 개선 이전의 코드2. 개선 이후의 코드3. 정리하기 1. 개선 이전의 코드개발자 유미님의 채널에 스프링 시큐리티 관련한 구현 영상들이 많이 있어서 참고를 하였습니다 ( 개발자 유미 채널 )Oauth2 로그인 과정에서 User 관련 로직을 커스텀하기 위해서 CustomOauth2UserService를 만들어보았습니다.인터페이스만 상속받아서 구현할까 상속을 받을까 고민을 해보았는데, ..
-
로그인을 어디서 처리할 것인가? 필터 vs 컨트롤러운영 중인 서비스/Coconut. 2024. 5. 2. 23:41
인증 서버에서 로그인을 구현하면서 고민한 내용을 적어봅니다.최종적으로 구현은 필터 위에 작업이 되었으나, 다시 한다면 컨트롤러에서 진행할 것 같습니다 ㅎㅎ 아래의 글은 다음의 순서로 진행됩니다.1. 필터 기반의 로그인 구현2. 필터 체인 구성3. 필터를 쓰는 것이 맞는 것인가? 4. 다시 만든다면? 코코넛 서비스의 주요 로그인은 Oauth를 사용할 예정이지만, 특별한 사용자들의 접근을 위해서 아이디/패스워드 형식의 로그인도 기능을 만들어 두었습니다. Spring Security의 기능을 최대한 사용하는 방향에서 작업을 하고, 인증 서버는 요청량이 많을 것을 감안해서 성능상에 이점을 가져갈 수 있는 방법을 선택해서 구현하였습니다. 1. 필터 기반의 로그인 구현Security Conifg 파일을 먼저 살..
-
커다란 만능 모듈을 사용하면 만날 수 있는 함정운영 중인 서비스/Coconut. 2024. 4. 30. 17:06
여러 서비스에서 공유되는 모듈을 만들어서 사용하는 과정에서 만난 이슈를 적어봅니다.모듈을 분리하고 개별 서비스에 각각 적용하는 과정을 정리하고 있습니다. 이번 글은 아래와 같은 순서로 작성되었습니다.1. 모든 일을 하는 만능 모듈2. 만능 모듈의 단점3. 어떤 기준으로 분리할 것 인가?4. 변경 반영하기5. 정리하기 1. 모든 일을 하는 만능 모듈코코넛 서비스에 기능이 붙어가면서 점점 복잡도가 올라가고 있습니다.global이란 모듈에서 여러 서비스간에 공유되는 코드를 관리하고 있습니다.어느 순간 복잡성에 문제가 생길 것이라고 예상은 했지만 너무 빠른 시점에 찾아오고 말았습니다.. 글로벌 모듈의 build.gradle 파일의 일부입니다. 엔티티를 만들 때, 중복되는 요소들을 상속받아서 사용하기 위한..
-
왜 멀티모듈 프로젝트로 변경하려고 하는가?운영 중인 서비스/Coconut. 2024. 4. 26. 14:37
멀티 레포 형태로 프로젝트를 관리하면서 느낀 단점과 멀티모듈 형태로 개선하는 과정을 정리하였습니다. 아래의 글은 다음과 같은 순서로 작성되어있습니다.1. 최초에 여러 개의 프로젝트(멀티 프로젝트)를 만든 이유2. 멀티 프로젝트에서 발생하는 이슈3. 멀티 모듈 프로젝트로 변경 1. 최초에 여러 개의 프로젝트(멀티 프로젝트)를 만든 이유처음 프로젝트 관리 방법을 고민하면서 멀티 모듈 프로젝트를 염두에 두었으나 최종적으로는 개별 프로젝트로 만드는 방향을 선택하였습니다. 당시에는 아래의 이유로 개별 프로젝트를 여러개 만드는 것을 선택하였습니다. 1. 본인이 추가 하고 싶은 도메인이 있다면 그 부분에 대해서 독립적으로 작업할 수 있도록 만들자.2. 하나의 큰 프로젝트를 관리하기 보다는 간결한 작은 프로젝트가 더..
-
적절한 Serialization 방식 선택하기운영 중인 서비스/Coconut. 2024. 4. 22. 19:51
이번에 새로 추가한 기능을 배포한 후에 이슈가 발생해서 급하게 수정을 하고 기록으로 남겨봅니다. 현재 유저가 입력한 답변을 외부 api를 사용해서 채점을 하고 있습니다. 외부 api가 요구하는 형태의 JSON을 String.format을 사용하여 아래와 같이 생성하고 있었습니다. 서비스 운영 중에 한 사용자가 종종 오류가 발생한다는 것을 제보해주셨습니다. 에러 메세지를 확인해보니 요청에 전달하는 JSON에 문제가 있는 듯 합니다. "message": "We could not parse the JSON body of your request. (HINT: This likely means you aren't using your HTTP library correctly.) 아쉬웠던 부분은 예외 처리를 하면서 유..
-
무중단 배포 유지하면서 EC2 교체 하기운영 중인 서비스/Coconut. 2024. 4. 19. 21:32
최초에 모놀리식 아키텍쳐로 서비스 운영을 하도록 간단하게 인프라를 구축하였습니다. 하지만 작업하면서 MSA를 지향하게 되었고 서비스의 앞단에 프록시서버를 두기로 결정하였습니다. 이 글은 현재 배포되어 있는 커뮤니티 서비스는 중단되지 않으면서 앞단에 프록시 서버를 추가하는 과정을 적어보겠습니다. 아래 글은 다음 순서로 작성되었습니다 1. 현재 상황 - 작업을 하는 이유 2. 작업 설계 - 어떻게 작업을 진행할 것인가? 3. 작업 진행 - 3단계의 작업 진행 과정 4. 정리하기 1. 현재 상황 현재 운영 중인 커뮤니티 서비스가 사용자는 많지 않지만, 실제 유저분들이 사용하고 있는 상황입니다. 누적 조회수가 50 ~ 80정도 되는 것을 확인할 수 있습니다 ㅎㅎ ( 서비스 링크 ) 많은 유저가 사용하고 있다고 ..
-
단일 진입점으로 개별 서비스의 Swagger 접근하기운영 중인 서비스/Coconut. 2024. 4. 13. 22:02
서비스의 진입점에 Nginx를 사용하여 리버스 프록시 서버를 사용하고 있습니다. 퀴즈 서비스와 커뮤니티 서비스에 떠있는 Swagger를 단일 진입점에서 접근가능하도록 설정하는 과정을 정리하고있습니다. (실제 서비스 swagger 주소는 블로그 작성 이후 변경하였습니다~ 접근하지말아주세요~) 1. 기존 URI를 proxy_pass로 전달하는 방법 프로젝트를 구성하면서 Nginx를 앞단에 리버스 프록시 서버로 사용하고 있습니다. /answer의 경우 처럼 기존에는 host 주소만 변경해서 라우팅을 처리하고 있었습니다. 각 서비스에 정의되어있는 swagger를 연결하기 위해서 위와 같이 연결을 하였더니 바로 에러가 발생합니다. proxy_pass에 location과 동일한 regex가 들어있으면 안된다고 이야..
-
Nginx 로그 살펴보기 ( feat. 웹 스캐닝 )운영 중인 서비스/Coconut. 2024. 4. 7. 17:07
프로젝트에 새로운 도메인을 MSA 형태로 추가하기 위해서 앞단에 Nginx를 사용해서 프록시 서버를 구축하였습니다. 잘 작동하던 서버가 어느날 안되는 것을 발견하여 로그를 살펴보고 많은 일들이 일어나고 있다는 것을 발견하고 글을 써봅니다. 아래의 글은 다음과 같은 구성으로 작성되어있습니다. 1. 현재 Nginx 설정 구성 2. 로그 살펴보기 3. 대응하기 1. 현재 Nginx 설정 구성 아래와 같이 conf를 구성하여서 들어오는 프록시 서버로 들어오는 요청에 대해 access_log를 남기고 매칭되는 주소로 라우팅을 진행합니다. 2. 로그 살펴보기 인프라 세팅 이후 로컬에서 작업을 했기 때문에 한동안 요청을 한 적이 없음에도 로그가 많이 쌓여있어서 로그를 살펴보았습니다. gz 확장자를 갖는 로그를 살펴볼..