여러기기에서 로그인, 다중 로그인 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문이나 서브쿼리 정도 아닐까?'..
SSAFY 싸피 10기 전공자 합격 후기 + 팁
·
기타
삼성 SW아카데미, 즉 싸피를 수료한지 6개월이 되어간다. 인생에 있어 정말 잊기 힘들것같은 좋은 경험이었는데, 좋은 교육인만큼 들어가기도 힘들다. SW교육을 들어가는데 자소서(에세이)에 시험에 면접까지..! 취업과정이나 다름이없다ㅋㅋㅋ 당시 인터넷의 많은 합격후기들 덕분에 수월하게 준비했던 경험이 떠올라, 합격 후기와 팁을 적어보려고한다. 사실 이전 블로그에서 작성한적이 있긴한데, 싸피셜을 겸업하면서 썼다보니 개인적으론 좀더 날것으로 쓰고싶어 다시 써보려고 한다. TMI가 난무할 예정이다... 준비과정만 보고싶은 분들은 지원배경은 안읽으셔도 된다! 지원배경싸피를 처음 알게된건 대학시절, 코로나때였다. 학과선배가 6기를 다니고 있었다. 당시엔 지금과달리 이렇게 큰 기업에서 진행하는 부트캠프가 거의없었다...
서버이전을 고려한 Jenkins기반 아키텍처 개선(Feat. GithubActions)
·
프로젝트/빼곡
SEMENTO 프로젝트에선 Jenkins 기반의 CI/CD 로직을 구현했었다. 그런데 SSAFY 수료 이후, 우수작품 전시에 이 프로젝트를 올리고자 서버를 이전해달라는 요청이 왔다. 그래서 우리팀은 새로운 서버에 Jenkins 및 관련 스크립트, 그리고 Docker와 NginX설정 등을 다시 만들어야 했었다. 이 과정에서 반복작업에 불편함을 느꼈던 나는, 서버 이전을 고려한 아키텍처를 설계할 수는 없을까? 라는 고민을 하게 되었다. 결과적으로, 클라우드 기반 CI/CD 파이프라인 구축으로 서버 이관시의 비효율을 해결하고, 자동화 할 수 있었다. 기존 시스템의 비효율본격적인 설명에 들어가기 전에, 기존 시스템 아키텍처에 대해 설명해보고자 한다.  docker cp /home/.../config.proper..
라즈베리파이를 이용한 홈서버 구축
·
프로젝트/빼곡
나는 그동안 AWS 프리티어를 통해 프로젝트를 배포해왔다. 그러나 프리티어는 단 1년만 주어졌기에 현재는 프로젝트들이 전부 내려간 상태고, 대체제를 찾고자 오라클 서버, GCP 등을 고려해봤지만 가입과정의 오류, 결국 필연적인 과금의 위험성 등의 문제로 인해 최적의 선택지가 되어주진 못했다. 그러던중 친구가 '미니PC 같은걸로 홈서버를 만들어보는게 어때?' 라는 제안을 해왔고, 내가 만들었던 작은 프로젝트들을 올려두기에 딱 맞는 선택지라는 판단하에 실행에 옮기게 되었다.   무릇 백엔드 개발자라면 서버 하나쯤 있어야지!   서버 자원으로는 일반PC, 미니PC, 안드로이드 스마트폰 등 다양한 선택지가 존재한다. 나는 그중에서도 라즈베리파이를 선택했다! 아무래도 학부생 시절 임베디드 프로젝트등을 해왔다보니,..
JPA 엔티티 객체지향적으로 설계하기(테이블과 일대일 매핑은 그만!)
·
프로젝트/FindDog
과거 첫 웹개발을 배웠을땐 MyBatis로 백엔드를 개발했었다. DB와 데이터를 주고 받으려면 VO와같은 객체를 정의해두고, SQL문을 작성하는 방식이다. 다만 그 과정에서, 간단한 select문들도 매번 새로 정의해주는점이 불편하게 느껴졌고, 무엇보다 VO를 계속해서 만들다보니 이게 과연 객체지향적인 설계인가에 대한 고민이 생겼다. 그래서 조사한 결과, SQL Mapper인 MyBatis와는 달리, ORM으로 작동하는 JPA가 이러한 비효율을 해결해줄 수 있음을 알게되었었다. 백엔드단에 테이블 정보를 객체로 매핑함으로써, 기존의 SQL중심적 개발에서 객체중심의 개발로 전환할 수 있게 된 것이다! 이는 어마어마한 장점을 가져오는데, 개발 생산성과 유지보수에서 아주 큰 이점을 가진다. 특히 JpaRepos..