Search
Duplicate

WeMakePlay 중간발표자료

Search
Team (1)
이름
태그
MBTI
블로그 주소
Github주소
한마디!
부리더
ESFJ
모르는게 있으면 튜터님께 데려가기 (손 꼭 붙잡고)
팀원
INFJ
코딩은 재미없다 작품이 재밌는 것 코딩은 군것질 하면서

Github

1. 프로젝트

프로젝트 명 : We-Make-Play
소개
한 줄 정리 : 함께 운동하고 싶은 인원 모으기
내용 : 인원이 많이 필요한 운동을 하고 싶지만 사람모으기가 어려울 때! 그런 사람끼리 모여 축구, 야구 등 인원을 찾을 수 있습니다.
개발환경

2. 기획(2분)

기획
1.
목표: 개개인이 자유롭게 참여할 수 있는 온라인 운동 커뮤니티 구축
2.
주요 기능:
a.
모집 게시글,팀 생성 및 참여:
i.
사용자는 원하는 운동 종목 및 일정의 글을 생성하고, 다른 사용자들은 이에 참여할 수 있음.
ii.
참여한 사용자들은 함께 운동 일정을 계획하고 진행할 수 있음.
b.
유저 팔로우 및 좋아요 기능:
i.
사용자는 다른 사용자와의 활동이 유익했다면 좋아요 및 팔로우를 할 수 있음.
ii.
좋아요 수치는 프로필에서 조회가 가능하여 모집을 할 때 참고할 수 있음.
3.
MVP (Minimum Viable Product):
a.
계정 및 프로필 설정: 사용자는 회원가입시 프로필을 설정할 수 있음. 이는 향후 수정 가능함.
b.
게시글 작성: 사용자는 게시글을 작성하여 해당 게시글에 대한 다른 사용자의 참여를 받을 수 있음.
c.
팀 생성: 사용자는 팀을 생성하여 해당 팀에 다른 사용자의 신청을 받아 수락 및 거절을 할 수 있음.
d.
팔로우 및 좋아요: 사용자가 다른 사용자에게 할 수 있으며, 좋아요의 경우 많이 받은 순서대로 보여주는 게시판이 존재함.
4.
기술 스택:
a.
프론트엔드: bootstrap, thymeleaf
b.
백엔드: springboot
c.
데이터베이스: MySQL
d.
보안 및 인증: JSON Web Token (JWT)
e.
배포 및 CI/CD: Github Action, AWS
서비스 아키텍처
(아키텍처 그림)

3. MVP 주요 작업물(1분)

서비스의 핵심이 되는 기능 시연
1.
보드/팀 가입 및 수락
2.
유저 팔로잉, 팔로워 확인 기능

시연 영상

4. 기술적 의사 결정(2분30초)

1.
에러코드 처리 클래스
도입 이유:
기능 구현 중 여러 문제가 발생 할 수 있는 상황이 정리가 되어야 함
문제 상황:
자바에서 제공하는 IllegalArgumentException 을 사용하여 에러를 처리하면 코드 가독성도 좋지 않고 유지보수성 측면에서도 좋은 방법이 아님
해결 방안:
ServiceException 을 사용하여 ErrorCode Enum 클래스에 정리
의견 조율:
서로의 의견을 듣고 장단점을 얘기하여 조율을 하도록 노력했습니다.
의견 결정:
결정은 지금의 기술 스택과 유지보수성을 판단하여 결정을 하였습니다.
public Board findBoard(Long boardId) { return boardRepository.findById(boardId).orElseThrow( () -> new ServiceException(ErrorCode.NOT_EXIST_BOARD) );}
2.
게시글 및 팀 참여 구현
도입 이유:
함께 운동할 인원을 모집하여 해당 인원들과 소통할 수 있는 공간이 필요함
문제 상황:
참여 신청 상태를 수락/거절 두 가지로만 분류하니 거절당한 사용자가 신청자 목록에 남아 있게 되어 처리하기 곤란했음
해결 방안:
참여 신청 상태에 ‘대기’를 추가하여 신청자 목록을 조회할 때 거절당한 사용자는 나타나지 않도록 했음

5. 추후 개발 및 기술적인 도전 계획(1분30초)

MVP에서 개선할 기능과 이에 대한 개발 순서
카카오톡 등의 소셜 로그인 기능
웹소켓을 활용한 채팅 기능 도입
회원가입시 유저 프로필 사진 설정
게시글의 경기장과 지도 API 연동
예상되는 개발 난제와 이에 대한 해결 방안
채팅
개발 난제 : 개발 스택과 DB 관리의 문제
해결 방안 :
댓글 형식으로 의견을 주고 받을 수 있는 공간 마련
가입 승인된 사용자에게 방장이 생성해둔 오픈톡 초대 코드 등 발송하기

6. 튜터님 질문 10항(3분)

1.
ERD 상으로 프로필 사진에 대한 정보를 충분히 저장하지 못할 것으로 보이는데 업데이트된 내용이 있나 재확인 부탁드립니다.
업로드할 파일에 대한 정보를 가지는 새로운 클래스를 추가하였습니다.
2.
ERD 중 TB_LIKE에 라이킹ID 컬럼, TB_FOLLOW에 팔로잉ID 컬럼이 의미하는 바가 무엇인가요? (현재 상태로는 table pk와 동일한 개념으로 보이는 듯 합니다.)
TB_LIKE
user_id : 좋아요를 누르는 사용자의 id 값
liking_id : 좋아요를 받는 사용자의 id 값
TB_FOLLOW
user_id : 팔로우를 누르는 사용자의 id 값 (=following_id)
following_id : 팔로우를 받는 사용자의 id 값 (=follower_id)
3.
채팅메세지를 저장할 때 MySQL VARCHAR를 이용한다면 얼마나 저장할 수 있을까요? 그리고 최대치를 넘어간다면 어떻게 해결할 수 있을까요?
VARCHAR의 최대 저장 용량은 65,535 바이트인데 UTF-8문자 인코딩을 사용하는 경우 한 문자당 4바이트가 소요되어 최대 문자 수는 65,535 / 4 = 16,383입니다. 최대치를 넘어갈 경우를 고려하여 4GB 까지 용량이 확장되는 TEXT 타입의 사용을 고려해볼 수 있습니다.
또는 MySQL대신 Redis나 Kafka 같은 NOSQL DB를 사용하는 것을 고려해볼 수 있습니다.
4.
API Request 중 시간을 직접 Request에 보내는 API들이 있는데 특별히 의도하신 내용이 있나요?
게시글의 경우 운동을 원하는 일자를 Request로 보내주어 일자가 지나면 스케줄러를 통해 해당 게시글이 삭제 되도록 하였습니다.
5.
API 설계 중 admin과 관련된 Context가 도메인하고 일부 섞여있는데 특별히 의도하신건가요? 아니라면 다시 정리 부탁드립니다.
이전 프로젝트를 참고 하였는데 수정하도록 하겠습니다.
6.
테스트 코드가 전혀 작성되어 있지 않은데 어떤 계획을 갖고있으신가요?
테스트 코드 관련 강의를 참고해서 단위 테스트부터 진행해볼 계획입니다.
7.
일부 중요한 프로퍼티가 github에서 조회되는데 어떻게 개선할 수 있을까요? (실제로 유효한 value인지는 논외로 치겠습니다.)
민감 정보가 포함된 파일에 대해서는 gitignore를 활용하여 처리할 예정입니다.
8.
Entity 연관관계를 설정 시 JsonIgnore를 같이 선언한 부분이 여럿 보이는데 어떤 상황에서 왜 필요하셨나요?
@ManyToOne의 Fetch 타입을 Lazy로 사용했을 때, 비어있는 객체를 Serialize 하려다 에러가 발생하였습니다. 이를 해결하기 위해 직렬화시 해당 필드를 포함하지 않도록 @JsonIgnore 어노테이션을 사용하였습니다.
9.
Repository를 접근함에도 불구하고 일부 메소드에는 Transactional 처리가 안되어 있는데 특별히 이유가 있나요?
단순히 조회만 하여 데이터 값에 변동이 생기지 않는 경우에는 Transactional 처리를 하지 않아도 될것이라 판단했습니다.
10.
Java Exception 종류와 의미에 대해 아는대로 설명해주세요. (ErrorCode.java에 BAD_REQUEST만 잔뜩 작성되어 있어서, 답변에 따라 꼬리질문이 가능한 문항입니다.)
HttpStatus에 대한 이해도가 부족하였습니다. 튜터님 질문에 여러가지 상수가 있다는걸 알게되었습니다.
차후 에러 상황에 따라 `NOT_FOUND` 등의 Exception으로 수정하려고 합니다.