👩🏻🦳 스크럼 마스터의 한마디
- wiki 쓰지말고 notion에서 다 관리하기
- git project 관리 순서
- pull request 남기면 Done으로 이동
- 바꿔야될 부분이 있어서 리뷰 남기면 남긴 사람이 해당 issue를 Todo로 이동
+ issue에도 확인 댓글 남기기 (이미지 참고)
- 담당자가 댓글 확인 후 수정 시작하면 InProgress로 이동
issue에도 확인 댓글 남기기 (이미지 참고)
나쁜 예시


좋은 예시


Product Owner : 🙋♀️ 강희정
Scrum Master : 👸 김은서
Developer : 🙆🏻 권태형
잔소리꾼 : 💁🏻♂️ 조규현
3일 스프린트 일정
👉🏻 Github Repo
👉🏻 Issue Tracker
👉🏻 Postman API
✋🏻 Github Project 규칙
- 3일간 스프린트를 진행한다.
- 항상 회고 한다. (플젝팀 포함한 전체 팀)
- 프로세스에 대한 불만, 귀찮음은 사소한것이라도 얘기한다.
- 진행중 상태는 하나만 제약한다.
- 백로그, 할일에서 일을 할당하는 것이 아닌 진행중 으로 옮길때 담당자를 할당한다.
Planning and Analysis
코딩 컨벤션
Language : Java 11
빌드 도구 : Gradle
DB : mysql
서버 : aws
이슈 관리 : 깃허브 issue, 칸반보드
Git commit 이슈 번호 자동화
git hooks
prepare-commit-msg
파일을 .git/hooks 폴더에 저장한다.txt 빼야 한다!!!!!!!!!!!!!!!!!!!!!!!!!!
예시
barnch :
- feature/123
commit message :
- fix: 게시물 등록 api → [fix: #123] 게시물 등록 api
- 게시물 등록 api → [#123] 게시물 등록 api
캡처


프로젝트 계획
- Must Have : 이번 프로젝트에서 반드시 여기까진 다해야한다.
- 로그인 - 세션으로 구현
- 음식점 등록
- 주문 시스템
- 주문 내역 조회
- bootstrap으로 간단한 프론트엔드 구현
- API 문서화
- 테스트 코드
- Should Have : 혹시라도 여력이 된다면 여기까지도 한번 해보자.
- 페이징 구현
- 찜 목록 조회
- 장바구니
- 리뷰 작성
- 소셜 로그인 구현
- AWS 배포
- 가게 검색 ( 거리순 정렬)
- Could Have : 여기까지 할 수 있다면 정말 좋겠지만, 못해도 괜찮다.
- 지도 api 활용 주변 음식점 목록 표시
- google place api, geocoding api
- 오늘의 할인 제품
- 할인쿠폰 발급
- CI&CD
- Won't Have : 이건 이번 프로젝트에 할 수 있는게 아니니 괜히 미련 갖지 말자.
- 로그인 토큰 재발급
- 큐를 이용한 사용자 트래픽 관리
기능 명세
API 설계
- 사용자
POST api/v1/users/login
: 로그인 API- 주문 시스템
- 주문 내역 조회
POST /orders
: 주문 생성 API GET /orders/{order_id}
: 주문 조회 APIPATCH /orders/{order_id}
: 주문 수정 API- 음식점 관리
GET /stores
: 음식점 목록 조회 APIPOST /stores
: 음식점 등록 APIGET /stores/{storeId}
: 음식점 조회 API- 이미지 파일 업로드
POST api/v1/images
음식 이미지 업로드 API - 메뉴 관리
POST /stores/{storeId}/foods
: 단일메뉴 등록 API A가게 음식(2차구현)
PATCH /stores/{storeId}
: 음식점 정보 수정 API GET /stores/{storeId}/foods/{foodId}
: 단일메뉴 조회 API
리팩토링 백로그
리팩토링 백로그가게 조회
음식 조회
회의록
1일차 회의
1일차 회의(2021-10-19)
개발 환경
Language : Java 11
빌드 도구 : Gradle
DB : mysql
서버 : aws
이슈 관리 : 깃허브 issue, 칸반보
기능 목록
- 우선 구현 기능
- 로그인 - 세션으로 구현
- 회원 관리
- 주문 시스템
- 주문 내역 조회
- 주문 상세 조회
- 찜 목록 조회
- 리뷰 작성
- 음식점 등록
- 검색
- 가게 검색
- 거리 순 정렬
- ...
- bootstrap으로 간단한 프론트엔드 구현
- 추가로 구현하고 싶은 기능
- 오늘의 할인 제품
- 할인쿠폰 발급
- 큐를 이용한 사용자 트래픽 관리
- 지도 api 활용 주변 음식점 목록 표시
- google place api, geocoding api
- 로그인 토큰 재발급
태형님 설계 api(참고)
- TABLE : MEMBER
- (POST) 회원가입
- (POST) 로그인
- (GET) 회원 정보 조회
- (PATCH) 회원 정보 변경
- (PATCH) 회원 탈퇴
- 주문 관리 API TABLE : ORDER, ORDER_FOOD
- (GET) 주문 조회
- (GET) 내 모든 주문 조회
- (POST) 주문
- (PATCH) 주문 취소
- 상점 API TABLE : SHOP, FOOD
- (GET) 모든 상점 조회
- (GET) 상점의 모든 음식 조회
- (POST) 상점 등록
- (POST) 음식 등록
- (DELETE) 상점 삭제
- (DELETE) 음식 삭제
- (PUT) 음식 수정
- (PUT) 상점 수정
2일차 회의
2일차 회의(2021-10-21)
기능 정리 및 우선순위 정하기 (o)
목표.
기능 목록
태형님 설계 api(참고)
- TABLE : MEMBER
- (POST) 회원가입
- (POST) 로그인
- (GET) 회원 정보 조회
- (PATCH) 회원 정보 변경
- (PATCH) 회원 탈퇴
- 주문 관리 API TABLE : ORDER, ORDER_FOOD
- (GET) 주문 조회
- (GET) 내 모든 주문 조회
- (POST) 주문
- (PATCH) 주문 취소
- 상점 API TABLE : SHOP, FOOD
- (GET) 모든 상점 조회
- (GET) 상점의 모든 음식 조회
- (POST) 상점 등록
- (POST) 음식 등록
- (DELETE) 상점 삭제
- (DELETE) 음식 삭제
- (PUT) 음식 수정
- (PUT) 상점 수정
Entity 설계
MEMBER (1: n) ORDER (은서)
FOOD(1: n) SHOP (희정)
ORDER (1: n) ORDER_FOOD (n : 1) FOOD
생각해보기
- Must Have : 이번 프로젝트에서 반드시 여기까진 다해야한다.
- 로그인 - 세션으로 구현
- 음식점 등록
- 주문 시스템
- 주문 내역 조회
- 가게 검색 ( 거리순 정렬)
- bootstrap으로 간단한 프론트엔드 구현
- API 문서화
- 테스트 코드
- Should Have : 혹시라도 여력이 된다면 여기까지도 한번 해보자.
- 찜 목록 조회
- 회원 관리
- 리뷰 작성
- 소셜 로그인 구현
- AWS 배포
- Could Have : 여기까지 할 수 있다면 정말 좋겠지만, 못해도 괜찮다.
- 지도 api 활용 주변 음식점 목록 표시
- google place api, geocoding api
- 오늘의 할인 제품
- 할인쿠폰 발급
- CI&CD
- Won't Have : 이건 이번 프로젝트에 할 수 있는게 아니니 괜히 미련 갖지 말자.
- 로그인 토큰 재발급
- 큐를 이용한 사용자 트래픽 관리
Trello

JIRA

3일차 회의
3일차 회의(2021-10-22)
할일
레포 파기
Gradle 기본 환경 셋팅
YAML 설정(aws 배포 생각)
Entity 설계 확인
역할 분담
API 스펙 설계
기획
- Order Id 타입 (uuid or Long )
- 결제 방식 어디까지 구현할지. —> 주문 까지만, 주문자한테 balance를 두고 주문하면 가격만큼 차감하는 방식?,
- User에서 사장님, 사용자 구분- role을 두고 구분, 회원가입때 구분해서
- 화면에서 어디까지 구현할지?? 회원가입, 로그인, 가게 목록 페이지, 메뉴목록 페이지, 주문 페이지///(shouled) 주문 목록 조회 페이지
- enum 타입 사용 어떻게?? ENUM으로 상태머신??
- 처음에는 지도를 빼고 구현하고, 나중에 지도 넣을지 말지 구분하기
store, food
Stores
- Long id
- String name
- String telephone //가게 전화번호
- String description //가게 설명
- String Location
- Integer posX;
- Integer posY;
- boolean isDeleted //삭제 여부
- User user //대표자
Food
- Long id
- String name
- String description
- String price
- String image; ((메뉴 이미지?))
- Shop shop //가게
BaseTimeEntity
- createdAt
- updatedAt
User
package com.example.project.domain; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; @Entity @Table(name = "Users") @Getter @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "email", nullable = false) private String email; @Column(name = "name", nullable = false, length = 30) private String name; //주소 컬럼 //비밀번호 -> 해시값 변환 //닉네임 //balance값 설정 100만원(결제가 되는것을 보여주기 위한 예시값) //Role @Builder public User(String email, String name) { this.email = email; this.name = name; } }
Order
package com.example.project.domain; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; @Entity @Table(name = "Orders") @Getter @NoArgsConstructor public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "address", nullable = false) private String address; @Column(name = "order_status", nullable = false) private String orderStatus; //배달중, 배달완료, 주문완료 -> 상태머신 //enum 사용하고 db저장할때는 string으로 .name() @Column(name = "phone_number", nullable = false) private String phoneNumber; //01012345678 @Column(name = "total_amount", nullable = false) private Integer totalAmount; @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)-> 조사필요 @JoinColumn(name = "user_id", referencedColumnName = "id") private User customer; @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name = "store_id", referencedColumnName = "id") private Store store; }
4일차 회의
4일차 회의(2021-10-25)
월요일 1시
할일
태형: User,엔티티, 로그인 세션 구현, 로그인 페이지,
희정: STORE, FOOD → API 설계
은서: ORDER, ORDER_FOOD → API 설계
- 이슈 만들어서 커밋 하기
- 문서 페이지를 좀더 플랫화 해보기
- 멘토님이 프론트쪽을 좀 도와주실 예정
- 장바구니에 음식 목록을 추가할때 프론트에서 axios를 이용하는것 보다 백엔드 기능으로 구현해 보는 방법은?
- api postman 워크스페이스에서 관리
- git hook 써보기
오늘까지 코드리뷰 수정 후 머지 → 각자.
내일 회의 저녁
가게 등록
음식 등록
주문
7일차 회의
7일차 회의(2021-10-28)
스프린트 진행중
- 이슈 userServiceDetails 빈 이름 중복
해결 userDetailsService → userDetailsServiceImpl


- rest api 문서화작업 중 에러 발생
- Gradle에서 asciidoctor가 실행이 안됨
해결 : asciidoctor 버전 변경
plugins { id 'org.asciidoctor.jvm.convert' version '3.3.2' }
- index.html에서 연동이 안되는 문제
해결 : snippets 경로 설정 변경
// index.adoc :hardbreaks: ifndef::snippets[] :snippets: ./build/generated-snippets endif::[]
10일차 회의
5일차 회의
5일차 회의(2021-10-26)
[feat: prgrms-be-devcourse#1]
[feat: #1]
security 관련 참고하면 좋은 문서 : https://mangkyu.tistory.com/77
issue에서 project 설정을 따로 넣어줘야 project todo 목록에 뜹니다!!
브랜치 이름 규칙을
feature-1
→ feaure/1
로 변경합니다REST API 기능 구현,
테스트 , 문서화(Rest-docs, Postman), 프론트 → 금요일 밤 회의
희정
- 음식점 관리
GET /stores
: 음식점 목록 조회 APIPOST /stores
: 음식점 등록 APIGET /stores/{storeId}
: 음식점 조회 API은서
POST /stores/{storeId}/foods
: 단일메뉴 등록 API A가게 음식태형
GET /stores/{storeId}/foods
: 전체 메뉴 조회 API 이슈

음식점 등록 할때 warn이 뜹니다
.csrf().diabled() 필요

8일차 회의
8일차 회의(2021-10-29)
스프린트 리뷰 진행
11일차 회의
11일차 회의(2021-11-04)
user.findById() 함수 리턴할 때 엔티티 리턴됨! 리팩토링 필요
이슈: 포스트맨 쿠키값 설정
6일차 회의
6일차 회의(2021-10-27)
9일차 회의
9일차 회의(2021-11-01)
12일차 회의
12일차 회의(2021-11-05)
- 지금 배포중인 브랜치에서 기능 1개만 추가로 merge하기위해서 cherrypick 기능이 필요했음
- stage에 있는 파일들 stash하고나서 merge할 커밋을 cherrypick하면 됨!!! (매우 간단)
- controller에서 주소값 return할때 앞에 /가 있으면 주소 경로를 인식 못함
//안좋은 예시 return "/store/{storeId}/orders"; //좋은 예시 return "store/{storeId}/orders";
- ajax 주소에서 도메인 부분 제외해야 함(서버를 ec2에 올리면 안돌아가는 이슈 발생)
//안좋은 예시 url: "http://localhost:8080/api/v1/stores/"+[[${storeId}]]+"/foods", //좋은 예시 url: "/api/v1/stores/"+[[${storeId}]]+"/foods",
- Github Action & AWS Beanstalk 배포하기 - Github Action으로 빌드하기
- Flyway 로 Java 에서 DB schema, seed 관리하기
- 프론트 구조 다듬기
- 부트스트랩 없이 해보기
- jquery를 바닐라js로 해보기