Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] 버스 관련 리뷰 CRUD 추가 #33

Merged
merged 9 commits into from
Aug 5, 2024
Merged

[FEAT] 버스 관련 리뷰 CRUD 추가 #33

merged 9 commits into from
Aug 5, 2024

Conversation

ss0ngcode
Copy link
Collaborator

@ss0ngcode ss0ngcode commented Aug 2, 2024

  • 버스 리뷰 조회 (버스, 정류장, 시간대 옵션)
  • 버스 리뷰 생성
  • 버스 리뷰 수정 (리뷰, 시간대, 별점 옵션)
  • 버스 리뷰 삭제

#8 (지하철은 아직 미구현)

- 버스 리뷰 조회 (버스, 정류장, 시간대 옵션)
- 버스 리뷰 생성
- 버스 리뷰 수정 (리뷰, 시간대, 별점 옵션)
- 버스 리뷰 삭제
@ss0ngcode ss0ngcode changed the title [eat] #8 버스 관련 리뷰 CRUD 추가 [FEAT] 버스 관련 리뷰 CRUD 추가 Aug 2, 2024
@JuneParkCode JuneParkCode added ⌨️ BE Backend 작업 ✨ feat 기능 개발과 관련된 라벨입니다. labels Aug 2, 2024
Copy link
Contributor

@JuneParkCode JuneParkCode left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생 많이하셨습니다. 몇몇 부분 고칠 점이 보여서 Request Changes 남깁니다~

JuneParkCode and others added 6 commits August 5, 2024 11:32
- 필드의 Optional 제외
- Entity Setter 제외 / updateReview 추가
- delete 에서 id 존재 유무 체크
- repository Optional 제거 및 JPQL 쿼리 추가
final local variable 제거
field 에 공유되는 entity 제거
- validation 의존성 추가
- controller @Valid 추가
- requestDto validation 처리
Copy link
Contributor

@JuneParkCode JuneParkCode left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

페어프로그래밍 했습니다~

@ss0ngcode ss0ngcode merged commit ded2ebb into develop Aug 5, 2024
1 check passed
ss0ngcode added a commit to ss0ngcode/E2E2-TALKKA that referenced this pull request Aug 28, 2024
* feat: IntelliJ 협업용 Naver hackday 포매터 / 체크스타일 설정파일 추가

* feat: 스프링 프로젝트 초기화

* feat: mysql docker compose 설정

* fix: build.gradle 오탈자 수정

* Update issue templates

* fix: .env.sample DB 불일치 수정 (#12) (#13)

.env.sample MYSQL_URL 변경

**반드시 해당 커밋 pull 이후 .env 파일 수정할 것!!!!**

Closes: #12

* feat: 유저 도메인 엔티티 작성

- UserEntity 생성
- UserRepository 생성
- JPA auditing을 위한 ServerApplication에 @EntityListeners(AuditingEntityListener.class) 추가

Closes #6

* �docs: README.md

* feat: #14 PR 리뷰내용 반영

- @table 삭제 및 @column에 name 속성 추가
- BIGINT(32) => BIGINT 변경
- varchar 타입 columnDefinition 제거 및 length 추가
- PK updatable 삭제
- @EnableJpaAuditing 삭제
- created_at, updated_at 오탈자 수정

Closes #14

* feat: application.yaml 수정

- application.yaml 수정

* [FEAT] 버스 도메인 entity 작성 및 repository 작성 (#15)

## 작업 내용
- BusRouteEntity
- BusLocationEntity
- BusRouteStationEntity

## 특이사항
- Java 내에서는 ENUM 으로 표현하고 DB 에서는 실제로 가져오는 값을 바탕으로 바라볼 수 있도록 ENUM 을 생성하되,
`@Convert` 를 사용함
- (아직 잘 모르는 부분이라 학습이 필요함)

* feat: #14 PR 리뷰내용 반영

- created_at, updated_at 오탈자 재수정

Closes #14

* chore: gitignore mysql data 추가

* feat: BusRouteStationEntity 분리

* feat: BusRouteStationRepository 추가

* feat: BusLocation - BusRoute 연관관계 설정

* feat: BusStation - BusRouteStation - BusRoute 연관관계 설정

BusStation -> BusRouteStation 으로 타고 들어갈 일이 없기 때문에, 단방향 매핑함.

* feat: 리뷰 관련 연관관계 설정

* refactor: format / import 최적화

* refactor: 중복되는 변수명 수정

* [FEAT] 예외 처리 및 Exception Base 구현 (#18)

#16 
- HTTP Exception 구현
- DomainException -> CustomException 으로 구현
- 각 Exception을 처리할 수 있는 ControllerAdvice 구현

* fix: ApiRespDto 변경사항 누락 반영

* [FIX] BusReviewEntity에서 station_id 삭제

테이블 분할 시 station_id 삭제를 누락하여 삭제처리

* [FIX] BusRouteStationRepository에 JpaRepository extends 추가

BusRouteStationRepository에 JpaRepository extends가 누락되어 추가

* [FEAT] UserService 구현 (#27)

## 작업내용
- CRUD + isDuplicatedNickname 구현
- Entity 의 Grade Enum 으로 변경

(테스트 코드 참고)

#20 (진행중 - Service / 변경사항 미리 반영)

* [FEAT] PR 빌드 체크봇 추가 (#30)

- Github action 시에 build check를 하는 봇 추가입니다.

* [FEAT] 네이버 소셜 인증 구현 #9 (Kernel360#31)

- 네이버 소셜 인증 구현
- @JuneParkCode 의 코드와 병합하기 위한 작업

* [FIX] 네이버 인증 구현 누락 수정 #9 (Kernel360#32)

- OAuth관련 코드가 누락된 부분이 있어 다시 올립니다.

* [FEAT] 네이버 소셜 로그인 구현 (Kernel360#36)

- 로그인 흐름
  1. 홈페이지 접속
  2. 비로그인사용자일 경우 자동으로 로그인 페이지로 이동
  3. 소설인증(네이버)
  4. 로그인
    - DB에 회원정보가 있을 경우 로그인 완료
    - DB에 회원정보가 없을 경우 회원가입 폼으로 이동
  
- 소셜인증만 하고 회원가입 폼을 작성하지 않은 경우 회원가입 폼 이외의 페이지에 접속 불가능

* [FIX] 빌드 봇 캐싱 문제 해소 (Kernel360#37)

- restore key 의 문제로 인한 캐싱 실패 문제 해소입니다. (바로 merge 합니다.)

* [FIX] userId OAuth2User 에서 누락된 문제 해결 (Kernel360#39)

## 작업 내용
- userId 누락된 부분 해결

## NOTE
- CustomOAuth2Service 쪽에서 코드가 햇갈려서 조금 리팩터링했습니다. (optional 처리 부분에서 이름이
햇갈려가지고...)
- 아직 이쪽 코드에 대해서 이해가 부족해서 제대로된 리팩터링은  나중에 해결해보는게 좋을 것 같습니다.

* [FEAT] 버스 관련 리뷰 CRUD 추가 (Kernel360#33)

- 버스 리뷰 조회 (버스, 정류장, 시간대 옵션)
- 버스 리뷰 생성
- 버스 리뷰 수정 (리뷰, 시간대, 별점 옵션)
- 버스 리뷰 삭제

#8 (지하철은 아직 미구현)

---------

Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 유저 CRUD 구현 + 내 정보 API 구현 (Kernel360#34)

## 작업 내용
- 단순 User CRUD 구현 (`/api/users/`)
- 내 정보 API 반영 (`/api/users/me`)
- `MethodArgumentNotValidException` 에대한 Exception Handling 추가
- .env 에 대해 gitignore 추가

Closes #20

* [REFACTOR] Code 형식으로 저장되는 Enum 리팩토링 (Kernel360#40)

## 작업내용
(아침에 @ss0ngcode 님이 추천해주신 게시글 보고 리팩터링함)
- EnumCodeConverterUtils 추가
- EnumCodeConverter 추가
- EnumCodeConverter 상속하여 Converter 작성하도록 변경
- Code 를 사용하는 Enum의 경우 EnumCodeInterface 작성

## 변경 후 효과
- 공공 API 로부터 획득하는 Response 의 경우 code - enum 으로 연결되는데, 해당 Converter 에서의
코드 중복을 막을 수 있음.

(리팩터링이라서 천천히 나중에 리뷰해주셔도 됩니다!!)

Closes #17

* [FEAT] 버스관련 API 구현 (Kernel360#43)

- 노선 검색 API
- 노선 등록 service
- 정류장 검색 service
- 정류장 등록 service
- 노선별 경유 정류장 검색 service
- 노선별 경유 정류장 등록 service

* [REFACTOR] #8 busReview 관련 validate 추가 및 TimeSlot Enum 변경 (Kernel360#42)

#8 추가 수정 사항

## 작업내용
- controller에서 userId @AuthenticationPrincipal를 통해 받아오도록 수정
- BusReviewReqDto validation 추가
- service에서 작성자 일치여부 검증로직 추가
- service 변경에 따른 test 코드 변경
- TimeSlot Enum Type으로 변경

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>

* [FEAT] Kernel360#48 수도권 지하철 역 정보 csv 파일 생성 (Kernel360#49)

- Kernel360#48 지하철 역 정보 CSV 파일 추가

* [FEAT] 버스 노선, 정류장, 노선정류장 서비스 테스트 추가 (Kernel360#50)

- BusRouteServiceTest 작성
- BusStationServiceTest 작성
- BusRouteStationServiceTest 작성
- 테스트를 위한 entity, dto factory : BusFactory 추가

---------

Co-authored-by: Photogrammer <[email protected]>

* [FIX] dto 클래스 record 타입으로 리팩토링 (Kernel360#53)

## dto 클래스 record 타입으로 리팩토링 및 그에따른 service와 test 코드 수정
- BusRouteCreateDto
- BusRouteRespDto
- BusStationCreateDto
- BusStationRespDto
- BusRouteStationCreateDto
- BusRouteStationRespDto
- BusReviewReqDto
- BusReviewRespDto
- UserCreateDto
- UserCreateReqDto
- UserDto
- UserRespDto
- UserUpdateReqDto

## record타입은 getter 메소드가 필드명으로 생성됨
- getName() [x]
- name() [o]

Closes Kernel360#52

* [FEAT]: 소셜 로그인 과정 FE와 통합 (Kernel360#51)

- Security OAuth 경로 변경
- AuthRole 로 refactor
- UnregisteredUserFilter refactor

Closes Kernel360#47

* [FEAT] 지하철에 관련된 엔티티 생성 및 레포지토리 구현 (Kernel360#58)

- 지하철 역 엔티티 구현
- 지하철 혼잡도 엔티티 구현
- 지하철 시간표 엔티티 구현
- 각 레포지토리 구현

Closes Kernel360#56 

**현재까지 진행내용 merge하여 충돌 해결**

* [FEAT] BusApiService 구현 (Kernel360#62)

## 작업 내용
- 가장 간단한 형태의 구현
- ApiKeyProperty interface
- BusApiKeyProperty
- PublicBusApiResp interface

## NOTE
- 240809 에 정해둔 형태의 가장 간단한 형태의 구현입니다. (에러 핸들링 없음)
- FE 작업 중에 데이터 주입이 급해서 작성되었습니다.
  - 버스 노선 정보 획득 필요 (검색 기능쪽에서)
- 버스 노선 정보가 총 5천개 가량되는데, 이를 정적 데이터로 획득하기 위한 방법이 필요합니다. (하나씩 가져와야하여 5일가량
소요됨)

* [FEAT] 버스 관련 컨트롤러 구현 (Kernel360#63)

## 작업내용 Kernel360#54 
- �버스 노선 컨트롤러 구현
- 버스 정거장 컨트롤러 구현
- 버스 노선-정거장 컨트롤러 구현

* [FEAT] FE 통합에 따른 API 변경 (Kernel360#65) (Kernel360#66)

## 작업 내용
- BusReviewRespDto 변경
- BusRouteStationRespDto 변경

* [FEAT] 지하철 역 조회 & 혼잡도 조회 서비스 구현 (Kernel360#60)

## 작업내용 Kernel360#59 
- 지하철 역 조회 서비스 구현
- 지하철 혼잡도 조회 서비스 구현
- Entity 수정사항 반영

* [FIX] YN Enum Error / RouteStation Controller Error / Like Query Error (Kernel360#69)

## 수정 전 기능
- ENUM YN 에 대해서 "0", "1" 처리
- BusRouteStationController @service 어노테이션으로 되어있는 문제
- `Like` 쿼리

## 수정 후 기능
- "Y" "N" 처리
- @RestController 적용
- `StartWIth` 쿼리

## 수정 의도
- 버그 수정

Closes Kernel360#68

* [FEAT] 버스 관련 정적데이터 가공 (Kernel360#71)

## 버스 관련 정적데이터 가공
- 버스 노선 정보(bus_route.csv)
- 버스 노선-정거장 정보(bus_route_station.csv)
- 버스 정거장 정보(bus_station.csv)

## DB SQL 코드 작성
- Schema.sql 작성
- csv 파일 load data 스크립트 작성
- api_route_id, api_station_id -> route_id, station_id 매칭
- db 초기화 스크립트 작성

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 북마크 엔티티 및 dto 구현 (Kernel360#74)

- 북마크 엔티티 구현
  - BookmarkEntity
- 북마크 dto 구현
  - BookmarkCreateDto
  - BookmarkRespDto
 - 북마크 상세 엔티티 구현
  - BookmarkDetailEntity
- 북마크 상세 dto 구현
  - BookmarkDetailCreateDto
  - BookmarkDetailRespDto


![스크린샷 2024-08-15 오후 8 26
30](https://github.com/user-attachments/assets/a8fd7e0b-02ad-4e35-b55b-b067c93a0767)

북마크 상세의 type에 따라 버스와 지하철 둘중 하나 정보만 입력하는 방향으로 가려고 함.
(이후 NoSQL DB 도입을 고려)

버스의 경우 BusRouteStation에서 정보를 가져오기에 연관관계를 맺어도 크게 문제 없지만,
지하철의 경우 SubwayStation에서 정보를 얻는것이 아닌, SubwayConfusion, SubwayTimeTable에서
정보를 가져와야하기때문에, 추가적인 조회(select)가 불가피한 상황
이런경우 연관관계를 맺는것이 의미가 적다고 생각하여 북마크 상세에서 BusRouteStation, SubwayStation과의
연관관계를 맺지 않고 일단 id를 직접 가지고 있게 변경
=> 8/16(금) 연관관계에 대한 짧은 논의 필요

close Kernel360#64

* [FEAT BusReview api 형식에 맞춘 변경 + VO / DTO refactoring (Kernel360#76)

## 작업 내용
### Validator 분리
- ContentAccessValidator 분리
  - 해당 Validator 에서 Filter 단에서 검증하지 못하는 Access 에 대한 부분을 검증

### VO 분리
- 객체를 명확하게 나타내기 위해 VO 로 `Rating` `ReviewContent` 분리
  - `ReviewContent` 의 경우 리뷰 과정에서 함께 논의가 필요 (일단 시도..)
- `Rating` 객체에서는 Rating 에 대한 책임을 가지며, Rating 생성 실패시
`InvalidTypeException` 을 상속한 `InvalidRatingException` throw
  - DB, json converting 을 위한 Converter class 생성

### Exception 처리
- Controller 에서 Service 단의 Exception 을 처리하고 적절한 response 을 하도록 함.

### Dto 분리
- BusReviewReqDto 에서는 단순히 string 으로 유연하게 값을 가져오며, 이는 BusReviewDto 에 VO
타입으로 전환하며 타입을 명확하게 체크함.

### Review 관련 테스트 재작성
- service 단에서 사용해야하는 method / validator 를 명확하게 사용하고 있는지에 중점을 가지고 테스트를
수행함.

Closes Kernel360#72

* [FIX]: TimeSlot conversion 이 get method에서 변경되지 않은 문제 해결 (Kernel360#79)

- TimeSlot Converstion을 code 기반으로 하고 있던 문제를 해결함.

* [FIX] Enum code Exception 변경 및 Timeslot enum code 제거 (Kernel360#80)

- InvalidEnumCodeException 추가 및 EnumCodeConverterUtils 에서 해당 code throw
하도록 변경
- TimeSlot 에서 Code 관련된 부분 모두 제거 및 수정
- RestControllerAdvice 에서 InvalidEnumCodeException 에 대해서 500 response 처리

* [FEAT] 지하철 역 관련 코드 구현 (Kernel360#82)

## 작업내용 Kernel360#59 
- 지하철 역 컨트롤러 구현
- 지하철 역 서비스 및 dto 추가 및 리팩토링
- Enum 리팩토링 및 테스트 코드 추가
- Exception 처리 변경

* [REFACTOR]: User 관련 부분 VO / Exception refactor (Kernel360#83)

## 작업내용
- User 내 Nickname / Email VO 객체로 변경
  - VO 객체 변경에 따른 DTO 변경
  - Converter 추가
  - 관련 부분 수정 (OAuth)
- Controller 에서 exception handling 이후 response 하도록 변경
  - 변경된 Response 규칙에 따라 response

Closes Kernel360#77

* [FEAT] 북마크 서비스 구현 (Kernel360#81)

- BookmarkService
- BookmarkRepository
- BookmarkDetailRepository

* [FEAT] 북마크 컨트롤러 구현 및 TransportType Enum 리팩토링 (Kernel360#86)

- 북마크 컨트롤러 구현
  - `GET` `/bookmark` : 본인이 작성한 북마크 리스트 반환
  - `GET` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 조회
  - `POST` `/bookmark` : 북마크 생성
  - `DELETE` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 삭제
  -  `PUT` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 수정

- 북마크 서비스 수정
  - `getBookmarkById` 메소드에서 본인이 작성한 북마크만 조회하도록 수정 
  - 북마크 서비스 메소드 순서 변경 : get, create, update, delete 순서
  - 메소드 파라미터 순서 수정 : dto, userId, bookmarkId 순서
- 받아야하는 파라미터가 늘어날수록 코드 가독성이 나빠질 수 있음 -> 추후 service단에서 사용할 dto를 분리하도록
리팩토링 고려

- TransportType Enum 리팩토링
- `BookmarkRespDto` 에서 `TransportType`를 `String`이 아닌 `enum`으로 반환하도록 리팩토링
  - `TransportType`에서 `name` 필드가 불필요하다고 생각되어 삭제

close Kernel360#84

* [FEAT] 지하철 혼잡도 관련 코드 구현 (Kernel360#85)

## 작업내용 Kernel360#59 
- 지하철 혼잡도 컨트롤러 구현
- 지하철 혼잡도 서비스 리팩토링
- Exception 처리 변경

* [FEAT] 지하철 리뷰 관련 구현 (Kernel360#90)

## 작업내용
- schema.sql, add_constraints.sql에 지하철 관련 ddl 추가
- 지하철 리뷰 컨트롤러, 서비스, 레포지토리 , 엔티티, DTO, Exception 구현
- 테스트코드 작성

Closes Kernel360#55

* [FEAT] 지하철 시간표 관련 코드 구현 (Kernel360#88)

## 작업내용
- 지하철 시간표 컨트롤러 구현
- 지하철 시간표 서비스 구현
- 지하철 시간표 레포지토리 구현
- Custom Exception 구현
- 테스트 코드 작성

Closes Kernel360#59 
Closes Kernel360#73

* [FEAT] ApiClientException 추가 (Kernel360#94)

Closes Kernel360#93

* [REFACTOR]: 버스 도메인 리팩토링 (Kernel360#95)

## 작업내용
- 버스 컨트롤러, 서비스 리팩토링
- 경류 정류장 테이블 저장 시 apiXXXId로 넘기던 것 XXXId로 변경
  - 서비스 내에서 사용하는 정보는 apiXXXId가 아닌 XXXId
  - apiXXXId의 경우는 공공 데이터에서 받아온 데이터
- ResponseDto에서 apiXXXId 필드 추가
  - 다른 서비스에서 필요한 데이터
- Exception 추가 및 패키지 변경
  - busReview에 있던 bus 도메인 exception을 bus 패키지 하위로 변경

Closes Kernel360#91

---------

Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 버스 위치 정보 수집 스케줄러 구현 (Kernel360#96)

## 작업 내용
- 최대한 유연하게 Scheduler 를 구현함
  - 추후에 변경 가능성 있는 class 모두 interface 분리
  - Application.yaml 을 통해서 설정을 변경가능하도록 설정함.

Closes Kernel360#92

* [FEAT] 권한별 API 접근 제한 및 개발용 세션 구현 (Kernel360#100)

## 작업내용
- 권한 별 API Path 접근 제어 설정
  - `@Secured`를 사용하여 security session의 권한 확인 후 접근 제한
- 개발용 세션 구현
  - OAuth2.0을 통하지 않고 `USER`, `ADMIN` 권한을 가질 수 있는 개발용 세션 구현
- AuthRole과 Grade enum 통합
- oauth 패키지의 AuthRole enum과 user 패키지의 Grade enum의 중복으로 인해 AuthRole로 통합 및
Grade 삭제

Closes Kernel360#97 
Closes Kernel360#98 
Closes Kernel360#99

* [FEAT] Exception Handler 에서 Exception.class 에 대한 처리 (Kernel360#105)

Closes Kernel360#101

* [FEAT] HTTP Request / Response 기본 logging (Kernel360#107)

## 결과 예시

![image](https://github.com/user-attachments/assets/15a49bf0-4b69-40a8-b45e-d1cd4edbad6d)

## 작업 내용
- Logging Filter 추가
  - OncePerRequestFilter 적용 (Filter 두번 타는 경우 방지)
  - 총 지연시간 ms 로 표현
  - Security 보다 먼저 거치도록 가장 Order 를 높게 잡음.

Closes Kernel360#106

* [REVERT] "[FEAT] Exception Handler 에서 Exception.class 에 대한 처리" (Kernel360#108)

## Revert 사유
- Exception handling 과정에서, 해당 시점에 catch 되지 말아야할 error (`@Secured` 에러와 같은
것들) 까지 catch 되어 처리되고 있음.

Reverts Kernel360#105

* [FIX] Bookmark 관련 오류 수정 (Kernel360#109)

## 작업 내용
- `/api` 가 빠진 문제 수정
- `@RequestBody` 빠진 문제 수정 및 `@Valid` (name 길이) 추가
- `DuplicatedBookmarkNameException` 추가

* [FEAT] Controller 에 대한 권한 제어 재작성 (Kernel360#111)

## 작업 내용
- SecurityConfig + `@Secure` 활용하여 권한 제어
- `Authenticate` 필요한 부분 -> `config` 에서 `.authenticated()`처리
- `Authorization` 필요한 부분 -> `@Secure` 로 권한 명시

* [FEAT] Springdoc OpenAPI 적용 (Kernel360#117)

## 작업 내역
- springdoc 적용
- 각 API 에 대해서 springdoc annotation 이용하여 api 명세 작성
  - Controller 에 대해서 interface 적용하여 구현

https://app.swaggerhub.com/apis/SUNGJUN/TALKKA/1.0.0

* [FEAT] FE 리뷰 / 경로 조회 (기초) (Kernel360#118)

## 작업 내용
- 경로 북마크 조회
- 리뷰 조회
- 내정보 조회 / 수정
- 로그인 / 로그아웃
- API 생성을 open api 명세 바탕으로 자동화


(아직 한참 남았음 / 상태 공유를 위한 merge)

* [FEAT] 버스 실시간 도착 정보 연동 및 구현 (Kernel360#121)

## 작업 내용
- [x] DTO 구현
- [x] BusApiService 에 method 추가
- [x] SimpleBusApiService 에 구현 추가
- [x] CachedStorage interface 작성
- [x] CachedStorage 구현체 (memory based / time expire 가능) 구현

## 캐시 사용시 변화 시간
- 1분 간격 캐싱 (동일 노선 정류장에 대한 조회시 1분에 한번 request 사용)
  - 1s -> 50ms

## NOTE
- 작업양이 꽤 되니, commit 단위로 리뷰하시면 편합니다.

Closes Kernel360#120

* feature: EC2 환경 구성 및 CI/CD 구현

- server를 컨테이너로 올리기 위해 docker compose에 작성
- nginx 및 ssl인증(certbot)을 위해 docker compose에 작성
- ssl 인증을 위한 init-letsencrypt.sh 작성
- Github Action을 통해 CI / CD를 위한 gradle-build.yml 작성

* feature: PR시 작동 제거 및 태그 추가

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Gyaak <[email protected]>
ss0ngcode added a commit to ss0ngcode/E2E2-TALKKA that referenced this pull request Aug 28, 2024
* feat: IntelliJ 협업용 Naver hackday 포매터 / 체크스타일 설정파일 추가

* feat: 스프링 프로젝트 초기화

* feat: mysql docker compose 설정

* fix: build.gradle 오탈자 수정

* Update issue templates

* fix: .env.sample DB 불일치 수정 (#12) (#13)

.env.sample MYSQL_URL 변경

**반드시 해당 커밋 pull 이후 .env 파일 수정할 것!!!!**

Closes: #12

* feat: 유저 도메인 엔티티 작성

- UserEntity 생성
- UserRepository 생성
- JPA auditing을 위한 ServerApplication에 @EntityListeners(AuditingEntityListener.class) 추가

Closes #6

* �docs: README.md

* feat: #14 PR 리뷰내용 반영

- @table 삭제 및 @column에 name 속성 추가
- BIGINT(32) => BIGINT 변경
- varchar 타입 columnDefinition 제거 및 length 추가
- PK updatable 삭제
- @EnableJpaAuditing 삭제
- created_at, updated_at 오탈자 수정

Closes #14

* feat: application.yaml 수정

- application.yaml 수정

* [FEAT] 버스 도메인 entity 작성 및 repository 작성 (#15)

## 작업 내용
- BusRouteEntity
- BusLocationEntity
- BusRouteStationEntity

## 특이사항
- Java 내에서는 ENUM 으로 표현하고 DB 에서는 실제로 가져오는 값을 바탕으로 바라볼 수 있도록 ENUM 을 생성하되,
`@Convert` 를 사용함
- (아직 잘 모르는 부분이라 학습이 필요함)

* feat: #14 PR 리뷰내용 반영

- created_at, updated_at 오탈자 재수정

Closes #14

* chore: gitignore mysql data 추가

* feat: BusRouteStationEntity 분리

* feat: BusRouteStationRepository 추가

* feat: BusLocation - BusRoute 연관관계 설정

* feat: BusStation - BusRouteStation - BusRoute 연관관계 설정

BusStation -> BusRouteStation 으로 타고 들어갈 일이 없기 때문에, 단방향 매핑함.

* feat: 리뷰 관련 연관관계 설정

* refactor: format / import 최적화

* refactor: 중복되는 변수명 수정

* [FEAT] 예외 처리 및 Exception Base 구현 (#18)

#16 
- HTTP Exception 구현
- DomainException -> CustomException 으로 구현
- 각 Exception을 처리할 수 있는 ControllerAdvice 구현

* fix: ApiRespDto 변경사항 누락 반영

* [FIX] BusReviewEntity에서 station_id 삭제

테이블 분할 시 station_id 삭제를 누락하여 삭제처리

* [FIX] BusRouteStationRepository에 JpaRepository extends 추가

BusRouteStationRepository에 JpaRepository extends가 누락되어 추가

* [FEAT] UserService 구현 (#27)

## 작업내용
- CRUD + isDuplicatedNickname 구현
- Entity 의 Grade Enum 으로 변경

(테스트 코드 참고)

#20 (진행중 - Service / 변경사항 미리 반영)

* [FEAT] PR 빌드 체크봇 추가 (#30)

- Github action 시에 build check를 하는 봇 추가입니다.

* [FEAT] 네이버 소셜 인증 구현 #9 (Kernel360#31)

- 네이버 소셜 인증 구현
- @JuneParkCode 의 코드와 병합하기 위한 작업

* [FIX] 네이버 인증 구현 누락 수정 #9 (Kernel360#32)

- OAuth관련 코드가 누락된 부분이 있어 다시 올립니다.

* [FEAT] 네이버 소셜 로그인 구현 (Kernel360#36)

- 로그인 흐름
  1. 홈페이지 접속
  2. 비로그인사용자일 경우 자동으로 로그인 페이지로 이동
  3. 소설인증(네이버)
  4. 로그인
    - DB에 회원정보가 있을 경우 로그인 완료
    - DB에 회원정보가 없을 경우 회원가입 폼으로 이동
  
- 소셜인증만 하고 회원가입 폼을 작성하지 않은 경우 회원가입 폼 이외의 페이지에 접속 불가능

* [FIX] 빌드 봇 캐싱 문제 해소 (Kernel360#37)

- restore key 의 문제로 인한 캐싱 실패 문제 해소입니다. (바로 merge 합니다.)

* [FIX] userId OAuth2User 에서 누락된 문제 해결 (Kernel360#39)

## 작업 내용
- userId 누락된 부분 해결

## NOTE
- CustomOAuth2Service 쪽에서 코드가 햇갈려서 조금 리팩터링했습니다. (optional 처리 부분에서 이름이
햇갈려가지고...)
- 아직 이쪽 코드에 대해서 이해가 부족해서 제대로된 리팩터링은  나중에 해결해보는게 좋을 것 같습니다.

* [FEAT] 버스 관련 리뷰 CRUD 추가 (Kernel360#33)

- 버스 리뷰 조회 (버스, 정류장, 시간대 옵션)
- 버스 리뷰 생성
- 버스 리뷰 수정 (리뷰, 시간대, 별점 옵션)
- 버스 리뷰 삭제

#8 (지하철은 아직 미구현)

---------

Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 유저 CRUD 구현 + 내 정보 API 구현 (Kernel360#34)

## 작업 내용
- 단순 User CRUD 구현 (`/api/users/`)
- 내 정보 API 반영 (`/api/users/me`)
- `MethodArgumentNotValidException` 에대한 Exception Handling 추가
- .env 에 대해 gitignore 추가

Closes #20

* [REFACTOR] Code 형식으로 저장되는 Enum 리팩토링 (Kernel360#40)

## 작업내용
(아침에 @ss0ngcode 님이 추천해주신 게시글 보고 리팩터링함)
- EnumCodeConverterUtils 추가
- EnumCodeConverter 추가
- EnumCodeConverter 상속하여 Converter 작성하도록 변경
- Code 를 사용하는 Enum의 경우 EnumCodeInterface 작성

## 변경 후 효과
- 공공 API 로부터 획득하는 Response 의 경우 code - enum 으로 연결되는데, 해당 Converter 에서의
코드 중복을 막을 수 있음.

(리팩터링이라서 천천히 나중에 리뷰해주셔도 됩니다!!)

Closes #17

* [FEAT] 버스관련 API 구현 (Kernel360#43)

- 노선 검색 API
- 노선 등록 service
- 정류장 검색 service
- 정류장 등록 service
- 노선별 경유 정류장 검색 service
- 노선별 경유 정류장 등록 service

* [REFACTOR] #8 busReview 관련 validate 추가 및 TimeSlot Enum 변경 (Kernel360#42)

#8 추가 수정 사항

## 작업내용
- controller에서 userId @AuthenticationPrincipal를 통해 받아오도록 수정
- BusReviewReqDto validation 추가
- service에서 작성자 일치여부 검증로직 추가
- service 변경에 따른 test 코드 변경
- TimeSlot Enum Type으로 변경

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>

* [FEAT] Kernel360#48 수도권 지하철 역 정보 csv 파일 생성 (Kernel360#49)

- Kernel360#48 지하철 역 정보 CSV 파일 추가

* [FEAT] 버스 노선, 정류장, 노선정류장 서비스 테스트 추가 (Kernel360#50)

- BusRouteServiceTest 작성
- BusStationServiceTest 작성
- BusRouteStationServiceTest 작성
- 테스트를 위한 entity, dto factory : BusFactory 추가

---------

Co-authored-by: Photogrammer <[email protected]>

* [FIX] dto 클래스 record 타입으로 리팩토링 (Kernel360#53)

## dto 클래스 record 타입으로 리팩토링 및 그에따른 service와 test 코드 수정
- BusRouteCreateDto
- BusRouteRespDto
- BusStationCreateDto
- BusStationRespDto
- BusRouteStationCreateDto
- BusRouteStationRespDto
- BusReviewReqDto
- BusReviewRespDto
- UserCreateDto
- UserCreateReqDto
- UserDto
- UserRespDto
- UserUpdateReqDto

## record타입은 getter 메소드가 필드명으로 생성됨
- getName() [x]
- name() [o]

Closes Kernel360#52

* [FEAT]: 소셜 로그인 과정 FE와 통합 (Kernel360#51)

- Security OAuth 경로 변경
- AuthRole 로 refactor
- UnregisteredUserFilter refactor

Closes Kernel360#47

* [FEAT] 지하철에 관련된 엔티티 생성 및 레포지토리 구현 (Kernel360#58)

- 지하철 역 엔티티 구현
- 지하철 혼잡도 엔티티 구현
- 지하철 시간표 엔티티 구현
- 각 레포지토리 구현

Closes Kernel360#56 

**현재까지 진행내용 merge하여 충돌 해결**

* [FEAT] BusApiService 구현 (Kernel360#62)

## 작업 내용
- 가장 간단한 형태의 구현
- ApiKeyProperty interface
- BusApiKeyProperty
- PublicBusApiResp interface

## NOTE
- 240809 에 정해둔 형태의 가장 간단한 형태의 구현입니다. (에러 핸들링 없음)
- FE 작업 중에 데이터 주입이 급해서 작성되었습니다.
  - 버스 노선 정보 획득 필요 (검색 기능쪽에서)
- 버스 노선 정보가 총 5천개 가량되는데, 이를 정적 데이터로 획득하기 위한 방법이 필요합니다. (하나씩 가져와야하여 5일가량
소요됨)

* [FEAT] 버스 관련 컨트롤러 구현 (Kernel360#63)

## 작업내용 Kernel360#54 
- �버스 노선 컨트롤러 구현
- 버스 정거장 컨트롤러 구현
- 버스 노선-정거장 컨트롤러 구현

* [FEAT] FE 통합에 따른 API 변경 (Kernel360#65) (Kernel360#66)

## 작업 내용
- BusReviewRespDto 변경
- BusRouteStationRespDto 변경

* [FEAT] 지하철 역 조회 & 혼잡도 조회 서비스 구현 (Kernel360#60)

## 작업내용 Kernel360#59 
- 지하철 역 조회 서비스 구현
- 지하철 혼잡도 조회 서비스 구현
- Entity 수정사항 반영

* [FIX] YN Enum Error / RouteStation Controller Error / Like Query Error (Kernel360#69)

## 수정 전 기능
- ENUM YN 에 대해서 "0", "1" 처리
- BusRouteStationController @service 어노테이션으로 되어있는 문제
- `Like` 쿼리

## 수정 후 기능
- "Y" "N" 처리
- @RestController 적용
- `StartWIth` 쿼리

## 수정 의도
- 버그 수정

Closes Kernel360#68

* [FEAT] 버스 관련 정적데이터 가공 (Kernel360#71)

## 버스 관련 정적데이터 가공
- 버스 노선 정보(bus_route.csv)
- 버스 노선-정거장 정보(bus_route_station.csv)
- 버스 정거장 정보(bus_station.csv)

## DB SQL 코드 작성
- Schema.sql 작성
- csv 파일 load data 스크립트 작성
- api_route_id, api_station_id -> route_id, station_id 매칭
- db 초기화 스크립트 작성

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 북마크 엔티티 및 dto 구현 (Kernel360#74)

- 북마크 엔티티 구현
  - BookmarkEntity
- 북마크 dto 구현
  - BookmarkCreateDto
  - BookmarkRespDto
 - 북마크 상세 엔티티 구현
  - BookmarkDetailEntity
- 북마크 상세 dto 구현
  - BookmarkDetailCreateDto
  - BookmarkDetailRespDto


![스크린샷 2024-08-15 오후 8 26
30](https://github.com/user-attachments/assets/a8fd7e0b-02ad-4e35-b55b-b067c93a0767)

북마크 상세의 type에 따라 버스와 지하철 둘중 하나 정보만 입력하는 방향으로 가려고 함.
(이후 NoSQL DB 도입을 고려)

버스의 경우 BusRouteStation에서 정보를 가져오기에 연관관계를 맺어도 크게 문제 없지만,
지하철의 경우 SubwayStation에서 정보를 얻는것이 아닌, SubwayConfusion, SubwayTimeTable에서
정보를 가져와야하기때문에, 추가적인 조회(select)가 불가피한 상황
이런경우 연관관계를 맺는것이 의미가 적다고 생각하여 북마크 상세에서 BusRouteStation, SubwayStation과의
연관관계를 맺지 않고 일단 id를 직접 가지고 있게 변경
=> 8/16(금) 연관관계에 대한 짧은 논의 필요

close Kernel360#64

* [FEAT BusReview api 형식에 맞춘 변경 + VO / DTO refactoring (Kernel360#76)

## 작업 내용
### Validator 분리
- ContentAccessValidator 분리
  - 해당 Validator 에서 Filter 단에서 검증하지 못하는 Access 에 대한 부분을 검증

### VO 분리
- 객체를 명확하게 나타내기 위해 VO 로 `Rating` `ReviewContent` 분리
  - `ReviewContent` 의 경우 리뷰 과정에서 함께 논의가 필요 (일단 시도..)
- `Rating` 객체에서는 Rating 에 대한 책임을 가지며, Rating 생성 실패시
`InvalidTypeException` 을 상속한 `InvalidRatingException` throw
  - DB, json converting 을 위한 Converter class 생성

### Exception 처리
- Controller 에서 Service 단의 Exception 을 처리하고 적절한 response 을 하도록 함.

### Dto 분리
- BusReviewReqDto 에서는 단순히 string 으로 유연하게 값을 가져오며, 이는 BusReviewDto 에 VO
타입으로 전환하며 타입을 명확하게 체크함.

### Review 관련 테스트 재작성
- service 단에서 사용해야하는 method / validator 를 명확하게 사용하고 있는지에 중점을 가지고 테스트를
수행함.

Closes Kernel360#72

* [FIX]: TimeSlot conversion 이 get method에서 변경되지 않은 문제 해결 (Kernel360#79)

- TimeSlot Converstion을 code 기반으로 하고 있던 문제를 해결함.

* [FIX] Enum code Exception 변경 및 Timeslot enum code 제거 (Kernel360#80)

- InvalidEnumCodeException 추가 및 EnumCodeConverterUtils 에서 해당 code throw
하도록 변경
- TimeSlot 에서 Code 관련된 부분 모두 제거 및 수정
- RestControllerAdvice 에서 InvalidEnumCodeException 에 대해서 500 response 처리

* [FEAT] 지하철 역 관련 코드 구현 (Kernel360#82)

## 작업내용 Kernel360#59 
- 지하철 역 컨트롤러 구현
- 지하철 역 서비스 및 dto 추가 및 리팩토링
- Enum 리팩토링 및 테스트 코드 추가
- Exception 처리 변경

* [REFACTOR]: User 관련 부분 VO / Exception refactor (Kernel360#83)

## 작업내용
- User 내 Nickname / Email VO 객체로 변경
  - VO 객체 변경에 따른 DTO 변경
  - Converter 추가
  - 관련 부분 수정 (OAuth)
- Controller 에서 exception handling 이후 response 하도록 변경
  - 변경된 Response 규칙에 따라 response

Closes Kernel360#77

* [FEAT] 북마크 서비스 구현 (Kernel360#81)

- BookmarkService
- BookmarkRepository
- BookmarkDetailRepository

* [FEAT] 북마크 컨트롤러 구현 및 TransportType Enum 리팩토링 (Kernel360#86)

- 북마크 컨트롤러 구현
  - `GET` `/bookmark` : 본인이 작성한 북마크 리스트 반환
  - `GET` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 조회
  - `POST` `/bookmark` : 북마크 생성
  - `DELETE` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 삭제
  -  `PUT` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 수정

- 북마크 서비스 수정
  - `getBookmarkById` 메소드에서 본인이 작성한 북마크만 조회하도록 수정 
  - 북마크 서비스 메소드 순서 변경 : get, create, update, delete 순서
  - 메소드 파라미터 순서 수정 : dto, userId, bookmarkId 순서
- 받아야하는 파라미터가 늘어날수록 코드 가독성이 나빠질 수 있음 -> 추후 service단에서 사용할 dto를 분리하도록
리팩토링 고려

- TransportType Enum 리팩토링
- `BookmarkRespDto` 에서 `TransportType`를 `String`이 아닌 `enum`으로 반환하도록 리팩토링
  - `TransportType`에서 `name` 필드가 불필요하다고 생각되어 삭제

close Kernel360#84

* [FEAT] 지하철 혼잡도 관련 코드 구현 (Kernel360#85)

## 작업내용 Kernel360#59 
- 지하철 혼잡도 컨트롤러 구현
- 지하철 혼잡도 서비스 리팩토링
- Exception 처리 변경

* [FEAT] 지하철 리뷰 관련 구현 (Kernel360#90)

## 작업내용
- schema.sql, add_constraints.sql에 지하철 관련 ddl 추가
- 지하철 리뷰 컨트롤러, 서비스, 레포지토리 , 엔티티, DTO, Exception 구현
- 테스트코드 작성

Closes Kernel360#55

* [FEAT] 지하철 시간표 관련 코드 구현 (Kernel360#88)

## 작업내용
- 지하철 시간표 컨트롤러 구현
- 지하철 시간표 서비스 구현
- 지하철 시간표 레포지토리 구현
- Custom Exception 구현
- 테스트 코드 작성

Closes Kernel360#59 
Closes Kernel360#73

* [FEAT] ApiClientException 추가 (Kernel360#94)

Closes Kernel360#93

* [REFACTOR]: 버스 도메인 리팩토링 (Kernel360#95)

## 작업내용
- 버스 컨트롤러, 서비스 리팩토링
- 경류 정류장 테이블 저장 시 apiXXXId로 넘기던 것 XXXId로 변경
  - 서비스 내에서 사용하는 정보는 apiXXXId가 아닌 XXXId
  - apiXXXId의 경우는 공공 데이터에서 받아온 데이터
- ResponseDto에서 apiXXXId 필드 추가
  - 다른 서비스에서 필요한 데이터
- Exception 추가 및 패키지 변경
  - busReview에 있던 bus 도메인 exception을 bus 패키지 하위로 변경

Closes Kernel360#91

---------

Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 버스 위치 정보 수집 스케줄러 구현 (Kernel360#96)

## 작업 내용
- 최대한 유연하게 Scheduler 를 구현함
  - 추후에 변경 가능성 있는 class 모두 interface 분리
  - Application.yaml 을 통해서 설정을 변경가능하도록 설정함.

Closes Kernel360#92

* [FEAT] 권한별 API 접근 제한 및 개발용 세션 구현 (Kernel360#100)

## 작업내용
- 권한 별 API Path 접근 제어 설정
  - `@Secured`를 사용하여 security session의 권한 확인 후 접근 제한
- 개발용 세션 구현
  - OAuth2.0을 통하지 않고 `USER`, `ADMIN` 권한을 가질 수 있는 개발용 세션 구현
- AuthRole과 Grade enum 통합
- oauth 패키지의 AuthRole enum과 user 패키지의 Grade enum의 중복으로 인해 AuthRole로 통합 및
Grade 삭제

Closes Kernel360#97 
Closes Kernel360#98 
Closes Kernel360#99

* [FEAT] Exception Handler 에서 Exception.class 에 대한 처리 (Kernel360#105)

Closes Kernel360#101

* [FEAT] HTTP Request / Response 기본 logging (Kernel360#107)

## 결과 예시

![image](https://github.com/user-attachments/assets/15a49bf0-4b69-40a8-b45e-d1cd4edbad6d)

## 작업 내용
- Logging Filter 추가
  - OncePerRequestFilter 적용 (Filter 두번 타는 경우 방지)
  - 총 지연시간 ms 로 표현
  - Security 보다 먼저 거치도록 가장 Order 를 높게 잡음.

Closes Kernel360#106

* [REVERT] "[FEAT] Exception Handler 에서 Exception.class 에 대한 처리" (Kernel360#108)

## Revert 사유
- Exception handling 과정에서, 해당 시점에 catch 되지 말아야할 error (`@Secured` 에러와 같은
것들) 까지 catch 되어 처리되고 있음.

Reverts Kernel360#105

* [FIX] Bookmark 관련 오류 수정 (Kernel360#109)

## 작업 내용
- `/api` 가 빠진 문제 수정
- `@RequestBody` 빠진 문제 수정 및 `@Valid` (name 길이) 추가
- `DuplicatedBookmarkNameException` 추가

* [FEAT] Controller 에 대한 권한 제어 재작성 (Kernel360#111)

## 작업 내용
- SecurityConfig + `@Secure` 활용하여 권한 제어
- `Authenticate` 필요한 부분 -> `config` 에서 `.authenticated()`처리
- `Authorization` 필요한 부분 -> `@Secure` 로 권한 명시

* [FEAT] Springdoc OpenAPI 적용 (Kernel360#117)

## 작업 내역
- springdoc 적용
- 각 API 에 대해서 springdoc annotation 이용하여 api 명세 작성
  - Controller 에 대해서 interface 적용하여 구현

https://app.swaggerhub.com/apis/SUNGJUN/TALKKA/1.0.0

* [FEAT] FE 리뷰 / 경로 조회 (기초) (Kernel360#118)

## 작업 내용
- 경로 북마크 조회
- 리뷰 조회
- 내정보 조회 / 수정
- 로그인 / 로그아웃
- API 생성을 open api 명세 바탕으로 자동화


(아직 한참 남았음 / 상태 공유를 위한 merge)

* [FEAT] 버스 실시간 도착 정보 연동 및 구현 (Kernel360#121)

## 작업 내용
- [x] DTO 구현
- [x] BusApiService 에 method 추가
- [x] SimpleBusApiService 에 구현 추가
- [x] CachedStorage interface 작성
- [x] CachedStorage 구현체 (memory based / time expire 가능) 구현

## 캐시 사용시 변화 시간
- 1분 간격 캐싱 (동일 노선 정류장에 대한 조회시 1분에 한번 request 사용)
  - 1s -> 50ms

## NOTE
- 작업양이 꽤 되니, commit 단위로 리뷰하시면 편합니다.

Closes Kernel360#120

* feature: EC2 환경 구성 및 CI/CD 구현

- server를 컨테이너로 올리기 위해 docker compose에 작성
- nginx 및 ssl인증(certbot)을 위해 docker compose에 작성
- ssl 인증을 위한 init-letsencrypt.sh 작성
- Github Action을 통해 CI / CD를 위한 gradle-build.yml 작성

* feature: PR시 작동 제거 및 태그 추가

* feature: test

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Gyaak <[email protected]>
ss0ngcode added a commit to ss0ngcode/E2E2-TALKKA that referenced this pull request Aug 28, 2024
* feature: EC2 환경 구성 및 CI/CD 구현

- server를 컨테이너로 올리기 위해 docker compose에 작성
- nginx 및 ssl인증(certbot)을 위해 docker compose에 작성
- ssl 인증을 위한 init-letsencrypt.sh 작성
- Github Action을 통해 CI / CD를 위한 gradle-build.yml 작성

* feature: PR시 작동 제거 및 태그 추가

* Feature/Kernel360#123 (#1)

* feat: IntelliJ 협업용 Naver hackday 포매터 / 체크스타일 설정파일 추가

* feat: 스프링 프로젝트 초기화

* feat: mysql docker compose 설정

* fix: build.gradle 오탈자 수정

* Update issue templates

* fix: .env.sample DB 불일치 수정 (#12) (#13)

.env.sample MYSQL_URL 변경

**반드시 해당 커밋 pull 이후 .env 파일 수정할 것!!!!**

Closes: #12

* feat: 유저 도메인 엔티티 작성

- UserEntity 생성
- UserRepository 생성
- JPA auditing을 위한 ServerApplication에 @EntityListeners(AuditingEntityListener.class) 추가

Closes #6

* �docs: README.md

* feat: #14 PR 리뷰내용 반영

- @table 삭제 및 @column에 name 속성 추가
- BIGINT(32) => BIGINT 변경
- varchar 타입 columnDefinition 제거 및 length 추가
- PK updatable 삭제
- @EnableJpaAuditing 삭제
- created_at, updated_at 오탈자 수정

Closes #14

* feat: application.yaml 수정

- application.yaml 수정

* [FEAT] 버스 도메인 entity 작성 및 repository 작성 (#15)

## 작업 내용
- BusRouteEntity
- BusLocationEntity
- BusRouteStationEntity

## 특이사항
- Java 내에서는 ENUM 으로 표현하고 DB 에서는 실제로 가져오는 값을 바탕으로 바라볼 수 있도록 ENUM 을 생성하되,
`@Convert` 를 사용함
- (아직 잘 모르는 부분이라 학습이 필요함)

* feat: #14 PR 리뷰내용 반영

- created_at, updated_at 오탈자 재수정

Closes #14

* chore: gitignore mysql data 추가

* feat: BusRouteStationEntity 분리

* feat: BusRouteStationRepository 추가

* feat: BusLocation - BusRoute 연관관계 설정

* feat: BusStation - BusRouteStation - BusRoute 연관관계 설정

BusStation -> BusRouteStation 으로 타고 들어갈 일이 없기 때문에, 단방향 매핑함.

* feat: 리뷰 관련 연관관계 설정

* refactor: format / import 최적화

* refactor: 중복되는 변수명 수정

* [FEAT] 예외 처리 및 Exception Base 구현 (#18)

#16 
- HTTP Exception 구현
- DomainException -> CustomException 으로 구현
- 각 Exception을 처리할 수 있는 ControllerAdvice 구현

* fix: ApiRespDto 변경사항 누락 반영

* [FIX] BusReviewEntity에서 station_id 삭제

테이블 분할 시 station_id 삭제를 누락하여 삭제처리

* [FIX] BusRouteStationRepository에 JpaRepository extends 추가

BusRouteStationRepository에 JpaRepository extends가 누락되어 추가

* [FEAT] UserService 구현 (#27)

## 작업내용
- CRUD + isDuplicatedNickname 구현
- Entity 의 Grade Enum 으로 변경

(테스트 코드 참고)

#20 (진행중 - Service / 변경사항 미리 반영)

* [FEAT] PR 빌드 체크봇 추가 (#30)

- Github action 시에 build check를 하는 봇 추가입니다.

* [FEAT] 네이버 소셜 인증 구현 #9 (Kernel360#31)

- 네이버 소셜 인증 구현
- @JuneParkCode 의 코드와 병합하기 위한 작업

* [FIX] 네이버 인증 구현 누락 수정 #9 (Kernel360#32)

- OAuth관련 코드가 누락된 부분이 있어 다시 올립니다.

* [FEAT] 네이버 소셜 로그인 구현 (Kernel360#36)

- 로그인 흐름
  1. 홈페이지 접속
  2. 비로그인사용자일 경우 자동으로 로그인 페이지로 이동
  3. 소설인증(네이버)
  4. 로그인
    - DB에 회원정보가 있을 경우 로그인 완료
    - DB에 회원정보가 없을 경우 회원가입 폼으로 이동
  
- 소셜인증만 하고 회원가입 폼을 작성하지 않은 경우 회원가입 폼 이외의 페이지에 접속 불가능

* [FIX] 빌드 봇 캐싱 문제 해소 (Kernel360#37)

- restore key 의 문제로 인한 캐싱 실패 문제 해소입니다. (바로 merge 합니다.)

* [FIX] userId OAuth2User 에서 누락된 문제 해결 (Kernel360#39)

## 작업 내용
- userId 누락된 부분 해결

## NOTE
- CustomOAuth2Service 쪽에서 코드가 햇갈려서 조금 리팩터링했습니다. (optional 처리 부분에서 이름이
햇갈려가지고...)
- 아직 이쪽 코드에 대해서 이해가 부족해서 제대로된 리팩터링은  나중에 해결해보는게 좋을 것 같습니다.

* [FEAT] 버스 관련 리뷰 CRUD 추가 (Kernel360#33)

- 버스 리뷰 조회 (버스, 정류장, 시간대 옵션)
- 버스 리뷰 생성
- 버스 리뷰 수정 (리뷰, 시간대, 별점 옵션)
- 버스 리뷰 삭제

#8 (지하철은 아직 미구현)

---------

Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 유저 CRUD 구현 + 내 정보 API 구현 (Kernel360#34)

## 작업 내용
- 단순 User CRUD 구현 (`/api/users/`)
- 내 정보 API 반영 (`/api/users/me`)
- `MethodArgumentNotValidException` 에대한 Exception Handling 추가
- .env 에 대해 gitignore 추가

Closes #20

* [REFACTOR] Code 형식으로 저장되는 Enum 리팩토링 (Kernel360#40)

## 작업내용
(아침에 @ss0ngcode 님이 추천해주신 게시글 보고 리팩터링함)
- EnumCodeConverterUtils 추가
- EnumCodeConverter 추가
- EnumCodeConverter 상속하여 Converter 작성하도록 변경
- Code 를 사용하는 Enum의 경우 EnumCodeInterface 작성

## 변경 후 효과
- 공공 API 로부터 획득하는 Response 의 경우 code - enum 으로 연결되는데, 해당 Converter 에서의
코드 중복을 막을 수 있음.

(리팩터링이라서 천천히 나중에 리뷰해주셔도 됩니다!!)

Closes #17

* [FEAT] 버스관련 API 구현 (Kernel360#43)

- 노선 검색 API
- 노선 등록 service
- 정류장 검색 service
- 정류장 등록 service
- 노선별 경유 정류장 검색 service
- 노선별 경유 정류장 등록 service

* [REFACTOR] #8 busReview 관련 validate 추가 및 TimeSlot Enum 변경 (Kernel360#42)

#8 추가 수정 사항

## 작업내용
- controller에서 userId @AuthenticationPrincipal를 통해 받아오도록 수정
- BusReviewReqDto validation 추가
- service에서 작성자 일치여부 검증로직 추가
- service 변경에 따른 test 코드 변경
- TimeSlot Enum Type으로 변경

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>

* [FEAT] Kernel360#48 수도권 지하철 역 정보 csv 파일 생성 (Kernel360#49)

- Kernel360#48 지하철 역 정보 CSV 파일 추가

* [FEAT] 버스 노선, 정류장, 노선정류장 서비스 테스트 추가 (Kernel360#50)

- BusRouteServiceTest 작성
- BusStationServiceTest 작성
- BusRouteStationServiceTest 작성
- 테스트를 위한 entity, dto factory : BusFactory 추가

---------

Co-authored-by: Photogrammer <[email protected]>

* [FIX] dto 클래스 record 타입으로 리팩토링 (Kernel360#53)

## dto 클래스 record 타입으로 리팩토링 및 그에따른 service와 test 코드 수정
- BusRouteCreateDto
- BusRouteRespDto
- BusStationCreateDto
- BusStationRespDto
- BusRouteStationCreateDto
- BusRouteStationRespDto
- BusReviewReqDto
- BusReviewRespDto
- UserCreateDto
- UserCreateReqDto
- UserDto
- UserRespDto
- UserUpdateReqDto

## record타입은 getter 메소드가 필드명으로 생성됨
- getName() [x]
- name() [o]

Closes Kernel360#52

* [FEAT]: 소셜 로그인 과정 FE와 통합 (Kernel360#51)

- Security OAuth 경로 변경
- AuthRole 로 refactor
- UnregisteredUserFilter refactor

Closes Kernel360#47

* [FEAT] 지하철에 관련된 엔티티 생성 및 레포지토리 구현 (Kernel360#58)

- 지하철 역 엔티티 구현
- 지하철 혼잡도 엔티티 구현
- 지하철 시간표 엔티티 구현
- 각 레포지토리 구현

Closes Kernel360#56 

**현재까지 진행내용 merge하여 충돌 해결**

* [FEAT] BusApiService 구현 (Kernel360#62)

## 작업 내용
- 가장 간단한 형태의 구현
- ApiKeyProperty interface
- BusApiKeyProperty
- PublicBusApiResp interface

## NOTE
- 240809 에 정해둔 형태의 가장 간단한 형태의 구현입니다. (에러 핸들링 없음)
- FE 작업 중에 데이터 주입이 급해서 작성되었습니다.
  - 버스 노선 정보 획득 필요 (검색 기능쪽에서)
- 버스 노선 정보가 총 5천개 가량되는데, 이를 정적 데이터로 획득하기 위한 방법이 필요합니다. (하나씩 가져와야하여 5일가량
소요됨)

* [FEAT] 버스 관련 컨트롤러 구현 (Kernel360#63)

## 작업내용 Kernel360#54 
- �버스 노선 컨트롤러 구현
- 버스 정거장 컨트롤러 구현
- 버스 노선-정거장 컨트롤러 구현

* [FEAT] FE 통합에 따른 API 변경 (Kernel360#65) (Kernel360#66)

## 작업 내용
- BusReviewRespDto 변경
- BusRouteStationRespDto 변경

* [FEAT] 지하철 역 조회 & 혼잡도 조회 서비스 구현 (Kernel360#60)

## 작업내용 Kernel360#59 
- 지하철 역 조회 서비스 구현
- 지하철 혼잡도 조회 서비스 구현
- Entity 수정사항 반영

* [FIX] YN Enum Error / RouteStation Controller Error / Like Query Error (Kernel360#69)

## 수정 전 기능
- ENUM YN 에 대해서 "0", "1" 처리
- BusRouteStationController @service 어노테이션으로 되어있는 문제
- `Like` 쿼리

## 수정 후 기능
- "Y" "N" 처리
- @RestController 적용
- `StartWIth` 쿼리

## 수정 의도
- 버그 수정

Closes Kernel360#68

* [FEAT] 버스 관련 정적데이터 가공 (Kernel360#71)

## 버스 관련 정적데이터 가공
- 버스 노선 정보(bus_route.csv)
- 버스 노선-정거장 정보(bus_route_station.csv)
- 버스 정거장 정보(bus_station.csv)

## DB SQL 코드 작성
- Schema.sql 작성
- csv 파일 load data 스크립트 작성
- api_route_id, api_station_id -> route_id, station_id 매칭
- db 초기화 스크립트 작성

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 북마크 엔티티 및 dto 구현 (Kernel360#74)

- 북마크 엔티티 구현
  - BookmarkEntity
- 북마크 dto 구현
  - BookmarkCreateDto
  - BookmarkRespDto
 - 북마크 상세 엔티티 구현
  - BookmarkDetailEntity
- 북마크 상세 dto 구현
  - BookmarkDetailCreateDto
  - BookmarkDetailRespDto


![스크린샷 2024-08-15 오후 8 26
30](https://github.com/user-attachments/assets/a8fd7e0b-02ad-4e35-b55b-b067c93a0767)

북마크 상세의 type에 따라 버스와 지하철 둘중 하나 정보만 입력하는 방향으로 가려고 함.
(이후 NoSQL DB 도입을 고려)

버스의 경우 BusRouteStation에서 정보를 가져오기에 연관관계를 맺어도 크게 문제 없지만,
지하철의 경우 SubwayStation에서 정보를 얻는것이 아닌, SubwayConfusion, SubwayTimeTable에서
정보를 가져와야하기때문에, 추가적인 조회(select)가 불가피한 상황
이런경우 연관관계를 맺는것이 의미가 적다고 생각하여 북마크 상세에서 BusRouteStation, SubwayStation과의
연관관계를 맺지 않고 일단 id를 직접 가지고 있게 변경
=> 8/16(금) 연관관계에 대한 짧은 논의 필요

close Kernel360#64

* [FEAT BusReview api 형식에 맞춘 변경 + VO / DTO refactoring (Kernel360#76)

## 작업 내용
### Validator 분리
- ContentAccessValidator 분리
  - 해당 Validator 에서 Filter 단에서 검증하지 못하는 Access 에 대한 부분을 검증

### VO 분리
- 객체를 명확하게 나타내기 위해 VO 로 `Rating` `ReviewContent` 분리
  - `ReviewContent` 의 경우 리뷰 과정에서 함께 논의가 필요 (일단 시도..)
- `Rating` 객체에서는 Rating 에 대한 책임을 가지며, Rating 생성 실패시
`InvalidTypeException` 을 상속한 `InvalidRatingException` throw
  - DB, json converting 을 위한 Converter class 생성

### Exception 처리
- Controller 에서 Service 단의 Exception 을 처리하고 적절한 response 을 하도록 함.

### Dto 분리
- BusReviewReqDto 에서는 단순히 string 으로 유연하게 값을 가져오며, 이는 BusReviewDto 에 VO
타입으로 전환하며 타입을 명확하게 체크함.

### Review 관련 테스트 재작성
- service 단에서 사용해야하는 method / validator 를 명확하게 사용하고 있는지에 중점을 가지고 테스트를
수행함.

Closes Kernel360#72

* [FIX]: TimeSlot conversion 이 get method에서 변경되지 않은 문제 해결 (Kernel360#79)

- TimeSlot Converstion을 code 기반으로 하고 있던 문제를 해결함.

* [FIX] Enum code Exception 변경 및 Timeslot enum code 제거 (Kernel360#80)

- InvalidEnumCodeException 추가 및 EnumCodeConverterUtils 에서 해당 code throw
하도록 변경
- TimeSlot 에서 Code 관련된 부분 모두 제거 및 수정
- RestControllerAdvice 에서 InvalidEnumCodeException 에 대해서 500 response 처리

* [FEAT] 지하철 역 관련 코드 구현 (Kernel360#82)

## 작업내용 Kernel360#59 
- 지하철 역 컨트롤러 구현
- 지하철 역 서비스 및 dto 추가 및 리팩토링
- Enum 리팩토링 및 테스트 코드 추가
- Exception 처리 변경

* [REFACTOR]: User 관련 부분 VO / Exception refactor (Kernel360#83)

## 작업내용
- User 내 Nickname / Email VO 객체로 변경
  - VO 객체 변경에 따른 DTO 변경
  - Converter 추가
  - 관련 부분 수정 (OAuth)
- Controller 에서 exception handling 이후 response 하도록 변경
  - 변경된 Response 규칙에 따라 response

Closes Kernel360#77

* [FEAT] 북마크 서비스 구현 (Kernel360#81)

- BookmarkService
- BookmarkRepository
- BookmarkDetailRepository

* [FEAT] 북마크 컨트롤러 구현 및 TransportType Enum 리팩토링 (Kernel360#86)

- 북마크 컨트롤러 구현
  - `GET` `/bookmark` : 본인이 작성한 북마크 리스트 반환
  - `GET` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 조회
  - `POST` `/bookmark` : 북마크 생성
  - `DELETE` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 삭제
  -  `PUT` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 수정

- 북마크 서비스 수정
  - `getBookmarkById` 메소드에서 본인이 작성한 북마크만 조회하도록 수정 
  - 북마크 서비스 메소드 순서 변경 : get, create, update, delete 순서
  - 메소드 파라미터 순서 수정 : dto, userId, bookmarkId 순서
- 받아야하는 파라미터가 늘어날수록 코드 가독성이 나빠질 수 있음 -> 추후 service단에서 사용할 dto를 분리하도록
리팩토링 고려

- TransportType Enum 리팩토링
- `BookmarkRespDto` 에서 `TransportType`를 `String`이 아닌 `enum`으로 반환하도록 리팩토링
  - `TransportType`에서 `name` 필드가 불필요하다고 생각되어 삭제

close Kernel360#84

* [FEAT] 지하철 혼잡도 관련 코드 구현 (Kernel360#85)

## 작업내용 Kernel360#59 
- 지하철 혼잡도 컨트롤러 구현
- 지하철 혼잡도 서비스 리팩토링
- Exception 처리 변경

* [FEAT] 지하철 리뷰 관련 구현 (Kernel360#90)

## 작업내용
- schema.sql, add_constraints.sql에 지하철 관련 ddl 추가
- 지하철 리뷰 컨트롤러, 서비스, 레포지토리 , 엔티티, DTO, Exception 구현
- 테스트코드 작성

Closes Kernel360#55

* [FEAT] 지하철 시간표 관련 코드 구현 (Kernel360#88)

## 작업내용
- 지하철 시간표 컨트롤러 구현
- 지하철 시간표 서비스 구현
- 지하철 시간표 레포지토리 구현
- Custom Exception 구현
- 테스트 코드 작성

Closes Kernel360#59 
Closes Kernel360#73

* [FEAT] ApiClientException 추가 (Kernel360#94)

Closes Kernel360#93

* [REFACTOR]: 버스 도메인 리팩토링 (Kernel360#95)

## 작업내용
- 버스 컨트롤러, 서비스 리팩토링
- 경류 정류장 테이블 저장 시 apiXXXId로 넘기던 것 XXXId로 변경
  - 서비스 내에서 사용하는 정보는 apiXXXId가 아닌 XXXId
  - apiXXXId의 경우는 공공 데이터에서 받아온 데이터
- ResponseDto에서 apiXXXId 필드 추가
  - 다른 서비스에서 필요한 데이터
- Exception 추가 및 패키지 변경
  - busReview에 있던 bus 도메인 exception을 bus 패키지 하위로 변경

Closes Kernel360#91

---------

Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 버스 위치 정보 수집 스케줄러 구현 (Kernel360#96)

## 작업 내용
- 최대한 유연하게 Scheduler 를 구현함
  - 추후에 변경 가능성 있는 class 모두 interface 분리
  - Application.yaml 을 통해서 설정을 변경가능하도록 설정함.

Closes Kernel360#92

* [FEAT] 권한별 API 접근 제한 및 개발용 세션 구현 (Kernel360#100)

## 작업내용
- 권한 별 API Path 접근 제어 설정
  - `@Secured`를 사용하여 security session의 권한 확인 후 접근 제한
- 개발용 세션 구현
  - OAuth2.0을 통하지 않고 `USER`, `ADMIN` 권한을 가질 수 있는 개발용 세션 구현
- AuthRole과 Grade enum 통합
- oauth 패키지의 AuthRole enum과 user 패키지의 Grade enum의 중복으로 인해 AuthRole로 통합 및
Grade 삭제

Closes Kernel360#97 
Closes Kernel360#98 
Closes Kernel360#99

* [FEAT] Exception Handler 에서 Exception.class 에 대한 처리 (Kernel360#105)

Closes Kernel360#101

* [FEAT] HTTP Request / Response 기본 logging (Kernel360#107)

## 결과 예시

![image](https://github.com/user-attachments/assets/15a49bf0-4b69-40a8-b45e-d1cd4edbad6d)

## 작업 내용
- Logging Filter 추가
  - OncePerRequestFilter 적용 (Filter 두번 타는 경우 방지)
  - 총 지연시간 ms 로 표현
  - Security 보다 먼저 거치도록 가장 Order 를 높게 잡음.

Closes Kernel360#106

* [REVERT] "[FEAT] Exception Handler 에서 Exception.class 에 대한 처리" (Kernel360#108)

## Revert 사유
- Exception handling 과정에서, 해당 시점에 catch 되지 말아야할 error (`@Secured` 에러와 같은
것들) 까지 catch 되어 처리되고 있음.

Reverts Kernel360#105

* [FIX] Bookmark 관련 오류 수정 (Kernel360#109)

## 작업 내용
- `/api` 가 빠진 문제 수정
- `@RequestBody` 빠진 문제 수정 및 `@Valid` (name 길이) 추가
- `DuplicatedBookmarkNameException` 추가

* [FEAT] Controller 에 대한 권한 제어 재작성 (Kernel360#111)

## 작업 내용
- SecurityConfig + `@Secure` 활용하여 권한 제어
- `Authenticate` 필요한 부분 -> `config` 에서 `.authenticated()`처리
- `Authorization` 필요한 부분 -> `@Secure` 로 권한 명시

* [FEAT] Springdoc OpenAPI 적용 (Kernel360#117)

## 작업 내역
- springdoc 적용
- 각 API 에 대해서 springdoc annotation 이용하여 api 명세 작성
  - Controller 에 대해서 interface 적용하여 구현

https://app.swaggerhub.com/apis/SUNGJUN/TALKKA/1.0.0

* [FEAT] FE 리뷰 / 경로 조회 (기초) (Kernel360#118)

## 작업 내용
- 경로 북마크 조회
- 리뷰 조회
- 내정보 조회 / 수정
- 로그인 / 로그아웃
- API 생성을 open api 명세 바탕으로 자동화


(아직 한참 남았음 / 상태 공유를 위한 merge)

* [FEAT] 버스 실시간 도착 정보 연동 및 구현 (Kernel360#121)

## 작업 내용
- [x] DTO 구현
- [x] BusApiService 에 method 추가
- [x] SimpleBusApiService 에 구현 추가
- [x] CachedStorage interface 작성
- [x] CachedStorage 구현체 (memory based / time expire 가능) 구현

## 캐시 사용시 변화 시간
- 1분 간격 캐싱 (동일 노선 정류장에 대한 조회시 1분에 한번 request 사용)
  - 1s -> 50ms

## NOTE
- 작업양이 꽤 되니, commit 단위로 리뷰하시면 편합니다.

Closes Kernel360#120

* feature: EC2 환경 구성 및 CI/CD 구현

- server를 컨테이너로 올리기 위해 docker compose에 작성
- nginx 및 ssl인증(certbot)을 위해 docker compose에 작성
- ssl 인증을 위한 init-letsencrypt.sh 작성
- Github Action을 통해 CI / CD를 위한 gradle-build.yml 작성

* feature: PR시 작동 제거 및 태그 추가

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Gyaak <[email protected]>

* feature: test

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Gyaak <[email protected]>
ss0ngcode added a commit to ss0ngcode/E2E2-TALKKA that referenced this pull request Aug 28, 2024
* feat: IntelliJ 협업용 Naver hackday 포매터 / 체크스타일 설정파일 추가

* feat: 스프링 프로젝트 초기화

* feat: mysql docker compose 설정

* fix: build.gradle 오탈자 수정

* Update issue templates

* fix: .env.sample DB 불일치 수정 (#12) (#13)

.env.sample MYSQL_URL 변경

**반드시 해당 커밋 pull 이후 .env 파일 수정할 것!!!!**

Closes: #12

* feat: 유저 도메인 엔티티 작성

- UserEntity 생성
- UserRepository 생성
- JPA auditing을 위한 ServerApplication에 @EntityListeners(AuditingEntityListener.class) 추가

Closes #6

* �docs: README.md

* feat: #14 PR 리뷰내용 반영

- @table 삭제 및 @column에 name 속성 추가
- BIGINT(32) => BIGINT 변경
- varchar 타입 columnDefinition 제거 및 length 추가
- PK updatable 삭제
- @EnableJpaAuditing 삭제
- created_at, updated_at 오탈자 수정

Closes #14

* feat: application.yaml 수정

- application.yaml 수정

* [FEAT] 버스 도메인 entity 작성 및 repository 작성 (#15)

## 작업 내용
- BusRouteEntity
- BusLocationEntity
- BusRouteStationEntity

## 특이사항
- Java 내에서는 ENUM 으로 표현하고 DB 에서는 실제로 가져오는 값을 바탕으로 바라볼 수 있도록 ENUM 을 생성하되,
`@Convert` 를 사용함
- (아직 잘 모르는 부분이라 학습이 필요함)

* feat: #14 PR 리뷰내용 반영

- created_at, updated_at 오탈자 재수정

Closes #14

* chore: gitignore mysql data 추가

* feat: BusRouteStationEntity 분리

* feat: BusRouteStationRepository 추가

* feat: BusLocation - BusRoute 연관관계 설정

* feat: BusStation - BusRouteStation - BusRoute 연관관계 설정

BusStation -> BusRouteStation 으로 타고 들어갈 일이 없기 때문에, 단방향 매핑함.

* feat: 리뷰 관련 연관관계 설정

* refactor: format / import 최적화

* refactor: 중복되는 변수명 수정

* [FEAT] 예외 처리 및 Exception Base 구현 (#18)

#16 
- HTTP Exception 구현
- DomainException -> CustomException 으로 구현
- 각 Exception을 처리할 수 있는 ControllerAdvice 구현

* fix: ApiRespDto 변경사항 누락 반영

* [FIX] BusReviewEntity에서 station_id 삭제

테이블 분할 시 station_id 삭제를 누락하여 삭제처리

* [FIX] BusRouteStationRepository에 JpaRepository extends 추가

BusRouteStationRepository에 JpaRepository extends가 누락되어 추가

* [FEAT] UserService 구현 (#27)

## 작업내용
- CRUD + isDuplicatedNickname 구현
- Entity 의 Grade Enum 으로 변경

(테스트 코드 참고)

#20 (진행중 - Service / 변경사항 미리 반영)

* [FEAT] PR 빌드 체크봇 추가 (#30)

- Github action 시에 build check를 하는 봇 추가입니다.

* [FEAT] 네이버 소셜 인증 구현 #9 (Kernel360#31)

- 네이버 소셜 인증 구현
- @JuneParkCode 의 코드와 병합하기 위한 작업

* [FIX] 네이버 인증 구현 누락 수정 #9 (Kernel360#32)

- OAuth관련 코드가 누락된 부분이 있어 다시 올립니다.

* [FEAT] 네이버 소셜 로그인 구현 (Kernel360#36)

- 로그인 흐름
  1. 홈페이지 접속
  2. 비로그인사용자일 경우 자동으로 로그인 페이지로 이동
  3. 소설인증(네이버)
  4. 로그인
    - DB에 회원정보가 있을 경우 로그인 완료
    - DB에 회원정보가 없을 경우 회원가입 폼으로 이동
  
- 소셜인증만 하고 회원가입 폼을 작성하지 않은 경우 회원가입 폼 이외의 페이지에 접속 불가능

* [FIX] 빌드 봇 캐싱 문제 해소 (Kernel360#37)

- restore key 의 문제로 인한 캐싱 실패 문제 해소입니다. (바로 merge 합니다.)

* [FIX] userId OAuth2User 에서 누락된 문제 해결 (Kernel360#39)

## 작업 내용
- userId 누락된 부분 해결

## NOTE
- CustomOAuth2Service 쪽에서 코드가 햇갈려서 조금 리팩터링했습니다. (optional 처리 부분에서 이름이
햇갈려가지고...)
- 아직 이쪽 코드에 대해서 이해가 부족해서 제대로된 리팩터링은  나중에 해결해보는게 좋을 것 같습니다.

* [FEAT] 버스 관련 리뷰 CRUD 추가 (Kernel360#33)

- 버스 리뷰 조회 (버스, 정류장, 시간대 옵션)
- 버스 리뷰 생성
- 버스 리뷰 수정 (리뷰, 시간대, 별점 옵션)
- 버스 리뷰 삭제

#8 (지하철은 아직 미구현)

---------

Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 유저 CRUD 구현 + 내 정보 API 구현 (Kernel360#34)

## 작업 내용
- 단순 User CRUD 구현 (`/api/users/`)
- 내 정보 API 반영 (`/api/users/me`)
- `MethodArgumentNotValidException` 에대한 Exception Handling 추가
- .env 에 대해 gitignore 추가

Closes #20

* [REFACTOR] Code 형식으로 저장되는 Enum 리팩토링 (Kernel360#40)

## 작업내용
(아침에 @ss0ngcode 님이 추천해주신 게시글 보고 리팩터링함)
- EnumCodeConverterUtils 추가
- EnumCodeConverter 추가
- EnumCodeConverter 상속하여 Converter 작성하도록 변경
- Code 를 사용하는 Enum의 경우 EnumCodeInterface 작성

## 변경 후 효과
- 공공 API 로부터 획득하는 Response 의 경우 code - enum 으로 연결되는데, 해당 Converter 에서의
코드 중복을 막을 수 있음.

(리팩터링이라서 천천히 나중에 리뷰해주셔도 됩니다!!)

Closes #17

* [FEAT] 버스관련 API 구현 (Kernel360#43)

- 노선 검색 API
- 노선 등록 service
- 정류장 검색 service
- 정류장 등록 service
- 노선별 경유 정류장 검색 service
- 노선별 경유 정류장 등록 service

* [REFACTOR] #8 busReview 관련 validate 추가 및 TimeSlot Enum 변경 (Kernel360#42)

#8 추가 수정 사항

## 작업내용
- controller에서 userId @AuthenticationPrincipal를 통해 받아오도록 수정
- BusReviewReqDto validation 추가
- service에서 작성자 일치여부 검증로직 추가
- service 변경에 따른 test 코드 변경
- TimeSlot Enum Type으로 변경

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>

* [FEAT] Kernel360#48 수도권 지하철 역 정보 csv 파일 생성 (Kernel360#49)

- Kernel360#48 지하철 역 정보 CSV 파일 추가

* [FEAT] 버스 노선, 정류장, 노선정류장 서비스 테스트 추가 (Kernel360#50)

- BusRouteServiceTest 작성
- BusStationServiceTest 작성
- BusRouteStationServiceTest 작성
- 테스트를 위한 entity, dto factory : BusFactory 추가

---------

Co-authored-by: Photogrammer <[email protected]>

* [FIX] dto 클래스 record 타입으로 리팩토링 (Kernel360#53)

## dto 클래스 record 타입으로 리팩토링 및 그에따른 service와 test 코드 수정
- BusRouteCreateDto
- BusRouteRespDto
- BusStationCreateDto
- BusStationRespDto
- BusRouteStationCreateDto
- BusRouteStationRespDto
- BusReviewReqDto
- BusReviewRespDto
- UserCreateDto
- UserCreateReqDto
- UserDto
- UserRespDto
- UserUpdateReqDto

## record타입은 getter 메소드가 필드명으로 생성됨
- getName() [x]
- name() [o]

Closes Kernel360#52

* [FEAT]: 소셜 로그인 과정 FE와 통합 (Kernel360#51)

- Security OAuth 경로 변경
- AuthRole 로 refactor
- UnregisteredUserFilter refactor

Closes Kernel360#47

* [FEAT] 지하철에 관련된 엔티티 생성 및 레포지토리 구현 (Kernel360#58)

- 지하철 역 엔티티 구현
- 지하철 혼잡도 엔티티 구현
- 지하철 시간표 엔티티 구현
- 각 레포지토리 구현

Closes Kernel360#56 

**현재까지 진행내용 merge하여 충돌 해결**

* [FEAT] BusApiService 구현 (Kernel360#62)

## 작업 내용
- 가장 간단한 형태의 구현
- ApiKeyProperty interface
- BusApiKeyProperty
- PublicBusApiResp interface

## NOTE
- 240809 에 정해둔 형태의 가장 간단한 형태의 구현입니다. (에러 핸들링 없음)
- FE 작업 중에 데이터 주입이 급해서 작성되었습니다.
  - 버스 노선 정보 획득 필요 (검색 기능쪽에서)
- 버스 노선 정보가 총 5천개 가량되는데, 이를 정적 데이터로 획득하기 위한 방법이 필요합니다. (하나씩 가져와야하여 5일가량
소요됨)

* [FEAT] 버스 관련 컨트롤러 구현 (Kernel360#63)

## 작업내용 Kernel360#54 
- �버스 노선 컨트롤러 구현
- 버스 정거장 컨트롤러 구현
- 버스 노선-정거장 컨트롤러 구현

* [FEAT] FE 통합에 따른 API 변경 (Kernel360#65) (Kernel360#66)

## 작업 내용
- BusReviewRespDto 변경
- BusRouteStationRespDto 변경

* [FEAT] 지하철 역 조회 & 혼잡도 조회 서비스 구현 (Kernel360#60)

## 작업내용 Kernel360#59 
- 지하철 역 조회 서비스 구현
- 지하철 혼잡도 조회 서비스 구현
- Entity 수정사항 반영

* [FIX] YN Enum Error / RouteStation Controller Error / Like Query Error (Kernel360#69)

## 수정 전 기능
- ENUM YN 에 대해서 "0", "1" 처리
- BusRouteStationController @service 어노테이션으로 되어있는 문제
- `Like` 쿼리

## 수정 후 기능
- "Y" "N" 처리
- @RestController 적용
- `StartWIth` 쿼리

## 수정 의도
- 버그 수정

Closes Kernel360#68

* [FEAT] 버스 관련 정적데이터 가공 (Kernel360#71)

## 버스 관련 정적데이터 가공
- 버스 노선 정보(bus_route.csv)
- 버스 노선-정거장 정보(bus_route_station.csv)
- 버스 정거장 정보(bus_station.csv)

## DB SQL 코드 작성
- Schema.sql 작성
- csv 파일 load data 스크립트 작성
- api_route_id, api_station_id -> route_id, station_id 매칭
- db 초기화 스크립트 작성

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 북마크 엔티티 및 dto 구현 (Kernel360#74)

- 북마크 엔티티 구현
  - BookmarkEntity
- 북마크 dto 구현
  - BookmarkCreateDto
  - BookmarkRespDto
 - 북마크 상세 엔티티 구현
  - BookmarkDetailEntity
- 북마크 상세 dto 구현
  - BookmarkDetailCreateDto
  - BookmarkDetailRespDto


![스크린샷 2024-08-15 오후 8 26
30](https://github.com/user-attachments/assets/a8fd7e0b-02ad-4e35-b55b-b067c93a0767)

북마크 상세의 type에 따라 버스와 지하철 둘중 하나 정보만 입력하는 방향으로 가려고 함.
(이후 NoSQL DB 도입을 고려)

버스의 경우 BusRouteStation에서 정보를 가져오기에 연관관계를 맺어도 크게 문제 없지만,
지하철의 경우 SubwayStation에서 정보를 얻는것이 아닌, SubwayConfusion, SubwayTimeTable에서
정보를 가져와야하기때문에, 추가적인 조회(select)가 불가피한 상황
이런경우 연관관계를 맺는것이 의미가 적다고 생각하여 북마크 상세에서 BusRouteStation, SubwayStation과의
연관관계를 맺지 않고 일단 id를 직접 가지고 있게 변경
=> 8/16(금) 연관관계에 대한 짧은 논의 필요

close Kernel360#64

* [FEAT BusReview api 형식에 맞춘 변경 + VO / DTO refactoring (Kernel360#76)

## 작업 내용
### Validator 분리
- ContentAccessValidator 분리
  - 해당 Validator 에서 Filter 단에서 검증하지 못하는 Access 에 대한 부분을 검증

### VO 분리
- 객체를 명확하게 나타내기 위해 VO 로 `Rating` `ReviewContent` 분리
  - `ReviewContent` 의 경우 리뷰 과정에서 함께 논의가 필요 (일단 시도..)
- `Rating` 객체에서는 Rating 에 대한 책임을 가지며, Rating 생성 실패시
`InvalidTypeException` 을 상속한 `InvalidRatingException` throw
  - DB, json converting 을 위한 Converter class 생성

### Exception 처리
- Controller 에서 Service 단의 Exception 을 처리하고 적절한 response 을 하도록 함.

### Dto 분리
- BusReviewReqDto 에서는 단순히 string 으로 유연하게 값을 가져오며, 이는 BusReviewDto 에 VO
타입으로 전환하며 타입을 명확하게 체크함.

### Review 관련 테스트 재작성
- service 단에서 사용해야하는 method / validator 를 명확하게 사용하고 있는지에 중점을 가지고 테스트를
수행함.

Closes Kernel360#72

* [FIX]: TimeSlot conversion 이 get method에서 변경되지 않은 문제 해결 (Kernel360#79)

- TimeSlot Converstion을 code 기반으로 하고 있던 문제를 해결함.

* [FIX] Enum code Exception 변경 및 Timeslot enum code 제거 (Kernel360#80)

- InvalidEnumCodeException 추가 및 EnumCodeConverterUtils 에서 해당 code throw
하도록 변경
- TimeSlot 에서 Code 관련된 부분 모두 제거 및 수정
- RestControllerAdvice 에서 InvalidEnumCodeException 에 대해서 500 response 처리

* [FEAT] 지하철 역 관련 코드 구현 (Kernel360#82)

## 작업내용 Kernel360#59 
- 지하철 역 컨트롤러 구현
- 지하철 역 서비스 및 dto 추가 및 리팩토링
- Enum 리팩토링 및 테스트 코드 추가
- Exception 처리 변경

* [REFACTOR]: User 관련 부분 VO / Exception refactor (Kernel360#83)

## 작업내용
- User 내 Nickname / Email VO 객체로 변경
  - VO 객체 변경에 따른 DTO 변경
  - Converter 추가
  - 관련 부분 수정 (OAuth)
- Controller 에서 exception handling 이후 response 하도록 변경
  - 변경된 Response 규칙에 따라 response

Closes Kernel360#77

* [FEAT] 북마크 서비스 구현 (Kernel360#81)

- BookmarkService
- BookmarkRepository
- BookmarkDetailRepository

* [FEAT] 북마크 컨트롤러 구현 및 TransportType Enum 리팩토링 (Kernel360#86)

- 북마크 컨트롤러 구현
  - `GET` `/bookmark` : 본인이 작성한 북마크 리스트 반환
  - `GET` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 조회
  - `POST` `/bookmark` : 북마크 생성
  - `DELETE` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 삭제
  -  `PUT` `/bookmark/{bookmarkId}` : bookmarkId로 북마크 수정

- 북마크 서비스 수정
  - `getBookmarkById` 메소드에서 본인이 작성한 북마크만 조회하도록 수정 
  - 북마크 서비스 메소드 순서 변경 : get, create, update, delete 순서
  - 메소드 파라미터 순서 수정 : dto, userId, bookmarkId 순서
- 받아야하는 파라미터가 늘어날수록 코드 가독성이 나빠질 수 있음 -> 추후 service단에서 사용할 dto를 분리하도록
리팩토링 고려

- TransportType Enum 리팩토링
- `BookmarkRespDto` 에서 `TransportType`를 `String`이 아닌 `enum`으로 반환하도록 리팩토링
  - `TransportType`에서 `name` 필드가 불필요하다고 생각되어 삭제

close Kernel360#84

* [FEAT] 지하철 혼잡도 관련 코드 구현 (Kernel360#85)

## 작업내용 Kernel360#59 
- 지하철 혼잡도 컨트롤러 구현
- 지하철 혼잡도 서비스 리팩토링
- Exception 처리 변경

* [FEAT] 지하철 리뷰 관련 구현 (Kernel360#90)

## 작업내용
- schema.sql, add_constraints.sql에 지하철 관련 ddl 추가
- 지하철 리뷰 컨트롤러, 서비스, 레포지토리 , 엔티티, DTO, Exception 구현
- 테스트코드 작성

Closes Kernel360#55

* [FEAT] 지하철 시간표 관련 코드 구현 (Kernel360#88)

## 작업내용
- 지하철 시간표 컨트롤러 구현
- 지하철 시간표 서비스 구현
- 지하철 시간표 레포지토리 구현
- Custom Exception 구현
- 테스트 코드 작성

Closes Kernel360#59 
Closes Kernel360#73

* [FEAT] ApiClientException 추가 (Kernel360#94)

Closes Kernel360#93

* [REFACTOR]: 버스 도메인 리팩토링 (Kernel360#95)

## 작업내용
- 버스 컨트롤러, 서비스 리팩토링
- 경류 정류장 테이블 저장 시 apiXXXId로 넘기던 것 XXXId로 변경
  - 서비스 내에서 사용하는 정보는 apiXXXId가 아닌 XXXId
  - apiXXXId의 경우는 공공 데이터에서 받아온 데이터
- ResponseDto에서 apiXXXId 필드 추가
  - 다른 서비스에서 필요한 데이터
- Exception 추가 및 패키지 변경
  - busReview에 있던 bus 도메인 exception을 bus 패키지 하위로 변경

Closes Kernel360#91

---------

Co-authored-by: Photogrammer <[email protected]>

* [FEAT] 버스 위치 정보 수집 스케줄러 구현 (Kernel360#96)

## 작업 내용
- 최대한 유연하게 Scheduler 를 구현함
  - 추후에 변경 가능성 있는 class 모두 interface 분리
  - Application.yaml 을 통해서 설정을 변경가능하도록 설정함.

Closes Kernel360#92

* [FEAT] 권한별 API 접근 제한 및 개발용 세션 구현 (Kernel360#100)

## 작업내용
- 권한 별 API Path 접근 제어 설정
  - `@Secured`를 사용하여 security session의 권한 확인 후 접근 제한
- 개발용 세션 구현
  - OAuth2.0을 통하지 않고 `USER`, `ADMIN` 권한을 가질 수 있는 개발용 세션 구현
- AuthRole과 Grade enum 통합
- oauth 패키지의 AuthRole enum과 user 패키지의 Grade enum의 중복으로 인해 AuthRole로 통합 및
Grade 삭제

Closes Kernel360#97 
Closes Kernel360#98 
Closes Kernel360#99

* [FEAT] Exception Handler 에서 Exception.class 에 대한 처리 (Kernel360#105)

Closes Kernel360#101

* [FEAT] HTTP Request / Response 기본 logging (Kernel360#107)

## 결과 예시

![image](https://github.com/user-attachments/assets/15a49bf0-4b69-40a8-b45e-d1cd4edbad6d)

## 작업 내용
- Logging Filter 추가
  - OncePerRequestFilter 적용 (Filter 두번 타는 경우 방지)
  - 총 지연시간 ms 로 표현
  - Security 보다 먼저 거치도록 가장 Order 를 높게 잡음.

Closes Kernel360#106

* [REVERT] "[FEAT] Exception Handler 에서 Exception.class 에 대한 처리" (Kernel360#108)

## Revert 사유
- Exception handling 과정에서, 해당 시점에 catch 되지 말아야할 error (`@Secured` 에러와 같은
것들) 까지 catch 되어 처리되고 있음.

Reverts Kernel360#105

* [FIX] Bookmark 관련 오류 수정 (Kernel360#109)

## 작업 내용
- `/api` 가 빠진 문제 수정
- `@RequestBody` 빠진 문제 수정 및 `@Valid` (name 길이) 추가
- `DuplicatedBookmarkNameException` 추가

* [FEAT] Controller 에 대한 권한 제어 재작성 (Kernel360#111)

## 작업 내용
- SecurityConfig + `@Secure` 활용하여 권한 제어
- `Authenticate` 필요한 부분 -> `config` 에서 `.authenticated()`처리
- `Authorization` 필요한 부분 -> `@Secure` 로 권한 명시

* [FEAT] Springdoc OpenAPI 적용 (Kernel360#117)

## 작업 내역
- springdoc 적용
- 각 API 에 대해서 springdoc annotation 이용하여 api 명세 작성
  - Controller 에 대해서 interface 적용하여 구현

https://app.swaggerhub.com/apis/SUNGJUN/TALKKA/1.0.0

* [FEAT] FE 리뷰 / 경로 조회 (기초) (Kernel360#118)

## 작업 내용
- 경로 북마크 조회
- 리뷰 조회
- 내정보 조회 / 수정
- 로그인 / 로그아웃
- API 생성을 open api 명세 바탕으로 자동화


(아직 한참 남았음 / 상태 공유를 위한 merge)

* [FEAT] 버스 실시간 도착 정보 연동 및 구현 (Kernel360#121)

## 작업 내용
- [x] DTO 구현
- [x] BusApiService 에 method 추가
- [x] SimpleBusApiService 에 구현 추가
- [x] CachedStorage interface 작성
- [x] CachedStorage 구현체 (memory based / time expire 가능) 구현

## 캐시 사용시 변화 시간
- 1분 간격 캐싱 (동일 노선 정류장에 대한 조회시 1분에 한번 request 사용)
  - 1s -> 50ms

## NOTE
- 작업양이 꽤 되니, commit 단위로 리뷰하시면 편합니다.

Closes Kernel360#120

* feature: EC2 환경 구성 및 CI/CD 구현

- server를 컨테이너로 올리기 위해 docker compose에 작성
- nginx 및 ssl인증(certbot)을 위해 docker compose에 작성
- ssl 인증을 위한 init-letsencrypt.sh 작성
- Github Action을 통해 CI / CD를 위한 gradle-build.yml 작성

* feature: PR시 작동 제거 및 태그 추가

* feature: test

* feature: working-directory 변경

---------

Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Photogrammer <[email protected]>
Co-authored-by: Gyaak <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
⌨️ BE Backend 작업 ✨ feat 기능 개발과 관련된 라벨입니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants