블로그

Jerry Lee

🚀 Backstage Plug-in 소개 - Platforming Engineering

📢 최근 Platform Engineering에 대한 관심이 많아지고 있기에, 도움이 될만한 정보를 공유합니다. Platform Engineering(특히, IDP) 구현은 일반적으로 Backstage를 많이 고려하고 있으나🧐, Backstage의 Base 기능에 대한 불편한 점들, 특히 👀Backstage에서 생성된 Service or Resource 수정 또는 Update의 번거로움 등 여러가지 불편한 부분이 있었는데, entity-scaffolder Plug-in이 지원을 합니다. 즉, 📝 Backstage Entity Page에 Scaffolder Template을 직접 embedding하여, 기존 Data를 기반으로 손쉽게 Entity를 Update하고 Self-Service 강화할 수 있는 Plug-in 입니다. 🙌 🔥 주요 기능 & 특징⇉ 엔티티 내 템플릿 실행 (Embed Scaffolder) 더 이상 템플릿 페이지로 이동할 필요 없이, 엔티티 상세 페이지(Entity Page) 안에서 해당 리소스와 관련된 템플릿을 바로 실행할 수 있습니다.⇉ 데이터 자동 완성 (Pre-populate Values) 수정할 때마다 모든 정보를 다시 입력할 필요없이, 기존 엔티티의 메타데이터를 가져와 템플릿 입력 필드를 자동으로 채워주기 때문에(Pre-fill). 개발자는 변경이 필요한 부분만 수정하면 됩니다.⇉ 조건부 워크플로우 (Conditional Steps) 단순한 입력뿐만 아니라, 상황에 따라 달라지는 복잡한 조건부 단계들도 매끄럽게 처리하여 정교한 셀프 서비스 시나리오를 지원합니다.⇉ 진정한 셀프 서비스 (Self-Service) 리소스 사양 변경, 태그 수정, 설정 업데이트 등 빈번한 유지보수 작업을 개발자가 직접, 빠르고 정확하게 수행할 수 있도록 돕습니다.  Platform Engineering 구축에 실질적인 도움이 되시기를 기대합니다.  [출처]: https://github.com/TheCodingSheikh/backstage-plugins/tree/main/plugins/entity-scaffolder[참고 Link] : https://www.cloudbro.ai/t/3538

개발 도구백스테이지플러그인

바커스

취업은 타이밍! 실시간 채용 무료앱 추천

  안녕하세요. 취업 준비생 여러분! 자소서 쓰느라 바쁜데, 채용 사이트 매번 새로고침 하기 힘드시죠? "아, 맞다! 그 공고 마감일 언제였지?" 하고 깜빡해서 기회를 놓친 적이 있다면, 오늘 소개해 드리는 이 앱이 필수입니다.  취업은 스피드! '공채속보'복잡한 건 딱 질색인 분들을 위해 만들었습니다. 이것저것 설정할 필요 없이, 설치만 하면 바로 실시간 채용 정보를 배달해 드립니다. 남들보다 한발 앞서는 비결 새 공고가 뜨면 '푸시 알림' 도착  내가 직접 찾으러 다니지 않아도 됩니다. 새로운 기업 공채, 대기업/공기업 소식이 업데이트되는 즉시 휴대폰으로 [알림]을 보내드립니다. 왜 '공채속보'를 써야 할까요? 1. 군더더기 없는 심플함 � 복잡한 필터 설정하느라 머리 아플 필요 없습니다. 앱을 켜는 순간, 지금 가장 핫한 채용 정보가 한눈에 들어옵니다. 2. 1초도 아까운 취준생을 위한 속도  좋은 공고는 타이밍이 생명입니다. 누구보다 빠르게 확인하고 먼저 지원하세요. 3. 평생 100% 무료  취업 준비 비용도 만만치 않으시죠? 이 앱의 모든 정보와 알림 서비스는 예비 직장인들을 위해 완전 무료로 제공됩니다.  지금 바로 알림을 켜두세요! 지금 이 순간에도 새로운 채용 정보는 계속 올라오고 있습니다. 놓치고 후회하지 마시고, 지금 바로 앱을 설치해서 알림을 받아보세요. 합격의 기운을 담아 가장 빠르게 전달해 드리겠습니다.  [클릭] 실시간 공채속보 무료 다운로드 받기 (위 글자를 클릭하면 구글 플레이스토어로 이동합니다)   

취업 · 이직채용정보공채기업공채실시간공채

[프로젝트 공유] 프레임워크에 덜 의존적인 UI 컴포넌트를 만들어봤습니다

안녕하세요.프론트엔드 개발을 하면서 React, Vue 등 여러 프레임워크를 오가다 보니항상 비슷한 고민을 하게 되었습니다.Select, Toast 같은 기본 UI 컴포넌트는프레임워크가 바뀔 때마다 다시 구현해야 할까?UI 동작과 UX는 거의 같은데,프레임워크에 묶여 있다는 이유로매번 새로 만드는 구조가 과연 효율적인지 의문이 들었습니다.그래서 개인 프로젝트로프레임워크에 덜 의존적인 UI 컴포넌트를 Web Components 기반으로 만들어보았습니다.🔧 어떤 것을 만들어봤나요?크게 두 가지 컴포넌트입니다.1⃣ Select 컴포넌트Web Component 기반 (의존성 없음)대용량 데이터 처리를 위한 가상 스크롤한글 초성 / 일본어 / 중국어 검색 지원키보드 접근성 및 스크린 리더 대응CSS Variables 기반 스타일 커스터마이징React, Vue 등에서 사용할 수 있도록 래퍼 제공2⃣ Toast 알림 컴포넌트프레임워크에 종속되지 않는 Toast UI여러 위치와 애니메이션 지원중복 메시지 자동 그룹핑SSR 환경 고려접근성(ARIA) 기본 지원🤔 Web Components를 선택한 이유Web Components를 선택한 이유는 단순합니다.브라우저 표준 기술이라 장기 유지에 유리특정 프레임워크 라이프사이클에 묶이지 않음여러 프로젝트에서 재사용 가능UI 프리미티브(Select, Toast 등)에 적합하다고 판단물론 프레임워크 전용 컴포넌트만큼의 DX는 아닐 수 있지만,장기적인 관점에서는 충분히 의미 있는 시도라고 생각했습니다.💬 커뮤니티 분들께 여쭤보고 싶습니다실무에서 Web Components를 사용해보신 경험이 있으신가요?프레임워크 변경 가능성이 있는 프로젝트에서UI 컴포넌트를 어떻게 관리하고 계신지 궁금합니다.이런 접근 방식이 현실적인 선택일지 의견을 듣고 싶습니다.아직은 실험적인 프로젝트이고,피드백을 받아가며 개선해보려는 단계입니다.편하게 의견 주시면 감사하겠습니다.🔗 참고 링크Select 컴포넌트: https://www.npmjs.com/package/seo-selectToast 컴포넌트: https://www.npmjs.com/package/seo-toast

프론트엔드javascripttypescriptreactvuewebcomponentnpmselecttoast

[학습일기] HTTP 서비스 인증/인가 관련 이해한 내용 정리

들어가며인증과 인가와 관련해서 공부를 할 때 원리가 이해가 안 되어서 로그인과 CSRF와 같은 개념을 그냥 예시를 통해서 귀납적으로 학습하는 데에 그쳤다. 당연히 뭔가 답답한 느낌이 들었고 CSRF의 경우 외우고 까먹고를 반복했다.그러다가 최근에 갑자기 이 내용이 이해가 되었다. 방금 깨달은 사람의 따끈따끈한 이해를 말아드리고 싶어서 이 블로그글을 작성하게 되었다. (이랬는데 알고 보니 틀린 이해일 수도 있습니다ㅠㅠ 혹시 틀린 부분을 발견하시면 댓글 달아주시면 감사합니다!!)이해한 부분네트워크 서비스의 인증 및 인가와 관련해서 이해하는 데 개인적으로 다음 활동이 굉장히 도움이 많이 되었다.특정 사용자를 인증하기 위한 필요충분조건을 논리식으로 작성하기특정 서비스의 사용을 인가하기 위한 필요충분조건을 논리식으로 작성하기 이 관점에서 인증 및 인가를 다음과 같이 정리하게 되었다.인증(Authentication, Authn)정의위키피디아에서 찾아본 인증의 정의는 다음과 같다.특정 사용자의 본인확인을 증명하는 과정. 다시 말해, 특정 사용자가 본인이라고 주장하는 사람이 맞는지 확인하는 과정인증이라는 개념이 왜 필요하게 되었는지를 웹 서버의 입장이 되어 생각해보자.일반적인 웹 서비스에서 사용하는 웹 서버의 경우 대부분의 ip로부터 요청을 받을 수 있다. 비유하자면 불특정 다수로부터 쪽지를 받는 것과 같다. 다음 쪽지를 받았다고 가정해보자.안녕하세요, 미스터 비스트 유튜브 팀에서 연락드렸습니다.저희가 이번에 만들고 있는 영상에 초대드리고 싶습니다.아래의 주소에 접근해서 설명을 따라 주시면, 다음 영상에 출연하실 수 있습니다.https://example.com?phishing=true문제가 한두개가 아니다. 일단 미스터 비스트가 내게로 연락을 보낼 리가 없고, 글솜씨가 허접하다. (글쓴이의 글쓰기 스킬 이슈입니다.) 하지만 웹서버 입장에서 중요한 문제는 따로 있다. 본인이 알고 있는 주소에서만 접근하는 것도 아니고 불특정 다수의 ip 주소로부터 HTTP 요청을 받기 때문에 요청을 보낸 것이 실제 미스터 비스트인지 미스터 비스트인 척 하는 김 아무개씨인지를 확인할 방법이 없다. 다시 말해 웹 서비스에 가입한 특정 사용자 A가 있을 때, 본인이 사용자 A라고 주장하는 요청이 실제 사용자 A가 보낸 것인지 아닌지 확인하는 과정이 필요하다. 이런 맥락에서 인증이라는 개념이 자연스럽게 필요해진 것 같다.간단한 웹 서비스에서의 사용자 인증비밀번호를 통한 인증소개 및 필요충분조건웹 서비스를 누군가는 처음 만들었을 것이다. 만들면서 인증에 대한 문제를 다음과 같이 풀 생각을 하지 않았을까? (즉, 뇌피셜입니다.)인증의 문제를 다음과 같이 해결하면 어떨까?하나, 사용자 A가 가입하는 시점에 A와 웹 서비스 둘이서만 아는 비밀번호를 공유한다.둘, 앞으로 HTTP 요청을 보낼 때 본인이 A라고 주장하며 동일한 비밀번호를 제시하면, 그 사람은 A라고 유추할 수 있다.현재까지의 사고 과정을 필요충분조건으로 정리하면 다음과 같다.(사용자 A 인증) <=> (HTTP 요청 시 A의 비밀번호가 제시됨)문제점위의 인증 방식은 조금만 생각해보면 사용성 또는 보안에서 엄청난 문제점이 있는 것을 확인할 수 있다. 웹사이트에 요청을 보낼 때마다 비밀번호를 제시해야 하기 때문이다. 사용자가 본인 페이지 내에서 이동할 때마다 비밀번호를 입력하게 하자니 사용성에서 하자가 있다. 또한 매 요청마다 평문으로 비밀번호가 전송되기 때문에 요청 중 하나라도 감청당한다면 비밀번호가 그대로 노출되게 된다.비밀번호 및 세션 토큰을 통한 인증소개사용자가 웹 서비스를 사용할 때 특정 시각부터 특정 시각까지 대화가 오가는 패턴이 자주 등장한다. 대화에서와 마찬가지로 이 대화 내의 나중의 요청은 이전의 요청들에 의해 쌓인 맥락을 가지고 있다. 이렇게 특정 시간 범위 동안 존재하는 고수준 양방향 연결을 세션이라고 한다. 보통 세션은 이전 요청들에서 쌓인 맥락을 가지고 있기에 stateful하다.이렇게 웹 서비스에서 흔하게 존재하는 세션이라는 개념을 활용하면 "매 요청마다 비밀번호가 평문으로 전송된다"는 문제를 다음과 같이 해결할 수 있다.이미 사용자 A에 대한 세션이 있는 경우 A의 세션에 대한 접근 권한을 A의 비밀번호 대신 사용할 수 있다.이 경우 연결이 감청당한 경우에도 세션 접근 권한 정보는 세션이 존재하는 동안만 유효하기 때문에 비밀번호가 유출되는 확률을 낮출 수 있다. (추가: 그러나 세션이 탈취당한 상황에서 이게 얼마나 의미가 있는지는 모르겠습니다.)따라서 매번 비밀번호를 입력받는 과정을 다음의 세 단계 과정으로 대체할 수 있다.하나, 사용자 A에 대한 아이디와 비밀번호를 받아서 서버에서 세션 저장소에 A를 위한 세션의 정보를 저장하고, 세션 정보에 접근할 수 있는 권한을 응답에 반환한다. 이를 보통 "로그인"이라고 칭한다.둘, 로그인 상태에서는 세션 접근 권한을 비밀번호 대신 인증 수단으로 사용한다.셋, 특정 시간이 지나거나 사용자가 직접 요청하는 경우 세션 정보를 파기한다. 이를 "로그아웃"이라고 칭한다.토큰 소개오해를 방지하기 위해 토큰에 대해서 짚고 넘어가보자. 위키피디아에 의하면 토큰의 정의는 다음과 같다.특정 작업에 대한 권한을 표현하는 소프트웨어 혹은 하드웨어 객체따라서 꼭 JWT의 형식이 아니더라도 세션 접근에 대한 권한을 표현하는 데이터를 모두 "세션 토큰"이라고 칭할 수 있는 것으로 보인다. (혹시 아니라면 알려주시면 감사드립니다!)필요충분조건위에서 정리한 내용을 필요충분조건으로 정리하면 다음과 같다.(사용자 A 인증) <=> (A 비밀번호 제시) OR (현재 존재하는 A의 세션에 대한 토큰 제시)여기서 인상적인 점이 토큰이라는 개념은 바로 뒤에 다룰 내용인 인가에 대한 내용이지만, 인증 정책의 일환으로 A의 세션에 대한 권한이 있는 사용자를 A에 대한 인증의 충분조건으로 사용했기에 여기에 등장했다는 사실이다.정리여기까지 인증에 대한 내용을 간단하게나마 살펴보았다. 인증으로 접근 권한도 퉁쳐서 나타내면 안 되는 걸까? 여기서는 CSRF의 사례를 들어 둘을 분리해야 하는 이유 중 하나를 살펴보겠다.인가정의위키피디아에서는 다음과 같이 서술하고 있다.리소스에 접근할 수 있는 권한을 명시하는 것인증과 구별해야 하는 이유여기서 "A로 인증했으면 A가 권한이 있는 작업들을 모두 허용해도 되는 것 아닌가?"라는 의문이 당연하게 들 수 있다. 이 둘을 일치시켰을 때 발생할 수 있는 문제 중 하나로 CSRF 공격을 예로 들어보겠다.CSRFCSRF는 Cross-Site Request Forgery의 약자로, "사이트 간 요청 위조"를 뜻한다. 쉽게 말해 S1 사이트에서 사용자 A에게 본인의 의사와는 무관하게 S2 사이트로 특정 요청을 보내도록 시키는 공격이다. 예를 들어 S1이 해커 사이트이고, S2가 은행 사이트이고, S2가 CSRF에 대한 보호가 안 되어 있는 경우, S1 사이트에서 HTML Form과 자바스크립트를 통해 S1에 접속한 사용자 A로 하여금 해커에게 송금을 하라는 요청을 S2에 보내도록 시킬 수 있다. 자세한 정보는 MDN에서 잘 설명되어 있다.CSRF가 발생할 수 있는 이유는 사용자가 브라우저에서 S1 사이트를 방문했을 때 S2 사이트에 대신 요청을 보내도록 하는 것이 너무 쉽게 가능하기 때문이다. Form 태그의 action attribute를 활용하면 사용자로 하여금 다른 사이트에 요청을 보내도록 할 수 있고, 이 때 cookie에 저장된 인증 정보가 같이 전송되기 때문에 문제가 된다.CSRF 발생 원인 분석 및 해결사이트 S2 입장에서 다음과 같은 정책을 생각할 수 있다.(사용자 A의 송금 서비스 접근 권한) <=> (사용자 A의 인증 정보)이렇게 할 경우 문제가 안 생기는 맥락이 어디엔가 있을지도 모르지만, 안타깝게도 웹 서비스 환경에서는 위에서 기술한 이유로 인해서 요청한 사용자가 정상적으로 웹 서비스를 사용해서 나온 요청인지, CSRF 공격의 피해를 당해서 발생하는 요청인지 구분할 수 없다.이에 대응해서 정상적으로 웹 서비스를 사용하는 사람에게만 발급해주는 토큰을 사용해서 해결할 수 있다. 구체적으로 HTML Form으로 웹 서비스를 제공하는 경우, Form의 hidden field에다가 매번 바뀌는 랜덤 문자열 토큰을 삽입해주고, Form을 제출했을 때 이 토큰을 확인함으로써 해결할 수 있다. 이 경우 토큰은 사이트 외부에서 접근 가능한 정보가 아니지만 요청에 꼭 필요한 정보이기 때문에, CSRF로 요청을 위조하는 것이 불가능하게 된다.이를 논리식으로 나타내면 다음과 같다.(사용자 A의 송금 서비스 접근 권한) <=> (사용자 A의 인증 정보) AND (CSRF 방지 토큰 소유)정리하며생각보다 시간이 많이 걸렸습니다. 잘 이해했는지 모르겠네요...

웹 개발학습일기

[인프런 클론 6주 완성 챌린지] 선택 및 집중 과정에서 포기해야 하는 것들에 대한 고민

지난주는 nextjs에 익숙해지는 데 많은 시간을 할애했다.주어진 속도로는 시간을 최대한으로 투자해도 진도를 정해진 일정대로 따라가는 것은 무리라고 판단하였다. 그래서 어차피 챌린지 일정이 밀릴거라면, 1-2주차처럼 무리해서 시간을 배분하지 말고 챌린지 외 일정들을 챙기면서 진도를 천천히 따라가자는 계산을 했다.사실 지난주와 지금을 비교해봤을 때 실력적으로 큰 차이가 있지는 않지만 비슷한 패턴을 여러 번 반복해서 보다 보니 심적으로 익숙해지게 되었다. 그래서 다시 챌린지로 돌아와 프런트엔드 코드를 작성할 때 (할 일 계획) + (nextjs 코드 작성 및 이해)의 두 가지 변수 중에 후자가 해결되어 cursor에게 어떻게 일을 시킬지에 집중할 수 있게 되었고, 문제였던 불안도 어느 정도 해결되었다.각설하고 이제 급한 문제를 해결하고 보니 절대적인 시간이 부족하게 되어, 챌린지 기간 동안 어떤 부분을 챙기고 어떤 부분을 포기할지를 고민해야 하는 상황이다. 사실 이 생각을 하게 된 구체적인 이유가 있다.인프런의 지식공유자 강의 수정 화면은 다음과 같이 구성되어 있다.페이지상단 헤더: 현재 수정중인 강의 제목, 저장 및 제출 버튼 등메인 영역사이드바: 수정 과정의 모든 단계들 및 현재 단계 표시 강의 수정 영역: 강의 수정 정보 입력 폼반면 챌린지의 화면은 다음과 같이 구성되어 있다.페이지 사이드바메인 영역상단 헤더강의 수정 영역개인적으로 느끼기에 챌린지의 화면 구성이 훨씬 고민거리가 적기 때문에 챌린지 설계 과정에서 훌륭한 트레이드오프가 들어간 게 아닌가 생각하고 있다. (아닌가요...? 죄송합니다ㅠㅠ)이 파트를 구현하면서 챌린지 화면 구성에서 끝내도 되는 줄 모르고 이를 인프런 화면 구성으로 리팩터링을 시도하느라 하루를 보냈다. (결국 오늘 더 시간 쓰고 싶지 않아서 revert했습니다.) 이와 관련해서 글의 주제와는 관련 없는 몇 가지 흥미로운 생각이 들었는데 [여담]에서 따로 기술하였다.이 문제를 해결하면서 한 고민들은 nextjs를 이해하는 데 도움은 되었지만, 챌린지의 맥락에서 봤을 때 너무 지엽적인 내용인 것 같았다. 그래서 오늘 챌린지 전체 과정을 한 번 훑어보면서 내가 어떤 부분을 취하고 어떤 부분을 버려야 할지 다시 한 번 생각하게 되었다.개인적으로 챌린지를 하면서 가져가고 싶은 부분은 다음과 같다.백엔드 실 서비스 개발의 전체 흐름을 직접 경험해보기 (상세한 디테일은 챌린지 목차에서 확인 가능)이를 위해서 nextjs에 대한 이해는, 챌린지 코드의 큰 구조 및 데이터 흐름 및 AI 생성 코드를 이해할 수 있는 만큼만 가져가기로 결정했다. 그리고 "인프런 화면 구성 구현하기"는 이 관점에서 살펴봤을 때 욕심이라는 생각이 들었다.이상입니다. 읽어주셔서 감사드립니다.[여담] 여담이지만 위 현상을 경험하면서 몇 가지 생각이 들었다.스스로 무언가를 해보면서 발생하는 문제 상황을 해결할 때 배우는 게 많다. (주관적인 생각입니다.)AI가 이 과정을 방해한다고 생각했는데, 방금 배운 것을 돌아보니 AI를 활용한다고 해도 이 과정이 바뀌지는 않는구나 싶은 생각이 들었다.나는 AI가 작성하는 코드를 이해하고 싶은 마음이 크다. 혹시 관련이 있을지도?Context 왜 쓰는지 백날 고민해봤는데 한 번 리팩터링하면서 와닿는 게 더 많았다. 역시 직접경험이 짱인 것 같다.UI가 응집되는 방향성과 데이터/함수/메소드가 응집되는 방향성이 달라서 발생하는 문제를 해결한다고 생각했었고 이번 리팩터링에서 이를 실감했다. 개인적으로는 현재 리액트 주류 스택이나 MobX 활용 스택이나 주인공을 컴포넌트로 둘 것인지 객체로 둘 것인지의 관점의 차이만 있지 둘 다 이 문제를 훌륭하게 해결한다고 느꼈다. (물론 저는 말하는 감자입니다. 감자가 느낀 것을 그대로 믿으시면 안됩니다.)내가 초기 스타트업에서 일을 하는 상황이었다면 챌린지 화면처럼 구현하자고 기획자와 승부를 봐서 타협을 했을 것 같다.나는 AI가 작성한 코드를 더 쉽게 이해하고 싶어서 스타일링 최소화한 ui 코드 만들기 / 스타일링하기의 2단계로 쪼개서 일을 시키는 것을 좋아한다.또 리팩터링을 설계하고 AI 생성 코드를 이해하는 과정에서 다음과 같은 고민들을 했거나 진행중이다. 내가 생각하기에 괜찮은 고민인 것 같다.nextjs에서 서버 컴포넌트로 ViewModel A에 대한 초기 json 데이터를 얻고, 클라이언트 컴포넌트에서 A를 업데이트하는 패턴이 보이는데, 이 패턴을 공통으로 묶을 수 없을까? (고민중)인프런 화면 구성을 구현하려면 Layout 컴포넌트를 어떻게 설계해야 할까? (마음에 드는 솔루션 하나 확인)

개발 · 프로그래밍 기타학습일기

[인프런 클론 6주 완성 챌린지] 배우기와 익히기의 밸런스

개인적으로 이번 챌린지를 신청하는 데 많은 용기가 필요했다.하나는 타인의 문제 해결을 클론코딩하면서 내가 문제를 해결하는 문제해결력이 떨어지는 것이 아닌가 걱정했기 때문이고,다른 하나는 내 자신의 문제해결력에 하자가 있다는 것을 인정해야 했기 때문이다. (주의: 개인적인 맥락 하에서만 맞는 얘기입니다. 일반적으로 클론코딩 수업을 듣는다고 문제해결력에 하자가 있다고는 생각하지 않습니다.)이번 챌린지를 신청했을 때 했던 생각은 약간 자포자기하는 심정으로 '내 문제해결력이 떨어지는 리스크를 감수해서라도 나는 백엔드 개발을 한 바퀴를 돌려봐서 흐름을 파악해야겠다'였다. 또 '지금 못해도 배워서 잘 하면 되지'라는 말로 못하는 내 자신을 용서하는 과정도 필요했다.뚜껑을 열어보니 예상외로 챌린지에 참여하기를 정말 잘한 것 같다는 생각이 들었다. 일단 지금까지는 그렇다. 모방하고 이를 돌아보는 과정에서 내 문제 해결의 어떤 부분에서 하자가 있는지를 파악할 수 있었기 때문이다.실마리는 불안한 상태에서도 퍼포먼스를 내는 방법을 고민하면서 찾아왔다. 문득 '불안한 상태에서도 손이 자동적으로 나가도록 무지성 연습을 하면 불안할 때도 내 실행 능력의 저점은 보장되지 않을까?'라는 생각이 들었다. 그래서 nestjs 첫 프로젝트 수업을 2회, 컨트롤러는 3회 반복해서 구현했다. 반복하면서 다음 생각이 들었다.내가 불안감을 느끼면서 막혔던 이유는 동시에 문제 2-3개를 해결해야 해서 압도당했기 때문이다.예를 들면 nestjs controller 구현 + 클론 코딩 과정에서 현재 단계에 대한 이해작업이 어려워서가 아니라 코드가 손에 안 익어서 막힌다.간단한 게시글에 대한 crud 작업 연습에서 사실 "이해"가 필요한 부분은 거의 없다. 반복하면서 막혔던 이유는 전부 nest가 손에 안 익어서였다.그러면서 이런 생각이 들었다.모든 학습 과정은 배우기('학')와 익히기('습')가 동반된다. 프로그래밍의 경우 과목 특성인지 배움 없이 익히기에 치중한 학습자들이 많아서인지는 모르겠지만 이 중 정확한 이해를 통한 배우기가 특히 강조된다고 개인적으로 느꼈다.배우기와 익히기의 비중은 프로그래밍의 하위 분야에 따라 많이 다른 것 같다. 알고리즘 학습의 경우 (PS만큼 어렵지는 않은 맥락에서는) 배우기를 잘 하면 익히기는 상대적으로 수월하게 되는 것 같고, 웹 개발의 경우 배우기와 익히기 둘 다 의식적인 노력이 필요한 것 같다.나는 지금까지 내가 알고리즘은 못하더라도 "뭔가 잘 맞고" 웹 개발은 "뭔가 잘 안 맞는다"고 생각했는데, 적성의 문제가 아니라 학습 방법의 문제인 것 같다는 생각이 들었다.이제 앞으로 할 일은 막힐 때 어떤 부분으로 인해 병목이 생기는지를 파악해서 그 부분의 문제를 하나씩 해결하면 되지 않을까 싶다.

백엔드학습일기nest클론코딩

규인

주섬이 웹서비스를 출시하기까지

주섬이 웹서비스를 출시하기까지부제 : 홍보인 듯 회고인 듯, 회고인 듯 홍보인 듯 안녕하세요, 링크저장 앱 주섬을 운영하고 있는 팀 핑크보스입니다. 혹시 저희 서비스, 링크저장 앱 주섬을 들어보신 적이 있으신가요?  주섬은 링크를 편리하게 저장, 분류, 관리할 수 있게 도와주는 서비스입니다.주섬 프로젝트는 23년 4월, 직장인 사이드프로젝트로 시작되었고 같은 해 8월에 iOS 출시, 이후 운영과 고도화를 계속하고 있고, 올해 n월 웹서비스까지 출시하게 되었답니다! 주섬이 처음이신 분들을 위해, 주섬이 어떤 서비스인지 잠깐 소개해드릴게요! 링크, 자주 저장하시나요? 그렇다면 잘 찾아오셨습니다.레퍼런스 저장, 구매가 고민되는 상품, 놓치기 싫은 플레이리스트, 그냥 웃겨서 저장해두는 글 등, 우리는 평소에 링크를 참 많이 저장해요.  그런데 그렇게 저장해둔 링크들, 정말 다시 찾아서 열어보시나요?카톡 나만의 채팅방이나 메모장에 쌓아만 두고 계시진 않나요?분명히 나중에 보려고 저장했는데 까먹었다가 막상 다시 보려니 어디에 저장했는지 까먹어서 메모장과 나만의 채팅방을 뒤적뒤적…… 어떤 링크인지 잘 안 보여서 몇 개를 열었다 닫았다 반복하면서 🤯🤯🤯링크 하나 찾다가 짜증이 확 올라오는 경험, 모두 한 번씩은 해보셨을 거예요.  실제로 링크 저장과 관련 사용자 경험 설문을 해보니 응답자의 70% 이상이 링크를 저장해둔 사실을 잊어버리는 것이 불편하다고 응답했고, 응답자의 40% 이상이 원하는 링크를 찾기 힘들어서 불편하다고 응답했어요.   그래서 주섬은 이런 기능을 제공해요편리한 저장 : 웹이나 앱에서 링크를 복사하거나 공유패널을 이용하여 간편하게 저장링크 제목 수정 : 링크 제목은 내가 알아볼 수 있게 직접 수정폴더 커스터마이징 : 원하는 만큼 폴더를 생성하고 내 마음대로 커스텀!태그 : 부가정보를 담을 수 있는 태그 추가 및 태그 필터 기능 제공읽지 않은 링크 알림 : 알림을 켜두면 읽지않은 링크는 PUSH 알림을 줘요 🙋‍♀ 평소 링크를 많이 저장해두는 분🙋 링크를 쌓아두기만 하고 다시 열어보는 게 가장 어렵게 느껴지시는 분🙋‍♂ 내 마음대로 링크를 분류, 정리해두고 필요할 때 빠르게 찾아보고 싶은 분 이런 분들에게 딱 맞는 서비스랍니다. 현재 앱은 iOS만 지원되고 안드로이드는 개발 중이예요! 웹서비스 출시, 이제 PC에서도 쓸 수 있어요!사실 이 글은 조금 두서 없었지만 웹서비스 출시 홍보글이랍니다. 올해 11월, 드디어 주섬 웹서비스가 출시 되었거든요!박수갈채 타임 갖겠습니다. 뿌이뿌이뿌이 뿌이~~~ 🥳🎉🎉🎉🎉(주섬 웹서비스 출시에 대한 객관적인 비평 또는 피드백? 그런 거 원하지 않습니다. 무조건 박수갈채. 일방적이고 편향적인 칭찬 부탁드립니다.) 아래 URL로 접속하여 주섬 웹서비스를 사용해보세요!https://app.joosum.com/원래 주섬 사용자셨다면 기존 계정으로 로그인하여 사용할 수 있어요. 처음 사용해보신다면 소셜 로그인으로 간편하게 가입하고 웹, 앱서비스를 함께 사용해보세요! 웹서비스 출시, 왜 했을까요?주섬 iOS 출시 후 운영과 고도화를 계속하면서, 팀원들이 직접 주섬을 사용하면서 느낀 불편한 점들도 같이 공유하고 개선해왔는데요.가장 큰 고민 중 하나는 iOS 앱으로만 지원이 되니 PC에서는 지원이 되지 않는다는 것이었어요.  모바일에서 주섬으로 링크를 편하게 관리할 수 있더라도 PC에서 링크 저장 시에는 다른 방법을 써야 한다면 결국은 디바이스마다 링크 저장 경로가 달라지면서 링크를 다시 찾아보기 어려워지게 돼요. 어떤 링크를 찾아보려고 할 때 어느 정도는 기억에 의존해야 하고, 기억이 나지 않는다면 결국엔 핸드폰에서 주섬을 뒤져보고, PC에서는 PC 저장경로를 뒤져보는 행동을 반복하게 되었어요. 즉, 주섬이 원래 해결하고자 했던 문제가 다시 발생하는 거죠.  🥲 : 링크 저장한 건 많은데, 막상 다시 쓰려고 하면 어디 있는지 몰라서 또 검색하게 돼… 이러한 문제점을 해결하려면 PC와 모바일에서 통합적으로 사용할 수 있도록 앱서비스와 연동된 웹서비스 출시가 필요하다고 생각했죠. 그래서 출시 후 6개월이 지난 어느 날, 핑크보스는 주섬 웹서비스 개발 계획을 세우게 되었어요. 물론 과정은 쉽지 않았어요. 웹개발자 구인, 직장인 팀원들의 야근 이슈, 우선순위 정리….. 등 다양한 이슈로 예상보다는 진행이 늦어졌지만 그래도 드디어! 웹서비스 출시를 할 수 있게 되었답니다.  그럼, 어떤 점이 좋아졌을까요?주섬은 이번 웹서비스 출시로, 앱/웹 통합 링크저장 서비스로서 더욱 향상된 사용경험을 제공할 수 있게 되었어요.그럼 본격적으로 저희 웹서비스 자랑을 좀 해볼게요 🤗 하나, 모든 기기로 이어지는 자연스러운 흐름스마트폰에서 저장한 링크를 PC에서 바로 열어보고,PC에서 저장한 링크도 앱에서 손쉽게 확인할 수 있어요.디바이스에 구애받지 않고, 언제 어디서나 원하는 링크에 즉시 접근하세요.링크를 저장하는 순간부터, 활용하는 순간까지 끊김 없이 연결돼요.  둘, PC 환경에 최적화된 사용경험그냥 옮긴 게 아니라, 새로 설계했어요. 모바일 앱의 기능은 가져오면서 PC에 맞게 새롭게 구성한 UIUX를 적용했어요.넓은 화면을 살려 화면 이동 없이 링크 내용을 확인하고, 어떤 화면에서도 폴더 목록을 보고 정리할 수 있어요.정리와 탐색이 더 빠르고 편리해졌어요! 셋, 더욱 편리한 검색찾고 싶은 링크가 있다면 PC 버전 상단 검색창에서 링크 제목으로 검색해보세요. 어느 화면에서나 폴더에 상관없이 바로 검색하여 ‘찾는 시간’을 줄여보세요. 넷, 하나로 모아지는 저장경로, 높아진 생산성이제는 흩어지지 말고, 주섬 하나로 통합하여 링크를 더 잘 활용해보세요. 어디에서 저장하든 내가 만든 폴더와 태그로 정리하고, 필요할 때 언제든 쉽게 찾아보세요. 잘 정리해둔 나만의 링크 목록, 당신의 생산성을 높여줄 거예요.   주섬, 많이 사랑해주세요!주섬은 처음 출시한 이후, 꾸준히 운영과 고도화 작업을 지속하고 있으며 안드로이드 출시도 앞두고 있답니다. 웹서비스 출시로 더욱 다양한 기기와 환경에서 사용이 가능해지면서 더 많은 가능성이 생겼고‘링크 관리를 통한 생산성 향상’에 집중하여 더욱 나은 경험과 가치를 드리기 위해 고민하고, 노력하고 있어요. 앞으로도 이런 주섬, 많은 관심과 성원과 응원과(중요) 앱 다운로드와(중요) 사용 부탁 드리며, 궁금한 점이나, 피드백이 있으시다면 언제든지 pinkjoosum@gmail.com 으로 보내주세요! 주섬 앱 다운로드 하기(iOS)https://apps.apple.com/kr/app/주섬-joosum/id6455258212 

기획 · PM· PO출시회고웹서비스사이드프로젝트링크저장아카이빙

김소연

Snowflake BUILD KOREA 웨비나 – 개발자를 위한 AI·데이터 실전 인사이트

안녕하세요, 여러분!데이터와 AI의 흐름이 빠르게 진화하는 요즘,Snowflake Korea가 준비한 웨비나“BUILD with us in the Age of AI”에 여러분을 초대합니다. 📅 일시: 2025년 12월 9일 (화) 14:00–16:30🔗 등록하기: https://buly.kr/1xzeDO7 이번 웨비나는 단순한 기술 발표를 넘어, 개발자가 당장 실무에 활용할 수 있는 AI·데이터 인사이트를 얻을 수 있는 자리입니다. 정형·비정형 데이터를 활용한 AI 에이전트 개발부터 ML 프로젝트 운영까지 다양한 실전 노하우를 공유합니다. 🎉 다양한 이벤트도 준비되어 있습니다!웨비나 참여자분들을 위한 스페셜 이벤트와 경품도 마련되어 있어요.참여만 해도 Snowflake가 준비한 사은품, 기술 리소스, 다시보기 영상 등을 받을 수 있으니 부담 없이 들어오셔서 혜택도 챙기고 인사이트도 얻어가세요! 🎁 등록자 혜택 • 글로벌 BUIL D 주요 세션(한글 자막 포함) 8편 다시보기 제공 • Snowflake 기술 자료 및 개발자 리소스 제공 • 라이브 참여자 대상 특별 이벤트 및 기념품  AI와 데이터를 중심으로 새로운 시대를 만드는 데 관심 있는 개발자라면 놓치지 마세요. 12월 9일에 함께해요! #Developer #AI #DataCloud #Snowflake #BuildKorea

데이터베이스DeveloperDataCloudAISnowflakeBuildKorea

Gemma

[책추천] SQL 코딩 테스트를 준비한다면 | SQL 실전 트레이닝

(원본: https://blog.naver.com/italian-lesson/223972366847)나의 본업은 데이터 분석가이다. 그중 SQL은 회사에서 메인으로 쓰는 나의 언어이다. 내가 좋아하는 언어는 이탈리아어와 SQL인데, 그중 SQL은 제한적인 문법만으로 데이터를 원하는 방식으로 추출할 수 있다는 게 마음에 든다. 그런 내가 SQL과 관련된 책을 썼다. 교보문고, yes 24, 알라딘에서 구매 가능하다.https://product.kyobobook.co.kr/detail/S000217223580 저자 소개에서도 포기할 수 없었던 내 이탈리아어 블로그 🌈내가 SQL 코딩 테스트를 준비할 때 사용했던 방식을 책에 녹였기 때문에 극강의 효율로 SQL을 공부할 수 있는 책이다. 차별 포인트 #1SQL 이론이 아닌 SQL 문제 풀이로 구성된 책이다. 수학의 정석 같은 느낌보다 수학 익힘책 같은 책이다. 이론을 아무리 배워봤자 막상 문제를 풀려고 하면 못 푸는 것을 수학 공부할 때 다들 느껴보았다. 어느 정도 이론을 알았다면 바로 문제를 풀어보는 것이 더 효과적이다. 차별 포인트 #263개의 SQL 문제들을 18개의 유형으로 정리하였다. 그래서 이 중에서 내가 약한 유형을 집중적으로 파볼 수 있다.유형 1. INNER JOIN유형 2. LEFT OUTER JOIN유형 3. CROSS JOIN유형 4. FULL OUTER JOIN유형 5. GROUP BY유형 6. HAVING유형 7. MIN, MAX유형 8. SUM, COUNT유형 9. CASE WHEN유형 10. IFNULL유형 11. LIMIT유형 12. NOT IN유형 13. RANK유형 14. DENSE_RANK유형 15. ROW_NUMBER유형 16. LAG, LEAD유형 17. DATE유형 18. CONCAT 각 유형 안에서 또 문제의 유형을 나누었다. 그래서 만약 GROUP BY가 어렵다면 어떤 유형의 GROUP BY 문제가 약한지 추가적으로 파악해 볼 수 있다. (문제 유형을 확인하고 싶다면 교보문고/yes24/알라딘 링크의 '목차' 부분에서 확인 가능!)책 마지막 부분에 문제 세트 3개로 마무리된다. 문제 세트에서는 여러 유형들이 섞여 있기 때문에 복습하기에 좋다. 차별 포인트 #3이렇게 다른 방법으로도 풀 수 있다는 다른 정답 풀이도 있고, 이렇게 풀면 틀리다는 오답 풀이도 있다. 수학 문제를 풀 때도 선생님이 푸는 방식은 이해가 가는데, 왜 내가 푸는 방식은 틀린 거지? 내 방식으로 풀면 안 되나?라는 질문이 뒤따른다. 그러한 궁금증을 해소하기 위해 다른 정답 풀이와 오답 풀이에 힘을 많이 썼다. 특히 오답 풀이는 내가 처음 SQL 문제를 풀었을 때 잘못 풀었던 방식이다. 우리 모두 별반 다르지 않기 때문에 내가 그런 실수를 했다면 다른 사람들도 똑같이 실수할 것이다. 그리고 이때 왜 자신이 틀렸는지 정확히 아는 것이 중요하고 그때 실력이 확 는다.차별 포인트 #4중간중간 이해를 돕기 위해 도식화한 그림들도 많다. 모든 유형에 직접 한 땀 한 땀 파워포인트로 만든 그림들을 추가하였다. (역시 파워포인트로 뭐든지 할 수 있음)어찌 보면 나한테 쉽게 설명하려고 그린 그림이기도 하다. 특히나 처음 JOIN을 배웠을 때 데이터가 결합하는 방식이 헷갈렸다. JOIN이 나올 때마다 어떻게 데이터가 연결되는지 하나하나 다 연결해서 표시하였다. 예상 독자SQL 코딩 테스트를 위해 준비했던 방식을 책에 녹인 것이긴 하지만 무조건 코테 대비용은 아니다. 크게 보면 SQL을 구현하는 데는 어려움을 겪고 있는 초보자를 위한 책이다. 이런 초보자들은 이론적 설명 보다 문제를 통한 학습이 이해하기 쉽고 기억에도 더 잘 남는다. 그 외에도 헷갈리는 포인트, 실무에서 깨달았던 SQL 구현 꿀팁들도 녹였다. 실무에서 직면하는 문제를 해결하는 데 필요한 실전 경험을 미리 쌓아볼 수 있다.

데이터 분석SQLSQL실전트레이닝SQL코딩테스트코딩테스트

레거시 결제/정산 백엔드 서비스 재구축

1. 프로젝트 소개>프로젝트 목표:현재 운영 중인 레거시 결제/정산 백엔드 시스템의 구조적 문제점(낮은 유지보수성, 강한 종속성, 불안정한 확장성)을 해결하고, 클린 아키텍처를 적용하여 고도로 안정적이며 변화에 유연하게 대응할 수 있는 차세대 결제/정산 시스템으로 전환하는 것입니다.>주요 기능:핵심 결제 로직 재구현: 안정적인 결제 승인, 취소, 환불 로직 처리.정산 시스템 고도화: 일별/월별 정산 데이터 생성 및 관리, 복잡한 수수료 및 분배 로직 처리.PG사 연동 모듈 분리: 다양한 외부 결제대행업체(PG사) 및 금융기관 연동을 위한 인터페이스(Gateway)를 명확히 분리하여, PG사 변경이나 추가에 유연하게 대응.고성능 트랜잭션 처리: 대량의 결제 트래픽을 안정적으로 처리할 수 있는 성능과 트랜잭션 무결성 확보.2. 클린 아키텍처 선택 동기-기존 레거시 방식의 문제점기존 레거시 결제/정산 시스템은 다음과 같은 구조적 문제점을 내포하고 있어, 장기적인 운영 및 개발에 심각한 어려움을 초래했습니다.DB/프레임워크에 종속된 비즈니스 로직:핵심 결제 및 정산 비즈니스 규칙이 데이터베이스 접근 코드(SQL, ORM)나 특정 웹 프레임워크(예: Spring Controller, Django View)의 구현체에 강하게 결합되어 있었습니다.이로 인해 DB 스키마나 프레임워크 버전이 변경될 때마다 핵심 비즈니스 로직까지 대규모의 수정이 필요했습니다.-낮은 유지보수성과 확장성:시스템의 핵심인 결제 로직이 외부 기술과 얽혀있어, 새로운 결제 수단이나 복잡한 정산 정책이 추가될 경우 코드 전체를 건드려야 했으며, 이 과정에서 코드의 유연성과 유지보수성이 현저히 저하되었습니다.-테스트의 어려움:순수한 비즈니스 로직을 테스트하기 위해서도 반드시 데이터베이스 연결이나 웹 환경 설정이 필요하여, 단위 테스트 작성이 어렵고, 기능 변경 후 안정성을 신속하게 검증하기 어려웠습니다.-클린 아키텍처 적용 동기결제/정산 시스템은 회사의 수익과 직결되는 미션 크리티컬(Mission-Critical)한 핵심 도메인입니다. 클린 아키텍처는 이러한 핵심 도메인의 안정성과 장기적인 유지보수성을 극대화하는 최적의 솔루션입니다.-핵심 비즈니스 로직 보호 (Independent of Frameworks, DBs, UIs):클린 아키텍처는 핵심 비즈니스 규칙(도메인)을 DB, Web Framework, UI와 같은 외부 기술 요소로부터 완벽하게 분리하여 보호합니다.이는 시스템의 생명주기가 길어질수록, 프레임워크의 변화나 DB 마이그레이션과 같은 외부적인 변화에도 결제/정산 로직의 안정성을 흔들림 없이 유지할 수 있게 합니다.-높은 테스트 용이성 확보:Use Case(유스케이스, Interactor) 계층에 비즈니스 로직을 집중하고, 이를 외부 인프라(DB Repository)의 구현체에 의존하지 않도록 설계합니다.결과적으로 DB 연결 없이도 순수한 비즈니스 로직만을 독립적으로 테스트할 수 있어, 리팩토링 및 기능 확장 시 안정성을 매우 높일 수 있습니다.-SOLID 원칙 준수 및 장기적인 유지보수 극대화:클린 아키텍처는 SOLID 원칙을 자연스럽게 유도하며, 특히 SRP(단일 책임 원칙)와 OCP(개방-폐쇄 원칙)에 따라 시스템을 설계하도록 장려합니다. 이는 결제, 정산, 환불 등 각 기능별 유스케이스의 책임을 명확히 하고, 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있는 유연하고 확장 가능한 구조를 확립합니다.  

채널톡 아이콘