[UMC] UMC 9TH 프로젝트 & 회장단 회고

[ UMC ]2026. 3. 3. 20:26

2026.02.26

안녕하세요! UMC 9기 동양미래대 회장으로 활동했던 테리/최도현입니다. 3-2 졸업학기를 앞두고 UMC라는 외부 동아리를 참여하게 됐는데요. 전체적인 회고록을 한번에 작성해보고자 합니다.

 

우선 UMC를 활동하게 된 계기인데요. 구름톤 유니브 3기 활동이 꽤나 좋은 기억으로 남기도 했었고, 이후에 들어갔던 DND도 너무 좋은 경험이였어서 또 IT 연합 동아리에서 프로젝트나 이런걸 진행해보고 싶다는 생각이 커져 다른 동아리를 찾던 중, 마침 UMC에서 신규 학교 모집을 진행하고 있던 참이였어서 지원하게 되었고, 운이 좋게도 바로 합격하게 되었습니다.

 

이후로는 매주 월요일 저녁 9시에 회장단 회의를 진행했고, 중앙 측에서 미리 준비해온 자료에 대해 설명해주시고, 안내해주시는 방향으로 회의는 진행되었어요. 저희 학교는 신규학교다보니 새로 세팅해야할 것들이 조금 많기도 하고 중앙 측의 매뉴얼? 가이드북도 숙지해야하는 상황이였기에 초기에 굉장히 바빴던 것 같아요. (+교내 동아리, 다른 프로젝트, 졸작을 병행 중이였어서 더더욱 그렇게 느껴지기도 했고,, 뭔가 회장이니까 조금 더 열심히 해야겠다라는 생각이 컸던 것 같습니다,,) 

진짜 오티가 엊그제 같은데.

저희 챌린저들 귀엽죠? 근처 아는 분들을 열심히 수소문해서,,(부회장님너무고생많으셨어요...) 총 29명이나 모았습니다. 첫 기수로 들어온 학교 중에서는 꽤나 많은 인원을 모은거라고 하더라구요! 내심 뿌듯했답니다.

파트장 제외 25명!

물론 중간에 탈부자가 생기기도 했지만,, 데모데이까지도 많은 인원이 함께했던 것 같아요.

 

코어데이도 가고 학교 로고도 만들고

로고는 제가 만들었어요

행사 기획도 짜고
네트워킹 데이~,,

동미대 잼민이들 다들 2층에 미끄럼틀 타러 우르르 몰려가고 ㅋㅋㅋㅋ

임원진끼리 찍기로 했는데 민정누나 어디갓는데.
근데 갑자기 비와서 비맞으면서 갔어요

이날 이러고 첫차타고 갔다는 사실,,,

 

pm day,, 한 110명 왔었나요
분명히 강의실 대여했는데 문이 다 잠겨있어서,, 진짜 철렁했어요
이거 명찰 디자인 제가 했답니다

못 다 이룬 예디대의 꿈을 이뤄보는 시간이였어요,,, 사람도 너무 많고 준비해야할 것도 많아서 정말 힘들었던 기억이 생생하네요.

 

마지막은 SR DAY에요! 제가 지부장으로써 마지막으로 열었던 전체 행사였는데요. 전날까지 싱가포르에 있다가 귀국한 상태라서 정말 상태가.. 안좋았어요 ㅋㅋㅋㅠ 그래도 잘 마무리했던 것 같습니다!

당일 전체 진행+밸류디팀 프론트 발표까지 했어요.

이래저래 일이 겹쳐서 당일에는 시간이 정말 빨리 지나갔던 거 같고, 여기까지가 회장단 회고입니다!

 

사실 데모데이 참여나 다른 파트장 겸임 하는 거 제외하고 회장으로써만 일한다면 업무량은 크지 않은 것 같아요. 개인적으로 데모데이 프론트 팀장+교내 plan 파트장+지부장+TF팀까지 여러개를 병행해본 후기로는,, 딱 세개까지가 워라밸 맞춰가면서 하기 좋을 것 같아요. 저는 그리고 데모데이 중 싱가포르 해외연수라는 3주짜리 일정이 있었어서 더 어려웠던 것 같고, 의외로 지부장으로써 할 일이 조금 있었어서.. 케바케긴 하겠지만 너무 많은 겸업은 비추드립니다. 나름 열심히는 해봤는데 뜻처럼 평탄하게만 흘러가진 않았던 것 같아요 ㅋㅋㅋㅋㅠ

 

다행히 한성대랑 숙대 측에서 여러모로 신경을 써주셔서 편하게 9기를 마무리 할 수 있지 않았나 싶습니다! +중앙분들께도 감사드립니다,,

 

이후로는 프로젝트 회고입니다!


저는 이번에 자산 관리 금융 서비스 밸류디에 참여하게 되었는데요, DND 때 현직자분과 함께 작업했던 것과는 달리 이번엔 팀에 프론트 개발을 처음 하시는 분들이 많으셔서 제가 팀장을 맡았습니다. 전체적으로 PM 분께서도 처음이시고, 백엔드도 처음 개발하시는 분들이 많으셔서 꽤나 쉽지 않았던 프로젝트였어요. (처음엔 왜 팀원들이 왜 이렇게 많나 싶었는데 프로젝트 진행하면서 왜 많은지를 알게 되었습니다,,)

 

이번 프로젝트에서는 기능 개발보다는 구조 설계를 우선시해서 작업했어요. apiClient, queryKeyFactory나 폴더 구조, PR 템플릿 설정을 먼저 진행했고, 기반을 다져놔야 다른 분들이 더 쉽게 할 수 있지 않을까,, 고민을 많이 했습니다.

 

도메인 역시 명확하게 정해져있었기에, (온보딩, 목표, 분석, 추천 등) 다른 로직을 사용하지만 캐싱, 에러처리, 로딩 등을 일관되게 처리를 해야했고, TanStack Query의 이해도가 높지 않은 프론트 스쿼드라고 생각해 최대한 강제성을 부여하려고 했습니다.

 

사실 원래도 시스템 설계 과정은 잘 알고 있다,, 라고 생각하는 편이였는데요, 이번 기회로 하여금 더 깊이있게 리드의 역할을 알 수 있었던 것 같습니다.

 

그리고 금융 서비스의 UX 상으로 중간에 입력 데이터가 날아가는게 큰 문제라는 걸 인지했고, 목표 입력 폼을 관리하는 useGoalForm 커스텀 훅을 설계했는데요,

export const useGoalForm = () => {
  const [values, setValues] = useState<GoalFormValues>(initialValues);
  const [isDirty, setIsDirty] = useState(false);
  const [isSubmitting, setIsSubmitting] = useState(false);

  const validate = (next: GoalFormValues) => {
    if (!next.amount || next.amount <= 0) {
      throw new Error("목표 금액은 0보다 커야 합니다.");
    }

    if (!next.period) {
      throw new Error("목표 기간을 설정해야 합니다.");
    }
  };

  useEffect(() => {
    const handleBeforeUnload = (event: BeforeUnloadEvent) => {
      if (!isDirty || isSubmitting) return;

      event.preventDefault();
      event.returnValue = "";
    };

    window.addEventListener("beforeunload", handleBeforeUnload);

    return () => {
      window.removeEventListener("beforeunload", handleBeforeUnload);
    };
  }, [isDirty, isSubmitting]);

  const handleChange = (next: Partial<GoalFormValues>) => {
    setIsDirty(true);

    const updated = { ...values, ...next };

    validate(updated);
    setValues(updated);
  };

  return {
    values,
    handleChange,
    isDirty,
    isSubmitting,
    setIsSubmitting,
  };
};

해당 방식으로 구현해서 목표 금액이나 기간을 입력하다가 새로고침하거나 뒤로 가기를 눌러도 처음부터 다시 입력하지 않도록 수정했습니다. 실시간 validation과 브라우저 이탈 방지를 하나의 로직으로 묶어서 최대한 안정적인 UX를 제공하고자 작업했구요.

 

추가적으로 기존에는 UI + 도메인 로직이 코드 상에 합쳐져있는 구조였는데요, 목표 달성률 계산 로직이나 계산 쪽 부분이 여러 곳에서 중복되면서 수식을 변경 할 때 버그가 발생할 가능성이 커졌고,

export const calculateGoalProgress = (
  currentAmount: number,
  targetAmount: number
) => {
  if (targetAmount === 0) return 0;

  return Math.min((currentAmount / targetAmount) * 100, 100);
};

export const getRemainingAmount = (
  currentAmount: number,
  targetAmount: number
) => {
  return Math.max(targetAmount - currentAmount, 0);
};

 

위 코드처럼 모든 계산 로직을 함수화시켜서 컴포넌트를 단순화 시키도록 작업했었습니다.

 

밸류디를 마치면서는 아키텍처 구조에 대해 조금 더 깊게 생각하고, 새로운 라이브러리 (Storybook 등)을 써봤다는 점에서 꽤나 뜻깊었던 것 같아요. 기존에는 유지보수하기 좋은 아키텍처가 최고라고 생각했던 편이였는데 그걸 바탕으로 하되, 보기 쉽고 팀원이 실수하지 않도록 도와주는 아키텍처가 더 중요할 수도 있겠다라는 생각이 들었던,, 프로젝트였던 것 같습니다. 

저희 우수상도 받았어요ㅋㅋㅋㄱㅋㄱ

처음 하시는 분들도 많았는데 좋은 결과로 끝나서 나름 뿌듯했던 프로젝트입니다,, 사실 중간부턴 기대를 안했는데 마지막쯤에 불려서 진짜 당황했었어요 ㅋㅋㅋㅠ 밸류디 팀원들 너무 고생 많았고, 9기 중앙 운영진분들, 잘 따라와준 동미대분들 모두 수고 많으셨습니다!

DMU 짱