2023.08.24 ~ 2023.09.19
공식적인 마지막 프로젝트의 종료일이 되었다. 🥳🥳🥳
원래는 매주 한 번씩이라도 블로깅을 하자
정확히는 할 수 있겠지 생각을 했지만
프로젝트 기간이 짧았던 것인지 계획한 양이 많았던 것인지
코딩하기 바빠 블로깅을 한 달을 멈춰버렸다...
그래도 좋은 팀원들을 만나 프로젝트도
만족스러운 마무리 단계로 접어들었기 때문에
여유가 생겨 이번 프로젝트를 하며
느낀 점들과 배운 점들을 정리해보려 한다!
https://github.com/codestates-seb/seb45_main_026
🔵 팀 빌딩 및 주제 선정 🔵
주어진 팀 빌딩 기간 2 ~ 3일 전에 미리 팀 빌딩을 해뒀기 때문에
주제 선정이나 팀의 방향성을 정하는 부분에 있어
다른 팀들보다 조금이나마 여유롭게 시작했던 것 같다.
백엔드의 경우에는 이전부터 같이 스터디를 하여
알고 있던 사이이기 때문에 걱정이 없었지만
프런트분들은 모두 처음 보는 분들이기 때문에
처음에는 어색할까 걱정했는데
다들 친화력이 만렙이시라
첫날부터 편한 분위기에서 회의가 진행됐다.
우선 프로젝트의 테마는 교육 미디어 플랫폼으로
기존의 강의 사이트들은 검증된 강사의 영상만
검수를 거치고 올라갔지만
유튜브처럼 누구나 자유롭게 강의를 올려서
자신의 지식을 전할 수 있는 플랫폼이 있으면
좋겠다는 의견이 모여져 주제가 정해졌다.
📢 팀 규칙 정하기 📢
1. 팀원 간의 소통 시 존댓말을 사용하자
사실 돌아보니 말끝만 다나 요로 끝나는 거긴 한데
어쨌든 서로 존대를 하기로 했다.
2. 스택별 스크럼은 자유롭게
프런트와 백만 나눠서 하는 스크럼은
각자 필요에 따라 자유롭게 하기로 정했다.
백엔드의 경우에는 오후 전체 스크럼 전에
짧게 하루동안 작성한 팀원들 간 코드를 살펴봤다.
3. 통합 스크럼
통합 스크럼은 고정적으로
하루에 두 번 진행하기로 하였다.
처음은 매일 아침 9시에 한 번 진행하며
10~20분 정도 각자 오늘 어떤 부분을 개발할지,
백, 프런트가 공유해야 할 내용 등에 대해서
가볍게 이야기했다.
오후 5시에 현재까지의 개발 진행도나
문제점들이나 보완할 점들을 서로 공유했고
필요에 따라 조금 더 일찍 모이기도 했다.
4. 다른 스택 간의 소통에 대해
이번 프로젝트에서는 디스코드 채널을 사용해
각 스택별 소통을 진행하기도 하였고
소통 채널을 따로 만들어 서로 의견을 주고받았다.
사실 소통 채널이 아니라 해줘 채널이 아닐까...
여담이지만 프런트와 백에 T가 총 4명
F가 2명인가 있었는데
F를 배려해 주자는 규칙도 있던 것 같기도 하다...
📋 프로젝트 간단 설명 📋
가입한 회원이라면 별도의 과정 없이
자신의 채널에 공유하고자 하는 강의를
무료 혹은 유료로 가격을 지정하여 올릴 수 있다.
검색 혹은 강의 목록의 필터별 정렬을 통해
찾고자 하는 강의를 쉽게 조회할 수도 있고
강의를 구매하기 전에 미리 보기도 가능하다.
자신 혹은 다른 사람의 채널에 들어가
업로드한 영상들을 보기 쉽게 찾아볼 수도 있으며
자신의 시청기록이나
구매한 강의 목록들도 필터링하여 확인할 수 있다.
강의마다 업로드한 사용자가
퀴즈를 낼 수도 있어서
강의를 시청한 후에 퀴즈를 풀어
마일리지를 획득할 수도 있다.
강의 업로드, 구매, 강의평 작성, 퀴즈 풀이 등으로
마일리지를 획득하여
결제에 일부 사용하거나
회원의 등급을 올려 성취감을 느낄 수도 있다.
👩💻 기술 스택 👩💻
JAVA 11 / SPRING BOOT 2.7
기본적인 서버 개발환경은 위와 같이 사용하였다.
SPRING SECURITY / JWT / OAUTH
인증 및 인가 처리를 위해 스프링 시큐리티를 적용하였고
JWT 방식의 로컬 로그인과
구글, 카카오, 깃허브 OAuth2 로그인을 적용했다.
JPA / QUERYDSL
데이터베이스를 다루기 위해 간단한 쿼리문은
JPA를 사용해서 처리하였고
대부분의 쿼리문은 QueryDSL을 사용했다.
REST DOCS
문서화를 위해 스웨거와 레스트독 둘 중 고민하다
레스트독으로 결정했다.
MYSQL
데이터베이스는 MySQL을 사용했는데
데이터 저장 이외에도
Full-Text 인덱스를 사용한 검색에도 사용했다.
REDIS
회원가입이나 패스워드 찾기 등의
이메일 인증이 필요한 경우
일시적으로 인증 상태를 저장하기 위해 사용되었다.
사실 이런 이유로 레디스를 쓰면 뺨 맞을 소리고
그냥 써보고 싶어서 썻다.
🔵 프로젝트 간단 진행 과정 🔵
팀 규칙, 프로젝트 주제, 깃 컨벤션, 백엔드 코드 컨벤션 등을 정한 후에
API를 정리하기 시작했고 어느 정도 틀을 잡은 후에
프런트는 화면 설계를 백엔드는 스텁 데이터 추가를 시작했다.
배우기만 하고 써본 적은 없던 기술인
AOP를 적용해서 빈 컨트롤러를 만들기만 한 후에
AOP로 컨트롤러의 응답값을 고정시켜 두었다.
그 후에 상시 프런트와 백에 서로 소통하며
실제 로직 개발 및 테스트 코드 작성을 진행하였다.
🔵 담당 파트 개발을 하며 느낀 점 🔵
일단 AOP로 스텁 데이터를 고정시켜 두니
클라이언트 측이 어떤 요청을 하든
서비스 로직 개발이 끝나지 않아도
정해진 응답값을 줄 수 있기 때문에
개발하는 입장에서 심적으로(?) 안정감이 들어서 편했다.
시큐리티 쪽을 이번 기회에
제대로 짚고 넘어가고 싶었어서
맡게 되었는데
개발 당시에는 많이 어려웠어서
먼저 따로 시작하게 되었고
다행히도 팀장님의 이전 프로젝트 코드도 참고하고
질문을 할 때마다 잘 가르쳐 주셔서
마무리할 수 있었다.
인증 및 인가 로직 외에도
회원 정보 CRUD 작업에 대해서도 맡게 되었는데
생각보다 조인을 해야 하는 테이블이 많아
쿼리문이 복잡해지다 보니
JPQL 같은 걸 사용하면 가독성이 떨어지고
현재 작성한 쿼리가 올바르게
작성된 쿼리인지 확인하는 것이 힘들었다.
그래서 QueryDSL을 사용하게 되었는데
처음 써보는 것이라 어려울 줄 알았지만
인텔리제이의 자동완성과
구글링과 챗지피티를 통해 금방 배울 수 있었다.
막상 지금 생각해 보면 실제 쿼리문 작성보다도
훨씬 쉬운 거 같다고 생각이 된다.
검색 엔진 구현도 시간이 남아서
맡게 되었는데 멘토님이
엘라스틱 서치 같은 것들은 당장 하기에는
과하고 진입 장벽이 높다 하셔서
MySQL 풀텍스트 인덱스를 사용한
검색 기능을 구현하였다.
이 과정에서 인덱싱과 캐싱에 대해서도
찾아보게 되면서 간단하게
개념으로만 알고 있던 부분들을
지금도 완벽하게 알지는 못하지만
어느 정도 학습한 개념을 토대로
이번 프로젝트에 적용시켜 보았다.
캐싱까지는 작업하지는 않았고
인덱싱 작업만 수행하였는데
우선 프로젝트의 코드 레벨의 쿼리문에서
조인, 정렬, 조건 검색 등에 자주 사용되던
칼럼들을 인덱싱 해주었다.
사실 데이터셋이 작아서
풀텍스트 검색을 쓰나 LIKE문으로 하나
인덱싱을 하나 안 하나
차이가 눈에 띄지는 않지만
개념 공부 차원에서 해봤다...
또한 이전 프로젝트와는 다르게
모든 코드에 대해 문서화와
컨트롤러/서비스/레포지토리/엔티티로 나누어
테스트 코드를 작성한 후에
최종적으로 통합 테스트까지 진행하였는데
이게 밤샘 코딩에
정신이 나가버린 건지 모르겠지만
테스트 코드를 작성하고 돌렸을 때
막힘 없이 초록색 패스 아이콘과 글씨들이
촤르륵 뜨는 걸 보니 이런 상쾌함이 없긴 하다.
(액션 쾌감 던X 앤 파이터)
🤔 사용한 기술 스택에 대한 잡생각 🤔
우선 스프링 시큐리티에 대해서는
기본적인 인증 및 인가 처리에
대해서만 사용하긴 했지만
핸들러 쪽을 보면서 뭔가 더 다양한 기능을
추가할 수 있지 않을까 생각을 해봤다.
성공 핸들러에는 출석체크 같은 기능을 추가한다던가
실패 핸들러에는 레디스를 같이 사용해
로그인 요청을 몇 번 이상 실패 시
일정 시간 계정을 잠구는 방법을 생각했었다.
데이터의 추가 및 수정 작업에서도
예를 들면 회원 탈퇴의 경우
탈퇴한 회원과 관련된 정보를
모두 업데이트해야 하기 때문에
쿼리문을 여러 번 날리게 되어
일괄 업데이트 쿼리문을 사용하여
최대한 줄이는 방향으로 로직을 완성했다.
하지만 이런 방법도
최적의 방법이라고 생각되지는 않아서
찾아봤을 때 스프링 배치와 스케줄러를
이용한 방법이 있었는데
이 부분도 추가적으로 학습해 보면 좋을 것 같다.
쿼리문 작성도 아직
어떻게 쿼리문을 작성해야
좋은 쿼리문인지 판단하는 것이 쉽지 않아
코드를 더 작성해 보고
제대로 공부를 해야 될 것 같다.
또한 테스트 코드도 이번에
팀장님을 통해 공통화와 다양한 방식들을 배웠는데
아직 테스트 코드가 그렇게
다른 사람도 한눈에 알아보기 쉽게
짜였다고 생각이 들지는 않아서
계속해서 작성해 보며
테스트 코드는 개발자의 의도를 알 수 있는
가장 쉬운 코드라는 말처럼
이해하기 쉽게 짜도록 노력해야겠다.
MySQL의 풀텍스트 검색의 경우에도
MATCH... AGAINST 쿼리문은
MySQL에서만 사용할 수 있기 때문에
특정 데이터베이스에 종속적이라는 문제가 있어
엘라스틱 서치나 하이버네이트 서치에 대해서도
배워봐야 할 것 같다.
😎 프로젝트를 마치며 😎
프로젝트 마무리 단계에 오면서
아쉬움도 많고 이런저런 생각이 들긴 하지만
팀장님 덕분에 시큐리티부터 테스트, 객체지향 개발까지
이번 기회에 많이 배우고 얻어갈 수 있었던 것 같다.
사실 프런트분들과 백엔드의 입장이
내가 알던 것과 반대가 돼버린 것 같긴 해서
미안한 마음이 드는 것도 같지만...
어쨌든 다들 매일 같이 새벽까지
코딩하다 주무시고 하루하루가 지나갈 때마다
아침 스크럼 시간에 좀비가 되어가는 걸 보면서
더 열심히 해야겠다 하고 동기부여가 되기도 한 거 같다.
모두 열심히 해주시고
항상 밝은 분위기를 만들어주셔서
다들 지치는데도 프로젝트를 여기까지
마무리할 수 있었던 것 같고
그래서 좋은 팀원들을 만날 수 있어
참 다행이었다고 생각한다.
프로젝트 자체는 기간이 한정적이어서
더 구현해보고 싶고 보완하고 싶은
부분들이 많았지만 못하게 되었는데
예를 들면 강의를 시청하는
회원들에게 동기 부여를 하기 위한
콘텐츠의 부족함 같은 부분들도
너무 적은 것 같아 아쉽긴 하다.
그래도 아쉬운 부분들도 존재하긴 하지만
배우고 얻어간 부분들이 더 많다고 생각해서
만족스러운 프로젝트였고
이 자리를 빌려 짧다면 짧고 길다면 긴 기간이지만
같이 매일 밤새 노력해 주신 팀원들 덕분에...
프로젝트 재밌게 작업하면서 마무리했습니다!
다들 너무 고생하셨고 앞으로도
코딩길만 걸으세요!
'Diary' 카테고리의 다른 글
[백준] 스트릭 64일 (1) | 2023.12.04 |
---|---|
[백준] 골드 달성! (0) | 2023.11.02 |
[백준] 새싹 5단계 뱃지! (0) | 2023.11.02 |
[백준] 30일 잔디 심기 (0) | 2023.10.31 |
코딩 테스트를 준비하면서 끄적이는 메모장 (0) | 2023.10.03 |