프로젝트 소개
시간과 공간에 제약 없이 편리하게 운동과 건강정보를 공유하고 1:1 맞춤코칭으로 전문 트레이너가 개개인의 라이프스타일을 고려하여 맞춤 식단과 운동을 제공하는 서비스를 기획했다.
기술 스택
FRONT-END
- React
- Javascript
- HTML
BACK-END
- Node.js
- Javascript
- Express
- MYSQL
- MYSQL WorkBench
- AWS
- Postman
COOPERATION
- Trello
- Slack
- Notion
- dbdiagram
- Figma
Trello
dbdiagram
Figma
[★] : 내가 담당한 기능 표시
프로젝트 기획
플로우 차트 [★]
API 기능 정의서 [★]
API 목록 정리
ERD 모델링
핵심 기능
소셜로그인
- 유저 타입 구분
커뮤니티 게시글 [★]
- 게시글 목록 조회
- 게시글 작성
- 게시글 상세 조회
맞춤코칭 게시글 작성 및 조회
맞춤코칭 게시글 [★]
- 게시글 상세 조회
- 게시글 댓글 조회
결제
- 외부 API 결제
- 포인트 결제
3차 프로젝트 회고이자 감사한 분들에게 전하는 메시지가 담겨 있다 : )
2차 프로젝트보다 역할이 늘었고 그만큼 혼자 코드를 어떻게 짤지 고민하고 해결하는 시간을 많이 가졌다.
끙끙 앓으면서 막히던 문제는 멘토님들의 힌트 덕분에 성취감을 얻을 수 있었다!
1️⃣
주로 게시글 조회를 담당했기 때문에 조인문을 짜고 게시글을 어떻게 정렬해서 전송할지가 관건이였다.
첫번째로 게시글에 작성된 댓글을 어떻게 배열 안의 객체로 넣을지를 고민했다.
구글링을 해보다가 이영서 현업 멘토님께 힌트를 얻었다 쿼리문 작성이 막막할 때는 원하는 결과값을 미리 적고 하나하나씩 도출해내면 수월하다고 알려주셨다. +서브쿼리를 활용해보라는 말씀에 어렵지 않게 게시글 안의 댓글을 배열안의 객체로 넣을 수 있었다.
큰 그림과 가닥을 잡아주시고 앞으로 있을 면접 꿀팁도 알려주신 영서멘토님💜 격려해주셔서 감사합니다! 열심히 할게요! 꼭 다시 뵈어요 : )
2️⃣
두번째로 앓았던 문제.
게시글 상세조회에서 댓글을 내림차순으로 정렬하는 것이였다.
초반에 게시글의 생성시간 옆에 댓글의 생성시간을 설정하는 것으로 작성했으나 전혀 변화가 없었다.
구글링을 통해 댓글은 JSON_ARRAYAGG 함수 안에 있으니 이 함수 안에서 코드를 작성해야 한다는 것을 알아냈다.
이런 저런 방법을 시도했지만 해결되지 않아 결국 GPT에게 도움 요청했으나 GPT도 해결해주지 못하는 것이다! 20번 넘는 시도에 답답해하다가 함께 검색해준 동기가 GPT에게 승질내니ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 해결코드를 내어줬다(민수 짱!)
이렇게 댓글 최신순 정렬도 완료!
3️⃣
게시글을 작성하면 데이터베이스에 데이터가 쌓이는 것까진 완료되었으나 게시글 상세로 넘어가지 않는 오류를 마주했다.
통신은 완료! 근데 게시를 누르면 상세페이지로 넘어가야 하는데 error가 뜨는 상황이였다.
내가 무엇을 빠트렸을까 생각해보았다.
- 테이블 순서대로 컬럼을 나열해서 코드 작성
- 다오-서비스-컨트롤러 코드 확인
- 프론트와 키값을 맞춤
- 백엔드쪽에서 게시글이 작성되면 그 게시글의 id를 보내주는 코드를 작성해야 하는데??????????
4번을 빠트렸다!!!!!
dao에서 insertThreadId를 리턴하는 코드 추가해주고
const postCommunity = async (userId, category, title, content) => {
try {
const result = await dataSource.query(
`
INSERT INTO threads (
user_id,
thread_types_id,
title,
content
) VALUES (
?,
?,
?,
?
)
`,
[userId, category, title, content]
);
const insertThreadId = result.insertId;
return insertThreadId;
} catch (error) {
console.error('Error in postCommunity:', error);
throw new error('Internal Server Error');
}
};
controller에서 ( dao → service 로 넘어온) thread를 response할 수 있도록 메시지 옆에 작성해주었다.
const { catchAsync } = require('../utils/error');
const postService = require('../services/postService');
const getPostListAll = catchAsync(async (req, res) => {
const allPosts = await postService.getPostListAll();
res.status(201).json({ data: allPosts });
});
const getPostListDetail = catchAsync(async (req, res) => {
const postId = req.params.postId;
const post = await postService.getPostListDetail(postId);
res.status(201).json({ data: post });
});
const postCommunity = catchAsync(async (req, res) => {
const { userId, category, title, content } = req.body;
const thread = await postService.postCommunity(
userId,
category,
title,
content
);
res.status(201).json({ message: 'Post created successfully', thread });
});
게시글 id 전송하기 완료!
커뮤니티 게시글을 같이 담당한 덕분에 프론트엔드 효은님과 함께 통신하고 API 관련해서 많은 것들을 소통하느라 붙어있는 시간이 많았다.
효은님은 서로 통신하다가 오류가 발생하면 프론트문제/백문제를 구분하지 않고 모든 오류를 해결하기 위해 같이 검색하고 고민해주셨다.
그리고 내가 기능 구현하는 속도가 느리다고 생각할까봐 부담없이 천천히 하라는 응원도 많이 해주셨다. 효은님 덕분에 프로젝트를 하면서 너무 즐거웠고 열심히 하는 모습에 덩달아 열심히 하면서 많은 것을 배웠다. 효은님😻 힘들 때 응원해주고 격려 많이 해주셔서 함께 협업하는 내내 좋은 기억만 있어요 감사합니다! 제가 진짜 팬이에영.........🫶
귀여운 효은님의 절규ㅋㅋㅋㅋㅋㅋㅋㅋㅋ진짜 고생 많으셨어요!!
😊소헌멘토님😊
2차 프로젝트를 진행하면서 소헌님께 DM 아니 SOS를 보냈다.
지금 생각해보면 그저 웃기지만ㅎㅎ당시에는 정말 막막하고 절실했다.
소헌님은 오자마자 일단 나를 안아주셨고ㅎㅎㅎㅎㅎㅎ나의 이해도를 파악하시고 레이어드 패턴대로 온전히 서버를 연결할 수 있도록 동작하는 방법을 알려주셨다.
처음부터 완벽한 코드를 치게끔 하지 않고 기초단에서 하나하나 수행할 수 있도록 체크리스트를 정해주신 덕분에 서버가 동작할 수 있는 흐름을 깨우칠 수 있었다. 당시 소헌님의 도움이 없었다면 나는 3차 프로젝트를 자신있게 시작할 수 없었을 것이다.
데이터를 넣고 포스트맨을 테스트 해보고 조인문으로 결과값을 낼 수 있도록 차근차근 알려주신 소헌님! 정말 감사합니다🥰
Keep
적극적인 태도|회의록 작성과 트레이너 인터뷰
팀이 발표되고 첫 팀 미팅으로 규칙부터 정했다. 지각하지 않기, 모든 의견은 자유롭게 공유하기 등 우리 팀만의 분위기를 만들었다.
기획회의는 45분 회의, 15분 휴식하면서 연장되는 회의시간에 지치지 않도록 했다. 모든 회의 내용은 내가 자발적으로 기록하고 내용은 노션에 히스토리를 공유했다. 회의 날짜순으로 프론트와 백엔드의 전달사항을 구분하여 회의 내용을 모두에게 공유했고 우리 팀이 어떤 이슈로 많은 이야기가 오고 갔는지 확인할 수 있게 했다.
우리 팀은 밤늦게까지 피트니스 서비스에 대해 함께 논의했다. 다른 팀보다 하루를 더 써서라도 기획을 탄탄히 하고 적절한 티켓 할당이 이루어졌다. 프로젝트 완성도를 위해 DB에 전문적인 트레이너의 상담글이 필요해보였고 주말에 트레이너 지인을 따로 만나 20가지 정도의 질문을 준비하여 질의응답 인터뷰를 가졌다.
주어진 티켓만 처리하는 것에 그치지 않고 우리의 서비스가 더 나아질 수 있도록 고민하고 진정한 애정과 오너십을 갖고 적극적으로 임했다.
Problem
부담감
총 3주의 프로젝트 기간 중 3번의 Sprint Planning Meeting이 있었다.
1차는 우리가 기획한 서비스를 멘토님에게 공유하고 3주라는 시간 안에 구현할 수 있는 스케일인지 검토받고 기능을 덜어내는 시간이였고,
2차는 각 팀원들의 티켓 진행 상황을 파악하고 현실적인 목표 달성을 다시 설정하는 시간이다.
3차는 완료할 수 있는 티켓을 마무리하고 남은 티켓은 과감하게 포기하고 완성도를 위해 통신에 집중하는 시간이다.
2차 스프린트 미팅 시점에 몇몇 팀원들은 필수구현이 끝나 추가 기능을 구현하자는 의견이 나왔고 나는 티켓 3개 중 1개를 80%진행완료한 상황에서 티켓이 하나 더 추가되었다.
기능 구현이 일주일밖에 남지 않은 시점이라 기한 안에 마무리 해야 한다는 부담감을 크게 느꼈다. 그 때 승윤멘토님이 '어차피 못할거 하나만 하자!' 라고 생각하면 부담감을 없앨 수 있다고 말씀해주셨다.
처음부터 4개의 티켓을 처리해야 한다고 생각하기보다 1개를 완료하자는 목표로 다시 설정하니 부담감이 덜고 현재 티켓에 집중할 수 있었다. 결국 나는 기한 안에 모든 티켓을 완료할 수 있었다.
일정에 대한 부담감을 안고 사는 건 개발자에게 뗄 수 없는 감정이지만 현재 목표에 충실하면 달성할 수 있다는 걸 경험했다.
3차 프로젝트에 티켓을 다 해낼 수 있을까라는 불안함을 이겨낼 수 있도록 조언해준 🐻승윤멘토님🐻 항상 감사합니다!
Try
대범함을 갖자
기업협업 팀 발표가 나왔다. 각 기업마다 1~4명의 백엔드 인원이 투입되는데 나는 혼자 협업에 참가하게 되었다.
그동안의 프로젝트에서는 백엔드 팀원들이 있었고 아이디어를 주고 받고 막히는 부분은 함께 고민하고 의지하며 수행했다면, 이번엔 오로지 혼자 모든 것을 생각해야 한다.
쫄지 말자... 혼자하는 것이 시련이고 힘들겠지만 그만큼 성장할 수 있는 기회라고 생각한다. 혼자만의 경쟁을 하면 된다!
뭐지? 나는 아직 부족한데? 어떡하지? 나 못하는거 아니야? 기업에 민폐끼치는 거 아니야? 등등의 생각만 하면 점점 다운될 것이 확실하다.
이런 생각은 다 접어두고 어떻게 해결할지만 생각하고 현업에서 많이 배울 수 있는 자세로 기업협업을 맞이하려고 한다.
내가 잘 할 수 있을 것이라 믿는다고, 나의 성장에 엄청난 도움이 될 것이라고 끝까지 응원해주신 🤓경래멘토님🤓 감사합니다!
'💡 > 회고' 카테고리의 다른 글
[기업인턴 회고] 옷장정리 서비스 (1) | 2023.10.27 |
---|---|
[프로젝트 회고] 스니커즈 리셀 SREAM (0) | 2023.09.10 |