카테고리 없음

칸반보드 프로젝트

류정근 2024. 7. 15. 21:45
work-flow

 

한동안 계속 팀장을 하게되면서 너무 바쁜 관계로 블로그를 잘 안쓰게 되었다가 이번에 팀플을 진행하면서 배운부분이 너무 많아서 기록을 하려한다.

 

 

프로젝트 소개

  • 프로젝트 명 : work flow
  • 소개
    • 한 줄 정리 : 협업의 흐름을 한번에 파악 가능한 칸반 보드 서비스
    • 내용 : 보드를 사용하여 작업의 흐름을 정리하고 협업을 좀 더 효율적으로 만들어주는 서비스입니다. 

프로젝트 진행준비

바로 직전에 했던 아웃소싱 프로젝트에서 팀장을 맡으면서 느꼈던 아쉬운 점을 이번 프로젝트에서 보충하기 위해서 프로젝트 시작 전날 부터 많은 준비를 했다. 그리고 직전 프로젝트에서 잘되어서 유지하고 싶은것도 다시한번 정리를 했다.

 

유지하고 싶었던 것

1. 그라운드 룰 - 회의 시간, 식사시간, 자리비움 규칙을 정하여 일정하게 소통을 유지

2. 깃허브 이슈 템플릿, PR 템플릿, 커밋 템플릿을 활용하여 통일성 유지

3.서로 어려운 부분은 즉시 물어보기

 

개선(도입)하고 싶었던 것

1.확실한 코드 컨벤션 -  변수명, 함수명, 반환타입, 등등

2.PR전 확실한 코드리뷰

3.organization 으로 프로젝트 관리하기

 

프로젝트 진행

1.코드컨벤션

너무 고마웠던 점은 다들 실력도 좋고 소통이 잘된다는 점!!

그렇게 시간은 오래걸렸지만 시작부터 확실하게 코드 컨벤션을 정할 수 있었다. 

 

더보기

코드 컨벤션

Code Convention

Naming Convention

 
변수 : CamelCase를 사용한다
 
예 : userEmail, userCellPhone
 
패키지명 : 항상 소문자를 사용한다.
 
예 : frontend, useremail
3. ENUM 및 상수 : 대문자와 언더바(_)를 사용한다.
 
예 : NORMAL_STATUS
 
함수명 : 소문자로 시작하고 동사로 네이밍한다.
 
예 : getUserId(), isNormal()
<CRUD 메서드명>
 
생성 : create~
 
조회 : get~
 
전체를 조회할 때: getAll~~s 예시)getAllComments()
 
부분을 조회할 때: get~~sBy~ 예시) getCardsByAssigneeId()
 
수정 : update~
 
삭제 : delete~
 
Boolean : is~
 
 
클래스명 : 명사로 작성하고 UpperCamelCase를 사용한다.
 
예 : UserEmail, Address
 

Entity Convention

 
Timestamed가 필요없다고 판단되는 엔터티는 제외하고 나머지 엔터티는 모두 Timestamp를 상속받도록 합니다.
 
Soft delete / Hard delete : 추후 결정
 
Setter 사용은 지양합니다.
 
Builder 패턴을 사용합니다.
 
CRUD 메서드를 Entity에서 Static으로 활용 → 도메인 주도적인 방법
 
Service.java
Java
복사
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); }
 
Entity.java
Java
복사
@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(); }
 

Response Type

 
ResponseEntity<CommonResponse<DTO>> 형태로 반환하기
 
ex)
Java
복사
@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)); }

Structure

 
Repository → Service 사이 예외를 처리해주는 adapter 계층 사용하기
 

예외처리

messages.properties 를 사용하여 예외 메시지를 관리
Java
복사
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=아이디가 동일합니다.
Java
복사
User getUser = userRepository.findById(userId).orElseThrow( () -> new IllegalArgumentException( messageSource.getMessage("not.find.user", null, Locale.getDefault()) ) );
조회
단일 조회 뿐 아니라 전체 조회,범위 조회에서 찾을 내용물이 없으면 "조회할 ~~ 가 없습니다." 로 예외처리 통일하기

패키지 구조

도메인형 구조
Java
복사
product ⎿ controller ⎿ service ⎿ dao ⎿ dto member ⎿ controller ⎿ service ⎿ dao ⎿ dto cart ⎿ controller ⎿ service ⎿ dao ⎿ dto
 

주석

컨트룰러 - 기능 설명 + @Param
서비스: 기능 설명 + @Param+ @Return + @throw
/** * consumers 회원가입 * * @param requestDto * @return * @throws email 중복 * @throws 비밀번호 틀림 */
Java
복사
/** * 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.프로젝트 생성

다음편에 계속...