🔥딱 8일간! 인프런x토스x허먼밀러 역대급 혜택

블로그

[인프런워밍업클럽3기]PM/PO 발자국 4주차

강의별 회고제품 발견(Product Discovery), 시장에서 성공하는 제품을 만들기 위해핵심 포인트:“Product Discovery”란, 고객이 겪는 문제를 정확히 정의하고, 이를 해결하는 과정에서 가치를 창출할 방안을 탐색·검증하는 단계.“고객 문제 이해 → 아이디어 및 가설 설정 → 검증(실험)”을 반복하며, 유의미한 피드백 루프를 만드는 것이 중요.이 과정을 간과하면, 사용자에게 진정 필요한 제품이 아닌, 내부 가정만으로 만든 ‘실패할 가능성 높은’ 제품이 나오기 쉬움.인사이트:프로젝트를 시작할 때, 빠르게 코드를 짜기보다, “누구를 위해 어떤 문제를 해결해야 하는지”부터 깊이 파고들어야 함을 재확인.Discovery 단계에서 수많은 가설이 제기될 수 있는데, 이를 정교하게 정리·우선순위화해야 리소스를 효율적으로 투입할 수 있음. Product Discovery – 실험, 가설, 가정, 베팅핵심 포인트:Discovery에는 크고 작은 실험(Experiment)이 필수적이며, 가설(Hypothesis)과 가정(Assumption)을 명확히 구분할 필요가 있음.가설은 “~할 것이다”라고 예상되는, 검증이 필요한 주장.가정은 “이미 사실로 전제”하고 있는 부분(필수 조건). 하지만 추후 틀렸음이 드러나면 전체 전략이 흔들릴 수 있어, 역시 재검토해야 함.“베팅(Betting)” 개념: 한정된 리소스 속에서 가장 효과적이라 생각되는 실험에 투자(베팅)하고, 결과를 통해 다음 단계로 확장 혹은 중단을 결정.인사이트:“단순히 기능을 릴리즈해 보고 반응을 지켜보는 것”이 아니라, 명확한 가설과 메트릭을 설정하고, 실험 디자인을 꼼꼼히 해야 한다는 점이 중요.베팅은 결국 우선순위 결정의 문제. 팀 내에서 “무엇에, 왜 리소스를 투자하는지”를 공유하면 합의된 실험 문화를 형성할 수 있을 듯. Product Discovery – 기본 전제조건은 전략핵심 포인트:Discovery 과정에서 가장 중요하지만 흔히 놓치는 부분이 “제품 전략”임.제품 전략(비전, 목표, 방향성)이 선행적으로 설정되지 않은 채로, 다양한 실험 아이디어가 난무하면 우선순위 혼란이 발생하고, 결과적으로 일관된 제품 경험을 만들기 어려움.팀 전체가 공유하는 전략을 기반으로, Discovery의 각 단계를 수행해야 함.인사이트:나는 Discovery를 할 때 사용자의 니즈만 강조했었는데, 회사나 팀의 전략과 맞닿아야 실제로 실행력이 생긴다는 점을 다시금 느꼈음.Discovery 자체가 의미 있으려면, “우리가 궁극적으로 달성하려는 비전”을 분명히 하고, 해당 비전에 부합하는 가설·실험을 설계해야 한다. 체계적인 제품 발견을 위한 개념적 지도, 기회 솔루션 트리(Opportunity-Solution Tree)핵심 포인트:“Opportunity-Solution Tree”는 사용자가 겪는 문제(=기회)를 구조적으로 나누고, 각 문제를 해결하기 위한 솔루션(아이디어)들을 트리 형태로 시각화하는 방식.트리를 통해 여러 기회를 놓치지 않고 파악하면서도, 어떤 솔루션이 어느 기회에 기여하는지를 한눈에 파악 가능.Discovery의 복잡성을 줄이고, 팀원 간 커뮤니케이션을 명확히 하는 데 유용.인사이트:문제·기회를 단순히 “리스트업”하는 데서 끝내지 않고, 우선순위를 매기거나, 솔루션과 기회의 연결 관계를 트리로 표현하면, 의사결정이 명확해짐.지금 진행 중인 프로젝트에도 이 트리를 적용해, ‘가장 중요한 문제’부터 해결하는 과정을 체계적으로 해볼 수 있겠다. 체계적인 제품 발견을 위한 방법론, North Star Framework핵심 포인트:North Star Metric(NSM)과 그를 뒷받침하는 하위 지표(Leading indicators)를 설정해, 궁극적 제품 가치가 무엇인지, 그리고 그 가치로 가는 핵심 경로를 추적하는 방법론.Discovery 단계에서도 North Star Framework를 적용해, 프로덕트 성공의 궁극적 지표를 정의하고, 그 지표를 개선하기 위한 여러 실험과 기능을 설계·검증할 수 있음.인사이트:기존에 North Star Metric은 “유지율”이나 “DAU” 같은 단순 사용자 수치쯤으로만 생각했는데, 제품의 본질적 가치와 연결된 지표를 설정해야 한다는 점을 배움.Discovery 과정 내내, “우리가 설정한 NSM에 어떻게 기여하는가?”를 고민하면, 실험을 평가하는 기준이 훨씬 뚜렷해진다. 프로덕트 그로스(Product Growth) 입문하기주요 내용:프로덕트 그로스의 개념과 배경‘그로스’는 단순 마케팅이 아니라, 제품 전체 수명 주기에서 “획득 → 활성화 → 잔존 → 확산 → 수익화”를 개선하는 일련의 활동을 의미Growth 팀(또는 Growth 담당)이 있다면, 제품 관점의 실험과 데이터 분석을 통해 지표를 지속적으로 개선해 나감느낀 점:과거에는 마케팅 채널에 돈을 많이 쓰는 것만이 ‘그로스’라고 생각했는데, 프로덕트가 스스로 성장을 견인할 수 있는 구조(바이럴, 리텐션, 업셀링 등)가 중요함을 배움“획득-활성-유지” 사이사이에 데이터를 기반으로 한 실험이 필수적이라는 점이 인상적 첫 번째 그로스 레버, 제품으로 고객 획득(Acquisition)하기주요 내용:Acquisition 단계는 어떻게 제품을 통해 신규 사용자를 효율적으로 유입시킬 수 있는가에 초점자사 사이트나 앱 안에 Referral(추천), 바이럴 루프, 사용자간 초대 기능 등을 설계해, “제품의 내재적 기능”만으로도 획득 채널을 만들 수 있음“온보딩(첫 사용)”을 매끄럽게 만들어 초기 이탈을 줄이는 기법도 강조느낀 점:우리가 보통 생각하는 광고, SEO, 콘텐츠 마케팅 외에도, 제품 자체 기능으로 신규 사용자를 끌어들이는 설계가 중요“가입 이후 바로 이탈”을 방지하려면, 온보딩 플로우가 쉽고 명확해야 한다는 점을 다시 깨달음  두 번째 그로스 레버, 리텐션(Retention): Activation & Engagement(1) Activation활성화(Activation): 신규 사용자가 “가치”를 충분히 느끼도록 핵심 기능을 빠르게 경험하게 하는 것Activation Point(핵심 액션)를 찾고, 사용자가 이 액션에 도달하도록 UX 설계·알림·가이드를 제공(2) Engagement연속적인 활용(Engagement): 활성화 이후에도 사용자가 계속해서 앱/서비스를 사용하도록 만든 구조DAU, 세션 길이, 재방문율 등 구체적인 지표로 모니터링사용자의 피드백 루프, 보상(게임화 요소), 커뮤니티 기능 등이 대표적인 Engagement 전략느낀 점:Retention이야말로 제품의 장기적 성장을 결정짓는 핵심 요소. DAU나 WAU가 없다면, 신규 유입을 아무리 해도 빠져나가버리기 때문Activation과 Engagement는 사실상 연결되어 있으며, “처음 경험의 만족도 + 지속적으로 다시 오게 만드는 가치” 이 두 축이 매우 중요 세 번째 그로스 레버, Monetization주요 내용:제품에서 가치를 느낀 사용자가 실제로 유료 결제나 업셀링을 통해 매출을 발생시키는 구조과금 모델(구독형, 일회성 결제, 광고, 프리미엄 등)을 정할 때, 사용자가 언제·어떻게 결제하게 될지를 제품 흐름과 자연스럽게 연결해야 함Price Testing, 구독 vs. 일회성 결제 실험 등 데이터를 통한 검증 과정이 필수느낀 점:Monetization은 “돈을 받을 것인가?”가 아니라, “사용자가 기꺼이 지불할 가치를 제공하는가?”로 접근해야 한다는 점그로스 관점에서, Monetization도 실험과 지표 추적으로 개선할 수 있다는 사실이 흥미로움(예: 결제 전환율, 체험판 전환율 등) 그로스 모델(Growth Model): 우리 제품의 성장 메커니즘 도식화하기주요 내용:전체 그로스 과정을 시각적 모델로 표현해, 어디서 사용자가 유입되고, 어떤 요인으로 유지·이탈·전환이 일어나는지 한눈에 보이도록 만듦예) AARRR(아아르) 프레임워크(유입(Acquisition) – 활성(Activation) – 잔존(Retention) – 매출(Revenue) – 추천(Referral))를 기반으로, 우리 제품 특유의 루프나 경로를 그려서 목표 지표와 인과관계를 정리느낀 점:실제 팀에서 Growth Model을 그려보면, “어떤 부분이 병목(bottleneck)인지”, “가장 먼저 개선해야 할 구간이 어디인지”가 명확해짐제품팀·마케팅팀 등이 모두 하나의 그로스 모델을 공유하면, 같은 언어로 협업이 가능해질 듯

PM/PO발자국4주차

leeebug

워밍업 클럽 스터디 3기 FS - 4주차 발자국

3주차 과제를 일찍 마무리하고 4주차는 조금 일찍 학습을 시작했기 때문인지 유난히도 길었던 마지막 주차도 끝나간다.이번주는 특히나 굉장히 많은 이슈를 경험했다. 결론부터 말하자면 채팅방 생각보다 구현하기 쉽지 않았다. 간단하게 하나만 언급하자면 URL로 장난질 치는 것에 대한 방어로직 구현이 특히 어려웠다. 사실 예전에 firebase 기반으로 미니 SNS를 구현했던 경험이 있는데 이번에 채팅을 구현했으니 이 프로젝트를 그대로 고도화해서 SNS를 완성해볼 계획이다. (실제로 완성할 수 있을지는...)📝 4주차 학습Supabase Auth이메일/비밀번호, OAuth, Magic Link, SMS 인증 등 다양한 인증 방식을 지원하는 인증 서비스supabase.auth.signUp, signInWithOAuth, getUser() 등으로 유저 관리와 세션 제어가 가능JWT 기반으로 RLS와 연동되며, 로그인 상태 자동 유지 및 세션 갱신 기능도 제공Supabase RealtimePostgreSQL의 Listen, Notify 기능을 기반으로 실시간 데이터 동기화 제공테이블 변경(Insert, Update, Delete)을 클라이언트에서 실시간으로 브로드캐스트supabase.chaeenel()로 원하는 이벤트를 구독Supabase RLS(Row Level Security)데이터베이스의 행(Row) 단위로 접근 제어를 설정하는 보안 기능Create Policy를 적용하여 유저별로 조회/ 수정 권한을 세밀하게 조정활성화 시 명시적인 권한 정책 필수아래는 개인적으로 나머지 공부로 학습하고 적용해본 라이브러리입니다.ZodTS 환경에서 런타임 스키마 검증과 타입 추론을 제공하는 유효성 라이브러리z.object() 등 메서드로 구조화된 데이터의 유효성 검사 수행 및 타입 자동 생성서버 및 클라이언트 모두에서 안전한 폼 및 api 검증에 활용React Hook Form과 함께 사용하기 유용한 라이브러리React Tostify토스트 메시지를 손쉽게 띄울 수 있는 라이브러리간단한 API로 다양한 유형의 토스트 알림 제공강력한 커스터마이징 제공Kyfetch API 기반의 모던한 HTTP 클라이언트간결한 문법 제공자동 재시도, 에러 핸들링, 인터셉터 등 확장성과 다수의 편의 기능 포함📋 4주차 미션💬GitHub 저장소👉체험하러 가기 미션 해결 과정 요약이번주 미션의 필수 구현 과제는 Supabas Auth를 사용한 회원가입, 로그인 기능 구현 및 Supabase Realtime을 활용한 1:1 채팅 기능 구현하기였다. 추가 구현 과제는 메시지 삭제, 메시지 알림, 메시지 읽음 여부 표시, 채팅 신고, 유저 차단 기능 등 자유롭게 구현하기였는데 시간 관계 상 전부 구현하긴 어려워서 비교적 쉬운 메시지 삭제와 메시지 알림을 제한적으로 구현했다. 원래는 DB 스키마를 꼼꼼하게 고민하고 시작했어야하는데 급하게 하다보니 처음 계획했던 내용과 많이 달라졌다.myon_users.id -> auth.users.idSupabase Auth로 회원가입된 유저만 등록 가능myon_rooms.userA_id -> myon.users.idmyon_rooms.userB_id -> myon.users.id회원가입된 유저만 채팅에 참여 가능myon_messages.sender_id -> myon_users.id회원가입된 유저만 채팅 전송 가능myon_rooms.last_message_id -> myon_messages.id가장 최근 메시지 미리보기 시 테이블 join에 활용myon_users.username회원가입 시 입력한 닉네임을 기반으로 한글과 특수 문자 등을 제거한 후 중복 발생 시 유틸함수를 통해서 suffix를 불여서 고유한 username을 자동 생성(회원가입 시 입력 폼의 간소화를 위한 선택)✅ 이메일 로그인, 회원가입GET app/auth/signup/callbackPOST api/user/email/register✅ OAuth 로그인, 회원가입GET app/auth/oauth/kakao/callbackPOST api/user/oauth/register우선 회원 기능부터 만들기 시작했는데 강의 패턴을 참고하여 자동 생성되는 auth.users 테이블만 사용하여 회원 로직을 만들었는데 메타 데이터의 형태가 provider 별로 일정하지 않고.. 무엇보다도 auth.users 테이블은 커스텀이 제한적이기 때문에 public.users 테이블을 별도로 관리하였다. 카카오 계정 로그인의 경우 user_metadata를 커스텀 인터페이스로 관리하여 타입 오류를 방지하였다.또한 auth.users 테이블만 단독 사용시의 문제는 회원가입 단계에서 사전에 이메일 중복 검증이 어렵다는 점도 단점이었다.찾아보니 보안상의 이유로 Supabase 내부적으로 auth.users 테이블을 직접 조회하는 기능은 별도로 제공하지 않아서 가입 요청 후에 에러를 캐치할 수 있는 구조이기 때문에 이부분도 public.users를 조회하여 이메일 중복 검증을 통과한 경우에만 회원가입 요청을 할 수 있도록 처리했다.회원가입이나 로그인 인풋 유효성 검증은 Zod + react-hook-form 라이브러리도 대체했다.이메일 회원가입이메일 로그인✅1:1 채팅POST, GET api/rooms/[roomId]POST api/messagesGET api/messages/[roomId]문제는 채팅 기능 구현이었는데 채팅 기능 자체는 Realtime 구독으로 어렵지않게 완성했으나 문제는 방어로직 구현이었다. 몇 가지 예시를 들자면 /direct-message 로 접근 시에 해당 페이지에서 나 자신을 제외한 모든 유저 리스트를 불러온 뒤, /direct-message/:roomId 로 동적 라우트를 구현할 때, 처음에는 고유성을 보장하기 위해서userA_username-userB_username-suffix 형태로 roomId를 생성하는 유틸 함수를 사용했는데 렌더링 시 마다 suffix가 변동되기 때문에 서버단에서 해당 URL이 유효한 URL인지 검증하기가 쉽지 않아서 userA_username과 userB_username을 정렬하여 항상 동일한 roomId를 생성하는 순수 유틸 함수로 변경하여 해당 문제를 해결하였다.export function generateRoomId({ usernameA, usernameB }: { usernameA: string; usernameB: string }) { const sortedUsernames = [usernameA, usernameB].sort() return `${sortedUsernames[0]}-${sortedUsernames[1]}` }과제 추가 구현 기능✅ 메시지 삭제(Soft Delete)PATCH api/message/[messageId]메시지 삭제는 두가지 방식이 있는데 DELETE 메서드를 사용하여 DB Row에서 아예 삭제하는 하드 삭제와 실제 DB Row에서 삭제하지 않지만 is_delete 같은 플래그를 true 하여 클라이언트단에서 감추는 방식인 소프트 삭제 방식이 있다. 하드 삭제의 경우 DB 공간 절약이 필요하거나 탈퇴 회원 정보 등 영구 삭제가 필요한 경우에 적합하고 소프트 삭제의 경우는 복구가 필요하거나 삭제 이력을 추적해야하는 경우에 적합한데 채팅은 로그를 남기는게 중요해서 개인적으로는 소프트 삭제로 구현했다.메시지 호버 시 삭제 아이콘 표시삭제된 메시지✅ 메시지 알림(토스트 메시지 활용)별도 API route 없이 구독으로 구현그냥 마무리하기 아쉬워서 추추가 기능으로 구현했다. 예전부터 토스트 메시지에 관심이 많았는데 직접 구현해보니 생각보다 비효율적이라서 react-tostify 라는 라이브러리를 적용했다.토스트 메시지는 스크롤이 최하단이 아닌 지난 메시지를 읽고 있을때만 우측 상단에 스택 형태로 알림을 보내도록 구현했다. 👀 4주차 회고이번 주는 지난 스터디 기간 동안 진행했던 프로젝트를 배포하는 과정이 포함되어 있었기 때문에, 추가적인 기능보다는 안정적인 배포에 중점을 둘 계획이었으나.. 다행히도 지난주에 미리 매를 맞아두었기 때문에 이번 주 과제 배포는 크게 문제 없이 마무리할 수 있었다.다만 실제 배포 경험이 많지 않다 보니 환경 변수 관련 이슈를 자주 겪게 되었고, OAuth Redirect URL 설정 누락, 빌드 시 타입 오류 등의 경험으로 배포 시 고려해야 할 요소들을 더 잘 이해하게 되었다. 앞으로는 다른 프로젝트 배포 시 참고할 수 있도록 트러블슈팅 내역을 꼼꼼하게 정리하는 습관을 들일 계획이다.이번주에 과제를 진행하면서 딱 한가지 아쉬웠던 점이라면 2주차부터 꾸준히 적용해오던 Container-Presentational Component 패턴을 이번에는 적용시키지 못했다는 점이다. 이번주 과제가 전반적으로 복잡도가 높다보니 관심사 분리를 코드에 녹여내지 못했으나 점진적으로 리팩토링을 통해서 개선해나가기 위해서 백로그에 기록해두었다. 스터디 이후..이번에 구현한 채팅 기능은 실제 배포를 해보니 전송 시 약간의 딜레이가 발생하는 것을 발견했다. 지금 타이밍에서 메시지 전송에 대한 낙관적 업데이트를 적용해서 최적화하는것이 가장 시급한 과제라고 생각한다.끝으로 이번 프로젝트는 이후에 포트폴리오로 활용할 수 있도록 고도화 작업을 이어갈 생각이며, 동시에 타입스크립트에 대한 이해를 더 심화시키고, 쉽진 않겠지만 최근 관심이 생긴 테스트 코드 작성 관련 학습도 병행해나가 보려 한다.정말 마지막으로.. 풀스택 과정을 포함한 모든 3기 스터디 러너분들, 멘토님들과 서포터분들, 워밍업 클럽 관계자 여러분들 모두 고생하셨습니다👏 여러분들 덕분에 좋은 인사이트 얻어갑니다 :)  

풀스택워밍업클럽3기풀스택Next.js4주차회고미션

[워밍업 클럽 2기 - Clean Code & Test Code] 4주차 발자국

워밍업 클럽 2기: Clean Code & Test Code의 4주차 발자국 작성입니다.3주차 발자국 보러가기 📝 학습 내용Presentation Layer 테스트 작성Mock더 나은 테스트를 작성하기 위한 여러 팁REST Docs ✍ 학습 내용 복습Q. Presentation Layer의 특징은?클라이언트로 부터 입력을 받아서 비즈니스 계층으로 해당 요청을 보내는 계층요청을 제일 먼저 받는 계층입력 데이터에 대한 기본적인 검증을 수행한다Presentation 계층에서의 검증과 Business 계층에서의 검증을 분리해서 생각해야 한다Presentation 계층에서는 보통 형식적인 검증을 한다예시: 필수 입력 값 검사, 데이터 타입 검사, null 검사, 빈 문자열 검사Business 계층에서는 비즈니스 로직에 따른 도메인 유효성 검사가 이루어진다Business 계층으로 부터 결과를 받아서 클라이언트로 반환한다컨트롤러에서 사용하는 요청 DTO가 서비스 계층으로 침투하지 못하도록 컨트롤러 계층에서 서비스 전용 DTO로 변환하는 것을 권장한다(상황에 따라 다를 수 있을것 같다. 만약 받는 포맷이 변할 가능성이 거의 없다면, 그냥 컨트롤러의 DTO를 쭉 사용해도 괜찮지 않을까 생각이 된다.)Q. Presentation Layer의 테스트 방법은?Business, Persistence 계층을 모킹해서 테스트한다MockMvc 같은 도구를 사용해서 HTTP요청과 응답을 시뮬레이션 한다모킹을 위해서 Mockito 같은 프레임워크를 사용할 수 있다 Q. Test Double의 종류를 정리해보자면?Dummy: 아루런 동작도 하지 않는 객체. 잘 사용되진 않지만, 보통 파라미터 전달용으로 사용된다.Fake: 실체 객체와 동일한 기능은 수행하지만, 프로덕션 용도로 사용하기에는 적합하지 않은 객체.예시: 인메모리로 맵을 사용해서 가짜 레포지토리를 구현하는 경우Stubs: 테스트에서의 요청에 대해 미리 준비된 결과를 제공하는 객체. 미리 반환할 데이터가 정의되어 있고, 호출하는 경우 해당 데이터를 반환한다. 미리 정의되어 있지 않은 것들은 응답하지 않는다.Spies: Stub이지만 정복 기록도 함께하는 객체. 호출 여부, 호출 횟수 등의 정보를 기록할 수 있다. 일부는 실제 객체 처럼 동작하고, 일부는 Stubbing할 수 있다.Mocks: 행위에 대한 기대를 명세하고, 그 명세에 따라 동작되도록 설계 된 객체. 그러니깐 개발자가 직접 그 객체의 행동을 관리하는 객체이다.Q. Stub과 Mock을 구분하는 기준은?Stub : 상태 검증(State Verification)Mock : 행동 검증(Behavior Verification) TIP. 테스트 작성을 위한 여러 팁을 정리해보면Mockito 프레임워크를 한번 래핑하는 BDD Mockito 프레임워크를 사용해서 조금 더 자연스러운 API 네이밍으로 프레임워크를 사용할 수 있다테스트 간의 독립성을 보장하자 테스트에서 전역 변수를 정의해서 사용하는 것은 권장하지 않는다@BeforeEach또는 @AfterEach 메서드를 사용한 레포지토리 클렌징@Transactional사용 Test Fixture용 클래스를 따로 분리해서 사용하는 것은 권장하지 않는다Test Fixture를 @BeforeEach를 사용한 셋업 메서드에서 사용하는 경우, 중복 제거보다 해당 테스트에 해당 내용을 알아야하는지 고려해보고 적용하자테스트 내용은 동일한데 입력값만 변경해보면서 테스트 해보고 싶으면 @ParameterizedTest 사용private메서드에 대한 테스트가 필요하다면 해당 메서드의 책임을 분리할지 고민해본다단순히 테스트하기 위해서 public으로 열어두는 것은 권장하지 않는다 Q. REST Docs vs Swagger의 차이는?REST Docs테스트를 통과해야 문서가 만들어지기 때문에 신뢰도가 높다프로덕션 코드에 비침투적이다코드의 양이 많고 설정이 상대적으로 어렵다Swagger적용이 쉽다문서에서 바로 API 호출이 가능하다애노테이션을 달아줘야 하기 때문에 프로덕션 코드에 침투적이다🤔 회고워밍업 클럽의 마지막 주차가 되었다. 강의 양이 많아도 내가 정말 필요한 내용을 담아서 만들어져있어서, 시간 가는 줄 모르고 시청했다.강의와 미션을 따라가면서 학습에 많은 도움을 받았다. 만약 워밍업 클럽 3기가 있다면 다시 참가할 예정이다.지금까지 학습 내용을 다시 복습해보고 더 나아가서 프로젝트에 적용하는 것이 목표이다. 🔍 참고Practical Testing: 실용적인 테스트 가이드

백엔드테스트코드워밍업클럽2기백엔드발자국4주차회고

miiro

[인프런 워밍업 스터디 클럽 1기] BE 4주차 회고록

네 번째 발자국자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고인프런 워밍업 클럽에 참여하여 쓰는 네 번째 회고록입니다.학습 내용build.gradle빌드 스크립트라고 불린다.gradle을 이용하여 프로젝트를 빌드하고 의존성을 관리하기 위해 작성되었다.현재는 groovy 언어를 사용해 작성되어있고, kotlin 언어를 사용할 수도 있다. 플러그인plugins { id 'java' id 'org.springframework.boot' version '3.1.11' id 'io.spring.dependency-management' version '1.1.4' } org.springframework.boot 플러그인스프링을 빌드했을 때 실행 가능한 jar 파일이 나오게 도와준다.스프링 애플리케이션의 실행을 도와준다.이 외의 플러그인들이 적용될 수 있도록 해준다.io.spring.dependency-management 플러그인외부 라이브러리, 프레임워크의 버전 관리의존성 처리하는 데 사용java 플러그인java 프로젝트 개발 시 필요한 기능 추가JVM 언어 Gradle 플러그인의 사용할 수 있는 기반 마련 그룹group = 'sample' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' }group프로젝트 그룹빌드 결과물에 프로젝트 그룹에 대한 정보가 들어있다.version프로젝트 버전sourceCompatibility프로젝트가 사용하고 있는 JDK 버전 레포지토리repositories { mavenCentral() }외부 라이브러리/ 프레임워크를 가져오는 장소 설정 의존성(dependencies)dependencies { // Spring boot implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' // test testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' //mysql runtimeOnly 'com.mysql:mysql-connector-j' }사용하는 라이브러리/프레임워크 표시implementation : 해당 의존성을 항시 사용한다.runtimeOnly : 코드를 실행할때에만 의존성을 사용한다.testImplementation : 테스트코드를 컴파일하거나 실행할 때 항시 사용한다.Spring과 SpringBoot의 차이점간편한 설정스프링은 강력한 기능을 제공한다.ex) IoC/DI, AOP, PSA ..기능을 사용하기 위해 xml 설정을 해야했는데 양이 많았다. -> 어노테이션 기반의 설정으로 변경하고 기본적으로 필요한 것들은 모두 자동 설정간단한 의존성 관리Spring을 사용할 때는 개발에 필요한 라이브러리/프레임워크를 모두 기입해야했다.의존성 관리가 힘들기에 starter로 묶어서 관리강력한 확장성Springboot 내부에 tomcat이 있기에 따로 설정할 필요가 없다.MSA에 적합한 모니터링application.yml 파일YAML 문법Yet Another Markup Language(또 다른 마크업 언어)YMAL Ain't Markup Language(마크업 언어가 아니다)확장자 : .yaml 또는 .ymlkey : value 형식으로 데이터를 정의한다.각 계층은 들여쓰기를 통해 구분하게 되며, 이를 통해 중복을 제거할 수 있다.value에는 참/거짓, 숫자, 문자열이 들어갈 수 있다.value에는 배열도 들어갈 수 있다. - 를 활용한다.#을 이용하면 주석을 사용할 수 있다.application.propertiesdev profile 사용application-dev.properties 파일 생성Lombokgetter/setter, 생성자와 같은 반복되는 보일러 플레이트 코드(boiler plate code)를 제거할 수 있다.dependencies 추가compileOnly 'org.projectlombok:lombok'annotationProcessor 추가annotationProcessor 'org.projectlombok:lombok'Spring Boot 2.7.x -> 3.0.x 변경점java 최소 버전이 17로 업그레이드스프링 프로젝트, third-party library 버전 업그레이드AOT 기초 작업AOT(Ahead Of Time) : 빌드 시 스프링 애플리케이션을 분석하고 최적화하는 도구애플리케이션 시작 시간과 메모리 사용량을 줄일 수 있게 해준다.javax -> jakarta 패키지로 변경모니터링 기능 강화 과제 내용이번 프로젝트에서는 출퇴근 사내 시스템으로써, 회사 내 팀과 직원 관리, 출퇴근 관리, 그리고 연차 관리 기능을 설계하였습니다. 기본적인 기술 스택으로는 Java 17 / Springboot 3.x.x으로 구성하여 팀 관리에서는 팀 이름을 필수로 등록하고 팀 정보를 조회할 수 있는 기능을 구현했습니다. 직원 관리에서는 직원의 이름, 매니저 여부, 입사 날짜, 생일을 등록하고, 직원 정보를 조회할 수 있게 했습니다. 출퇴근 관리에서는 직원의 출근 및 퇴근 기능을 구현하였으며, 직원의 근무 시간을 날짜별로 조회할 수 있도록 하였습니다. 연차 관리에서는 직원이 연차를 신청하고, 남아있는 연차를 조회할 수 있는 기능을 제공했습니다. 특히, 연차 신청 시 팀마다 다른 등록 기간을 적용하여 유연성을 높였습니다. 📋 미니 프로젝트 Github : commuting-system회고이번 프로젝트를 통해 팀, 직원, 출퇴근, 연차 관리를 통합적으로 설계하는 경험을 쌓았습니다. 팀 관리에서는 팀의 필수 정보를 명확히 정의하고, 팀 조회 기능을 통해 팀 운영의 투명성을 높였습니다. 직원 관리에서는 직원의 기본 정보를 체계적으로 관리할 수 있게 되었고, 매니저 여부와 같은 역할 분류를 통해 조직의 구조를 명확히 파악할 수 있었습니다. 출퇴근 관리에서는 출퇴근 예외 처리와 날짜별 근무 시간 조회 기능을 통해 직원들의 근태를 정확히 관리할 수 있었습니다. 연차 관리에서는 연차 신청과 조회 기능을 통해 직원들이 연차를 효율적으로 사용할 수 있도록 했습니다. 팀마다 다른 연차 등록 기간을 적용함으로써 조직의 유연성을 높였습니다. 이 프로젝트를 통해 데이터의 일관성을 유지하면서도 다양한 요구 사항을 충족시키는 설계의 중요성을 깨달았습니다. 또한, 시스템 통합의 복잡성을 이해하고, 사용자 편의성을 고려한 기능 설계의 필요성을 다시 한 번 느꼈습니다.

백엔드인프런워밍업스터디클럽4주차회고록

채널톡 아이콘