Giter Club home page Giter Club logo

cafe-guide-book's Introduction

☕ Takeout Coffee Ordering Service

☕ 서버 구조도

☕ 프로젝트 주요 관심사 (진행중)

1. 단순 기능 구현에만 집중하지 않기

  • 단순히 기능을 빠르게 구현하는것보다 중요한 것은 사용 기술을 정확하게 이해하고 사용하는 것이라고 생각합니다.
  • 새로운 기술을 적용할 때 기술서적과 공식문서를 통해 해당 기술에 대한 깊이 있는 학습을 진행하여 이를 최대한 코드에 녹이기 위해 노력했습니다.

2. 테스트 코드 작성에 충실하기

  • 올바른 기능 구현과 예상한대로 코드가 동작하는지 검증하기 위해 새로운 기능을 구현할 때 마다 통합테스트 및 단위테스트를 구현하도록 하였습니다.
  • 새로운 개발자가 합류했을 경우 기능을 추가하거나 수정할 때 테스트 코드를 통해 문제가 없음을 보장하고 자신감을 줌으로써 빠르게 프로젝트에 적응할 수 있습니다.
  • 또한 테스트 코드는 작성된 코드에 대한 문서 자체의 역할을 하기도 합니다.

3. 문서화

  • 새로운 개발자가 중간에 프로젝트에 참여하더라도 Wiki와 같은 문서를 통해 프로젝트에 대해 쉽게 이해하고 적응할 수 있도록 하였습니다.
  • PR, Issues, Commit Template을 통해 협업하는 개발자간의 커뮤니케이션 미스에 대한 비용을 최소화 하기 위해 노력하였습니다.

4. 사소한 이슈라도 끝까지 파헤쳐서 원인 파악하기

  • 발생한 이슈가 사소한것일지라도 추후에 다시 문제가 생기지 않도록 예방해야 합니다.
  • 문제의 원인을 파악하기 위한 학습을 진행하였고 이를 기술블로그에 정리하였습니다.

5. 대용량 트래픽 환경에서도 안정적인 서비스 구현하기(진행중)

  • 프로젝트를 시작하게된 동기와 최종목표는 대용량 트래픽에도 견고하고 안정적인 서비스를 개발하는 것입니다.
  • nGrinder를 통한 부하테스트를 진행하면서 이를 지키기 위해 노력했습니다.

기술블로그

☕ Entity Relation Diagram

☕ 사용기술

  • Java 11
  • Spring Boot
  • JUnit5
  • Mockito
  • MySQL
  • MyBatis
  • Jenkins
  • nGrinder
  • Pinpoint
  • AWS

cafe-guide-book's People

Contributors

f-lab-michael avatar minseongkimdev avatar nicky-day avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

cafe-guide-book's Issues

유저가 좋아요 누른 카페 조회 기능

개요

  • 해당 PR은 #67 의 브랜치로부터 브랜치를 땄습니다.
  • #67 해당 이슈의 PR이 머지되면 리베이스 하도록 하겠습니다

작업사항

  • 1. 특정 유저가 누른 좋아요에 대한 정보를 가져오는 API 구현
  • 2. 본 기능을 검증하기 위한 단위 테스트 구현
  • 3. 본 기능을 검증하기 위한 통합 테스트 구현

어드민 신규 Cafe에 대한 승인 및 반려 기능

개요

AS-IS

  • 어드민이 신규 카페에 대한 승인 및 반려 기능이 없습니다.

TO-BE

  • 어드민이 신규 카페에 대한 승인 및 반려 기능을 구현합니다.
  • 카페의 등록 상태를 정의한 CafeRegistration 열거형 타입 (PENDING, DENY, APPROVAL) 를 MyBatis에서 다루기 위해 TypeHandler를 적용합니다

참고

작업사항

  • 1. CafeRegistration 열거형 타입에 대한 TypeHandler 적용
  • 2. 승인 및 반려에 대한 Service, Controller 메서드 구현
  • 3. 어드민인지 권한 체크 기능 구현
  • 3. 단위 테스트 추가
  • 4. 통합 테스트 추가

회원가입

개요

AS-IS

  • 서비스의 기본적인 기능인 회원가입 기능이 없습니다.

TO-BE

  • 회원가입 기능을 구현합니다.

진행상황

  • 1. MyBatis 연동 및 config 추가
  • 2. DTO, Controller, Service 추가
  • 3. Mapper 클래스 추가
  • 4. 통합테스트 및 단위테스트 추가

비밀번호 업데이트

개요

AS-IS

  • 비밀번호 업데이트 기능이 없어 해당 기능을 구현이 필요합니다.

TO-BE

  • 로그인 체크 AOP에 대한 PR이 Merge된 이후에 로그아웃 상태에서 비밀번호를 변경 했을 때 적절한 예외를 던지고 이를 검증하는 단위테스트와 통합테스트를 추가할 예정입니다.
  • RestDocs에 대한 PR이 머지된 이후에 문서 자동화 목록에 회원탈퇴 기능에 대한 명세를 추가할 예정입니다.

진행상황

  • 1. 비밀번호 변경 UserController 메소드 및 서비스 로직 구현
  • 2. 단위 테스트 작성
  • 3. 통합 테스트 작성
  • 4. (#53 AOP Merge후) 단위 테스트 및 통합테스트 보완
  • 5. (#62 RestDocs Merge후) RestDocs를 통한 문서화

참고

  • HTTP의 PATCH 메서드를 사용하여 구현하였습니다.
  • 공식문서에 다음과 같이 되어있습니다.
  • A PATCH request is considered a set of instructions on how to modify a resource.

  • PATCH는 리소스를 수정하는 방법에 대한 지침으로 간주된다.

  • (Userpassword만 변경되므로 PUT 대신 PATCH를 사용하였습니다.
  • 비밀번호 변경 성공시 상태코드 204를 리턴합니다.

카페에 달린 리뷰들을 확인할 수 있는 기능

개요

AS-IS

  • 카페에 달린 리뷰들을 확인할 수 있는 기능이 없습니다.

TO-BE

  • 카페에 달린 리뷰들을 확인할 수 있는 기능을 구현합니다.
  • 카페 리뷰 기능에 대한 코드가 필요하여 #27 의 브랜치로부터 새로운 브랜치를 생성하였습니다.
  • #27 에 대한 PR이 머지되면 리베이스 하도록 하겠습니다.

진행상황

  • 1. 카페에 달린 리뷰들 조회 Controller, Service 관련 코드 구현
  • 2. 해당 기능을 검증하기 위한 단위 테스트 추가
  • 3. 해당 기능을 검증하기 위한 통합 테스트 추가

API문서화 자동화를 위한 RestDocs 적용

개요

AS-IS

  • API에 대한 문서가 없어 다른 사람이 작성한 API에 대한 스펙을 알 수 없고 이를 알기 위한 추가적인 커뮤니케이션 비용이 발생합니다.
  • 일일이 API에 대한 명세를 작성할 수 있겠지만 이를 자동화하는 것이 좋아보입니다.

TO-BE

  • RestDocs를 활용하여 API 문서화를 자동화합니다.

진행상황

  • 1. Gradle에 RestDocs관련 라이브러리 추가
  • 2. UserController 통합 테스트에 RestDocs에 필요한 요청, 응답 정보 기술
  • 3. AsciiDocs을 통한 API문서 마크업

RestDocs 참고사항

  • 모든 테스트가 성공해야만 API 문서 파일이 생성됩니다.
  • ./gradlew build 을 통해 API 문서 파일을 생성할 수 있습니다.
  • AsciiDoc, RestDocs, 우아한형제들 기술블로그 추후 작업하는데 도움이 될만한 레퍼런스입니다.

문서화 양식

  • 크게 프로젝트의 개요와 REST API 명세부로 나눴습니다. (추후에 필요한 섹션은 추가될 수 있습니다.)
  • 우선 요청 성공에 대한 케이스만 명세하였습니다.
  • 요청 파라미터 or 필드, 요청 방법, 응답(성공시) 순으로 명세하였습니다.

스크린샷 2021-09-06 오후 9 34 59

스크린샷 2021-09-06 오후 9 35 17

스크린샷 2021-09-06 오후 9 38 43

카페 등록 시 카페 아이디 중복 체크 구현

개요

AS-IS

  • 카페 등록시 카페 아이디를 등록할 때 중복되어도 등록되는 문제가 있음

TO-BE

  • 카페 아이디를 DB에서 자동 생성하도록 수정

진행상황

  • 1. CafeDTO, Cafe에서 CafeId를 int 타입으로 변경
  • 2. mapper.xml에서 cafeId는 insert 시 입력 안하도록 변경

회원가입시 이메일 중복 체크

개요

AS-IS

  • 회원가입시 이메일 중복 검사를 실시하지 않습니다.

TO-BE

  • 회원가입 시 이메일 중복검사를 통해, 가입된 이메일이 없을시에만 회원가입이 가능합니다.
  • 중복된 이메일이 있을시 422 status code를 리턴하도록 하였습니다.

진행상황

  • 1. 이메일 중복체크 Service, Controller 로직 추가
  • 2. 이메일 중복시 422 Unprocessable Entity 리턴 및 DuplicatedEmailException throw
  • 3. 단위테스트 및 통합테스트 작성

카페정보 삭제하기

개요

AS-IS

  • 카페 주인이 개별 카페를 삭제하는 기능이 없습니다.

TO-BE

  • 카페 주인이 개별 카페를 삭제할 수 있는 기능을 추가합니다.

진행상황

  • 1. 카페 주인이 개별 카페를 삭제할 수 있는 기능 로직 작성하기
  • 2. 테스트 코드 작성하기

회원정보 조회

개요

AS-IS

  • 서비스의 기본적인 기능인 회원정보 조회 기능이 없습니다.

TO-BE

  • 회원정보 조회 기능을을 구현합니다.

진행상황

  • 1. Service, Controller, Mapper 구현
  • 2. 조회한 정보가 없을시 404 리턴 및 UserNotFoundException throw

로그인 기능에 AOP 적용

개요

AS-IS

  • 로그인이 꼭 필요한 기능에 로그인 여부를 체크하는 코드들이 중복되어 나타나는 문제가 있습니다.

TO-BE

  • AOP를 통해 로그인 여부를 체크하는 로직을 Aspect로 모듈화 합니다.

진행상황

  • 1. 프로젝트에 spring-boot-starter-aop 라이브러리 추가
  • 2. 로그인 체크 로직이 담긴 Aspect 정의
  • 3. 로그아웃과 회원정보 (로그인이 꼭 필요한 기능)에 로그인 체크 부가기능 적용
  • 4. 통합테스트 작성

TypeHandler를 통해 Enum 타입 처리(MenuGroup, MenuStatus, OptionStatus, CafeCondition, CafeRegistration)

개요

AS-IS

  • mybatis에서 enum 타입 데이터를 바인딩하지 못하는 문제가 있습니다.

TO-BE

  • MyBatis 환경에서 Enum, Int 상호 변환을 자동으로 핸들링 해주는 TypeHandler를 적용합니다. 따라서 DB에 데이터를 저장하고 관리할 때 코드성 데이터로 관리할 수 있게 됩니다.

진행상황

  • 1. Enum 타입 수정
  • 2. TypeHandler 구현 및 SqlSessionFactory에 추가
  • 3. 테스트 코드 수정 후 적용되는 지 확인

카페 메뉴 삭제하기

개요

AS-IS

  • 카페 주인이 자신이 등록한 메뉴와 옵션을 삭제할 수 없음

TO-BE

  • 카페 주인이 자신이 등록한 메뉴와 옵션을 삭제할 수 있어야 함

진행상황

  • 1. Controller, Service, Mapper 작성하기
  • 2. 테스트 코드 작성하기

회원 권한 분리 (일반, 카페주인, 어드민)

개요

AS-IS

  • 회원에 대한 권한이 분리되어 있지 않습니다.
  • USER : 일반사용자

  • OWNER : 카페사장

  • ADMIN : 어드민

  • MyBatis 환경에서 Enum 타입을 Int 타입으로 변환해서 insert 하는 작업에 대해 핸들링 되지 않고 있습니다.

TO-BE

  • 회원의 권한을 분리하여 앞으로 구현할 기능에 대비합니다.
  • MyBatis 환경에서 Enum, Int 상호 변환을 자동으로 핸들링 해주는 TypeHandler를 도입합니다.

진행상황

  • 1. 회원 권한별 Enum 타입 선언
  • 2.UserType 전용 TypeHandler 구현 및 SqlSessionFactory에 추가
  • 3. 회원가입 비지니스 로직에 권한 분리 적용

CD 환경 구축

개요

AS-IS

  • CI/CD 환경 구축이 필요함

TO-BE

  • jenkins 서버에서 publish over ssh를 사용해 타겟 EC2 서버에 배포

진행상황

  • 1. 타겟 EC2에 java 설치 및 시작 스크립트 파일 작성
  • 2. gradle에서 jar로 배포하도록 설정(build.gradle 파일 수정)
  • 3. Github + jenkins + Docker로 빌드/배포 자동화

Pull requests, Issues 템플릿 규칙 생성

문제 정의

  • 팀원간 Pull requests와 Issues의 작성 스타일이 달라 이들이 파편화 되는 문제가 있습니다.

해결 방안

  • Discription을 작성하는데 비용을 줄이고 가독성 측면과 커뮤니케이션을 더 원할하게 하기 위해 해당 이슈를 추가하게 되었습니다.

카페 오픈, 마감 기능

개요

AS-IS

  • 카페 오픈 시간과 마감 시간이 되면 카페를 열고 닫을 수 있는 기능이 존재하지 않습니다.

TO-BE

  • 카페 주인이 카페 오픈과 마감을 할 수 있도록 기능을 구현합니다.

진행상황

  • 1. 비즈니스 로직 작성
  • 2. 테스트 코드 작성(통합 테스트 검증에 필요한 cafeId가 auto_increment 칼럼이므로 단위 테스트 코드로 대체합니다.)

유저가 자신이 맘에 드는 카페에 추가하기 기능 (좋아요)

개요

AS-IS

  • 유저가 맘에 드는 카페를 추가하는 기능이 없습니다.

TO-BE

  • 유저가 맘에 드는 카페를 추가하는 기능을 구현합니다.
  • Heart(좋아요) 테이블에 유저의 PK와, 카페의 PK를 추가합니다

진행상황

  • 1. 단위테스트 추가
  • 2. 통합테스트 추가

Firebase 푸쉬 알람 서비스 구현

개요

AS-IS

  • 모바일 클라이언트에 상황에 맞는 푸쉬 알람을 보내야 합니다.

TO-BE

  • @async를 통해 해당 비지니스 로직과 별개로 비동기적으로 푸시를 전송할 수 있습니다.

진행상황

  • 1. 단위테스트 작성
  • 2. 통합테스트 작성

카페 등록하기 수정

  1. google indented 2칸 수정
  2. CafeDTO 클래스 id가 아닌 email로 로그인되게 수정
  3. Cafe 클래스 불필요한 non null 제거

카페정보 수정하기 및 조회하기

개요

AS-IS

  • 카페 정보를 조회하거나 수정하는 기능이 현재 존재하지 않습니다.

TO-BE

  • 사장님의 전체 카페를 조회하는 기능을 추가합니다.
  • 사장님의 개별 카페를 조회하는 기능을 추가합니다.
  • 사장님의 개별 카페를 수정하는 기능을 추가합니다.

진행상황

  • 1. 사장님의 개별 카페 조회하기
  • 2. 사장님의 전체 카페 조회하기
  • 3. 사장님의 개별 카페 수정하기
  • 4. 테스트 코드 작성

카페 메뉴 등록 기능

개요

AS-IS

  • 카페에서 판매하는 메뉴를 구입하거나, 주문하거나, 찜 리스트에 추가할 수 없다.

TO-BE

  • 카페에서 판매하는 메뉴를 등록하는 기능을 추가한다.

진행상황

  • 1. MenuDTO 작성, OptionDTO 작성
  • 2. Controller, Service, Mapper 코드 작성
  • 3. 테스트 코드 작성

로그아웃

개요

AS-IS

  • 서비스의 기본적인 기능인 로그아웃 기능이 없습니다.

TO-BE

  • 로그아웃 기능을 구현합니다.

진행상황

  • 1. Controller 로직 추가
  • 2. Service 로직 추가
  • 3. 통합테스트 및 단위테스트 추가

회원가입 시 Validation 설정

개요

AS-IS

  • 회원가입시 각 필드에 대한 Validation 이 적용되어 있지 않습니다.

TO-BE

  • 컨트롤러에 @Valid 어노테이션을 통해 회원가입시 각 필드에 대한 Validation 을 적용합니다.

진행상황

  • 1. UserDTO의 각 필드에 제약 조건 정의
  • 2. UserController 회원가입 메서드의 파라미터의 UserDTO에 @Valid 선언

유저가 작성한 리뷰들을 조회할 수 있는 기능

Fixes #27

개요

AS-IS

  • 유저가 작성한 리뷰들을 조회할 수 있는 기능이 없습니다.

TO-BE

  • 유저가 작성한 리뷰들을 조회할 수 있는 기능을 구현합니다.

참고

  • 해당 PR은 #24 의 브랜치로부터 브랜치를 땄기 때문에 해당 이슈의 PR이 머지되면 리베이스 하도록 하겠습니다

작업사항

  • 1. ReviewController에 컨트롤러 메서드 구현
  • 2. ReviewService에 서비스 로직 구현
  • 3. 단위 테스트 추가
  • 4. 통합 테스트 추가

카페 리뷰 등록

Fixes #24

개요

AS-IS

  • 유저가 카페에 대한 리뷰를 남길 수 있는 기능이 없습니다.

TO-BE

  • 유저가 카페에 대한 리뷰를 남길 수 있는 기능을 구현합니다.

참고

  • 해당 PR은 #67 의 브랜치로부터 브랜치를 땄기 때문에 해당 이슈의 PR이 머지되면 리베이스 하도록 하겠습니다

작업사항

  • 1. ReviewController에 컨트롤러 메서드 구현
  • 2. ReviewService에 서비스 로직 구현
  • 3. 단위 테스트 추가
  • 4. 통합 테스트 추가

카페 메뉴 수정하기 기능

개요

AS-IS

  • 카페 주인이 자신이 등록한 메뉴와 옵션을 수정할 수 없음

TO-BE

  • 카페 주인이 자신이 등록한 메뉴와 옵션을 수정할 수 있어야 함

진행상황

  • 1. Controller, Service, Mapper 코드 작성
  • 2. 테스트 코드 작성

Connection Pool 연동하기

  1. HikariCP

application-local.properties

spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/cafeguidebook?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.hikari.username=root
spring.datasource.hikari.password=Cafe1234!
spring.datasource.hikari.pool-name=HikariPool

로그인

개요

AS-IS

  • 서비스의 기본적인 기능인 로그인 기능이 없습니다.

TO-BE

  • 로그인 기능을 구현합니다.

진행상황

  • 1. 로그인을 위한 세션 키를 보관하는 유틸 클래스 생성
  • 2. 잘못된 회원정보 입력했을 경우를 위한 UserNotFoundException 예외 생성
  • 3. 로그인 관련 서비스 및 컨트롤러 추가
  • 4. 통합테스트 및 단위테스트 추가

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.