Skip to content

Commit

Permalink
[Team-25][BE][Jay] 예약 가능한 숙소 조회 및 위시 리스트 추가/삭제 API PR (#270)
Browse files Browse the repository at this point in the history
* Update issue templates

* Update issue templates

* Update issue templates

* Update issue templates

* Initial commit

* build: Github action 백엔 개발 CI 에 working-directory 추가

* build: Github action 백엔드 운영 CI/CD 에 working-directory 추가

* feat: 전역 예외 클래스 추가

비즈니스 예외 클래스들이 HttpMethod 를 반환하도록 하여,
각 예외에 맞는 HTTP 상태코드를 반환할 수 있도록 함

* feat: 전역 예외 로직 추가

프로젝트 전역에서 발생하는 예외를 처리하는 로직 추가
- 비즈니스 예외 발생시에는 예외 클래스에 있는 HTTP 상태코드 반환
- 나머지 분류되지 않은 예외는 INTERNAL_SERVER_ERROR 로 반환

* feat: DB 연결 설정 추가

* feat: airbnb 테이블 정의(DDL) 추가

* feat: airbnb Entity 추가

* feat: 숙소(Accommodation) 에 가격 추가

* feat: 위시리스트(Wish) 에서 wished 속성 제거

- 위시 리스트 추가 여부는, 레코드가 있는지 여부로 판단
- Wish 엔티티는 숙소와 회원의 id 만 참조하도록 변경

* feat: 숙소제공항목(Provides) null 가능 항목 Wrapper 클래스로 변경

* style: 예약(Reservation) 테이블에 NOT NULL 항목 위로 이동

* feat: 각 도메인 필수항목 NOT NULL 설정

* fix: 불필요한 항목 제거

- 미완성된 FeesPolicy 커밋된 내역 제거

* fix: MySQL 주석으로 변경

* refactor: Accommodation 관련 도메인 클래스들 domain 패키지로 이동

* build: mysql, h2 의존성 참조 시점 수정

- mysql : 런타임에만 참조
- h2 : 테스트 런타임에만 참조

* build: queryDSL 의존성 및 설정 추가

- test/resources/application.properties : 테스트 환경 분리를 위해 추가
- QueryDslConfig : JPAQueryFactory 빈 등록

* refactor: QueryDSL 구현 편의를 위해, Money 타입 제거

* refactor: Accommodation 통계 쿼리 Repository 및 테스트 코드 추가

* git: QueryDLS QClass 경로 gitignore 추가

* refactor: Accommodation 의 Repository 관련 클래스들 repository 패키지로 이동

* refactor: AccommodationRepositoryCustom 테스트 클래스 이름 변경

* feat: 숙소 가격 통계가 입력값으로 주어진 단위대로 출력되도록 변경

* refactor: 숙소 가격 통계 쿼리 리펙토링

* feat: 숙소 가격 통계 서비스 추가

- AccommodationStatisticsService : 통계 서비스 제공, 가격 통계는 하루단위 캐싱
- AmountUnitPolicy : 얼마 단위로 가격 통계를 낼것인지의 기준

* refactor: AccommodationRepositoryCustom 을 더 명확한 이름인 AccommodationQueryRepository 로 변경

- 아직은 Interface 가 필요하지 않아 제거하였음

* feat: 숙소 가격 통계 API 추가

* feat: 숙소 가격 통계 API 추가

- API 문서 추가
- github action API 문서화 확인 단계 추가

* build: Github action API 문서 빌드 확인 step 추가

* 1차 배포 PR (#19)

* Initial commit

* build: Github action 백엔 개발 CI 에 working-directory 추가

* build: Github action 백엔드 운영 CI/CD 에 working-directory 추가

* feat: 전역 예외 클래스 추가

비즈니스 예외 클래스들이 HttpMethod 를 반환하도록 하여,
각 예외에 맞는 HTTP 상태코드를 반환할 수 있도록 함

* feat: 전역 예외 로직 추가

프로젝트 전역에서 발생하는 예외를 처리하는 로직 추가
- 비즈니스 예외 발생시에는 예외 클래스에 있는 HTTP 상태코드 반환
- 나머지 분류되지 않은 예외는 INTERNAL_SERVER_ERROR 로 반환

* feat: DB 연결 설정 추가

* feat: airbnb 테이블 정의(DDL) 추가

* feat: airbnb Entity 추가

* feat: 숙소(Accommodation) 에 가격 추가

* feat: 위시리스트(Wish) 에서 wished 속성 제거

- 위시 리스트 추가 여부는, 레코드가 있는지 여부로 판단
- Wish 엔티티는 숙소와 회원의 id 만 참조하도록 변경

* feat: 숙소제공항목(Provides) null 가능 항목 Wrapper 클래스로 변경

* style: 예약(Reservation) 테이블에 NOT NULL 항목 위로 이동

* feat: 각 도메인 필수항목 NOT NULL 설정

* fix: 불필요한 항목 제거

- 미완성된 FeesPolicy 커밋된 내역 제거

* fix: MySQL 주석으로 변경

* refactor: Accommodation 관련 도메인 클래스들 domain 패키지로 이동

* build: mysql, h2 의존성 참조 시점 수정

- mysql : 런타임에만 참조
- h2 : 테스트 런타임에만 참조

* build: queryDSL 의존성 및 설정 추가

- test/resources/application.properties : 테스트 환경 분리를 위해 추가
- QueryDslConfig : JPAQueryFactory 빈 등록

* refactor: QueryDSL 구현 편의를 위해, Money 타입 제거

* refactor: Accommodation 통계 쿼리 Repository 및 테스트 코드 추가

* git: QueryDLS QClass 경로 gitignore 추가

* refactor: Accommodation 의 Repository 관련 클래스들 repository 패키지로 이동

* refactor: AccommodationRepositoryCustom 테스트 클래스 이름 변경

* feat: 숙소 가격 통계가 입력값으로 주어진 단위대로 출력되도록 변경

* refactor: 숙소 가격 통계 쿼리 리펙토링

* feat: 숙소 가격 통계 서비스 추가

- AccommodationStatisticsService : 통계 서비스 제공, 가격 통계는 하루단위 캐싱
- AmountUnitPolicy : 얼마 단위로 가격 통계를 낼것인지의 기준

* refactor: AccommodationRepositoryCustom 을 더 명확한 이름인 AccommodationQueryRepository 로 변경

- 아직은 Interface 가 필요하지 않아 제거하였음

* feat: 숙소 가격 통계 API 추가

* feat: 숙소 가격 통계 API 추가

- API 문서 추가
- github action API 문서화 확인 단계 추가

* build: Github action API 문서 빌드 확인 step 추가

* fix: Github action API 문서 빌드 확인 step 타겟 디렉토리 수정

* fix: Github action API 문서 빌드 확인 step 타겟 디렉토리 수정

* fix: Github action API 문서 재빌드 스텝 수정

* fix: Github action API 문서 재빌드 스텝 수정

* build: 암호화 테스트 코드 활성화

* build: 운영 배포 환경 설정 추가

- application-prod.properties : 민감정보 암호화 하여 운영서버 설정 추가
- Dockerfile : prod 프로파일로 실행되도록 변경
- deploy.sh : docker 실행 로그 남기도록 변경

* 1차 배포 수정 (#20)

* Initial commit

* build: Github action 백엔 개발 CI 에 working-directory 추가

* build: Github action 백엔드 운영 CI/CD 에 working-directory 추가

* feat: 전역 예외 클래스 추가

비즈니스 예외 클래스들이 HttpMethod 를 반환하도록 하여,
각 예외에 맞는 HTTP 상태코드를 반환할 수 있도록 함

* feat: 전역 예외 로직 추가

프로젝트 전역에서 발생하는 예외를 처리하는 로직 추가
- 비즈니스 예외 발생시에는 예외 클래스에 있는 HTTP 상태코드 반환
- 나머지 분류되지 않은 예외는 INTERNAL_SERVER_ERROR 로 반환

* feat: DB 연결 설정 추가

* feat: airbnb 테이블 정의(DDL) 추가

* feat: airbnb Entity 추가

* feat: 숙소(Accommodation) 에 가격 추가

* feat: 위시리스트(Wish) 에서 wished 속성 제거

- 위시 리스트 추가 여부는, 레코드가 있는지 여부로 판단
- Wish 엔티티는 숙소와 회원의 id 만 참조하도록 변경

* feat: 숙소제공항목(Provides) null 가능 항목 Wrapper 클래스로 변경

* style: 예약(Reservation) 테이블에 NOT NULL 항목 위로 이동

* feat: 각 도메인 필수항목 NOT NULL 설정

* fix: 불필요한 항목 제거

- 미완성된 FeesPolicy 커밋된 내역 제거

* fix: MySQL 주석으로 변경

* refactor: Accommodation 관련 도메인 클래스들 domain 패키지로 이동

* build: mysql, h2 의존성 참조 시점 수정

- mysql : 런타임에만 참조
- h2 : 테스트 런타임에만 참조

* build: queryDSL 의존성 및 설정 추가

- test/resources/application.properties : 테스트 환경 분리를 위해 추가
- QueryDslConfig : JPAQueryFactory 빈 등록

* refactor: QueryDSL 구현 편의를 위해, Money 타입 제거

* refactor: Accommodation 통계 쿼리 Repository 및 테스트 코드 추가

* git: QueryDLS QClass 경로 gitignore 추가

* refactor: Accommodation 의 Repository 관련 클래스들 repository 패키지로 이동

* refactor: AccommodationRepositoryCustom 테스트 클래스 이름 변경

* feat: 숙소 가격 통계가 입력값으로 주어진 단위대로 출력되도록 변경

* refactor: 숙소 가격 통계 쿼리 리펙토링

* feat: 숙소 가격 통계 서비스 추가

- AccommodationStatisticsService : 통계 서비스 제공, 가격 통계는 하루단위 캐싱
- AmountUnitPolicy : 얼마 단위로 가격 통계를 낼것인지의 기준

* refactor: AccommodationRepositoryCustom 을 더 명확한 이름인 AccommodationQueryRepository 로 변경

- 아직은 Interface 가 필요하지 않아 제거하였음

* feat: 숙소 가격 통계 API 추가

* feat: 숙소 가격 통계 API 추가

- API 문서 추가
- github action API 문서화 확인 단계 추가

* build: Github action API 문서 빌드 확인 step 추가

* fix: Github action API 문서 빌드 확인 step 타겟 디렉토리 수정

* fix: Github action API 문서 재빌드 스텝 수정

* build: 암호화 테스트 코드 활성화

* build: 운영 배포 환경 설정 추가

- application-prod.properties : 민감정보 암호화 하여 운영서버 설정 추가
- Dockerfile : prod 프로파일로 실행되도록 변경
- deploy.sh : docker 실행 로그 남기도록 변경

* fix: 운영 DB URL 수정

* 1차 배포 재수정 (#21)

* Initial commit

* build: Github action 백엔 개발 CI 에 working-directory 추가

* build: Github action 백엔드 운영 CI/CD 에 working-directory 추가

* feat: 전역 예외 클래스 추가

비즈니스 예외 클래스들이 HttpMethod 를 반환하도록 하여,
각 예외에 맞는 HTTP 상태코드를 반환할 수 있도록 함

* feat: 전역 예외 로직 추가

프로젝트 전역에서 발생하는 예외를 처리하는 로직 추가
- 비즈니스 예외 발생시에는 예외 클래스에 있는 HTTP 상태코드 반환
- 나머지 분류되지 않은 예외는 INTERNAL_SERVER_ERROR 로 반환

* feat: DB 연결 설정 추가

* feat: airbnb 테이블 정의(DDL) 추가

* feat: airbnb Entity 추가

* feat: 숙소(Accommodation) 에 가격 추가

* feat: 위시리스트(Wish) 에서 wished 속성 제거

- 위시 리스트 추가 여부는, 레코드가 있는지 여부로 판단
- Wish 엔티티는 숙소와 회원의 id 만 참조하도록 변경

* feat: 숙소제공항목(Provides) null 가능 항목 Wrapper 클래스로 변경

* style: 예약(Reservation) 테이블에 NOT NULL 항목 위로 이동

* feat: 각 도메인 필수항목 NOT NULL 설정

* fix: 불필요한 항목 제거

- 미완성된 FeesPolicy 커밋된 내역 제거

* fix: MySQL 주석으로 변경

* refactor: Accommodation 관련 도메인 클래스들 domain 패키지로 이동

* build: mysql, h2 의존성 참조 시점 수정

- mysql : 런타임에만 참조
- h2 : 테스트 런타임에만 참조

* build: queryDSL 의존성 및 설정 추가

- test/resources/application.properties : 테스트 환경 분리를 위해 추가
- QueryDslConfig : JPAQueryFactory 빈 등록

* refactor: QueryDSL 구현 편의를 위해, Money 타입 제거

* refactor: Accommodation 통계 쿼리 Repository 및 테스트 코드 추가

* git: QueryDLS QClass 경로 gitignore 추가

* refactor: Accommodation 의 Repository 관련 클래스들 repository 패키지로 이동

* refactor: AccommodationRepositoryCustom 테스트 클래스 이름 변경

* feat: 숙소 가격 통계가 입력값으로 주어진 단위대로 출력되도록 변경

* refactor: 숙소 가격 통계 쿼리 리펙토링

* feat: 숙소 가격 통계 서비스 추가

- AccommodationStatisticsService : 통계 서비스 제공, 가격 통계는 하루단위 캐싱
- AmountUnitPolicy : 얼마 단위로 가격 통계를 낼것인지의 기준

* refactor: AccommodationRepositoryCustom 을 더 명확한 이름인 AccommodationQueryRepository 로 변경

- 아직은 Interface 가 필요하지 않아 제거하였음

* feat: 숙소 가격 통계 API 추가

* feat: 숙소 가격 통계 API 추가

- API 문서 추가
- github action API 문서화 확인 단계 추가

* build: Github action API 문서 빌드 확인 step 추가

* fix: Github action API 문서 빌드 확인 step 타겟 디렉토리 수정

* fix: Github action API 문서 재빌드 스텝 수정

* build: 암호화 테스트 코드 활성화

* build: 운영 배포 환경 설정 추가

- application-prod.properties : 민감정보 암호화 하여 운영서버 설정 추가
- Dockerfile : prod 프로파일로 실행되도록 변경
- deploy.sh : docker 실행 로그 남기도록 변경

* fix: 운영 DB URL 수정

* docs: API 문서 오타 수정

* feat: 숙소 가격 통계 API 가 더미 데이터를 반환하도록 변경

* feat: 숙소 가격 통계 API 에 전체 숙소 평균 가격 추가

* 가격 통계 API 더미 데이터 반환 배포 PR (#23)

* docs: API 문서 오타 수정

* feat: 숙소 가격 통계 API 가 더미 데이터를 반환하도록 변경

* feat: 숙소 가격 통계 API 에 전체 숙소 평균 가격 추가

* docs: 백엔드 README 추가

* Update README.md

* Update README.md

* Update README.md

* [FE] 체크인, 체크아웃 기능 구현 완료 (#25)

* Initialize project using Create React App

* feat: 개발 환경 셋팅

create-react-app(typescript)
styled-components(typescript)
styled-reset
eslint
prettier
material ui

* refactor: 개발 환경 셋팅 수정

* feat: 디렉터리, 폰트, styled-components 환경 구성

global.js 추가
theme.js 추가
google fonts 추가

* feat: 절대경로 설정 추가

* feat: router 설정

* feate: components에 컴포넌트별 디렉터리 생성

* feat: Hero 컴포넌트 마크업, 스타일 추가

* feat: constant 디렉터리, constant.js 파일 추가

* feat: utils.js 파일 추가

* design: utils.js WrapperMarginCenter 수정

* feat: 중첩 router 사용해 공통 header 추가

* design: Hero, Home 컴포넌트 스타일 수정

* feat: GNB 컴포넌트 마크업, 스타일 추가

* refactor: 코드리뷰 피드백 수정

* refactor: Hero, GNB 마크업 스타일 수정

* feat: header 마크업, 스타일 추가

* remove: js 파일 제거

* refactor: header 마크업 스타일 리팩토링

* feat: search 마크업, 스타일 추가

* style: favicon 추가

* feat: modal portal 기능 추가

* refactor: type들 파일로 따로 분류

* feat: modal backdrop show, hide 기능 추가

* feat: 캘린더 모달 내 캘린더 버튼 추가

* feat: Calendar 년, 월에 따른 일수 생성 기능 추가

* feat: 캐러셀 움직이는 기능 추가

* feat: 캘린더 새로운 년, 월 추가하는 기능 추가

* feat: 캘린더 마지막 요소일때만 추가하는 기능

오른쪽 버튼을 누를때 보여지는 요소가 캘린더의 마지막 아이템일경우에만 캘
린더를 추가하는 기능 추가

* style: 불필요한 주석 제거

* style: 캘린더 '일'에 마우스 호버시 스타일 추가

color, background-color 변경

* refactor: 중복되는 함수, type 변경

* feat: 과거 일자 스타일, 클릭 방지 기능 추가

* fix: 캘린더에서 오늘 날짜를 비활성시키는 버그 픽스

* feat: DateCell 컴포넌트 추가

* refactor: 코드리뷰 피드백 수정

* style: CalendarModal 변수명 리네임, 상수 추가

* refactor: CalendarModal reducer 부분 리팩토링

* rename: 파일들 FE 폴더로 이동

* feat: 라우터를 이용시 공통으로 보이는 배경 수정

* feat: 캘린더 요소 클릭시 선택되는 기능 구현

* fix: 체크인 관련 버그 수정

체크인을 누른 후 체크인보다 작은 날 누를시 생기는 버그 수정

* feat: 캘린더 체크인, 체크아웃 기능 구현 완료

* build: 백엔드 Docker 포트설정 변경

80 -> 8080

* docker 변경사항 PR (#30)

* docs: API 문서 오타 수정

* feat: 숙소 가격 통계 API 가 더미 데이터를 반환하도록 변경

* feat: 숙소 가격 통계 API 에 전체 숙소 평균 가격 추가

* docs: 백엔드 README 추가

* Update README.md

* Update README.md

* Update README.md

* build: 백엔드 Docker 포트설정 변경

80 -> 8080

* feat: API URL 변경

* feat: 숙소 가격 통계 API URL 복수형으로 변경

* feat: 숙소제공항목 row 로 저장 및 명칭 단수로 변경

- Provides -> Provide
- AccommodationProvide 추가
- 숙소제공항목을 enum 으로 관리
- enum 을 column 으로 변환하는 ProvideElementsConverter 추가

* feat: 변경 불가능한 컬렉션 대신, 복사하여 반환하도록 변경

* style: static 변수 대문자로 변경

* style: import * 대신, 필요한 것만 import 하도록 변경

* feat: 시작 종료일자 검증로직 추가

* feat: AccommodationRepository, ReservationRepository 추가

* feat: Accommodation 생성자 추가

- @AllArgsConstructor 추가
- @entity 를 위해 기본 생성자를 @NoArgsConstructor 로 변경

* refactor: ProvideElement -> ProvideName 으로 명칭 변경

- ProvideElement -> ProvideName
- ProvideElementConverter -> ProvideNameConverter

* feat: Schedule 에 정적 생성 메소드 추가

* feat: Reservation 에 Getter 및 AllArgsConstructor 추가

* feat: 예약 가능한 숙소 조회 쿼리 추가

* feat: 예약 일정을 저장하는 변수 타입 변경 (LocalDateTime -> LocalDate)

* feat: 예약 가능한 숙소 조회 서비스 추가

* build: MySQL Point 를 처리를 위해 hibernate-spatial 의존성 추가 및 Dialect 설정

* refactor: 전역 예외처리 로직 에러 로깅 추가

* refactor: Accommodation 의 Point 의존성 변경

* refactor: StartEndDate null 방어코드 추가

* refactor: Address toString 추가

* refactor: AccommodationService 에서 조회시 Lazy loading 되도록 수정

* style: 미사용 import 제거

* refactor: 일급컬렉션 객체 제거

* feat: 예약 가능한 숙소 조회 API 추가

* 조회 API 배포 (#45)

* feat: 숙소 가격 통계 API URL 복수형으로 변경

* feat: 숙소제공항목 row 로 저장 및 명칭 단수로 변경

- Provides -> Provide
- AccommodationProvide 추가
- 숙소제공항목을 enum 으로 관리
- enum 을 column 으로 변환하는 ProvideElementsConverter 추가

* feat: 변경 불가능한 컬렉션 대신, 복사하여 반환하도록 변경

* style: static 변수 대문자로 변경

* style: import * 대신, 필요한 것만 import 하도록 변경

* feat: 시작 종료일자 검증로직 추가

* feat: AccommodationRepository, ReservationRepository 추가

* feat: Accommodation 생성자 추가

- @AllArgsConstructor 추가
- @entity 를 위해 기본 생성자를 @NoArgsConstructor 로 변경

* refactor: ProvideElement -> ProvideName 으로 명칭 변경

- ProvideElement -> ProvideName
- ProvideElementConverter -> ProvideNameConverter

* feat: Schedule 에 정적 생성 메소드 추가

* feat: Reservation 에 Getter 및 AllArgsConstructor 추가

* feat: 예약 가능한 숙소 조회 쿼리 추가

* feat: 예약 일정을 저장하는 변수 타입 변경 (LocalDateTime -> LocalDate)

* feat: 예약 가능한 숙소 조회 서비스 추가

* build: MySQL Point 를 처리를 위해 hibernate-spatial 의존성 추가 및 Dialect 설정

* refactor: 전역 예외처리 로직 에러 로깅 추가

* refactor: Accommodation 의 Point 의존성 변경

* refactor: StartEndDate null 방어코드 추가

* refactor: Address toString 추가

* refactor: AccommodationService 에서 조회시 Lazy loading 되도록 수정

* style: 미사용 import 제거

* refactor: 일급컬렉션 객체 제거

* feat: 예약 가능한 숙소 조회 API 추가

* feat: WishRepository 추가

* feat: WishService 추가

- 위시 리스트 저장 기능 추가
- 위시 리스트 삭제 기능 추가

* feat: WishService 에서 위시 리스트 추가시 Wish 가 아닌 WishResponse 를 반환하도록 변경

* style: 들여쓰기 수정

* test: 테스트 독립성을 위해, Trasnactional 어노테이션 추가

* refactor: 가독성 좋은 형태로 변경

* refactor: 위시리스트 추가 서비스에서 WishAddRequest 를 받도록 변경

* refactor: 위시리스트 등록/삭제 API 추가

* refactor: 새로운 Wish 를 만드는 정적 팩토리 메소드 추가

* refactor: Accommodation, Member, Reservation 에 정적 팩토리 메소드 추가

새로 추가할 엔티티를 만들 경우에 사용

* feat: WishRepository 에 숙소 아이디와 회원 아이디로 위시 리스트를 조회하는 기능 추가

* feat: 예약 가능 숙소 정보와 위시 리스트 정보를 병합하여 반환하는 서비스 추가

* feat: 예약 가능 숙소 정보와 위시 리스트 정보를 병합하여 반환하는 API 추가

* fix: Github action API 문서 빌드 확인 step 타겟 디렉토리 수정

* fix: Github action API 문서 재빌드 스텝 수정

* 가격 통계 API 더미 데이터 반환 배포 PR (#23)

* docs: API 문서 오타 수정

* feat: 숙소 가격 통계 API 가 더미 데이터를 반환하도록 변경

* feat: 숙소 가격 통계 API 에 전체 숙소 평균 가격 추가

* 조회 API 배포 (#45)

* feat: 숙소 가격 통계 API URL 복수형으로 변경

* feat: 숙소제공항목 row 로 저장 및 명칭 단수로 변경

- Provides -> Provide
- AccommodationProvide 추가
- 숙소제공항목을 enum 으로 관리
- enum 을 column 으로 변환하는 ProvideElementsConverter 추가

* feat: 변경 불가능한 컬렉션 대신, 복사하여 반환하도록 변경

* style: static 변수 대문자로 변경

* style: import * 대신, 필요한 것만 import 하도록 변경

* feat: 시작 종료일자 검증로직 추가

* feat: AccommodationRepository, ReservationRepository 추가

* feat: Accommodation 생성자 추가

- @AllArgsConstructor 추가
- @entity 를 위해 기본 생성자를 @NoArgsConstructor 로 변경

* refactor: ProvideElement -> ProvideName 으로 명칭 변경

- ProvideElement -> ProvideName
- ProvideElementConverter -> ProvideNameConverter

* feat: Schedule 에 정적 생성 메소드 추가

* feat: Reservation 에 Getter 및 AllArgsConstructor 추가

* feat: 예약 가능한 숙소 조회 쿼리 추가

* feat: 예약 일정을 저장하는 변수 타입 변경 (LocalDateTime -> LocalDate)

* feat: 예약 가능한 숙소 조회 서비스 추가

* build: MySQL Point 를 처리를 위해 hibernate-spatial 의존성 추가 및 Dialect 설정

* refactor: 전역 예외처리 로직 에러 로깅 추가

* refactor: Accommodation 의 Point 의존성 변경

* refactor: StartEndDate null 방어코드 추가

* refactor: Address toString 추가

* refactor: AccommodationService 에서 조회시 Lazy loading 되도록 수정

* style: 미사용 import 제거

* refactor: 일급컬렉션 객체 제거

* feat: 예약 가능한 숙소 조회 API 추가

* style: 불필요한 공백 제거

Co-authored-by: Benny <77577858+uBeom@users.noreply.github.com>
  • Loading branch information
jinan159 and Benny committed Jun 8, 2022
1 parent c5199a8 commit 34d56be
Show file tree
Hide file tree
Showing 51 changed files with 1,606 additions and 55 deletions.
1 change: 1 addition & 0 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM openjdk:11.0.11
ARG JAR_FILE=./build/libs/*.jar
COPY ${JAR_FILE} airbnb.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "airbnb.jar"]
2 changes: 1 addition & 1 deletion backend/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
implementation 'org.hibernate:hibernate-spatial'
runtimeOnly 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
// compileOnly 'org.asciidoctor:asciidoctorj:2.5.3'
annotationProcessor 'org.projectlombok:lombok'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
Expand Down
2 changes: 1 addition & 1 deletion backend/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ services:
build: .
restart: always
ports:
- "80:8080"
- "8080:8080"
container_name: airbnb-was
env_file:
- .env
65 changes: 65 additions & 0 deletions backend/src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,68 @@ include::{snippets}/accommodation-statistics-price/response-body.adoc[]

=== http response fields
include::{snippets}/accommodation-statistics-price/response-fields.adoc[]

== 숙소 조회 API

예약 가능한 숙소를 조회하는 API 입니다.

=== curl
include::{snippets}/not-reserved-accommodations/curl-request.adoc[]

=== http request
include::{snippets}/not-reserved-accommodations/http-request.adoc[]

=== http request body
include::{snippets}/not-reserved-accommodations/request-body.adoc[]

=== http response
include::{snippets}/not-reserved-accommodations/http-response.adoc[]

=== http response body
include::{snippets}/not-reserved-accommodations/response-body.adoc[]

=== http response fields
include::{snippets}/not-reserved-accommodations/response-fields.adoc[]

== 숙소 위시 리스트 추가 API

위시 리스트 추가 API 입니다

=== curl
include::{snippets}/wish-list-add/curl-request.adoc[]

=== http request
include::{snippets}/wish-list-add/http-request.adoc[]

=== http request body
include::{snippets}/wish-list-add/request-body.adoc[]

=== http response
include::{snippets}/wish-list-add/http-response.adoc[]

=== http response body
include::{snippets}/wish-list-add/response-body.adoc[]

=== http response fields
include::{snippets}/wish-list-add/response-fields.adoc[]

== 숙소 위시 리스트 삭제 API

위시 리스트 삭제 API 입니다.

=== curl
include::{snippets}/wish-list-remove/curl-request.adoc[]

=== http request
include::{snippets}/wish-list-remove/http-request.adoc[]

/api/wishes/\{id\} 의 id 부분에 `위시 리스트 아이디` 를 넣어주시면 됩니다.

=== http request body
include::{snippets}/wish-list-remove/request-body.adoc[]

=== http response
include::{snippets}/wish-list-remove/http-response.adoc[]

=== http response body
include::{snippets}/wish-list-remove/response-body.adoc[]
Original file line number Diff line number Diff line change
@@ -1,21 +1,46 @@
package codesquad.airbnb.accomodation;

import codesquad.airbnb.accomodation.dto.AccommodationSearchRequest;
import codesquad.airbnb.accomodation.dto.PriceAndCountStatistics;
import codesquad.airbnb.accomodation.dto.WishedAccommodationResponse;
import codesquad.airbnb.accomodation.service.AccommodationStatisticsService;
import codesquad.airbnb.accomodation.service.WishedAccommodationService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/accommodation")
@RequestMapping("/api/accommodations")
public class AccommodationController {

private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");

private final AccommodationStatisticsService dummyAccommodationStatisticsService;
private final WishedAccommodationService wishedAccommodationService;

@GetMapping("/statistics/price")
public PriceAndCountStatistics getAccommodationPriceStatistics() {
return dummyAccommodationStatisticsService.getCachedPriceAndCountStatistics();
}

@GetMapping()
public List<WishedAccommodationResponse> getNotReservedAccommodations(
@RequestParam(value = "startDate", required = false) String startDate,
@RequestParam(value = "endDate", required = false) String endDate,
@RequestParam(value = "visitors", required = false) Integer visitors) {

AccommodationSearchRequest searchRequest = new AccommodationSearchRequest(
LocalDate.parse(startDate, DATE_FORMAT),
LocalDate.parse(endDate, DATE_FORMAT),
visitors);

return wishedAccommodationService.findWishedAccommodations(searchRequest);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
package codesquad.airbnb.accomodation.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.geo.Point;

import javax.persistence.*;
import org.locationtech.jts.geom.Point;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor // for @Entity
public class Accommodation {

@Id
Expand All @@ -29,7 +44,10 @@ public class Accommodation {
@JoinColumn(name = "address_id")
private Address address;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "provides_id")
private Provides provides;
@OneToMany(mappedBy = "accommodation", fetch = FetchType.LAZY)
private List<AccommodationProvide> accommodationProvides;

public static Accommodation createNewAccommodation(String title, long price, Image image, Point point, Address address) {
return new Accommodation(null, title, price, image, point, address, new ArrayList<>());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package codesquad.airbnb.accomodation.domain;

import lombok.Getter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
@Getter
public class AccommodationProvide {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "accommodation_id")
private Accommodation accommodation;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "provide_id")
private Provide provide;

@Column(nullable = false, columnDefinition = "integer default 0")
private int count;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
@Getter
Expand All @@ -17,4 +20,9 @@ public class Address {
private String city;
private String sigungu;
private String street;

@Override
public String toString() {
return String.format("%s %s %s", city, sigungu, street);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package codesquad.airbnb.accomodation.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor // for @Entity
public class Provide {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
@Convert(converter = ProvideNameConverter.class)
private ProvideName name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package codesquad.airbnb.accomodation.domain;

public enum ProvideName {
CAPACITY("최대 인원"),
BED_ROOM("침실"),
BED("침대"),
WASH_ROOM("욕실"),
KITCHEN("주방"),
WIFI("무선 인터넷"),
AIR_CONDITIONER("에어컨"),
HAIR_DRYER("헤어드라이어");

private final String name;

ProvideName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public static ProvideName provideNameOf(String provideName) {

for (ProvideName provideElement : values()) {
if (provideElement.getName().equals(provideName)) {
return provideElement;
}
}

throw new IllegalArgumentException("항목을 찾을 수 없습니다.(" + provideName + ")");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package codesquad.airbnb.accomodation.domain;

import javax.persistence.AttributeConverter;

public class ProvideNameConverter implements AttributeConverter<ProvideName, String> {

@Override
public String convertToDatabaseColumn(ProvideName attribute) {
return attribute.getName();
}

@Override
public ProvideName convertToEntityAttribute(String dbData) {
return ProvideName.provideNameOf(dbData);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package codesquad.airbnb.accomodation.dto;

import codesquad.airbnb.accomodation.domain.Accommodation;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;
import java.util.stream.Collectors;

@Getter
@AllArgsConstructor
public class AccommodationResponse {

private long id;
private String title;
private long price;
private String imageUrl;
private double x;
private double y;
private String address;
private List<ProvideResponse> provides;

public static AccommodationResponse of(Accommodation accommodation) {
// TODO : 2022-06-07 provideResponses 를 provideResponses 내부에서 생성하지 않고, 외부에서 주입하도록 변경
// TODO : 2022-06-07 provideResponses 가 결국 N+1 쿼리를 발생시키는데, 이를 하나의 쿼리로 가져와서 조합하도록 변경하기
List<ProvideResponse> provideResponses = accommodation.getAccommodationProvides()
.stream()
.map(ap -> new ProvideResponse(ap.getProvide().getName(), ap.getCount()))
.collect(Collectors.toUnmodifiableList());

return new AccommodationResponse(
accommodation.getId(),
accommodation.getTitle(),
accommodation.getPrice(),
(accommodation.getImage() != null) ? accommodation.getImage().getImageUrl() : "",
(accommodation.getPoint() != null) ? accommodation.getPoint().getX() : 0,
(accommodation.getPoint() != null) ? accommodation.getPoint().getY() : 0,
accommodation.getAddress().toString(),
provideResponses
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package codesquad.airbnb.accomodation.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.time.LocalDate;

@Getter
@AllArgsConstructor
public class AccommodationSearchRequest {

private LocalDate startDate;
private LocalDate endDate;
private Integer visitors;
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class PriceAndCountStatistics implements Iterable<PriceAndCount> {
private final double averagePrice;

public List<PriceAndCount> getPriceAndCountList() {
return Collections.unmodifiableList(priceAndCountList);
return List.copyOf(priceAndCountList);
}

public double getAveragePrice() {
Expand All @@ -21,6 +21,6 @@ public double getAveragePrice() {

@Override
public Iterator<PriceAndCount> iterator() {
return Collections.unmodifiableList(priceAndCountList).iterator();
return List.copyOf(priceAndCountList).iterator();
}
}
Loading

0 comments on commit 34d56be

Please sign in to comment.