"흩어진 동아리 정보를 한곳에, 복잡한 리크루팅을 간편하게."
똑똑(TtokTtok) 은 상명대학교 내 분산된 동아리 모집 정보로 인한 학생들의 정보 접근성 문제와, 엑셀/수작업에 의존하던 동아리 운영진의 비효율적인 채용 프로세스를 해결하기 위한 올인원 리크루팅 플랫폼입니다.
- For Students: 키워드/분야별 상세 필터링을 통한 맞춤형 동아리 탐색 및 간편 지원
- For Admins: 노코드(No-code) 스타일의 지원서 생성, 칸반 보드 형태의 지원자 관리, 합격 여부 이메일 자동 발송 등 채용 전 과정 자동화
서류 접수->면접 심사->최종 발표단계별 상태 변경 시스템 구축- 각 전형 단계 이동 시 데이터 무결성 검증 및 자동화 로직 적용
* 서류/면접 결과 통보 시 `JavaMailSender`와 비동기 처리를 활용하여 다수의 지원자에게 지연 없이 결과 메일 발송
- 이중 권한 관리 시스템:
ROOT_ADMIN(총동아리연합회) >CLUB_ADMIN(동아리 회장) >USER(학생) 계층형 권한 설계 (Spring Security) - 데이터 엑셀 추출: 운영진의 편의를 위해 지원자 명단 및 정보를 엑셀(
Apache POI)로 변환하여 다운로드 제공
1. 복잡한 동적 필터링 성능 최적화 (QueryDSL)
[Problem] 동아리 조회 시 '카테고리', '분과', '모집 여부', '정렬 조건' 등 6개 이상의 필터링 조건이 조합되어야 했습니다. 초기에는 JPQL과 if문을 사용했으나, 동적 쿼리 작성이 어렵고 가독성이 떨어지는 문제가 있었습니다.
[Solution]
QueryDSL을 도입하여 BooleanExpression을 활용한 모듈형 조건을 구성했습니다.
null체크를 통해 동적 조건을 안전하게 처리- 컴파일 타임에 타입 안전성(Type-Safety) 확보
- 복잡한 쿼리 로직을 직관적인 메서드 체이닝으로 리팩토링하여 유지보수성 증대
2. RDBMS에서 NoSQL 성격의 동적 데이터 처리 (Form Builder)
[Challenge] 동아리마다 지원서 양식(질문 개수, 타입, 필수 여부)이 전부 달라 고정된 DB 테이블 스키마로는 대응이 불가능했습니다.
[Approach]
MongoDB 같은 NoSQL 도입을 고려했으나, 프로젝트 규모와 트랜잭션 관리를 위해 PostgreSQL 을 유지하기로 결정했습니다. 대신 JPA의 AttributeConverter와 JSON 직렬화를 활용했습니다.
[Implementation]
- 지원서 질문 목록(
List<Question>)을 JSON 문자열로 변환하여 DB의TEXT컬럼에 저장 - 조회 시에는 다시 객체로 자동 매핑하여, RDBMS의 안정성과 NoSQL의 유연함을 동시에 확보
[Code] Question.java (JSON 매핑) 보러가기
3. 대량 메일 발송 비동기 처리
[Issue] 서류/면접 합격자 발표 시, 수십 명의 지원자에게 동기식으로 메일을 발송할 경우 서버 응답 지연(Latency) 문제가 발생했습니다.
[Optimization]
Spring의 @Async 비동기 처리를 적용하여 메일 발송 로직을 별도 스레드에서 실행되도록 분리했습니다. 이를 통해 클라이언트 응답 시간을 획기적으로 단축하고 사용자 경험(UX)을 개선했습니다.
[Code] EmailService.java 보러가기
| Role | Name | GitHub |
|---|---|---|
| Backend | 김가원 | @wongakim-99 |
| Backend | 김수민 | @codemaker-kim |
| Frontend | 임형준 | @hyeongjun6364 |
| Frontend | 차현우 | @chahyunwoo00 |
| Designer | 남현지 | - |