
1학기 때 진행했던 팀 프로젝트 “Graduation Coach”는
학생과 학사팀을 위한 졸업요건 관리 웹서비스다.
학생
학사팀
프로젝트 환경은 다음과 같았다.
팀은 총 7명이었고, 프로젝트 PPT 기준 내 역할은 이렇게 정의되어 있다.
포지션: BE
R&R: MVP 백엔드 개발
백엔드는 두 명이 나눠 진행했고,
나는 로그인·회원가입 같은 인증 플로우와 외국어/정보 인증 관리,
그리고 학사 대시보드와 연결되는 부분을 중심으로
서비스가 실제로 동작하는 MVP 백엔드를 구현했다.
이 글은 전체 프로젝트가 아니라, 그 중에서도 내가 맡았던 백엔드 구현 파트를 중심으로 정리한 기록이다.
GitHub 저장소
가장 먼저 했던 일은 이 서비스에 “진짜 로그인/로그아웃/회원가입”을 붙이는 것이었다.
spring-boot-starter-security 추가
SecurityConfig에서
/welcome, /login, /signup, 정적 리소스(css/**)는 permitAll()BCryptPasswordEncoder Bean 등록이전까지는 단순 HTML 폼 수준이었던 로그인 페이지가,
이 설정을 기점으로 “계정–세션–권한이 실제로 도는 구조”로 바뀌었다.
APIController의 /signup POST 핸들러 구현
UserDTO를 만들어 UserService.register() 호출UserDTO / UserRepository / UserService 수정
existsByUserId()로 아이디 중복 체크
UserService.register()에서
UserEntity 저장UserType(학생/학사)에 따라 분기StudentEntity까지 함께 생성UserService가 UserDetailsService를 구현하도록 변경
loadUserByUsername()에서 DB 유저 정보를 로드결과적으로,
“회원가입 → 로그인 → 세션/권한 부여 → 대시보드 진입”까지 이어지는 인증 플로우
를 처음부터 끝까지 구현했다.
초기 회원가입 화면에서 학교 입력은 단순 텍스트 입력이었다.
"연세대학교", "연대", "Yonsei" ...
이렇게 들어가면, 나중에 통계나 필터링, 조인할 때 전부 문제가 된다.
그래서 다음과 같이 수정했다.
input type="text" name="university"<select name="univ"> (value는 숫자 ID)이 작업을 통해
하는 구조를 만들었다.
이 경험 이후로, 전공/학과/과목/인증 같은 도메인도
항상 “보이는 이름 vs 내부 ID를 분리해서 설계”하는 습관이 잡혔다.
졸업요건에는 과목 외에도 외국어/정보 인증 같은 요소가 포함된다.
학사팀이 이 인증들을 전공·입학년도별로 등록하고, 필요 시 삭제할 수 있는 기능을 맡아서 구현했다.
ForeignCertRepository, CommunicationCertRepository
ForeignCertService, CommunicationCertService
이를 통해 학사팀은:
라는 흐름으로 인증을 관리할 수 있게 됐다.
학사팀 대시보드 컨트롤러에서
추가/삭제 요청 처리
즉,
“학사팀이 졸업요건 중 인증 항목을 직접 관리할 수 있는 전체 백엔드 플로우”를
Repository → Service → Controller → View까지 연결한 파트였다.
초기에는 Repository 메서드를 deleteAllByIdIn(...)으로 작성했는데,
실제 PK 필드 이름이 uid라 런타임 에러가 발생했다.
이를 deleteAllByUidIn(...)으로 수정하고,
Service/Controller 호출부까지 전부 맞추면서
화면 → Controller → Service → Repository → DB
까지의 흐름을 서비스 수준으로 안정화했다.
이전까지 GitHub는 나에게 그냥
“사람들이 거기에 코드 올리는 곳”
정도의 이미지였다.
이 프로젝트를 하면서 처음으로:
Spring도 마찬가지였다.
이 프로젝트 하나만으로 내 백엔드 역량이 전부 설명되지는 않지만,
백엔드와 GitHub 협업을 제대로 시작한 첫 팀 프로젝트였다는 사실은 분명하다.
Graduation Coach는 내가 처음으로 끝까지 맡아본 백엔드 팀프로젝트였다.
이 프로젝트에서 처음으로
프로젝트 자체는 거대한 서비스는 아니었지만,
“유저가 로그인하고, 권한에 따라 다른 데이터를 보고 조작하는 서비스의 백엔드”를 처음부터 끝까지 직접 만들어 본 경험이라는 게 중요했다.
이때 쌓은 경험이 이후 프로젝트(Spring 기반 사이드 프로젝트와 AI 서비스들)의 기본 골격을 잡는 데 기준점이 될 것이다.