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자체는 잘 동작하기 때문에, 성능관련한 고민만 하면 되겠지? 라고 생각했던것 같다.ㅎㅎ  그런데 코드리뷰..
이분그래프
·
알고리즘
백준 1707. 이분 그래프 처음 문제를 봤을땐 좀 이해하기 힘들었는데, 예제를 통해 그림을 그려보면 감이 좀 잡힌다. 예제분석CASE 1.1,2,3번 정점이 있고, (1,2)와 (2,3) 간선이 이어져있는 형태이다.분석해보면, [1,2]와 [3]으로 집합을 분리했을때 각 집합에 속한 정점끼리는 서로 인접하지 않는다는 것을 알 수 있다.즉, 이분그래프인것이다.  CASE 2. 1,3번 정점이 서로 연결되어있지는 않지만, 그둘을 하나의 집합으로 묶었다고 해서 이분그래프가 되진 못한다. 나머지 집합이 서로 인접하기 때문이다(간선을 갖기 때문)  이분그래프그렇다면 위 내용을 바탕으로, 이분그래프를 정의해보자면 다음과 같다. 이런식으로 정점을 두 진영으로 나누었을때, 서로 다른 진영끼리는 연결될 수 있으나 같은..
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번 문제 해결첫번째 문제는 오늘의 주제와는 동떨어진 휴먼에러이기 때문에 넘어갈까 했지만, 혹..
대전광역시 공공데이터 활용 창업 경진대회 참가 회고(우수상 수상🎉)
·
회고
올해 6월, 같이 공부하던 친구의 권유로 공모전에 하나 참가하게 되었다.바로바로 !!공공데이터를 활용해서 비즈니스 모델 및 참신한 아이디어를 발굴하고자 하는 대회이다.  지원계기당시 싸피를 수료할 시기여서 시간적 여유가 있었는데, 마지막 프로젝트를 함께했던 팀원이 이 공모전을 함께 나가자고 권유했다. 사실 처음엔 나갈 생각이 거의 없었다.. 그동안 모든 프로젝트들을 (백엔드인 내가) 디자인했었는데 이게 너무x100 힘들었었다. 근데 이 팀에 들어가면 밤새 혼자 피그마를 만질 내 모습이 보였다....😢 그치만 내가 합류하면 따라오겠다는 믿음직한 친구들도 있었고, 디자인만 끝내면 이번엔 백엔드에만 집중할 수 있으리라는 생각이 들었다(프론트엔드, AI 모두 능력있는 팀원들이였다). 무엇보다도 싸피 내 경쟁이..
선도기업 아카데미란? (Feat. SSAFY가 나에게 가져다 준 것)
·
기타
SSAFY를 수료한지도 벌써 6개월이 되어간다.1년이나 되는 교육과정에, 열정적인 사람들이 모인 부트캠프다보니 굉장히 많은 사람들을 만났고, 많은 경험을 했고, 또 많이 성장할 수 있었다.(한가지 스포일러를 해보자면, 싸피에서 진행되는 4개 프로젝트중 3개 프로젝트에서 1위를 수상했다😀!)그래서 오늘은 이러한 경험과 성장에 대해 포스팅해보려고 한다. 개발실력과 기술적인 얘기보다는, 이 프로그램이 나에게 가져다 준 경험, 그리고 그 감상에 초점을 맞춘 글이 될 것같다. 우선, 이러한 훈련과정을 알게된 경로인 '선도기업 아카데미'에 대해 먼저 알아보도록 하자. 선도기업 아카데미 훈련과정나는 삼성에서 진행하는 SSAFY를 들었지만, 사실 요즘은 기업에서 진행하는 훈련과정이 아주x100 많다. 그리고 이렇게 ..
Redis로 최근검색어 구현하기
·
프로젝트/빼곡
'빼곡'을 개발하면서, 유저의 최근검색어를 보여주는 API를 구현하게 되었다.  기본적으로 RDB를 사용하고 있었으므로 CRUD로 구현해도 되지만, 몇가지 의문이 생긴다.1. 해당 데이터는 검색 페이지에 접근할때마다 필요한데, 매번 DB에 접근해서 가져오는건 너무 느리지 않을까?2. 최근 검색한 5개의 검색어만 저장하는데, 검색어 추가에 따라 insert 및 delete(5개가 넘을때) 작업이 수행되는건 너무 오버헤드가 크지 않을까?3. 최근검색어를 삭제할때마다 RDB에서 해당 검색어를 삭제하는 작업도 기능에비해 오버헤드가 크다. 결론적으로, '최근검색어'라는 기능을 구현하기에 RDB는 오버헤드가 큰 접근법이라는 판단을 하게 되었다.그렇다면 RDB에 접근하지 않고 이 기능을 구현하려면 어떻게 해야할까? ..
코딩 테스트 대비 MySQL 문법 총정리
·
알고리즘
올해 하반기 신입공채를 준비하면서, 코딩테스트를 굉장히 많이 봤던것같다.대기업, 중견기업, 은행권, IT회사 등 가리지 않고 응시하게 되었는데, 특히 대기업과 은행권 쪽에서는 SQL이 꼭 필수적으로 출제되었다. 보통은 한문제에서 최대 두문제까지 나왔고, 난이도는 천차만별이였다... 분명 옛날에는 코테수준의 SQL은 어렵지 않다고, 특히 은행권은 어렵지 않다는 의견이 지배적이었던거 같은데^^;; 최근 코테 경향을 보면 그렇지만도 않은것같다. 쉬운건 정말 쉽지만, 어려운건 정말 어렵다는 느낌...왜 그렇게 생각했냐면, 지엽적(?)인 함수를 써야되는 문제들이 다수 출제되었다. 나는 프로그래머스 SQL 고득점 Kit를 통해 대비했는데, 취준 초반 시절엔 '음.. 어려워봤자 Join문이나 서브쿼리 정도 아닐까?'..