HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
[팀]조규현 공간(1-2)
[팀]조규현 공간(1-2)
/
🛵
뀨의 민족
🛵

뀨의 민족

✋🏻 Github Project 규칙Planning and Analysis프로젝트 계획리팩토링 백로그가게 조회 음식 조회 회의록
 

👩🏻‍🦳 스크럼 마스터의 한마디

✋
- wiki 쓰지말고 notion에서 다 관리하기 - git project 관리 순서 - pull request 남기면 Done으로 이동 - 바꿔야될 부분이 있어서 리뷰 남기면 남긴 사람이 해당 issue를 Todo로 이동 + issue에도 확인 댓글 남기기 (이미지 참고) - 담당자가 댓글 확인 후 수정 시작하면 InProgress로 이동
issue에도 확인 댓글 남기기 (이미지 참고)
나쁜 예시
notion image
notion image
좋은 예시
notion image
notion image
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
0.8KB
prepare-commit-msg 파일을 .git/hooks 폴더에 저장한다.
txt 빼야 한다!!!!!!!!!!!!!!!!!!!!!!!!!!
예시
barnch :
  • feature/123
commit message :
  • fix: 게시물 등록 api → [fix: #123] 게시물 등록 api
  • 게시물 등록 api → [#123] 게시물 등록 api
캡처
notion image
notion image
git hooks update
Git hook 을 관리 하기 위해 husky 를 도입하다.
Husky 깃헙 블로그
예시
barnch: feature/123
commit message :
  • fix: 게시물 등록 api → [fix: #123] 게시물 등록 api
  • 게시물 등록 api → [#123] 게시물 등록 api

husky 적용

node 가 설치되어 있어야 합니다.
npm install

Git Convention

notion image
 
 
 

프로젝트 계획

  • 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} : 주문 조회 API
PATCH /orders/{order_id} : 주문 수정 API
 
  • 음식점 관리
GET /stores : 음식점 목록 조회 API
POST /stores : 음식점 등록 API
GET /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
 

요구사항 분석

ERD
notion image

리팩토링 백로그

🧸
리팩토링 백로그
 

 

가게 조회

view
Features · Bootstrap v5.1
Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words. Call to action Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.
Features · Bootstrap v5.1
https://getbootstrap.com/docs/5.1/examples/features/
notion image
 

음식 조회

view
Carousel Template · Bootstrap v5.1
And yes, this is the last block of representative placeholder content. Again, not really intended to be actually read, simply here to give you a better view of what this would look like with some actual content. Your content.
Carousel Template · Bootstrap v5.1
https://getbootstrap.com/docs/5.1/examples/carousel/
notion image
notion image

회의록

 

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

notion image
 

JIRA

 
notion image

3일차 회의

3일차 회의(2021-10-22)

할일

레포 파기
Gradle 기본 환경 셋팅
YAML 설정(aws 배포 생각)
Entity 설계 확인
역할 분담
API 스펙 설계
https://velog.io/@city7310/백엔드가-이정도는-해줘야-함-6.-API-스펙-설계와-문서화-방식-결정-1
 
기획
  1. Order Id 타입 (uuid or Long )
  1. 결제 방식 어디까지 구현할지. —> 주문 까지만, 주문자한테 balance를 두고 주문하면 가격만큼 차감하는 방식?,
  1. User에서 사장님, 사용자 구분- role을 두고 구분, 회원가입때 구분해서
  1. 화면에서 어디까지 구현할지?? 회원가입, 로그인, 가게 목록 페이지, 메뉴목록 페이지, 주문 페이지///(shouled) 주문 목록 조회 페이지
  1. enum 타입 사용 어떻게?? ENUM으로 상태머신??
  1. 처음에는 지도를 빼고 구현하고, 나중에 지도 넣을지 말지 구분하기
 
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
 
Order
java - Order 오브젝트에 Spring 상태 머신을 사용하는 방법
프로젝트에 Spring State Machine을 사용하려고합니다. 여러 상태의 객체가 Order 있기 때문입니다. 그 객체는 다음과 같이 구현 될 수 있습니다 public class Order { private String id; private Customer customer; private OrderState state; // Some other fields with getter and setter } OrderService를 소개하고 DB에서 주문을 받고 OrderState를 포함한 일부 정보를 설정 한 다음 DB에 저장했습니다.
java - Order 오브젝트에 Spring 상태 머신을 사용하는 방법
https://pythonq.com/so/java/1541540

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
notion image
notion image
 
 
  • rest api 문서화작업 중 에러 발생
  1. Gradle에서 asciidoctor가 실행이 안됨
    1. 해결 : asciidoctor 버전 변경
       
  1. index.html에서 연동이 안되는 문제
    1. 해결 : snippets 경로 설정 변경
       
       

10일차 회의

10일차 회의(2021-11-03)
notion image
이슈
타임리프 이미지 가져오기
[springboot2] thymeleaf 사용할 때 주의할 점
springboot2-thymeleaf 사용 예제를 다룬 코드를 참고한다. https://www.mkyong.com/spring-boot/spring-boot-hello-world-example-thymeleaf/ 실수하기 좋은 부분은 다음과 같다. 1. html 파일에 다음을 추가해야 한다. velocity에서 아래와 같이 사용했다면.. 아래와 같이 th:text를 사용한다. 3, velocity에서 아래와 같이 사용했다면.. 아래와 같이 th:style과 콜럼을 잘 사용해야 한다. 실수하기 가장 쉬운 곳이 아래 빨간색 색칠한 부분이다.
[springboot2] thymeleaf 사용할 때 주의할 점
https://knight76.tistory.com/entry/springboo2-thymeleaf-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90
[springboot2] thymeleaf 사용할 때 주의할 점
 

5일차 회의

5일차 회의(2021-10-26)
commit 메시지 프리픽스를 [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 : 음식점 목록 조회 API
POST /stores : 음식점 등록 API
GET /stores/{storeId} : 음식점 조회 API
 
은서
POST /stores/{storeId}/foods : 단일메뉴 등록 API A가게 음식
 
태형
GET /stores/{storeId}/foods : 전체 메뉴 조회 API
 
이슈
notion image
음식점 등록 할때 warn이 뜹니다
 
.csrf().diabled()  필요
notion image
 

8일차 회의

8일차 회의(2021-10-29)
스프린트 리뷰 진행

11일차 회의

11일차 회의(2021-11-04)
user.findById() 함수 리턴할 때 엔티티 리턴됨! 리팩토링 필요
이슈: 포스트맨 쿠키값 설정
Postman에서 Cookie 설정하기 (with Session-Id)
Postman 을 이용하여 request를 보낼 때 FastCampus WPS 수업 에서는 token을 이용하여 사용자를 인증하는 방법을 배웠는데, 우리 회사에서는 token이 아닌 session id 를 이용하여 사용자를 인증한다. (아놔! ㅡㅡ;) 그래서 Postman 에서 session id 를 설정하는 것을 포스팅하고자 한다. 사실 Postman 공식문서에 설명이 되어 있기는 한데 쿠키(cookie)가 무엇인지 잘 모르는 상태에서는 이해가 쉽지 않고, 미래의 나를 위해 이 글을 작성하는 한다.
https://djshin2000.github.io/setting-cookies-in-postman/
Postman에서 Cookie 설정하기 (with Session-Id)

6일차 회의

6일차 회의(2021-10-27)
3일 스프린트 시작!
1차 스프린트
 

9일차 회의

9일차 회의(2021-11-01)
1차 스프린트 리뷰&회고
코드리뷰
 

12일차 회의

12일차 회의(2021-11-05)
  • 지금 배포중인 브랜치에서 기능 1개만 추가로 merge하기위해서 cherrypick 기능이 필요했음
    • stage에 있는 파일들 stash하고나서 merge할 커밋을 cherrypick하면 됨!!! (매우 간단)
  • controller에서 주소값 return할때 앞에 /가 있으면 주소 경로를 인식 못함
 
  • ajax 주소에서 도메인 부분 제외해야 함(서버를 ec2에 올리면 안돌아가는 이슈 발생)
 
  • Github Action & AWS Beanstalk 배포하기 - Github Action으로 빌드하기
https://jojoldu.tistory.com/543
  • Flyway 로 Java 에서 DB schema, seed 관리하기
https://blog.gangnamunni.com/post/introducing-flyway/
https://sabarada.tistory.com/193
  • 프론트 구조 다듬기
    • 부트스트랩 없이 해보기
    • jquery를 바닐라js로 해보기
// 예시 커밋 타이틀 [feat: #1] Person 나이 30으로 제한 // 주의해주세요! [feat: #1] 제한 Person 나이 30 (X) [feat: #1] Person 나이 30 (X) [feat: #1] Person 나이 30 으로 (X) [feat: #1] Person 나이 30으로 제한 하다. (X)
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; } }
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; }
plugins { id 'org.asciidoctor.jvm.convert' version '3.3.2' }
// index.adoc :hardbreaks: ifndef::snippets[] :snippets: ./build/generated-snippets endif::[]
//안좋은 예시 return "/store/{storeId}/orders"; //좋은 예시 return "store/{storeId}/orders";
//안좋은 예시 url: "http://localhost:8080/api/v1/stores/"+[[${storeId}]]+"/foods", //좋은 예시 url: "/api/v1/stores/"+[[${storeId}]]+"/foods",