동시성 제어 프로젝트
오늘부터 실전 프로젝트 기간이고 발제가 나왔는데 동시성 제어, Cachable, CSV 파일 읽기로 난이도가 상중하로 나뉘었다.
이번엔 수준별 분반으로 조가 구성되어서 뭔가 자연스레 난이도 상인 동시성 제어를 선택하게 됐고 조원 분들과 다양한 논의 결과 예상 시나리오로 자주 쓰이는 선착순 쿠폰 제공 이벤트에 타임딜을 섞어서 개발해보기로 했다.
프로젝트 목표
전체적으로 그냥 발제에서 나온 구현 목표들을 그대로 충실히 따라가보기로 했고 마지막에 MySQL Lock과 Redisson의 경우엔 성능 개선을 목적으로 하는 것이고 각 기술들의 장단점을 비교해보는 시간이 될 것 같아 우선순위가 뒤로 밀렸다.
Event storming
Wireframe
ERD
타임딜과 쿠폰을 어떻게 할지 정책적으로 의논하다가 우선 개발 스코프를 작게 가져가고자 타임딜:쿠폰을 1:1로 구성하고 이런 저런 분리를 한 결과 다음과 같이 처리됐다.
여태 해온 프로젝트중에서 스코프만 보면 가장 압축을 많이 했지만 구현해야하는 기능으로는 공부하고 고려해야할 부분이 꽤 많을 것이라 느껴진다. 아직 정확히 강의로 본 내용들이 아니기 때문에 직접 공부하고 적용해야 할 것이다.
코드 컨벤션
- 기본적인 Code style은 Kotlin Lint 사용
- IntelliJ 설정 - 에디터 - 코드 스타일 - lint.xml 적용
- 저장 시 액션 (Action on save) - 상단 4개 체크박스 체크
- 변수명
- Field: camelCase (myNumber)
- Enum Case, 상수(Constants): 전체 대문자 (SUPABASE_KEY)
- result, find처럼 불확실한 변수명 말고 Domain entity에 기반한 이름 쓰기
- 함수명
- 작명법: 반환 타입에 연관있게 작성 ex) getCoupon, createCoupon
- 생성자
- 생성자는 반드시 명시적으로 생성
- ex) Post(id = id, password = password, name = name)
- 매개변수
- 매개변수는 3개 이상일시 반드시 명시적으로 생성
fun updateUserProfile(userId: Long, principal: UserPrincipal, request: UpdateUserRequest, image: MultipartFile?)
- 또는 같은 타입으로만 이루어진 매개변수일시 (String, String)
- Entity
- @Column에 name은 명시적으로 하지 않고 다른 옵션이 필요할 때만
- Nullable을 명시적으로 써줄것인가? (@Column(nullable=true))
- Nullable 필드에만 nullable=ture를 명시한다
- Mutable 여부는 var, val로 구분합시다
- Immutable한 필드만 updatable=false를 명시한다
- 날짜에 대한 어노테이션
- 생성시 날짜가 필요한 경우: @CreatedDate 사용
- 수정시 날짜가 필요한 경우: @LastModifiedDate 사용
- Entity ↔ Dto 변환의 책임은 Dto가 지니게 작성
- dtoVariable.toEntity(entity: Entity)
- DtoCompanion.from(entity: Entity)
깃허브 컨벤션
깃허브 규칙
- Branch 정책
- main(version tag) - dev - (dev-mysql-lock, dev-redssion-lock) - feat/fix/docs branch
- branch {issue_id} - {feat/docs/fix/bug/refactor등} - {해당-이슈에-관한-네이밍}
- Branch에 추가 내용 구현해야할 시 PR 내용을 수정하거나 빨리 리뷰해달라고 닥달하기
- Main / Dev는 직접 Commit 불가, PR로만 머지 가능
- PR Merge 방법
- 다른 Domain 파일을 수정해야 하는 경우
커밋 규칙