work-flow
한동안 계속 팀장을 하게되면서 너무 바쁜 관계로 블로그를 잘 안쓰게 되었다가 이번에 팀플을 진행하면서 배운부분이 너무 많아서 기록을 하려한다.
프로젝트 소개
프로젝트 명 : work flow
소개
한 줄 정리 : 협업의 흐름을 한번에 파악 가능한 칸반 보드 서비스
내용 : 보드를 사용하여 작업의 흐름을 정리하고 협업을 좀 더 효율적으로 만들어주는 서비스입니다.
프로젝트 진행준비
바로 직전에 했던 아웃소싱 프로젝트에서 팀장을 맡으면서 느꼈던 아쉬운 점을 이번 프로젝트에서 보충하기 위해서 프로젝트 시작 전날 부터 많은 준비를 했다. 그리고 직전 프로젝트에서 잘되어서 유지하고 싶은것도 다시한번 정리를 했다.
유지하고 싶었던 것
1. 그라운드 룰 - 회의 시간, 식사시간, 자리비움 규칙을 정하여 일정하게 소통을 유지
2. 깃허브 이슈 템플릿, PR 템플릿, 커밋 템플릿을 활용하여 통일성 유지
3.서로 어려운 부분은 즉시 물어보기
개선(도입)하고 싶었던 것
1.확실한 코드 컨벤션 - 변수명, 함수명, 반환타입, 등등
2.PR전 확실한 코드리뷰
3.organization 으로 프로젝트 관리하기
프로젝트 진행
1.코드컨벤션
너무 고마웠던 점은 다들 실력도 좋고 소통이 잘된다는 점!!
그렇게 시간은 오래걸렸지만 시작부터 확실하게 코드 컨벤션을 정할 수 있었다.
더보기
코드 컨벤션
예 : userEmail , userCellPhone …
예 : frontend , useremail …
3. ENUM 및 상수 : 대문자와 언더바(_)를 사용한다.
함수명 : 소문자로 시작하고 동사로 네이밍한다.
예 : getUserId() , isNormal() …
전체를 조회할 때: getAll~~s 예시)getAllComments()
부분을 조회할 때: get~~sBy~ 예시) getCardsByAssigneeId()
클래스명 : 명사로 작성하고 UpperCamelCase를 사용한다.
Timestamed가 필요없다고 판단되는 엔터티는 제외하고 나머지 엔터티는 모두 Timestamp를 상속받도록 합니다.
Soft delete / Hard delete : 추후 결정
CRUD 메서드를 Entity에서 Static으로 활용 → 도메인 주도적인 방법
public ConsumersSignupResponseDto consumersUserAdd ( final ConsumersSignupRequestDto requestDto ) { userAdapter . checkDuplicateEmail ( requestDto . email ( ) ) ; User userData = User . saveUser ( requestDto ) ; PasswordHistory passwordHistory = PasswordHistory . savePasswordHistory ( userData , passwordEncoder . encode ( requestDto . password ( ) ) ) ; userAdapter . saveUser ( userData ) ; passwordHistoryAdapter . savePasswordHistory ( passwordHistory ) ; return ConsumersSignupResponseDto . of ( userData ) ; }
@Builder public User ( String email , String name , String nickName , String userAddress , UserStatus userStatus , UserRole userRole ) { this . email = email ; this . name = name ; this . nickName = nickName ; this . userAddress = userAddress ; this . userStatus = userStatus ; this . userRole = userRole ; } public static User saveUser ( final ConsumersSignupRequestDto requestDto ) { return User . builder ( ) . email ( requestDto . email ( ) ) . name ( requestDto . name ( ) ) . nickName ( requestDto . nickName ( ) ) . userAddress ( requestDto . address ( ) ) . userStatus ( UserStatus . ENABLE ) . userRole ( UserRole . CONSUMER ) . build ( ) ; }
ResponseEntity<CommonResponse<DTO>> 형태로 반환하기
@ResponseBody @PostMapping ( "/{columnId}" ) public ResponseEntity < ApiResponse < CardResponseDto > > createCard ( @Valid @RequestBody CardRequestDto requestDto , @PathVariable Long columnId ) { CardResponseDto cardResponseDto = cardService . createCard ( requestDto , columnId ) ; return ResponseEntity . status ( HttpStatus . OK ) . body ( ApiResponse . of ( cardResponseDto ) ) ; }
Repository → Service 사이 예외를 처리해주는 adapter 계층 사용하기
not . find . orders = 주문을 찾을 수 없습니다 . not . find . menu = 메뉴를 찾을 수 없습니다 . not . find . store = 가게를 찾을 수 없습니다 . not . find . review = 리뷰를 찾을 수 없습니다 . not . find . user = 유저를 찾을 수 없습니다 . not . find . like = 좋아요를 찾을 수 없습니다 . follow . mismatch . user = 자신을 팔로우 할 수 없습니다 . duplication . follow = 이미 팔로우를 했습니다 . not . find . follow = 이미 언팔로우 상태입니다 . not . find . follower = 팔로우 하지 않은 상태입니다 . mismatch . user = 유저가 일치하지 않습니다 . duplication . user = 아이디가 동일합니다 .
User getUser = userRepository . findById ( userId ) . orElseThrow ( ( ) -> new IllegalArgumentException ( messageSource . getMessage ( "not.find.user" , null , Locale . getDefault ( ) ) ) ) ;
단일 조회 뿐 아니라 전체 조회,범위 조회에서 찾을 내용물이 없으면 "조회할 ~~ 가 없습니다." 로 예외처리 통일하기
product ⎿ controller ⎿ service ⎿ dao ⎿ dto member ⎿ controller ⎿ service ⎿ dao ⎿ dto cart ⎿ controller ⎿ service ⎿ dao ⎿ dto
서비스: 기능 설명 + @Param+ @Return + @throw
/** * consumers 회원가입 * * @param requestDto * @return * @throws email 중복 * @throws 비밀번호 틀림 */
/** * consumers 회원가입 * * @param requestDto * @return * @throws email 이메일 중복 * @throws password 비밀번호 불일치 */
2.와이어 프레임
그리고 이번에는 프론트도 만들라는 요구사항이 있어 와이어 프레임에 좀 더 집중했다.
이정도가 최대였다... 자랑스러운 백엔드들
3.ERD
고민했던 점
-보드 와 유저는 다:다 관계가 되어서 중간테이블로 풀어냄
-카드에 담당자가 있는데 저부분을 보드 회원과 연결을 해야하는지 안해야하는지 의견이갈림
-요구사항을 자세히 읽어보니 담당자는 없을수도(null) 있어서 연결을 하지않고 Id값을 가지고 필요할때 보드회원을 찾기로함
4.API 명세서
API 명세서
API 명세서 | Notion
Built with Notion, the all-in-one connected workspace with publishing capabilities.
teamsparta.notion.site
5.프로젝트 생성
다음편에 계속...