JpaRepository에서 @Repository 생략이 가능한 이유
·
프로젝트/빼곡
두번째 리팩토링의 주제는 @Reposiotry 생략했는데 왜 정상작동? 이다. 과거 MyBatis를 활용해서 프로젝트를 진행했던적이 있다. Controller, Service, Repository 등 클래스들은 어노테이션을 통해 꼭 빈으로 등록했었다(당시에 몇번 빼먹었다가 오류가 나서 수정했던 기억이ㅎ) 그런데 프로젝트의 경우, @Repository 어노테이션을 생략해도 정상적으로 동작하는것을 발견했다. 초반에 작성했던 클래스를 제외하고는 대부분 명시하지 않았다. 구현에 급급하다보니 살피지 못했던 부분이다.  다른점이라면 기술스택으로 인한 차이가 있다. JPA를 채택하고있기 때문에 Repository는 모두 JpaRepository를 extends하는 인터페이스 기반의 레포지토리이다. 그렇다면 지금 발..
Bean일까 Util일까, CookieUtil 리팩토링하기
·
프로젝트/빼곡
기존 CookieUtil의 문제점 찾기코드리뷰 과정에서 대답에 가장 난항을 겪었던 클래스의 리팩토링 과정을 설명하려고 한다. 우선, 기존 코드는 다음과 같았다.@Slf4j@Componentpublic class CookieUtil { private static String domain; private CookieUtil() {}; @Value("${bbaegok.root-domain}") public void setDomain(String domain) { CookieUtil.domain = domain; } public static Optional getCookie(HttpServletRequest request, String name) { Co..
빼곡 스토어 출시! 그리고 개선방향(feat.코드리뷰)
·
프로젝트/빼곡
그동안 열심히 개발해온 독서기록 앱, 이 드디어 프로덕션으로 출시되었다🎉🎉그간 겪었던 수많은 난항...과 회고는 뒤로하고,앞으로의 운영, 그리고 개선방향에 대해 고민해볼때 인것같다. 마침 배포와 동시에 좋은 기회로ㅎㅎ 면접을 보게 됐는데, 무려 세시간동안 코드리뷰나 다름없는 면접을 볼 수 있었다.덕분에 앞으로 리팩토링의 방향성, 그리고 부족했던 부분들을 개선해나갈 인사이트를 얻었다..!오늘은 이러한 부분을 정리해보려고 한다.  우선 백엔드를 배포하고, 혼자 운영환경에 대해 고민했을때 필요했던 부분은 다음과 같았다.  전체적으로 코드 자체는 성능과 관련된 정말 운영이슈를 개선하려고 했었다.현재 API자체는 잘 동작하기 때문에, 성능관련한 고민만 하면 되겠지? 라고 생각했던것 같다.ㅎㅎ  그런데 코드리뷰..
Spring 명시적 Null값으로 부분 업데이트(PATCH) 구현하기
·
프로젝트/빼곡
노트 수정창에서 사용할 PATCH API, 즉 수정 API를 구현하던중 찝찝~한 부분을 발견하게 되었다. PATCH 는 기본적으로 '수정할 부분만' 전송하도록 동작한다.따라서 컨트롤러는 '값이 바인딩 된' 부분에 대해서만 수정작업을 진행하면 된다. 그런데 만약 사용자가 해당 필드를 '빈 값'으로 초기화 하려고 한다면?즉, 위 화면에서 '내용'에 해당하는 부분을 Null로 초기화하고 싶다면? 프론트엔드에서 발생하는 요청은 다르지만, 백엔드 컨트롤러에서 받을 요청은 똑같아진다(구분할 수 없다.) 문제상황자세히 설명하자면 다음과같다.우선 프론트엔드에선 다음과 같이 요청이 발생한다.  그러나 백엔드에선 두 요청이 똑같이 보인다.요청객체에 바인딩 되면서 할당되지 않은 값들은 Null로 초기화 되기 때문이다.따라서..
여러기기에서 로그인, 다중 로그인 Spring에서 구현하기
·
프로젝트/빼곡
배포환경에서 프론트-백엔드간 API를 테스트하던 중 계속해서 제기됐던 문제가 하나있다.바로 여러기기를 사용해서 로그인 하는 경우, 기존에 사용하던 기기는 액세스토큰 만료와 동시에 리프레쉬 토큰이 INVALID해진다는것! 이렇게만 말하면 대체 무슨소리인가 싶을수도 있는데, 좀더 자세히 설명해보도록 하겠다. 문제상황 분석우선, 각 토큰이 포함하고 있는 데이터는 다음과같이 설정되어있었다."Access-Token" : userId + providerCode + 동의한약관버전 + 비밀key + 만료시간(1분)"Refresh-Token" : 비밀key + 만료시간(7일) 위 상태에서, 로그인로직의 경우 다음과같이 동작한다.로그인에 성공하면 두 토큰을 모두 재발급해준다. 또한 동시에 Refresh토큰값을 DB에 저장..
다른 도메인 환경에서 쿠키 셋팅하기(Feat.samesite Cookie)
·
프로젝트/빼곡
배포환경에서 로그인 시스템에 문제가 생겼다. access-token 만료시 refresh-token 재발급 로직이 비정상적으로 동작하고 있었던 것. 즉 액세스토큰 재발급 API가 매번 런타임 에러를 뱉고 있는것이였다. 간단해보였던 이 문제는 우리팀을 꽤나 고생시켰는데... 크게 두가지 문제가 있어서 그랬던거였다.1. 액세스토큰 재발급 로직에서 액세스토큰을 검증하는 불필요한 로직이 있었음2. 리프레쉬토큰이 정상적으로 발급되지 않고 있었음 여기서 두번째 문제가 오늘의 주제, '다른 도메인간 쿠키 문제 해결하기!' 이다.또한 이 문제를 해결하면서 마주친 다양한 에러들에 대해 좀 더 기술해보도록 하겠다. 더보기(CF) 1번 문제 해결첫번째 문제는 오늘의 주제와는 동떨어진 휴먼에러이기 때문에 넘어갈까 했지만, 혹..
Redis로 최근검색어 구현하기
·
프로젝트/빼곡
'빼곡'을 개발하면서, 유저의 최근검색어를 보여주는 API를 구현하게 되었다.  기본적으로 RDB를 사용하고 있었으므로 CRUD로 구현해도 되지만, 몇가지 의문이 생긴다.1. 해당 데이터는 검색 페이지에 접근할때마다 필요한데, 매번 DB에 접근해서 가져오는건 너무 느리지 않을까?2. 최근 검색한 5개의 검색어만 저장하는데, 검색어 추가에 따라 insert 및 delete(5개가 넘을때) 작업이 수행되는건 너무 오버헤드가 크지 않을까?3. 최근검색어를 삭제할때마다 RDB에서 해당 검색어를 삭제하는 작업도 기능에비해 오버헤드가 크다. 결론적으로, '최근검색어'라는 기능을 구현하기에 RDB는 오버헤드가 큰 접근법이라는 판단을 하게 되었다.그렇다면 RDB에 접근하지 않고 이 기능을 구현하려면 어떻게 해야할까? ..
서버이전을 고려한 Jenkins기반 아키텍처 개선(Feat. GithubActions)
·
프로젝트/빼곡
SEMENTO 프로젝트에선 Jenkins 기반의 CI/CD 로직을 구현했었다. 그런데 SSAFY 수료 이후, 우수작품 전시에 이 프로젝트를 올리고자 서버를 이전해달라는 요청이 왔다. 그래서 우리팀은 새로운 서버에 Jenkins 및 관련 스크립트, 그리고 Docker와 NginX설정 등을 다시 만들어야 했었다. 이 과정에서 반복작업에 불편함을 느꼈던 나는, 서버 이전을 고려한 아키텍처를 설계할 수는 없을까? 라는 고민을 하게 되었다. 결과적으로, 클라우드 기반 CI/CD 파이프라인 구축으로 서버 이관시의 비효율을 해결하고, 자동화 할 수 있었다. 기존 시스템의 비효율본격적인 설명에 들어가기 전에, 기존 시스템 아키텍처에 대해 설명해보고자 한다.  docker cp /home/.../config.proper..
라즈베리파이를 이용한 홈서버 구축
·
프로젝트/빼곡
나는 그동안 AWS 프리티어를 통해 프로젝트를 배포해왔다. 그러나 프리티어는 단 1년만 주어졌기에 현재는 프로젝트들이 전부 내려간 상태고, 대체제를 찾고자 오라클 서버, GCP 등을 고려해봤지만 가입과정의 오류, 결국 필연적인 과금의 위험성 등의 문제로 인해 최적의 선택지가 되어주진 못했다. 그러던중 친구가 '미니PC 같은걸로 홈서버를 만들어보는게 어때?' 라는 제안을 해왔고, 내가 만들었던 작은 프로젝트들을 올려두기에 딱 맞는 선택지라는 판단하에 실행에 옮기게 되었다.   무릇 백엔드 개발자라면 서버 하나쯤 있어야지!   서버 자원으로는 일반PC, 미니PC, 안드로이드 스마트폰 등 다양한 선택지가 존재한다. 나는 그중에서도 라즈베리파이를 선택했다! 아무래도 학부생 시절 임베디드 프로젝트등을 해왔다보니,..