From a09368ff63a106ebbfe7186a807a21b7ed3cb0e9 Mon Sep 17 00:00:00 2001 From: Dora Choo Date: Fri, 18 Oct 2024 11:17:53 +0900 Subject: [PATCH] v1.1.5 (#601) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 공모 엔티티에 currentCount 필드 추가 (#55) * feat: 댓글 작성 API 구현 (#57) * feat: 댓글방 내 공모 일정 조회 기능 구현 (#58) * feat: 댓글방 내 공모 일정 조회 기능 구현 Co-authored-by: Dora Choo * refactor: 공모 일정 조회 api 명세 변경 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * refactor: common 패키지명을 global로 변경 (#61) * chore: 안드로이드 CI 파일 작성 (#63) * feat: 댓글 목록 조회 API 구현 (#66) * chore: build CI 작업을 위한 manifest 파일 수정 (#65) * chore: 알람 권한 추가 * chore: local properties 속성 추가 * chore: local properties null 체크 로직 추가 * chore: buildConfigField null 체크 * style: lint 적용 * chore: secret 값 설정 * fix: secret 값 오류 수정 * fix: 문법 오류 수정 * chore: 경로 수정 * chore: 문법 수정 * style: lint 적용 * feat: 댓글방 목록 조회 API 구현 (#70) * feat 댓글방 접히는 공지 뷰 구현 (#72) * chore: manifest에 CommentDetailActivity 추가 * feat: BindingAdatper을 사용하여 접힐 때 애니메이션 적용 및 픽셀 변환 * feat: viewmodel 구현 및 click 마다 접히고 펴지는 로직 구현 * style: ktlint 적용 * refactor: binding adpater을 사용하여 가시성 변경 * refactor: 댓글방 및 댓글 목록 조회 서비스 계층 (#78) * fix: 댓글방 목록 조회 시 가장 최근 댓글 조회 (#80) * feat: 홈화면 API 연결 (#74) * refactor: API변경에 따른 data, domain 코드 변경 * feat: 공모 목록 기능 구현 * refactor: 함수 분리 * style: lint적용 * style: font 적용 * fix: 시간순 정렬 쿼리 추가 (#83) * chore: 더미 데이터 추가 (#87) * feat: 댓글방 목록 API 연결 (#82) * feat: bottom navigation fragment 추가 * feat: vector 이미지 추가 * feat: 댓글방이 없으면 "채팅 목록이 없어요" 라는 텍스트뷰와 이미지뷰를 띄우는 기능 구현 * feat: 댓글방 띄우는 기능 구현 * test: 댓글방 UI 테스트 작성 * refactor: 테스트 클래스명 수정 * refactor: 줄바꿈 수정 * feat: 댓글방 API 서비스 구현 * refactor: API 명세에 따라 도메인 모델 수정 * feat: API 연결 * refactor: API명세에 따라 데이터바인딩 변수명 수정 * feat: 댓글방 목록 API 연결 * refactor: ktlint Format 적용 * refactor: 메모리 누수 방지를 위해 fragment가 destroy 될 때 _binding을 null로 설정 * refactor: 어답터를 방어적복사 하지 않아도 되어서 수정 * refactor: 채팅방이 없다는 이미지뷰를 띄워주는 방식 수정(바인딩 어댑터 수정) * refactor: 함수분리 * refactor: ktFormat 적용 --------- Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> * feat: 댓글방 접히는 공지 API 연결 (#85) * feat: 미팅 일정 API 연결을 위한 data layer 구현 * feat: 미팅 일정 API 연결을 위한 domain layer 구현 * feat: 미팅 일정 API 연결을 위한 presentation layer 구현 * style: ktlint 적용 * feat: 공동 구매 제목 databinding 적용 * refactor: 변수명 수정 * fix: 펼치기 접기 버튼 로직 반대로 수정 * style: ktlint 적용 * chore: 더미 데이터 바로가기 url 수정 (#93) * feat: 공모 상세 페이지 기능 추가 (#94) * chore: 마이페이지 닉네임 임시로 지정 * feat: 바로가기 기능 구현 * feat: 참여버튼 클릭 시 댓글방으로 가도록 기능 구현 * feat: 신고하기 이미지 추가 * style: lint적용 * refactor: 불러오는 공모 페이지 사이즈 변경 * refactor: 댓글 도메인 코드 리팩터링 (#96) * refactor: 로그인 멤버 변수명 변경 * refactor: JPQL 쿼리 컨벤션 및 멤버로 공모 조회 메서드명 변경 * refactor: 최근 댓글 응답 클래스명 변경 * refactor: 컨트롤러 및 서비스 API 순서 변경 * refactor: 로그인 사용자 유효성 검증 * feat: 댓글방 댓글 작성 api 연결 (#95) * chore: windowSoftInputMode 추가 * feat: post comment api service 구현 * feat: post comment DataSource 구현 * feat: post comment Repository 구현 * feat: post comment Presentation 구현 * chore: 더미 데이터 시간 변경 (#100) * feat: 댓글방 입장 기능, 본인이 총대인 방은 다르게 보이는 기능 구현 (#99) * feat: 댓글방의 마지막 댓글 시간을 띄우는 기능 구현 * feat: 자신이 총대인 댓글방을 표시하는 기능 구현 * feat: 댓글방 목록을 클릭해 댓글방 상세로 이동하는 기능 구현 * test: UI테스트 수정 * refactor: 클릭시 id 뿐만 아니라 title도 받아오는 방식으로 수정 * refactor: 오전/오후와 시간을 텍스트뷰에 띄우는 바인딩 어댑터를 DateTimeFormatter의 기능을 사용하는 것으로 수정 * refactor: memberId를 local.properties의 token을 가져다 쓰는 것으로 변경(임시 조치) * refactor: 댓글방 목록의 시간을 띄우는 바인딩 어댑터의 속성명을 수정함 * refactor: 데이터바인딩 variable 변수명을 구체적으로 수정, 일관성을 위해 앞에 `on` 붙임 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정(빠트린것 수정함) * feat: 전반적인 예외 처리 (#103) * feat: 예외 처리 핸들러 추가 * feat: Offering 예외 처리 코드 추가 * feat: Comment 예외 처리 코드 추가 * feat: Member 예외 처리 코드 추가 * feat: OfferingMember 예외 처리 코드 추가 * feat: Offering 예외 처리 상세 코드 추가 * feat: 에러 코드 적용 * feat: 도메인 검증 로직 * feat: DTO 검증 로직 --------- Co-authored-by: masonkimseoul * feat: swagger와 restdocs 연동 (#104) * chore: swagger ui 정적 파일 설치 및 static routing 세팅 * chore: restdocs-api-spec을 이용한 OAS 생성 * chore: swagger ui 정적 파일을 swagger-ui 디렉토리로 이동 * chore: swagger ui 정적 파일 및 static routing 세팅 제거 * chore: 생성된 OAS 파일을 Swagger 디렉터리로 복사하는 스크립트 작성 * chore: openapi3 yaml 파일 gitignore 처리 * chore: static routing 세팅 다시 추가 openapi3.yaml을 사용하기 위함 * test: RestAssured RestDocs 테스트 코드 작성 * test: 공모 목록 조회 API 문서화 * test: 공모 일정 조회 API 및 공모 참여 API 문서화 * test: 댓글 관련 API 문서화 * docs: 논의된 TODO 제거 * refactor: swagger 어노테이션 제거 * chore: 개발 API 서버 목록 설정 --------- Co-authored-by: fromitive * refactor: 에러메시지 필드명 변경 (#108) * fix: restdocs 관련 테스트 실패 이슈 해결 (#106) * chore: cicd 테스트 * chore: 테스트 위해 actions 범위 조정 * chore: 배포 스크립트 띄어쓰기 오타 수정 * chore: 빌드 캐싱 제거 * chore: logging * chore: --warning-mode all 옵션 줘서 gradle 호환 무시하도록 설정 * fix: status 달라서 실패하는 테스트 수정 * chore: actions 범위 수정 * chore: action 범위 수정 * chore: test용 static 파일 추가 * chore: static 하위 폴더를 jar 파일에 포함하도록 설정 * chore: swagger-ui 하위 폴더 제거 * chore: task 순서 조정 * chore: build 스크립트 수정 * chore: 불필요한 설정 변경 제거 * chore: clean build 대신 clean bootJar 사용 * chore: clean, build 각각 하도록 변경 * chore: test 까지 두 번 돌리도록 수정 * chore: openapi3까지 두 번 실행하도록 수정 * chore: copyOasToSwagger 까지 두번 실행하도록 수정 * chore: actions 활성화 범위 수정 * fix: 댓글방 목록 조회 시 참여자 수 조건 추가 (#111) * fix: 댓글방 조회 테스트 수정 (#113) * feat: 홈 화면 무한 스크롤 기능 구현 (#109) * build: pagination라이브러리 추가 * feat: 홈 화면 무한 스크롤 기능 구현 * fix: 마지막 댓글 response를 nullable하게 수정 (#115) * fix: 마지막 댓글 response를 nullable하게 수정 * refactor: ktFormat 적용 * feat: 댓글방 댓글 조회 api 연결 (#116) * feat: dto 및 mapper 구현 * feat: 댓글방 목록 service 구현 * feat: 댓글방 목록 data source 구현 * feat: 댓글방 목록 repository 및 model 구현 * feat: 댓글방 목록 view type을 활용한 recyclerview 구현 및 데이터 바인딩 * feat: polling 기능 구현 * feat: 댓글 스크롤 구현 (새로운 댓글이 생길시 스크롤 아래로) * feat: 총대와 다른 참가자 이미지 리소스 파일 * feat: 댓글방 디테일 공동 구매 상태별 관리 (#117) * feat: 공동구매 상태 관리 리소스 파일 * feat: 공동구매 상태를 관리하는 enum class 구현 * feat: 데이터바인딩을 사용하여 공동 구매 상태 뷰 업데이트 구현 * style: ktlint 적용 * feat: 공동구매 상태 관리 리소스 파일 추가 * fix: 이미지 링크 임시 수정 (#119) * fix: 이미지 링크 수정 (#120) * refactor: 네이밍 수정 (#123) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 (#125) * refactor: 뷰모델 팩토리 방식 변경 (#130) * refactor: 뷰모델 팩토리를 뷰모델의 동반객체로 이동 * style: lint적용 * refactor: Service분리 (#132) * refactor: service분리 * refactor: 패키지명 변경 * style: lint적용 * feat: 공모글 작성 UI 구현 (#134) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 뷰 구현 * fix: 뷰 수정사항 반영 * fix: @+id로 참조하는 부분을 수정 * fix: drawable의 네이밍에 where을 추가 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 (#136) * feat: 참여자 목록 drawer에 필요한 리소스 파일 추가 * refactor: 채팅 text gravity 수정 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 * style: ktlint 적용 * refactor: drawer early return 하는 방식으로 변경 * refactor: ivMore -> ivMoreOptions으로 네이밍 변경 * feat: 공구 참여자 item view 및 댓글방 view 사용자 친화적으로 수정 * chore: CI 빌드 스크립트 중 중복되는 task 제거해 성능 개선 (#128) * chore: jar태스크 비활성화하고 bootJar 태스크로만 JAR 파일 생성 * chore: cicd 범위 조정 * feat: 공모 작성 API 구현 (#139) * feat: 공모 작성 API 구현 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: create를 save로 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: dto entity 매핑로직을 dto로 이동 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: controller request 매개변수 명 컨벤션 적용 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 공모에 저장하는 주소 값 구체화 (#141) * refactor: 공모에 저장하는 주소 값 구체화 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: github-action 스크립트 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: CI/CD test 설정 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: static/swagger-ui 폴더 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: 설정 원상 복구 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: ci/cd 범위 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 홈화면(공모목록) UI 추가 구현 및 상태 변경 대응 (#142) * feat: 공모의 상태 변경이 반영되도록 기능 구현 * feat: 공모 목록 ui변경 * feat: 필터 ui추가 * feat: API변경에 따른 DTO수정 * style: lint적용 * feat: resource추가 * refactor: ui위치 수정 * chore: 불필요한 괄호 제거 * refactor: item 수직 정렬 * feat: 댓글방 메시지 조회 시 commentId 필드 추가 (#150) Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: OG 태그 크롤링 API 구현 (#148) * feat: OG 태그 크롤링 API 구현 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: OG 태그 크롤링 API 엔드포인트 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 제품 코드와 API 문서 동기화 (#153) * refactor: API 문서 개선 (#157) * refactor: 댓글 작성 시 성공 상태 코드 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 요청 필수 상태 설명 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: s3 이미지 업로드 API 구현 (#147) * feat: s3 이미지 업로드 API 구현 * chore: cicd 액션 범위 수정 * fix: 이미지 업로드 경로의 특수문자 제거 * chore: yml multipart 설정 추가 * chore: S3 업로드 결과 테스트 * fix: inputstream 변환로직 위치 이동 * fix: 업로드할 s3 path 올바르게 수정 * fix: 사진 url 속에 버킷이름을 cloudfront 도메인으로 수정 * chore: actions 범위 재조정 * feat: API endpoint 변경 * chore: docker image 지우는 작업을 마지막으로 이동 * chore: 다른 브랜치로 이전 커밋 이동하기 위해 제거 * chore: 충돌 해결 및 코드 스타일 변경 * test: S3 이미지 업로드 성공 케이스 추가 * test: multipart form data 문서화 * test: 공모 상태 enum 문서화 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 파일 업로드 크기 제한 100MB에서 20MB로 변경 --------- Co-authored-by: Choo Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 주소검색 기능구현 (#161) * refactor: 네이밍 컨벤션 적용 * build: webview 라이브러리 추가 * feat: 스크립트 실행위한 html파일 추가 * refactor: 인터페이스명 변경에 따른 변경 * feat: 주소검색 다이얼로그 레이아웃 작성 * feat: 주소검색 기능 구현 * style: lint적용 * refactor: 불필요한 코드 제거 * build: Firebase의존성 추가 (#165) * feat: 공모글 작성 API 연결 (#162) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 API 연결 구현 * feat: 공모글 작성 뷰모델 구현 * fix: edit text 데이터바인딩 추가 * chore: 테스트를 위해 MutableLiveData default값 넣어둠 * chore: deadline defualt값 형식에 맞게 수정 * feat: 글작성 화면을 액티비티에서 프래그먼트로 수정 * chore: 테스트목적이었던 주석과 mutable livedata 디폴트값 제거 * refactor: 임시 함수명 수정 * fix: 글작성 프래그먼트가 올라오기 전에 바텀 네비게이션이 사라지는 문제 수정 * feat: 필수 항목이 모두 입력되어야 버튼이 활성화 되는 기능 구현 * feat: 가격, 총원 입력이 잘못되었을 시 토스트를 띄우는 기능 구현 * fix: 버튼 비활성화 시 텍스트 변경 * feat: 앱 아이콘 변경 * feat: 앱 이름 변경(chongdae -> 총대마켓) * feat: 예상 엔빵 가격을 보여주는 기능 구현 * refactor: 상수화 * refactor: 예상 엔빵 가격에 ,가 들어가는 기능 구현, 콜론 뒤 white space 추가 * feat: 공구 할인율을 계산해 주는 기능 구현 * feat: +, - 버튼으로 총원을 조절하는 기능 구현 * fix: 할인율과 엔빵가격 계산 시 0으로 나눠지는 상황을 제거 * fix: 맞춤법 수정 할인률 -> 할인율 * fix: 총원 버튼 크기가 너무 작아서 확대 * fix: 항목간 간격이 좁아서 확대 * refactor: Offering Write의 API service, DataSource, Repository를 Offerings와 합침 * refactor: 디버깅용 코드 삭제 * refactor: 버튼 활성화/비활성화를 selector와 삼항연산자로 구현 * refactor: 바인딩어댑터 대신 뷰모델이 visibility 상태를 갖고 있는 방식으로 변경 * refactor: 바인딩어댑터 대신 xml에서 처리하는 방식으로 변경 * refactor: 총원 디폴트 라이브데이터값 상수화 * refactor: +, - 텍스트뷰 버튼으로 수정 * refactor: textStyle bold대신 fontFamily suit_bold를 쓰는 것으로 수정 * refactor: 변수명 뒤에 Int를 붙이는 것 대신 Value를 붙이는 것으로 수정 * refactor: 글작성 제출 버튼의 아이디를 추가 * refactor: ktFormat * refactor: 토스트를 띄우는 함수 분리 * refactor: 도메인 객체 분리 * refactor: UI모델 적용 * refactor: ktFormat 적용 * feat: 댓글방 디테일 Room을 사용하여 data 저장 (#166) * feat: local database 구현 * feat: entity 구현 * feat: dao 구현 * feat: LocalDataSourceImpl 구현 * feat: entity mapper 구현 * refactor: CommentResponse 에 id 값 추가 * refactor: datasource 이름 변경 및 패키지 변경 * refactor: article -> offering으로 네이밍 변경 * refactor: repository 패키지 변경에 따른 수정 * refactor: datasource 패키지 변경 및 local 과 remote 분리 * refactor: repository Application 클래스를 통한 주입으로 변경 * style: ktlint 적용 * refactor: api service 리네이밍 * refactor: git conflict 해결 * refactor: 함수 이름 컨벤션에 맞도록 변경 (getMeetings -> fetchMeetings) * chore: CI 스크립트 추가 (#173) * chore: ci 스크립트 추가 * chore: ci 스크립트 수정 * fix: og 태그 추출 시 크롤링 이슈 해결 (#174) * feat: 날짜, 시간 선택 기능 구현, 주소검색 기능 연결 (#171) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 모집마감 시간 클릭 시 date time picker를 띄우는 기능 구현 * feat: 날짜, 시간 선택 기능 구현 * feat: 주소 검색 기능 연결 * refactor: 함수명 수정, 함수분리 * refactor: ktFormat 적용 * refactor: string으로 분리, 상수화 * fix: string 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정3 * chore: CI workflow 파일 수정4 * feat: 공모가 정상적으로 게시되었을 시 "공모가 게시되었어요!" 라는 토스트를 띄우고 공모글 작성 프래그먼트를 종료하는 기능 구현 * feat: 토스트가 화면 중앙에 뜨는 문제 수정 * refactor: 사용되지 않는 파일 삭제 * refactor: xml 뷰 id 수정 * refactor: 버튼이 TextView인 문제 수정 * refactor: 사용되지 않는 data binding variable 제거 * refactor: 함수명 수정 * refactor: 다이얼로그, dateTimePickerBinding 전역으로 선언 * refactor: dateTimePicker 클릭 이벤트를 추상화 해 xml에서 처리하도록 변경 * refactor: ktFormat * feat: 상품 URL 이미지 추출 API 연결 (#180) * refactor: 사용하지 않는 파일 제거 * refactor: 가시성 변경 * feat: api service 구현 * feat: datasource 구현 * refactor: repository 네이밍 수정 (offeringsRepository -> offeringRepository) * feat: 사진 업로드 관련 리소스 파일 추가 * feat: repository 및 model 구현 * feat: 이미지 링크를 통한 크롤링 이미지 불러오는 api 연결 및 이미지 삭제 로직 구현 * style: ktlint 적용 * refactor: 이미지 prefix 추가 및 에러 메시지 수정 * refactor: build 오류 수정 * fix: git conflict 해결 * feat: 공모 목록 조회 API에 필터링과 검색 기능 추가 (#169) * feat: 공모 필터 목록 조회 API 구현 * test: 공모 필터 목록 조회 API 테스트 * style: 개행 형식 통일 * feat: 공모 필터 목록 조회 API Specification 도입 준비 * fix: url에 큰따움표 제거 * feat: Specification 도입 * refactor: queryString 구체화 * refactor: 함수명 변경 * feat: 최신순 필터링 적용 * feat: 마감임박순 필터링 적용 * feat: 높은할인률순 필터링 적용 * refactor: 전략 패턴 적용해 여러 갈래의 분기문과 중복되는 코드 처리 * test: 변경된 API 스펙에 맞게 문서화 작업 * refactor: 관련있는 메서드들끼리 모이게 순서 재배치 * refactor: 맞춤법 수정 * style: 개행 제거 --------- Co-authored-by: masonkimseoul * feat: 상태 변경 API 구현 (#175) * feat: 댓글방 상태 변경 및 조회 API 구현 Co-authored-by: masonkimseoul * feat: 공모글 상태 조회 API 구현 * feat: 댓글방 상태 변경 중 수동 확정 기능 구현 * refactor: 상태 변경 관련 메서드명 수정 * refactor: 추상 클래스 메서드 컨벤션 통일 * refactor: errorCode 사용 시 클래스 명시 * refactor: 댓글방 상태 관련 API 엔드포인트 수정 및 패키지 변경 * refactor: 댓글방 상태 변경 API HTTP 메서드 수정 * feat: 공모 모집 자동 확정 시 댓글방 상태 변경 --------- Co-authored-by: masonkimseoul Co-authored-by: Choo * feat: 로그인 기능 구현 (#177) * feat: password 일방향 암호화 기능 구현 * feat: cookie 생산-소비 기능 구현 * chore: jwt 관련 의존성 추가 * feat: 토큰 생성 기능 구현 * feat: 로그인 API 구현 * test: 로그인 API 테스트 * feat: 회원가입 API 구현 * test: 회원가입 API 테스트 * feat: 닉네임 생성 기능 구현 * test: 닉네임 생성 기능 테스트 * fix: postconstruct 여러 개라 발생한 에러 해결 * feat: 회원가입 응답값에 랜덤생성한 닉네임 추가 * feat: MemberArgumentResolver 구현 * feat: MemberArgumentResolver 일부 적용 * test: 바뀐 스펙에 맞게 변경 * test: TestConfig 설정해 빈충돌 오류 해결 * test: 공모 작성 API로 MemberArgumentResolver 사용 * feat: 토큰 재발급 API 구현 * test: 토큰 재발급 API 테스트 * test: 토큰 재발급 API 에러 테스트 * feat: MemberArgumentResolver commant에 적용 * feat: MemberArgumentResolver offering에 적용 * feat: MemberArgumentResolver participant에 적용 * refactor: ci값이 일치하지 않을경우 오류메시지 문구 변경 * refactor: 클래스명 일관적으로 변경 * refactor: 직관적인 명명으로 enum 네이밍 변경 * refactor: Custom Exception 적용 * refactor: 컨트롤러 메서드에 접근제어자 명시 * fix: 중복된 enum 값 제거 * test: 바뀐 API 스펙에 맞게 변경 --------- Co-authored-by: fromitive * fix: nicknameWordInitializer 설정 오류 해결 (#182) * fix: keyword null일 때 처리 및 docs에서 required 제거 (#184) * fix: keyword null일 때 처리 * test: optional() 붙여서 required 제거 * chore: 브랜치에 상관없이 pr 머지 시 자동으로 관련 이슈 닫는 스크립트 구현 (#187) * fix: og 이미지 태그 크롤링 문제 해결 (#190) * refactor: 댓글방 상태 도메인 설계 변경 (#189) * feat: 공모 목록 API 응답값에 낱개 가격 추가 (#193) * chore: readtimeout 5초로 수정 (#195) * feat: 댓글방 상태 조회 시 상태별 이미지 함께 반환 (#196) * feat: 공모 목록 조회 API연결 (#201) * refactor: Condition 수정에 따른 변경 * refactor: api변경에 따른 리팩토링 * refactor: api변경에 따른 목록 무한 스크롤 기능 리팩토링 * feat: 검색 기능 구현 * feat: 필터링 기능 구현 - 참여 가능은 서버 에러로 추후 추가 예정 * feat: 아이템을 불러온 후 recyclerview의 최상단으로 이동하는 기능 구현 - 검색, 필터링 수행 후 최상단으로 이동 * feat: 필터링 목록 불러오는 api연결 * feat: 마감임박 상태 추가 * refactor: default parameter제거 * style: lint적용 * feat: 토큰 반환 시 cookie가 아닌 body 사용하도록 변경 (#206) * feat: 발급한 토큰을 header가 아닌 body로 반환하도록 수정 * refactor: 사용안하는 클래스와 메서드 제거 * test: 바뀐 API 스펙에 맞게 명세 수정 * feat: 이미지 더미 데이터 수정 및 부정확한 가격 데이터 수정 (#207) * refactor: 공모 글 작성 시 총대 참여자 추가 (#208) * feat: 바텀 네비게이션 고정 기능 구현 (#211) * feat: 데이터에서 5자 이상 제거 (#212) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 (#202) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 * refactor: 도메인 명칭 변경 (낱개가격 -> 원가격) * refactor: 도메인 명칭 변경 (공모 -> 댓글방) * refactor: originPrice로 http client 변경 * feat: 키보드 이외 영역 터치 시 키보드 내려가도록 구현 (#214) * feat: 키보드외 화면 클릭 시 키보드 내려가도록 구현 * refactor: api변경에 다른 dto수정 * feat: 이미지 업로드 및 권한 설정 (#216) * chore: 이미지 권한 추가 * feat: permission manager을 생성하여 권한 체크 및 request * feat: 이미지 추가 버튼을 클릭할 시 권한 설정 연결 * feat: 이미지 피커를 사용하여 uri 전달 구현 * feat: 이미지 파일 업로드 api service 구현 * feat: 이미지 파일 업로드 data source 구현 * feat: 이미지 파일 업로드 repository 구현 * feat: 이미지 파일 martipart로 변환해주는 기능 구현 * feat: 이미지 업로드 관련 뷰 수정 * feat: 이미지 파일 업로드 및 api 연결 구현 * style: ktlint format * fix: git conflict 해결 * refactor: 이미지 scaleType 변경 * refactor: string value 컨벤션 적용 * feat: 토큰 반환 시 body가 아닌 cookie로 반환하도록 원상복구 (#223) * feat: 토큰 재발급 API에서 requestHeader로 refreshToken 받도록 수정 (#227) * feat: 토큰 재발급 API에서 body가 아닌 cookie로 토큰 반환 * feat: 회원가입 API도 body가 아닌 cookie로 토큰 반환 * refactor: service 용 dto 명 컨벤션에 맞춰 수정 * feat: 댓글방 일정 수정 API 구현 (#226) * feat: 댓글방 일정 수정 API 구현 * test: 총대가 아닌 참여자가 공모 일정 정보를 수정할 경우 예외 발생 * feat: 댓글방 상태 조회 시 버튼 텍스트 추가 (#229) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 (#222) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 * refactor: 구현 방식 변경 * style: lint적용 * Feature/217 offering status (#230) * feat: 댓글방 상태 조회 api service 구현 * feat: 댓글방 상태 조회 model 및 dto 구현 * feat: 댓글방 상태 조회 datasource 구현 * feat: 댓글방 상태 조회 repository 구현 * feat: 댓글방 상태 조회 api 연결 구현 * style: ktlint 적용 * feat: 댓글방 상태 변경 (#231) * feat: 댓글방 상태 변경 api service 구현 * feat: 댓글방 상태 변경 data source 구현 * Revert "feat: 댓글방 상태 변경 data source 구현" This reverts commit 052691a8de945c60a60586ee66a05a6a3b264217. * feat: 댓글방 상태 변경 data source 구현 * feat: 댓글방 상태 변경 repository 구현 * feat: 댓글방 상태 변경 api 연결 구현 * style: ktlint 적용 * feature: 카카오 로그인 구현 (#235) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * feat: 공모 참여자 목록 조회 API 구현 (#225) * feat: 공모 참여자 목록 조회 API 구현 * test: 실패 테스트 오류 수정 * style: 띄어쓰기 적용 * refactor: MemberEntity를 받도록 변경 * refactor: isParticipant를 구현하여 가독성 개선 * refactor: 총대를 찾을 수 없는 상황의 예외 추가 * refactor: 참여 검증로직을 서비스로 이동 * refactor: 사용하지 않는 메서드 제거 * refactor: 검증 로직 가장 상단에 위치 * refactor: 총대 추출 로직 수정 --------- Co-authored-by: masonkimseoul Co-authored-by: SCY * refactor: 마감임박순 필터링 쿼리 조건 수정 (#239) * refactor: 마감임박순 필터링 조건 수정 * refactor: 더미 데이터 시간 수정 * fix: 필터링 오류 수정 (#243) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 (#247) * feat: 공동구매 상태 변경 다이얼로그 구현 (#245) * feat: 공동구매 상태 변경 다이얼로그 view 구현 * feat: 공동구매 상태 변경 다이얼로그 Listener 구현 * feat: 공동구매 상태 변경 다이얼로그 연결 및 상태 변경 로직 수정 * test: 테스트 코드 작성을 위한 기본 세팅 (#255) * feat: CoroutinesTestExtension 구현 * feat: Livedata getOrAwaitValue 구현 * feat: InstantTaskExecutorExtension 구현 * feat: TestFixture 생성 * style: ktlint 적용 * feat: 공모글 목록 화면 UI 개선, 공모글 작성에서 낱개 금액이 엔빵 가격보다 저렴할 시 글 작성 막는 기능 구현 (#246) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * fix: 구분선을 각각의 아이템의 하단에 넣고 프래그먼트 뷰의 "채팅" 텍스트 밑에 하나 추가 * fix: 텍스트뷰에 font 적용, 마지막 댓글 시간 텍스트를 조금 왼쪽으로 이동 * fix: 낱개 가격 이름을 eachPrice -> originPrice 수정 * fix: 낱개 가격이 엔빵 가격보다 싸면 토스트를 띄우고 글작성을 막는 기능 구현 * fix: 네이티브앱키 로컬프로퍼티로 이동 * refactor: 함수명 변경 * fix: 카카오 계정으로 로그인 후 액티비티 전환하지 않는 문제 수정 * refactor: 사용되지 않는 클래스 삭제 * refactor: 패키지 수정 * refactor: alsong 로그 수정 * refactor: 변수명 수정 * refactor: Manifest의 네이티브앱 키 숨김 * refactor: 로컬프로퍼티의 데이터 형식 수정 * Update android.yml * refactor: alsong 로그 삭제 * ci 빌드 실패가 manifest때문인지 테스트 * refactor: 매니페스트에 앱 키 넣을 수 있게 하는 gradle 설정 수정 * 매니페스트 수정하고 재테스트 * 매니페스트 수정하고 재테스트 * chore: 그래들 수정 * chore: 그래들 수정2 * chore: 그래들 수정3 * chore: 그래들 수정4 * chore: 카카오 계정으로 로그인하는 기능 제외 * feat: 홈화면 테스트 작성 (#257) * chore: mockk의존성 추가 * test: OfferingViewModel 테스트 작성 * style: lint적용 * refactor: stub를 TestFixture로 이동 * test: 댓글방 테스트 코드 작성 (#258) * refactor: 댓글 보내는 함수명 변경 * refactor: 공구 약속 장소 및 시간 캐시 기능 * test: 테스트를 위한 fake repository 구현 * test: 댓글방 viewmodel test 작성 * feat: 댓글방 ActivityTest 작성 * feat: 댓글방 ActivityTest 작성 * style: ktlint 적용 * refactor: test fixture에서 사용하지 않는 것 삭제 * style: ktlint 적용 * feat: GA 모니터링 환경 구축 및 로깅 전략 적용 (#242) * chore: Firebase Crashlytics 의존성 추가 * feat: Firebase 초기화 * feat: FirebaseManager 구현 * feat: 총대가 공구 진행 상황을 다음 단계로 변경했을 때 event 추가 * feat: 로깅 기능 구현 - 검색 - 필터링 - 공모글 클릭 - 공모 참여 * style: lint적용 * feat: 글 작성 완료 시 event 추가 * feat: 로그인 시 event 추가 --------- Co-authored-by: Namyunsuk Co-authored-by: songpink * test: 공모글 작성 이미지 테스트 코드 작성 (#260) * refactor: 상수 가시성 변경 * feat: test fixture 구현 * feat: fake repository 이미지 업로드 기능 추가 * test: OfferingWriteViewModelTest 이미지 업로드 test 코드 작성 * feat: 로그인 후 홈화면으로 이동해도 로그인 화면이 종료되지 않는 문제 수정 (#261) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 로그인 후 LoginActivity가 종료되도록 수정 * feat: 공모 상세 화면 테스트 작성 (#264) * feat: OfferingDetailViewModel 테스트 작성 * refactor: 테스트 수정 * style: lint적용 * style: lint적용 * feat: 로깅 코드 삽입 (#266) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 * feature: 로깅 샘플 구현 * refactor: 불필요한 코드 제거 * feat: logging 적용 --------- Co-authored-by: fromitive * fix: 마감 임박 필터링 쿼리 수정 (#267) * chore: logback 설정 진행 (#270) * chore: logback 설정 * fix: multipart 요청 필터링 * chore: logback 설정 변경 * chore: pull request ci/cd 닫기 * fix: 이미지 업로드 API의 responseBody가 두 번 뜨는 오류 해결 (#273) * fix: 이미지 업로드 API 두 번 도는 문제 해결 * test: 이미지 업로드 API의 누락된 response field 추가 * refactor: 홈화면 수정 (#271) * refactor: 할인율 마진 추가 * refactor: 공구상태에 대한 문구 수정 * refactor: 클릭 시 최상단으로 이동하는 버튼 구현 * feat: 공모글 작성 화면 테스트코드 작성 (#274) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: 공모글 작성 테스트 구현 * feat: 댓글방 목록 화면 테스트코드 작성 (#276) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: "댓글방 목록을 확인할 수 있어야 한다" 테스트 작성 * feat: pageSize validation 추가 (#279) * feat: pageSize validation 추가 * feat: magic number 추출 * fix: 공모 상세 화면 오류 수정 (#280) * fix: 총대 여부 확인 로직 수정 * fix: 마감 임박 시 보여주는 버튼 수정 * fix: 공모 작성 후 홈화면으로 돌아왔을 떄 목록이 새로고침 되지 않는 오류 수정 * test: 테스트 코드 수정 * style: lint적용 * feat: 댓글방 목록 화면 자동 업데이트 되지 않는 문제 수정, 회원가입 이후 자동으로 로그인되지 않는 문제 수정 (#282) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 라이플사이클 오너 설정 * fix: 회원가입 후 자동으로 로그인 되도록 수정 * chore: change version name (#291) * feat: 카카오 계정 로그인 기능 구현 시 CI가 실패하는 문제 해결 (#296) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * feat: 로그인 화면 리팩토링 (#298) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * refactor: SimpleCookieJar의 패키지 변경(presentation 레이어에서 data레이어의 source 패키지로 이동) * refactor: data store를 관리하는 클래스를 생성하고 이 클래스를 사용하도록 변경 * refactor: 사용하지 않는 의존성과 주석 제거 * refactor: http status code 추가 * refactor: 함수분리 * refactor: ktFormat 적용 * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentRooms) * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentDetail), 사용되지 않게 된 memberId 제거 * refactor: ktFormat 적용 * test: 테스트코드 수정 * refactor: Preferences -> DataStore 이름 변경 * refactor: 채팅방 UI UX 개선 (#303) * feat: 키보드가 아닌 다른 영역을 클릭하면 키보드 내리는 기능 구현 * feat: 뒤로가는 버튼 기능 추가 * feat: 댓글 입력 maxLines 설정 및 maxLength 설정 * style: ktlint 적용 * 필요 없는 코드 제거 * feat: 댓글방 목록에서 자신이 총대인 댓글방의 UI 개선 (#304) * refactor: 댓글방의 자신이 총대인 댓글방 ui 개선 * fix: Binding 클래스 네이밍 수정 * feat: 가로모드, 다크모드 설정 (#305) * refactor: api변경에 따른 리팩토링 (#310) * feat: 로그인 화면 해상도 대응 (#313) * feat: 이미지 업로드 중일 때 로딩 상태 설정 (#317) * feat: 공모 글 작성 ui state 구현 * feat: 로딩 progressbar 생성 * feat: UI 상태에 따른 토스트 메시지 처리 * refactor: 잘못된 입력에 대한 에러 처리 변경 * refactor: 홈화면 리팩토링 (#324) * refactor: textSize dp로 변경 * refactor: 검색 버튼 크기 변경 - 검색 버튼 패딩 추가 - 검색창 끝에 패딩 추가 * refactor: 엔터키를 통해 검색하도록 수정 * refactor: 필터 단일 선택되도록 수정 * style: lint적용 * feat: 댓글방 새로운 기능 GA 연결 (#328) * feat: 댓글방 참여자 확인 Event 구현 * feat: 댓글방 상태 변경 다이얼로그 취소 Event * feat: 참여자가 공구에서 참여 포기 Event 구현 * style: ktlint 적용 * test: 테스트 데이터 수정 (#330) * feat: Fragment GA 모니터링 수집 (#332) * feat: fragment logScreenView 추적 함수 구현 * feat: 각 fragment에서 화면 감지 GA 설정 * feat: 마이페이지 기본 세팅 및 뷰 변경 (#335) * feat: 공모 참여 취소 기능 구현 (#318) * test: 공모 참여 취소 테스트코드 작성 * feat: 공모 참여 취소 기능 구현 * refactor: 불필요한 쿼리 메서드 제거 * style: 불필요한 개행 제거 * refactor: 모집중인 상태가 아닌 경우 공모 참여를 취소할 수 없도록 변경 * refactor: 공모 참여 취소 응답 상태 코드 변경 * refactor: 에러 메시지 명확한 문구로 변경 * refactor: query parameter를 적용해 어떤 공모의 참여를 취소할 것인지 의도를 명확하게 전달하도록 변경 * refactor: 총대 검증 메서드 네이밍 명확하게 변경 * feat: 댓글방 생성 시점 변경 (#319) * feat: 댓글방 생성 시점 변경 * refactor: 불필요한 도메인 OfferingWithRole 제거 * refactor: 불필요한 도메인 CommentWithRole 제거 * refactor: 댓글의 작성자 확인 메서드 추가 * refactor: 댓글방 목록 조회 dto 생성자 추가 * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 (#322) * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 * refactor: 로그인용 dto 분리 및 공통 dto에 prefix로 auth 추가 * feat: valid 어노테이션 추가 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 (#323) * refactor: 메서드명 구체적으로 변경 * refactor: 변수명 구체적으로 변경 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 * docs: todo 추가 * refactor: 함수명 통일 * feat: 공모자 여부 필드명 변경 * feat: 댓글방 상태 조회 API 확장 (#325) * feat: 댓글방 상태 조회 API 확장 * refactor: 댓글방 관련 로직 댓글 도메인으로 이동 * feat: LoggingFilter에서 던지는 유효하지 않은 요청에 대한 예외 처리 * refactor: 댓글 관련 엔드포인트 수정 * feat: 댓글방 정보 조회 시 조회 권한을 가진 사용자인지 검증 * refactor: 댓글방 상태 확인 로직 도메인으로 이동 * feat: 상태 변경을 시도하는 사용자가 총대인지 검증 * refactor: 댓글 목록 조회 엔드포인트 수정 * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 (#327) * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 * refactor: Response depth 줄이기 및 DTO 생성자 작성 * fix: imminent 필터 버그 해결 (#337) * fix: 커스텀 필터로 인해 h2-console 접속 깨지는 이슈 해결 (#339) * feat: 마이페이지 기능 구현 (#341) * feat: 마이페이지 닉네임 기능 구현 * feat: 로그아웃 로직 구현 * feat: url 연결 로직 구현 * feat: 필요없는 기능 삭제 * style: ktlint 적용 * feat: 공모 테이블에 할인율과 상태 필드 추가 (#342) * refactor: Condition과 Status 이름 변경 * refactor: 사용하지 않는 DTO 제거 * feat: OfferingEntity에 칼럼 추가 * feat: 공모 거래 날짜 필드 이름 변경 (#348) * fix: 상세화면에서 홈화면으로 갔을 때 상태 변경 안되는 오류 수정 (#343) * refactor: 공모상세페이지 Activity -> Fragment로 리팩토링 * fix: 페이지네이션 및 상태변경 미적용 오류 해결 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 주석 제거 및 상수화 * refactor: livedata 자료형 변경 * refactor: progressbar위치 수정 * refactor: lifecycleScope사용 리팩토링 * refactor: adapter에서 전체 아이템이 아닌 특정 아이템만 notify하도록 리팩토링 * refactor: API변경에 따른 대응 (#352) * refactor: api대응 * refactor: api변경에 따른 테스트 수정 * feat: 공모글 작성 화면 ux 개선 (#344) * fix: 각 항목의 설명을 place holder로 이동 * fix: 필수와 선택 항목의 프래그먼트 분리 * feat: 버튼이 항상 보이도록 수정 * fix: 가격과 총원은 숫자만 입력받도록 변경 * fix: 패딩 수정 * fix: ui 수정 * fix: 도메인 변경에 따른 deadline -> tradeDate 수정 * feat: 필수 항목을 모두 입력하면 선택 항목 화면으로 이동하는 기능 구현 * refactor: ktFormat 적용 * refactor: shared viewModel 사용, 미필수 항목을 미필수 입력 화면으로 이동 * refactor: 프래그먼트 이름 변경 * feat: 입력 숫자의 글자수와 라인수 제한 기능 구현 * fix: 총원이 -1이하로 떨어지는 버그 수정, 공동구매 텍스트 띄어쓰기 제거 * fix: 할인율, 엔빵 금액이 유효하지 않을 때는 "-"로 뜨도록 변경 * fix: 공모를 게시하면 필수, 선택 화면 모두 종료되도록 수정 * fix: 날짜 시간 픽커를 날짜만 선택하는 픽커로 변경 * refactor: ktFormat 적용 * refactor: 바인딩어댑터의 파라미터를 nullable하게 수정 * test: 테스트코드 수정 * feat: 낱개 가격의 place holder로 현재 엔빵 금액을 보여주는 기능 구현 * feat: 내용의 최대 글자수와 현재 글자수를 보여주는 기능 구현 * refactor: ktFormat 적용 * refactor: 공모글 작성시 memberId를 보내지 않도록 변경 * fix: 총원 최대 4자리에서 3자리까지만 입력받을 수 있도록 변경 * fix: deadline -> meetingDate 네이밍 수정 * fix: 공모글 작성 후 작성 화면의 입력값이 초기화되지 않는 버그 수정 * refactor: 네이밍 수정(eachPrice -> originPrice) * refactor: 네이밍 수정(individualPrice -> originPrice) * fix: 내용의 현재 글자수 색이 메인컬러가 되지 않는 문제 수정 * refactor: 프래그먼트 종료될 때 바인딩 해제하도록 수정 * refactor: id가 없는 뷰의 id 추가 * refactor: 함수 분리 * fix: 내용 옆의 * 제거 * fix: GA 이벤트 이름 변경(공모글 작성 - 필수 화면에서의 이벤트임을 명시함) * refactor: og 태그 추출 기능 수정 (#349) * refactor: crawler 패키지 이동 * feat: naver api 클라이언트 추가 refactor: 사용하지 않은 기존 og image 크롤러 명칭 변경 * feat: html 크롤링 방식과 naver api 방식을 조합하는 Extractor 구현 * fix: OfferingService ProductImageExtractor 추상화 * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 (#358) * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 * test: 테스트코드 수정 * refactor: 공모글 목록 조회 필터링 수정 및 추가 (#356) * refactor: 마감임박순 필터링 이름 마감임박만으로 변경 Co-authored-by: fromitive * refactor: 필터링 쿼리 수정 Co-authored-by: fromitive * feat: "참여가능만" 필터링 기능 구현 Co-authored-by: fromitive * feat: "참여가능만" 필터링 기능 연결 Co-authored-by: fromitive * fix: 쿼리 내 불필요한 파라미터 제거 Co-authored-by: fromitive * refactor: 할인율이 null일 경우 높은할인율 필터링 대상에서 제외 Co-authored-by: fromitive * feat: 참여가능만 필터링 전략 클래스 추가 * feat: 공모 목록 조회 API 응답값 변경 * fix: 높은 할인율 단위 변경 및 last-id 필터링 로직 수정 * style: 주석 제거 --------- Co-authored-by: fromitive * refactor: 할인율 계산 로직 수정 (#359) * refactor: 할인율 계산 로직 수정 Co-authored-by: fromitive * refactor: 소수점 둘째 자리에서 반올림하도록 변경 Co-authored-by: fromitive * test: 할인율 계산 로직 * fix: 할인율 단위 백분율로 수정 --------- Co-authored-by: fromitive * feat: 총 모집 인원 수 최댓값 설정 (#361) Co-authored-by: fromitive * fix: 필터 오류 수정 (#362) * fix: 필터 오류 수정 - '참여가능만'필터 분기처리 제거 * chore: 주석 제거 * feat: API 스펙 변경에 따른 대응 (#364) * feat: 댓글 목록 조회 api 스펙 변경에 따른 대응 * feat: 댓글방 정보 조회 api 스펙 변경에 따른 대응 * feat: 공모 일정 조회 api 스펙 변경에 따른 대응 * feat: 댓글 상태 변경 api 스펙 변경에 따른 대응 * test: api 스펙 변경에 따른 test 코드 변경 * style: ktlint 적용 * feat: remote dto package 분리 * feat: 자동 확정 기능을 위해 스케줄러 적용 (#363) * chore: todo 추가 및 메서드명 변경 * feat: Scheduled 어노테이션 추가 및 Scheduler 분리 * test: ServiceTest 환경 구축 * feat: offeringStatus 변경 로직 추가 * refactor: 수동 확정 로직 추가 및 코드 스타일 수정 * refactor: 자동 확정 로직을 조회에서 Scheduled로 이동 * fix: 마감임박 설정 기준 내일로 변경 --------- Co-authored-by: Choo Co-authored-by: SCY * fix: 공모 작성 후 홈화면 돌아올 때 새로 작성한 글이 보이지 않는 오류 수정 (#369) * feat: Access Token, Refresh Token을 data store에 저장하는 기능 구현 (#372) * feat: 앱 재시작 시 토큰을 데이터스토어에서 꺼내 사용하는 기능 구현 * feat: 로그인이 이미 되어있다면 로그인 화면을 건너뛰는 기능 구현 * feat: 로그아웃 기능 구현 * fix: 마이페이지 화면으로 넘어가면 바텀네비게이션이 사라지는 버그 수정 * fix: 데이터스토어에서 토큰이 꺼내지지 않는 버그 수정 data store에서 토큰을 꺼내는 코루틴 비동기 작업이 끝나기 전에 함수를 종료해 버려서 생기는 버그였습니다. * refactor: ktFormat 적용 * refactor: startActivity 함수를 LoginActivity가 동반객체로 갖고 있도록 변경 * refactor: 함수명과 event명 변경 추가로 GA위치가 조금 잘못된 점이 있어서 수정했습니다. * feat: 공모 상세 화면 추가 기능 반영 (#375) * feat: 신고하기 기능 구현 * feat: 물품 링크가 없으면 보여지지 않도록 구현 * refactor: 마감 시간에서 거래 날짜로 리팩토링 * feat: 이미 참여한 공모게시글에서 채팅방으로 이동하는 기능 구현 * fix: 댓글방 목록의 마지막 댓글방이 보이지 않는 문제 수정 (#376) * fix: 리사이클러뷰 레이아웃의 크기가 화면 밖에 벗어나지 않도록 수정 * fix: 리사이클러뷰 레이아웃의 맨 밑에 구분선 하나 추가 아래로 땡겼을 때 구분선이 사라져버리는게 보기 안좋아서 추가했습니다 * refactor: 코트 포맷 적용 (컨트롤 알트 L) * feat: isManualConfirmed 제거 및 도메인 로직 확인 (#377) * refactor: isManualConfirmed 칼럼 삭제 및 관련 로직 분리 * refactor: 더미 데이터 수정 --------- Co-authored-by: fromitive * feat: API 별 권한 확인 로직 추가 (#371) * feat: 권한 확인 로직 추가 * feat: 인증 필터 적용 * refactor: 더미 데이터 칼럼 위치 변경 (#382) * refactor: 홈화면 api필드 추가에 따른 대응 (#381) * refactor: dto필드 추가 * fix: 상태 변경 오류 해결 * fix: 필터 선택 또는 검색상태일 때 공모 작성 후 나오면 목록 안보이는 오류 수정 * refactor: 세부 주소 api에서 받아오도록 변경 * style: lint적용 * fix: API 문서에 접근할 수 없는 현상 해결 (#384) * fix: API 문서에 접근할 수 없는 현상 해결 * style: 신뢰할 수 있는 URL 개행 수정 * feat: 공모 목록에서 동을 보여주는 기능 구현 (#386) * feat: 공모 단건 조회 API 구현 (#388) * feat: 공모 상세 조회 API 엔드포인트 변경 * feat: 공모 단건 조회 API * style: 공모 관련 API 순서 변경 * test: 불필요한 공모글 생성 코드 제거 * test: 공모 단건 조회 서비스 테스트 * refactor: 상태변경 리팩토링 (#389) * refactor: 공모 상세 조회 api변경 대응 * refactor: 공모 상태 변경 리팩토링 * refactor: 리팩토링에 따른 테스트 수정 * chore: 불필요한 로그 제거 * fix: 댓글 입력 후 뒤로가기 시 최근 댓글이 반영되도록 수정 (#397) * chore: JAR 파일에 OAS 파일 누락되는 이슈 해결 및 중복 task 제거 (#391) * chore: 중복되는 task 제거 * chore: cicd 범위 조정 * fix: 참여자 목록 조회 API에서 totalCount 반환하지 않는 이슈 해결 (#400) * feat: 댓글방 참여자 확인 API 연결 (#401) * feat: 참가자 정보를 가져오는 api service 구현 * refactor: 필요없는 코드 삭제 * feat: 참여 관리 datasource 구현 * feat: 참여자 domain 모델 구현 * feat: 참여를 관리하는 repository 구현 * feat: 참여자 목록을 보여주는 recycler view 연결 및 구현 * refactor: 더보기 버튼 수정 * feat: 필요없는 리소스 파일 삭제 및 상태 기본 이미지 변경 * refactor: 약속 장소 및 시간 ui model 을 사용하여 관리 * refactor: 댓글방의 정보를 불러오는 로직 ui model을 사용하여 관리 * refactor: ui model 변환 로직 변경 * feat: 공동구매 참여 인원 확인 기능 구현 * feat: 신고하기 폼 연결 구현 * test: 코드 변경에 따른 테스트 코드 수정 * style: ktlint 적용 * refactor: xml id 추가 * feat: 댓글방 공동구매 나가기 API 연결 (#402) * feat: 공동구매 나가기 기능 api service 구현 * feat: 공동구매 나가기 기능 data source 구현 * feat: 공동구매 나가기 기능 repository 구현 * feat: 공동구매 나가기 기능 연결 * style:ktlint 적용 * fix: /auth/refresh endpoint accessToken 검증 예외 추가 (#407) * refactor: 더미 데이터 정합성 확보 (#406) * refactor: 더미 데이터 정합성 확보 * refactor: 추가된 칼럼 반영 * feat: CallApiHandler 구현 (#403) * feat: CallApiHandler 구현 * refactor: CommentRoomsDataSource 수정 * feat: CommentRemoteDataSourceImpl 에러핸들링을 통해 수정 * feat: 에러 핸들링에 따른 DataSource 리팩토링 - OfferingDetailDataSource - OfferingRemoteDataSource * feat: ParticipantRemoteDataSourceImpl 에러핸들링을 통해 수정 * style: ktlint 적용 * refactor: AuthRemoteDataSource 수정 * feat: Result의 map 과 getOrThrow 함수 생성 * feat: 에러 핸들링에 따른 Repository 리팩토링 - OfferingDetailRepository - OfferingRepository * refactor: Result 변경에 따른 레포지토리 수정 (AuthRepository, CommentRoomsRepository) * feat: 에러 핸들링에 따른 CommentDetailRepository 리팩토링 * feat: 에러 핸들링에 따른 ParticipantRepository 리팩토링 * feat: 에러 핸들링에 따른 viewmodel 리팩토링 - OfferingViewModel - OfferingDetailViewModel * refactor: 에러 핸들링에 따른 LoginViewModel 리팩토링 * refactor: 에러 핸들링에 따른 CommentRoomsViewModel 리팩토링 * refactor: 토큰 리프레쉬 후 다시 함수 호출하도록 추가 * feat: 에러 핸들링에 따른 CommentDetailViewModel 리팩토링 * refactor: 에러 핸들링에 따른 OfferingWriteViewModel 리팩토링 * refactor: 공모 목록 토큰 리프래시 적용 * fix: 잘못된 코드 수정 * refactor: 필요없는 주석 제거 * refactor: 공모 목록 리팩토링 * fix: 리빌드시 쿠키가 제대로 저장되지 않는 현상 수정 * refactor: 필요없는 코드 삭제 및 상수화 추가 * test: 에러핸들링에 따른 FakeAuthRepository, OfferingWriteViewModelTest 수정 * refactor: ktFormat 적용 * test: 코드 변경에 따른 Fake Repository 변경 * test: CommentDetailViewModelTest 코드 수정 * style: ktlint 적용 * refactor: 가독성 개선(에러 로그 함수명 추가, Success가 Error보다 위에 나오도록 수정) * refactor: 불필요한 로그 제거 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 람다 넘겨주는 방식 수정 * style: lint 적용 * test: 테스트코드 수정 --------- Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> Co-authored-by: Namyunsuk * feat: proguard를 사용한 난독화 적용 (#413) * chore: 환경에 따른 yml 파일 분리 (#411) * chore: 환경 별로 yml 파일 분리 * chore: 불필요한 yml 설정 제거 * fix: 공구 상세 페이지 오류 해결 (#417) * fix: 바로가기 클릭되지 않는 오류 수정 * refactor: 주소 표시할 때 최대 2줄까지 그리고 넘어갈 시 말줄임 나오도록 수정 * refactor: 공모 목록, 공모 상세 에러 핸들링 (#418) * refactor: 공모 목록에서 401에러를 제외하고는 에러코드 올 시 빈화면 보여주도록 에러핸들링 수정 * refactor: 필터및 업데이트된 공모 목록 가져오는 로직 에러핸들링 수정 - 400: 토스트 메시지 띄어줌 - 401: refresh - 그외에는 로그로 에러 코드를 보여줌 * refactor: strings네이밍 통일 * refactor: 공모 상세 에러 핸들링 수정 * refactor: strings정리 - offering_detail부분 정리 * feat: 카카오 로그인 중 사용자 정보 확인 로직을 안드로이드에서 백엔드로 이관 (#404) * feat: 카카오 로그인 API 구현 * feat: providerId를 loginId로 수정 * feat: 소셜 로그인 시 랜덤 생성된 비밀번호 사용 * refactor: 불필요한 api 제거 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY * test: 로그인 로직 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY * test: MemberFixture 불필요한 함수 제거 및 통일 Co-authored-by: fromitive Co-authored-by: Dora Choo * refactor: 불필요한 정보 제거 Co-authored-by: fromitive Co-authored-by: Dora Choo * feat: 카카오 로그인 에러 핸들러 추가 Co-authored-by: fromitive Co-authored-by: Dora Choo * feat: 민감 정보 로깅에서 제외 Co-authored-by: fromitive Co-authored-by: Dora Choo --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY Co-authored-by: fromitive * feat: cookie 관련 예외 처리 (#409) * refactor: 더미 데이터 http 추가 (#422) * fix: 더미데이터 정합성 맞추기 (#425) * feat: 로그인 api 변경 반영 (#426) * feat: 카카오 로그인 후 총대마켓 서버로 email을 보내던 방식에서 카카오 access token을 보내는 방식으로 변경 * feat: login과 signup을 하나로 api로 통합된 것 반영 * refactor: ktFormat 적용 * refactor: 테스트코드 수정 * feat: 로깅 시 UUID가 아닌 회원 번호가 기록되도록 변경 (#428) * feat: logging 시 memberId가 나오도록 기능 추가 * feat: logging 시 memberId 및 identifier가 함께 나오도록 변경 * refactor: lombok getter 적용 * feat: Spring Timezone KST로 설정 (#430) * chore: Dockerfile 타임존 변경 (#432) * fix: Offering 목록 조회 시 NPE 해결 (#434) * refactor: 에러 핸들링 리팩토링 (#436) * feat: 리프레시 토큰 만료 시 데이터스토어를 비우고 로그인 화면으로 이동하는 기능 구현 (#438) * feat: 댓글방 에러 헨들링 (#439) * refactor: refresh시 401이 오는 경우에 대한 에러핸들링 추가 (#441) * chore: 버전 업데이트 (#443) * refactor: 외래키 필드 notnull 조건 추가 (#445) * chore: prod CI/CD 구축 (#423) * chore: 환경 별로 yml 파일 분리 * chore: 운영 서버 CI/CD 스크립트 작성 * chore: 운영 환경 내 swagger 문서 제거 * chore: 운영 환경 포트포워딩 명령어 제거 * chore: prod ci/cd 스크립트 트리거 추가 * chore: prod ci/cd 스크립트 트리거 변경 * chore: prod ci/cd 스크립트 트리거 path 구체화 * chore: prod ci/cd 스크립트 docker 실행 명령어 오타 수정 * chore: prod ci/cd 스크립트 path 롤백 * chore: dev 및 prod ci/cd 스크립트 data.sql 실행 비활성화 * chore: prod ci/cd 스크립트 path 롤백 * chore: dev script test --------- Co-authored-by: Choo * chore: prod 불필요한 트리거 주석 처리 (#447) * merge: v1.1.0 to develop-BE * feat: 게시글 상세 화면 구현 (#8) * feat: 게시글 상세 화면 레이아웃 작성 * feat: Data layer코드 작성 * refactor: dto패키지 분리, dto에 serialName추가 * refactor: 도메인 모델 수정 - 가변에서 불변으로 변경 - 사용하지 않는 메서드 제거 * refactor: 공통으로 사용되거나 사용될 수 있는 확장함수를 별도의 파일로 분리 * style: lint 적용 * refactor: 메서드명 컨벤션 적용 * refactor: request Dto에 SerialName적용 * refactor: 메서드명 수정 * feat: 도메인 추가 (#15) * feat: BaseTimeEntity 추가 * feat: Member Entity 추가 * feat: Offering Entity 추가 * feat: OfferingMember Entity 추가 * feat: Comment Entity 추가 --------- * feat: BottomNavigation 구현 (#16) * chore: jetpack navigation 라이브러리 추가 * feat: 필요한 바텀 네비게이션 리소스 추가 * feat: bottom navigation fragment 추가 * feat: bottom navigation graph 구현 * refactor: 컨벤션에 맞게 id 수정 * feat: 공동구매 상세 조회 기능 구현 (#18) * chore: h2 환경설정 추가 * docs: http client 추가 * refactor: entity 접미어 적용 * chore: dummy data 추가 * docs: http client 값 변경 * refactor: repository 와 domain 패키지 분리 * feat: 공동구매 상세 조회 API 구현 * refactor: entity 접미어 적용 * style: 클래스 컨벤션 적용 * chore: h2 console 설정 제거 * refactor: OfferingCondition enum값 결정로직을 enum 안으로 이동 * feat: 홈화면, 마이페이지 화면 레이아웃 작성 (#19) * refactor: FragmentContainer width 속성 수정 * feat: 홈 화면 레이아웃 작성 * feat: 마이페이지 화면 레이아웃 작성 * fix: 플로팅 버튼이 홈에서만 보이도록 수정 * refactor: 리소스 네이밍 컨벤션에 맞게 수정 * feat: API 문서화 적용 (#23) * chore: springdoc-openapi 의존성 추가 * chore: springdoc 설정 추가 * feat: SwaggerConfig 파일 추가 * feat: 공모 상세 조회 API 문서화 --------- * fix: 공모 상세 조희 API의 price 필드 자료형 변경 및 memberId 필드 추가 (#28) * fix: 상세조회 API 금액 필드 자료형 변경 * fix: memberId 추가 * 내가 쓴 글인지 아닌지 확인 위해 --------- * chore: 백엔드 CI 및 도커 파일 작성 (#27) * chore: actions 적용 브랜치 설정 (#30) * chore: actions 적용 브랜치 설정 * chore: path 및 ref 태그 제거 * chore: working-directory 태그 추가 * chore: Dockerfile jar 경로 수정 * feat: 댓글방 목록 구현 (#26) * feat: 댓글방 목록 UI 구현 * fix: 구분선을 ImageView에서 View로 변경 * feat: 댓글방 목록 도메인 모델 구현 * feat: 댓글방 어답터 구현 * feat: "채팅" string 추가 * refactor: 불필요한 코드 제거 * fix: xmls 중복 속성 제거 * refactor: 댓글방 클래스들을 comment 패키지로 분리 * refactor: 컬러와 폰트 사이즈를 values 파일로 분리 * feat: 공모 목록 조회 기능 구현 (#35) * feat: 공모 목록 조회 API 구현 * docs: 공모 목록 조회 API http client에 추가 * fix: 공모 상세 조회 API의 status 필드를 condition으로 명칭 변경 * feat: 공모 목록 조회 API의 isClosed 필드 이름을 isOpen으로 변경 * feat: 댓글방 디테일 화면 구현 (#32) * feat: font 설정 * feat: vector 이미지 추가 * feat: 채팅 아이템 뷰 구현 * refactor: 컨벤션에 맞게 네이밍 수정 * feat: 댓글 입력 edit text 구현 * chore: 백엔드 CD 스크립트 작성 (#34) * chore: 백엔드 CD 스크립트 작성 * chore: 도커 백그라운드로 실행 * chore: 도커 설정 및 트리거 설정 변경 * chore: 도커 이미지 제거 로직 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 강제 제거하도록 수정 * chore: gradle 캐싱 로직 추가 (#39) * chore: gradle 캐싱 로직 추가 * chore: 이벤트 트리거 조건 수정 * feat: 공모 참여하기 기능 구현 (#40) * fix: BaseTimeEntity 적용 오류 수정 * feat: 참여하기 API 구현 --------- * feat: 공모 상세 조회 API에 참여자 목록 필드 추가 (#42) * feat: 공모 상세 조회 API의 request에 memberId 필드 추가 (#45) * feat: 공모 참여 API의 불필요한 응답값 전부 제거 (#48) * feat: 공모 참여 API의 불필요한 반환값 제거 * chore: 자주 쓰는 h2 console enabled 설정 주석 처리 * feat: 이미 참여한 공모에 참여 못하게 예외 처리 (#51) * feat: 공모 상세 페이지 API 연결 (#46) * build: 불필요한 의존성 제거, properties관련 코드 작성 * refactor: base_url코드상에서 제거 * feat: api수정에 따른 필드 변경 및 네이밍 반영 * refactor: 네이밍 변경 * refactor: OfferingDetail의 변경, mapper변경 * refactor: service분리 * refactor: DataSource, Repository분리 * refactor: API변경에 따른 리팩토링 * feat: 공모 상세 조회 기능 구현 * refactor: 참여하기 api변경에 따른 data, domain 코드 수정 * feat: 공모 상세 페이지 참여하기 기능 구현 * feat: 공모 상세 화면에서 이미지를 불러올 수 없을 시 기본이미지를 보여주는 기능 구현 * feat: 게시물 상세 화면 폰트 적용 * style: lint적용 * refactor: 액티비티 destroy시 binding해제하도록 코드 추가 * refactor: glide옵션 변경 - 에러 발생 시 보여줄 이미지 - url이 null일 시 보여줄 이미지 * refactor: viewModel에 custom getter추가 * fix: 내용이 짧을 시 뒷 배경이 회색으로 보이는 버그 수정 * fix: 참여하기 버튼을 눌렀을 시 텍스트가 바뀌지 않는 버그 수정 * feat: 테스트 데이터 다양화 (#52) * refactor: 공모 엔티티에 currentCount 필드 추가 (#55) * feat: 댓글 작성 API 구현 (#57) * feat: 댓글방 내 공모 일정 조회 기능 구현 (#58) * feat: 댓글방 내 공모 일정 조회 기능 구현 * refactor: 공모 일정 조회 api 명세 변경 --------- * refactor: common 패키지명을 global로 변경 (#61) * chore: 안드로이드 CI 파일 작성 (#63) * feat: 댓글 목록 조회 API 구현 (#66) * chore: build CI 작업을 위한 manifest 파일 수정 (#65) * chore: 알람 권한 추가 * chore: local properties 속성 추가 * chore: local properties null 체크 로직 추가 * chore: buildConfigField null 체크 * style: lint 적용 * chore: secret 값 설정 * fix: secret 값 오류 수정 * fix: 문법 오류 수정 * chore: 경로 수정 * chore: 문법 수정 * style: lint 적용 * feat: 댓글방 목록 조회 API 구현 (#70) * feat 댓글방 접히는 공지 뷰 구현 (#72) * chore: manifest에 CommentDetailActivity 추가 * feat: BindingAdatper을 사용하여 접힐 때 애니메이션 적용 및 픽셀 변환 * feat: viewmodel 구현 및 click 마다 접히고 펴지는 로직 구현 * style: ktlint 적용 * refactor: binding adpater을 사용하여 가시성 변경 * refactor: 댓글방 및 댓글 목록 조회 서비스 계층 (#78) * fix: 댓글방 목록 조회 시 가장 최근 댓글 조회 (#80) * feat: 홈화면 API 연결 (#74) * refactor: API변경에 따른 data, domain 코드 변경 * feat: 공모 목록 기능 구현 * refactor: 함수 분리 * style: lint적용 * style: font 적용 * fix: 시간순 정렬 쿼리 추가 (#83) * chore: 더미 데이터 추가 (#87) * feat: 댓글방 목록 API 연결 (#82) * feat: bottom navigation fragment 추가 * feat: vector 이미지 추가 * feat: 댓글방이 없으면 "채팅 목록이 없어요" 라는 텍스트뷰와 이미지뷰를 띄우는 기능 구현 * feat: 댓글방 띄우는 기능 구현 * test: 댓글방 UI 테스트 작성 * refactor: 테스트 클래스명 수정 * refactor: 줄바꿈 수정 * feat: 댓글방 API 서비스 구현 * refactor: API 명세에 따라 도메인 모델 수정 * feat: API 연결 * refactor: API명세에 따라 데이터바인딩 변수명 수정 * feat: 댓글방 목록 API 연결 * refactor: ktlint Format 적용 * refactor: 메모리 누수 방지를 위해 fragment가 destroy 될 때 _binding을 null로 설정 * refactor: 어답터를 방어적복사 하지 않아도 되어서 수정 * refactor: 채팅방이 없다는 이미지뷰를 띄워주는 방식 수정(바인딩 어댑터 수정) * refactor: 함수분리 * refactor: ktFormat 적용 --------- * feat: 댓글방 접히는 공지 API 연결 (#85) * feat: 미팅 일정 API 연결을 위한 data layer 구현 * feat: 미팅 일정 API 연결을 위한 domain layer 구현 * feat: 미팅 일정 API 연결을 위한 presentation layer 구현 * style: ktlint 적용 * feat: 공동 구매 제목 databinding 적용 * refactor: 변수명 수정 * fix: 펼치기 접기 버튼 로직 반대로 수정 * style: ktlint 적용 * chore: 더미 데이터 바로가기 url 수정 (#93) * feat: 공모 상세 페이지 기능 추가 (#94) * chore: 마이페이지 닉네임 임시로 지정 * feat: 바로가기 기능 구현 * feat: 참여버튼 클릭 시 댓글방으로 가도록 기능 구현 * feat: 신고하기 이미지 추가 * style: lint적용 * refactor: 불러오는 공모 페이지 사이즈 변경 * refactor: 댓글 도메인 코드 리팩터링 (#96) * refactor: 로그인 멤버 변수명 변경 * refactor: JPQL 쿼리 컨벤션 및 멤버로 공모 조회 메서드명 변경 * refactor: 최근 댓글 응답 클래스명 변경 * refactor: 컨트롤러 및 서비스 API 순서 변경 * refactor: 로그인 사용자 유효성 검증 * feat: 댓글방 댓글 작성 api 연결 (#95) * chore: windowSoftInputMode 추가 * feat: post comment api service 구현 * feat: post comment DataSource 구현 * feat: post comment Repository 구현 * feat: post comment Presentation 구현 * chore: 더미 데이터 시간 변경 (#100) * feat: 댓글방 입장 기능, 본인이 총대인 방은 다르게 보이는 기능 구현 (#99) * feat: 댓글방의 마지막 댓글 시간을 띄우는 기능 구현 * feat: 자신이 총대인 댓글방을 표시하는 기능 구현 * feat: 댓글방 목록을 클릭해 댓글방 상세로 이동하는 기능 구현 * test: UI테스트 수정 * refactor: 클릭시 id 뿐만 아니라 title도 받아오는 방식으로 수정 * refactor: 오전/오후와 시간을 텍스트뷰에 띄우는 바인딩 어댑터를 DateTimeFormatter의 기능을 사용하는 것으로 수정 * refactor: memberId를 local.properties의 token을 가져다 쓰는 것으로 변경(임시 조치) * refactor: 댓글방 목록의 시간을 띄우는 바인딩 어댑터의 속성명을 수정함 * refactor: 데이터바인딩 variable 변수명을 구체적으로 수정, 일관성을 위해 앞에 `on` 붙임 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정(빠트린것 수정함) * feat: 전반적인 예외 처리 (#103) * feat: 예외 처리 핸들러 추가 * feat: Offering 예외 처리 코드 추가 * feat: Comment 예외 처리 코드 추가 * feat: Member 예외 처리 코드 추가 * feat: OfferingMember 예외 처리 코드 추가 * feat: Offering 예외 처리 상세 코드 추가 * feat: 에러 코드 적용 * feat: 도메인 검증 로직 * feat: DTO 검증 로직 --------- * feat: swagger와 restdocs 연동 (#104) * chore: swagger ui 정적 파일 설치 및 static routing 세팅 * chore: restdocs-api-spec을 이용한 OAS 생성 * chore: swagger ui 정적 파일을 swagger-ui 디렉토리로 이동 * chore: swagger ui 정적 파일 및 static routing 세팅 제거 * chore: 생성된 OAS 파일을 Swagger 디렉터리로 복사하는 스크립트 작성 * chore: openapi3 yaml 파일 gitignore 처리 * chore: static routing 세팅 다시 추가 openapi3.yaml을 사용하기 위함 * test: RestAssured RestDocs 테스트 코드 작성 * test: 공모 목록 조회 API 문서화 * test: 공모 일정 조회 API 및 공모 참여 API 문서화 * test: 댓글 관련 API 문서화 * docs: 논의된 TODO 제거 * refactor: swagger 어노테이션 제거 * chore: 개발 API 서버 목록 설정 --------- * refactor: 에러메시지 필드명 변경 (#108) * fix: restdocs 관련 테스트 실패 이슈 해결 (#106) * chore: cicd 테스트 * chore: 테스트 위해 actions 범위 조정 * chore: 배포 스크립트 띄어쓰기 오타 수정 * chore: 빌드 캐싱 제거 * chore: logging * chore: --warning-mode all 옵션 줘서 gradle 호환 무시하도록 설정 * fix: status 달라서 실패하는 테스트 수정 * chore: actions 범위 수정 * chore: action 범위 수정 * chore: test용 static 파일 추가 * chore: static 하위 폴더를 jar 파일에 포함하도록 설정 * chore: swagger-ui 하위 폴더 제거 * chore: task 순서 조정 * chore: build 스크립트 수정 * chore: 불필요한 설정 변경 제거 * chore: clean build 대신 clean bootJar 사용 * chore: clean, build 각각 하도록 변경 * chore: test 까지 두 번 돌리도록 수정 * chore: openapi3까지 두 번 실행하도록 수정 * chore: copyOasToSwagger 까지 두번 실행하도록 수정 * chore: actions 활성화 범위 수정 * fix: 댓글방 목록 조회 시 참여자 수 조건 추가 (#111) * fix: 댓글방 조회 테스트 수정 (#113) * feat: 홈 화면 무한 스크롤 기능 구현 (#109) * build: pagination라이브러리 추가 * feat: 홈 화면 무한 스크롤 기능 구현 * fix: 마지막 댓글 response를 nullable하게 수정 (#115) * fix: 마지막 댓글 response를 nullable하게 수정 * refactor: ktFormat 적용 * feat: 댓글방 댓글 조회 api 연결 (#116) * feat: dto 및 mapper 구현 * feat: 댓글방 목록 service 구현 * feat: 댓글방 목록 data source 구현 * feat: 댓글방 목록 repository 및 model 구현 * feat: 댓글방 목록 view type을 활용한 recyclerview 구현 및 데이터 바인딩 * feat: polling 기능 구현 * feat: 댓글 스크롤 구현 (새로운 댓글이 생길시 스크롤 아래로) * feat: 총대와 다른 참가자 이미지 리소스 파일 * feat: 댓글방 디테일 공동 구매 상태별 관리 (#117) * feat: 공동구매 상태 관리 리소스 파일 * feat: 공동구매 상태를 관리하는 enum class 구현 * feat: 데이터바인딩을 사용하여 공동 구매 상태 뷰 업데이트 구현 * style: ktlint 적용 * feat: 공동구매 상태 관리 리소스 파일 추가 * fix: 이미지 링크 임시 수정 (#119) * fix: 이미지 링크 수정 (#120) * refactor: 네이밍 수정 (#123) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 (#125) * refactor: 뷰모델 팩토리 방식 변경 (#130) * refactor: 뷰모델 팩토리를 뷰모델의 동반객체로 이동 * style: lint적용 * refactor: Service분리 (#132) * refactor: service분리 * refactor: 패키지명 변경 * style: lint적용 * feat: 공모글 작성 UI 구현 (#134) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 뷰 구현 * fix: 뷰 수정사항 반영 * fix: @+id로 참조하는 부분을 수정 * fix: drawable의 네이밍에 where을 추가 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 (#136) * feat: 참여자 목록 drawer에 필요한 리소스 파일 추가 * refactor: 채팅 text gravity 수정 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 * style: ktlint 적용 * refactor: drawer early return 하는 방식으로 변경 * refactor: ivMore -> ivMoreOptions으로 네이밍 변경 * feat: 공구 참여자 item view 및 댓글방 view 사용자 친화적으로 수정 * chore: CI 빌드 스크립트 중 중복되는 task 제거해 성능 개선 (#128) * chore: jar태스크 비활성화하고 bootJar 태스크로만 JAR 파일 생성 * chore: cicd 범위 조정 * feat: 공모 작성 API 구현 (#139) * feat: 공모 작성 API 구현 * refactor: create를 save로 변경 * refactor: dto entity 매핑로직을 dto로 이동 * refactor: controller request 매개변수 명 컨벤션 적용 --------- * refactor: 공모에 저장하는 주소 값 구체화 (#141) * refactor: 공모에 저장하는 주소 값 구체화 * chore: github-action 스크립트 수정 * chore: CI/CD test 설정 추가 * chore: static/swagger-ui 폴더 추가 * chore: 설정 원상 복구 * chore: ci/cd 범위 수정 --------- * feat: 홈화면(공모목록) UI 추가 구현 및 상태 변경 대응 (#142) * feat: 공모의 상태 변경이 반영되도록 기능 구현 * feat: 공모 목록 ui변경 * feat: 필터 ui추가 * feat: API변경에 따른 DTO수정 * style: lint적용 * feat: resource추가 * refactor: ui위치 수정 * chore: 불필요한 괄호 제거 * refactor: item 수직 정렬 * feat: 댓글방 메시지 조회 시 commentId 필드 추가 (#150) * feat: OG 태그 크롤링 API 구현 (#148) * feat: OG 태그 크롤링 API 구현 * refactor: OG 태그 크롤링 API 엔드포인트 수정 --------- * refactor: 제품 코드와 API 문서 동기화 (#153) * refactor: API 문서 개선 (#157) * refactor: 댓글 작성 시 성공 상태 코드 변경 * refactor: 요청 필수 상태 설명 추가 --------- * feat: s3 이미지 업로드 API 구현 (#147) * feat: s3 이미지 업로드 API 구현 * chore: cicd 액션 범위 수정 * fix: 이미지 업로드 경로의 특수문자 제거 * chore: yml multipart 설정 추가 * chore: S3 업로드 결과 테스트 * fix: inputstream 변환로직 위치 이동 * fix: 업로드할 s3 path 올바르게 수정 * fix: 사진 url 속에 버킷이름을 cloudfront 도메인으로 수정 * chore: actions 범위 재조정 * feat: API endpoint 변경 * chore: docker image 지우는 작업을 마지막으로 이동 * chore: 다른 브랜치로 이전 커밋 이동하기 위해 제거 * chore: 충돌 해결 및 코드 스타일 변경 * test: S3 이미지 업로드 성공 케이스 추가 * test: multipart form data 문서화 * test: 공모 상태 enum 문서화 * feat: 파일 업로드 크기 제한 100MB에서 20MB로 변경 --------- * feat: 주소검색 기능구현 (#161) * refactor: 네이밍 컨벤션 적용 * build: webview 라이브러리 추가 * feat: 스크립트 실행위한 html파일 추가 * refactor: 인터페이스명 변경에 따른 변경 * feat: 주소검색 다이얼로그 레이아웃 작성 * feat: 주소검색 기능 구현 * style: lint적용 * refactor: 불필요한 코드 제거 * build: Firebase의존성 추가 (#165) * feat: 공모글 작성 API 연결 (#162) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 API 연결 구현 * feat: 공모글 작성 뷰모델 구현 * fix: edit text 데이터바인딩 추가 * chore: 테스트를 위해 MutableLiveData default값 넣어둠 * chore: deadline defualt값 형식에 맞게 수정 * feat: 글작성 화면을 액티비티에서 프래그먼트로 수정 * chore: 테스트목적이었던 주석과 mutable livedata 디폴트값 제거 * refactor: 임시 함수명 수정 * fix: 글작성 프래그먼트가 올라오기 전에 바텀 네비게이션이 사라지는 문제 수정 * feat: 필수 항목이 모두 입력되어야 버튼이 활성화 되는 기능 구현 * feat: 가격, 총원 입력이 잘못되었을 시 토스트를 띄우는 기능 구현 * fix: 버튼 비활성화 시 텍스트 변경 * feat: 앱 아이콘 변경 * feat: 앱 이름 변경(chongdae -> 총대마켓) * feat: 예상 엔빵 가격을 보여주는 기능 구현 * refactor: 상수화 * refactor: 예상 엔빵 가격에 ,가 들어가는 기능 구현, 콜론 뒤 white space 추가 * feat: 공구 할인율을 계산해 주는 기능 구현 * feat: +, - 버튼으로 총원을 조절하는 기능 구현 * fix: 할인율과 엔빵가격 계산 시 0으로 나눠지는 상황을 제거 * fix: 맞춤법 수정 할인률 -> 할인율 * fix: 총원 버튼 크기가 너무 작아서 확대 * fix: 항목간 간격이 좁아서 확대 * refactor: Offering Write의 API service, DataSource, Repository를 Offerings와 합침 * refactor: 디버깅용 코드 삭제 * refactor: 버튼 활성화/비활성화를 selector와 삼항연산자로 구현 * refactor: 바인딩어댑터 대신 뷰모델이 visibility 상태를 갖고 있는 방식으로 변경 * refactor: 바인딩어댑터 대신 xml에서 처리하는 방식으로 변경 * refactor: 총원 디폴트 라이브데이터값 상수화 * refactor: +, - 텍스트뷰 버튼으로 수정 * refactor: textStyle bold대신 fontFamily suit_bold를 쓰는 것으로 수정 * refactor: 변수명 뒤에 Int를 붙이는 것 대신 Value를 붙이는 것으로 수정 * refactor: 글작성 제출 버튼의 아이디를 추가 * refactor: ktFormat * refactor: 토스트를 띄우는 함수 분리 * refactor: 도메인 객체 분리 * refactor: UI모델 적용 * refactor: ktFormat 적용 * feat: 댓글방 디테일 Room을 사용하여 data 저장 (#166) * feat: local database 구현 * feat: entity 구현 * feat: dao 구현 * feat: LocalDataSourceImpl 구현 * feat: entity mapper 구현 * refactor: CommentResponse 에 id 값 추가 * refactor: datasource 이름 변경 및 패키지 변경 * refactor: article -> offering으로 네이밍 변경 * refactor: repository 패키지 변경에 따른 수정 * refactor: datasource 패키지 변경 및 local 과 remote 분리 * refactor: repository Application 클래스를 통한 주입으로 변경 * style: ktlint 적용 * refactor: api service 리네이밍 * refactor: git conflict 해결 * refactor: 함수 이름 컨벤션에 맞도록 변경 (getMeetings -> fetchMeetings) * chore: CI 스크립트 추가 (#173) * chore: ci 스크립트 추가 * chore: ci 스크립트 수정 * fix: og 태그 추출 시 크롤링 이슈 해결 (#174) * feat: 날짜, 시간 선택 기능 구현, 주소검색 기능 연결 (#171) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 모집마감 시간 클릭 시 date time picker를 띄우는 기능 구현 * feat: 날짜, 시간 선택 기능 구현 * feat: 주소 검색 기능 연결 * refactor: 함수명 수정, 함수분리 * refactor: ktFormat 적용 * refactor: string으로 분리, 상수화 * fix: string 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정3 * chore: CI workflow 파일 수정4 * feat: 공모가 정상적으로 게시되었을 시 "공모가 게시되었어요!" 라는 토스트를 띄우고 공모글 작성 프래그먼트를 종료하는 기능 구현 * feat: 토스트가 화면 중앙에 뜨는 문제 수정 * refactor: 사용되지 않는 파일 삭제 * refactor: xml 뷰 id 수정 * refactor: 버튼이 TextView인 문제 수정 * refactor: 사용되지 않는 data binding variable 제거 * refactor: 함수명 수정 * refactor: 다이얼로그, dateTimePickerBinding 전역으로 선언 * refactor: dateTimePicker 클릭 이벤트를 추상화 해 xml에서 처리하도록 변경 * refactor: ktFormat * feat: 상품 URL 이미지 추출 API 연결 (#180) * refactor: 사용하지 않는 파일 제거 * refactor: 가시성 변경 * feat: api service 구현 * feat: datasource 구현 * refactor: repository 네이밍 수정 (offeringsRepository -> offeringRepository) * feat: 사진 업로드 관련 리소스 파일 추가 * feat: repository 및 model 구현 * feat: 이미지 링크를 통한 크롤링 이미지 불러오는 api 연결 및 이미지 삭제 로직 구현 * style: ktlint 적용 * refactor: 이미지 prefix 추가 및 에러 메시지 수정 * refactor: build 오류 수정 * fix: git conflict 해결 * feat: 공모 목록 조회 API에 필터링과 검색 기능 추가 (#169) * feat: 공모 필터 목록 조회 API 구현 * test: 공모 필터 목록 조회 API 테스트 * style: 개행 형식 통일 * feat: 공모 필터 목록 조회 API Specification 도입 준비 * fix: url에 큰따움표 제거 * feat: Specification 도입 * refactor: queryString 구체화 * refactor: 함수명 변경 * feat: 최신순 필터링 적용 * feat: 마감임박순 필터링 적용 * feat: 높은할인률순 필터링 적용 * refactor: 전략 패턴 적용해 여러 갈래의 분기문과 중복되는 코드 처리 * test: 변경된 API 스펙에 맞게 문서화 작업 * refactor: 관련있는 메서드들끼리 모이게 순서 재배치 * refactor: 맞춤법 수정 * style: 개행 제거 --------- * feat: 상태 변경 API 구현 (#175) * feat: 댓글방 상태 변경 및 조회 API 구현 * feat: 공모글 상태 조회 API 구현 * feat: 댓글방 상태 변경 중 수동 확정 기능 구현 * refactor: 상태 변경 관련 메서드명 수정 * refactor: 추상 클래스 메서드 컨벤션 통일 * refactor: errorCode 사용 시 클래스 명시 * refactor: 댓글방 상태 관련 API 엔드포인트 수정 및 패키지 변경 * refactor: 댓글방 상태 변경 API HTTP 메서드 수정 * feat: 공모 모집 자동 확정 시 댓글방 상태 변경 --------- * feat: 로그인 기능 구현 (#177) * feat: password 일방향 암호화 기능 구현 * feat: cookie 생산-소비 기능 구현 * chore: jwt 관련 의존성 추가 * feat: 토큰 생성 기능 구현 * feat: 로그인 API 구현 * test: 로그인 API 테스트 * feat: 회원가입 API 구현 * test: 회원가입 API 테스트 * feat: 닉네임 생성 기능 구현 * test: 닉네임 생성 기능 테스트 * fix: postconstruct 여러 개라 발생한 에러 해결 * feat: 회원가입 응답값에 랜덤생성한 닉네임 추가 * feat: MemberArgumentResolver 구현 * feat: MemberArgumentResolver 일부 적용 * test: 바뀐 스펙에 맞게 변경 * test: TestConfig 설정해 빈충돌 오류 해결 * test: 공모 작성 API로 MemberArgumentResolver 사용 * feat: 토큰 재발급 API 구현 * test: 토큰 재발급 API 테스트 * test: 토큰 재발급 API 에러 테스트 * feat: MemberArgumentResolver commant에 적용 * feat: MemberArgumentResolver offering에 적용 * feat: MemberArgumentResolver participant에 적용 * refactor: ci값이 일치하지 않을경우 오류메시지 문구 변경 * refactor: 클래스명 일관적으로 변경 * refactor: 직관적인 명명으로 enum 네이밍 변경 * refactor: Custom Exception 적용 * refactor: 컨트롤러 메서드에 접근제어자 명시 * fix: 중복된 enum 값 제거 * test: 바뀐 API 스펙에 맞게 변경 --------- * fix: nicknameWordInitializer 설정 오류 해결 (#182) * fix: keyword null일 때 처리 및 docs에서 required 제거 (#184) * fix: keyword null일 때 처리 * test: optional() 붙여서 required 제거 * chore: 브랜치에 상관없이 pr 머지 시 자동으로 관련 이슈 닫는 스크립트 구현 (#187) * fix: og 이미지 태그 크롤링 문제 해결 (#190) * refactor: 댓글방 상태 도메인 설계 변경 (#189) * feat: 공모 목록 API 응답값에 낱개 가격 추가 (#193) * chore: readtimeout 5초로 수정 (#195) * feat: 댓글방 상태 조회 시 상태별 이미지 함께 반환 (#196) * feat: 공모 목록 조회 API연결 (#201) * refactor: Condition 수정에 따른 변경 * refactor: api변경에 따른 리팩토링 * refactor: api변경에 따른 목록 무한 스크롤 기능 리팩토링 * feat: 검색 기능 구현 * feat: 필터링 기능 구현 - 참여 가능은 서버 에러로 추후 추가 예정 * feat: 아이템을 불러온 후 recyclerview의 최상단으로 이동하는 기능 구현 - 검색, 필터링 수행 후 최상단으로 이동 * feat: 필터링 목록 불러오는 api연결 * feat: 마감임박 상태 추가 * refactor: default parameter제거 * style: lint적용 * feat: 토큰 반환 시 cookie가 아닌 body 사용하도록 변경 (#206) * feat: 발급한 토큰을 header가 아닌 body로 반환하도록 수정 * refactor: 사용안하는 클래스와 메서드 제거 * test: 바뀐 API 스펙에 맞게 명세 수정 * feat: 이미지 더미 데이터 수정 및 부정확한 가격 데이터 수정 (#207) * refactor: 공모 글 작성 시 총대 참여자 추가 (#208) * feat: 바텀 네비게이션 고정 기능 구현 (#211) * feat: 데이터에서 5자 이상 제거 (#212) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 (#202) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 * refactor: 도메인 명칭 변경 (낱개가격 -> 원가격) * refactor: 도메인 명칭 변경 (공모 -> 댓글방) * refactor: originPrice로 http client 변경 * feat: 키보드 이외 영역 터치 시 키보드 내려가도록 구현 (#214) * feat: 키보드외 화면 클릭 시 키보드 내려가도록 구현 * refactor: api변경에 다른 dto수정 * feat: 이미지 업로드 및 권한 설정 (#216) * chore: 이미지 권한 추가 * feat: permission manager을 생성하여 권한 체크 및 request * feat: 이미지 추가 버튼을 클릭할 시 권한 설정 연결 * feat: 이미지 피커를 사용하여 uri 전달 구현 * feat: 이미지 파일 업로드 api service 구현 * feat: 이미지 파일 업로드 data source 구현 * feat: 이미지 파일 업로드 repository 구현 * feat: 이미지 파일 martipart로 변환해주는 기능 구현 * feat: 이미지 업로드 관련 뷰 수정 * feat: 이미지 파일 업로드 및 api 연결 구현 * style: ktlint format * fix: git conflict 해결 * refactor: 이미지 scaleType 변경 * refactor: string value 컨벤션 적용 * feat: 토큰 반환 시 body가 아닌 cookie로 반환하도록 원상복구 (#223) * feat: 토큰 재발급 API에서 requestHeader로 refreshToken 받도록 수정 (#227) * feat: 토큰 재발급 API에서 body가 아닌 cookie로 토큰 반환 * feat: 회원가입 API도 body가 아닌 cookie로 토큰 반환 * refactor: service 용 dto 명 컨벤션에 맞춰 수정 * feat: 댓글방 일정 수정 API 구현 (#226) * feat: 댓글방 일정 수정 API 구현 * test: 총대가 아닌 참여자가 공모 일정 정보를 수정할 경우 예외 발생 * feat: 댓글방 상태 조회 시 버튼 텍스트 추가 (#229) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 (#222) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 * refactor: 구현 방식 변경 * style: lint적용 * Feature/217 offering status (#230) * feat: 댓글방 상태 조회 api service 구현 * feat: 댓글방 상태 조회 model 및 dto 구현 * feat: 댓글방 상태 조회 datasource 구현 * feat: 댓글방 상태 조회 repository 구현 * feat: 댓글방 상태 조회 api 연결 구현 * style: ktlint 적용 * feat: 댓글방 상태 변경 (#231) * feat: 댓글방 상태 변경 api service 구현 * feat: 댓글방 상태 변경 data source 구현 * Revert "feat: 댓글방 상태 변경 data source 구현" This reverts commit 052691a8de945c60a60586ee66a05a6a3b264217. * feat: 댓글방 상태 변경 data source 구현 * feat: 댓글방 상태 변경 repository 구현 * feat: 댓글방 상태 변경 api 연결 구현 * style: ktlint 적용 * feature: 카카오 로그인 구현 (#235) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * feat: 공모 참여자 목록 조회 API 구현 (#225) * feat: 공모 참여자 목록 조회 API 구현 * test: 실패 테스트 오류 수정 * style: 띄어쓰기 적용 * refactor: MemberEntity를 받도록 변경 * refactor: isParticipant를 구현하여 가독성 개선 * refactor: 총대를 찾을 수 없는 상황의 예외 추가 * refactor: 참여 검증로직을 서비스로 이동 * refactor: 사용하지 않는 메서드 제거 * refactor: 검증 로직 가장 상단에 위치 * refactor: 총대 추출 로직 수정 --------- * refactor: 마감임박순 필터링 쿼리 조건 수정 (#239) * refactor: 마감임박순 필터링 조건 수정 * refactor: 더미 데이터 시간 수정 * fix: 필터링 오류 수정 (#243) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 (#247) * feat: 공동구매 상태 변경 다이얼로그 구현 (#245) * feat: 공동구매 상태 변경 다이얼로그 view 구현 * feat: 공동구매 상태 변경 다이얼로그 Listener 구현 * feat: 공동구매 상태 변경 다이얼로그 연결 및 상태 변경 로직 수정 * test: 테스트 코드 작성을 위한 기본 세팅 (#255) * feat: CoroutinesTestExtension 구현 * feat: Livedata getOrAwaitValue 구현 * feat: InstantTaskExecutorExtension 구현 * feat: TestFixture 생성 * style: ktlint 적용 * feat: 공모글 목록 화면 UI 개선, 공모글 작성에서 낱개 금액이 엔빵 가격보다 저렴할 시 글 작성 막는 기능 구현 (#246) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * fix: 구분선을 각각의 아이템의 하단에 넣고 프래그먼트 뷰의 "채팅" 텍스트 밑에 하나 추가 * fix: 텍스트뷰에 font 적용, 마지막 댓글 시간 텍스트를 조금 왼쪽으로 이동 * fix: 낱개 가격 이름을 eachPrice -> originPrice 수정 * fix: 낱개 가격이 엔빵 가격보다 싸면 토스트를 띄우고 글작성을 막는 기능 구현 * fix: 네이티브앱키 로컬프로퍼티로 이동 * refactor: 함수명 변경 * fix: 카카오 계정으로 로그인 후 액티비티 전환하지 않는 문제 수정 * refactor: 사용되지 않는 클래스 삭제 * refactor: 패키지 수정 * refactor: alsong 로그 수정 * refactor: 변수명 수정 * refactor: Manifest의 네이티브앱 키 숨김 * refactor: 로컬프로퍼티의 데이터 형식 수정 * Update android.yml * refactor: alsong 로그 삭제 * ci 빌드 실패가 manifest때문인지 테스트 * refactor: 매니페스트에 앱 키 넣을 수 있게 하는 gradle 설정 수정 * 매니페스트 수정하고 재테스트 * 매니페스트 수정하고 재테스트 * chore: 그래들 수정 * chore: 그래들 수정2 * chore: 그래들 수정3 * chore: 그래들 수정4 * chore: 카카오 계정으로 로그인하는 기능 제외 * feat: 홈화면 테스트 작성 (#257) * chore: mockk의존성 추가 * test: OfferingViewModel 테스트 작성 * style: lint적용 * refactor: stub를 TestFixture로 이동 * test: 댓글방 테스트 코드 작성 (#258) * refactor: 댓글 보내는 함수명 변경 * refactor: 공구 약속 장소 및 시간 캐시 기능 * test: 테스트를 위한 fake repository 구현 * test: 댓글방 viewmodel test 작성 * feat: 댓글방 ActivityTest 작성 * feat: 댓글방 ActivityTest 작성 * style: ktlint 적용 * refactor: test fixture에서 사용하지 않는 것 삭제 * style: ktlint 적용 * feat: GA 모니터링 환경 구축 및 로깅 전략 적용 (#242) * chore: Firebase Crashlytics 의존성 추가 * feat: Firebase 초기화 * feat: FirebaseManager 구현 * feat: 총대가 공구 진행 상황을 다음 단계로 변경했을 때 event 추가 * feat: 로깅 기능 구현 - 검색 - 필터링 - 공모글 클릭 - 공모 참여 * style: lint적용 * feat: 글 작성 완료 시 event 추가 * feat: 로그인 시 event 추가 --------- * test: 공모글 작성 이미지 테스트 코드 작성 (#260) * refactor: 상수 가시성 변경 * feat: test fixture 구현 * feat: fake repository 이미지 업로드 기능 추가 * test: OfferingWriteViewModelTest 이미지 업로드 test 코드 작성 * feat: 로그인 후 홈화면으로 이동해도 로그인 화면이 종료되지 않는 문제 수정 (#261) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 로그인 후 LoginActivity가 종료되도록 수정 * feat: 공모 상세 화면 테스트 작성 (#264) * feat: OfferingDetailViewModel 테스트 작성 * refactor: 테스트 수정 * style: lint적용 * style: lint적용 * feat: 로깅 코드 삽입 (#266) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 * feature: 로깅 샘플 구현 * refactor: 불필요한 코드 제거 * feat: logging 적용 --------- * fix: 마감 임박 필터링 쿼리 수정 (#267) * chore: logback 설정 진행 (#270) * chore: logback 설정 * fix: multipart 요청 필터링 * chore: logback 설정 변경 * chore: pull request ci/cd 닫기 * fix: 이미지 업로드 API의 responseBody가 두 번 뜨는 오류 해결 (#273) * fix: 이미지 업로드 API 두 번 도는 문제 해결 * test: 이미지 업로드 API의 누락된 response field 추가 * refactor: 홈화면 수정 (#271) * refactor: 할인율 마진 추가 * refactor: 공구상태에 대한 문구 수정 * refactor: 클릭 시 최상단으로 이동하는 버튼 구현 * feat: 공모글 작성 화면 테스트코드 작성 (#274) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: 공모글 작성 테스트 구현 * feat: 댓글방 목록 화면 테스트코드 작성 (#276) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: "댓글방 목록을 확인할 수 있어야 한다" 테스트 작성 * feat: pageSize validation 추가 (#279) * feat: pageSize validation 추가 * feat: magic number 추출 * fix: 공모 상세 화면 오류 수정 (#280) * fix: 총대 여부 확인 로직 수정 * fix: 마감 임박 시 보여주는 버튼 수정 * fix: 공모 작성 후 홈화면으로 돌아왔을 떄 목록이 새로고침 되지 않는 오류 수정 * test: 테스트 코드 수정 * style: lint적용 * feat: 댓글방 목록 화면 자동 업데이트 되지 않는 문제 수정, 회원가입 이후 자동으로 로그인되지 않는 문제 수정 (#282) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 라이플사이클 오너 설정 * fix: 회원가입 후 자동으로 로그인 되도록 수정 * chore: change version name (#291) * feat: 카카오 계정 로그인 기능 구현 시 CI가 실패하는 문제 해결 (#296) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * feat: 로그인 화면 리팩토링 (#298) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * refactor: SimpleCookieJar의 패키지 변경(presentation 레이어에서 data레이어의 source 패키지로 이동) * refactor: data store를 관리하는 클래스를 생성하고 이 클래스를 사용하도록 변경 * refactor: 사용하지 않는 의존성과 주석 제거 * refactor: http status code 추가 * refactor: 함수분리 * refactor: ktFormat 적용 * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentRooms) * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentDetail), 사용되지 않게 된 memberId 제거 * refactor: ktFormat 적용 * test: 테스트코드 수정 * refactor: Preferences -> DataStore 이름 변경 * refactor: 채팅방 UI UX 개선 (#303) * feat: 키보드가 아닌 다른 영역을 클릭하면 키보드 내리는 기능 구현 * feat: 뒤로가는 버튼 기능 추가 * feat: 댓글 입력 maxLines 설정 및 maxLength 설정 * style: ktlint 적용 * 필요 없는 코드 제거 * feat: 댓글방 목록에서 자신이 총대인 댓글방의 UI 개선 (#304) * refactor: 댓글방의 자신이 총대인 댓글방 ui 개선 * fix: Binding 클래스 네이밍 수정 * feat: 가로모드, 다크모드 설정 (#305) * refactor: api변경에 따른 리팩토링 (#310) * feat: 로그인 화면 해상도 대응 (#313) * feat: 이미지 업로드 중일 때 로딩 상태 설정 (#317) * feat: 공모 글 작성 ui state 구현 * feat: 로딩 progressbar 생성 * feat: UI 상태에 따른 토스트 메시지 처리 * refactor: 잘못된 입력에 대한 에러 처리 변경 * refactor: 홈화면 리팩토링 (#324) * refactor: textSize dp로 변경 * refactor: 검색 버튼 크기 변경 - 검색 버튼 패딩 추가 - 검색창 끝에 패딩 추가 * refactor: 엔터키를 통해 검색하도록 수정 * refactor: 필터 단일 선택되도록 수정 * style: lint적용 * feat: 댓글방 새로운 기능 GA 연결 (#328) * feat: 댓글방 참여자 확인 Event 구현 * feat: 댓글방 상태 변경 다이얼로그 취소 Event * feat: 참여자가 공구에서 참여 포기 Event 구현 * style: ktlint 적용 * test: 테스트 데이터 수정 (#330) * feat: Fragment GA 모니터링 수집 (#332) * feat: fragment logScreenView 추적 함수 구현 * feat: 각 fragment에서 화면 감지 GA 설정 * feat: 마이페이지 기본 세팅 및 뷰 변경 (#335) * feat: 공모 참여 취소 기능 구현 (#318) * test: 공모 참여 취소 테스트코드 작성 * feat: 공모 참여 취소 기능 구현 * refactor: 불필요한 쿼리 메서드 제거 * style: 불필요한 개행 제거 * refactor: 모집중인 상태가 아닌 경우 공모 참여를 취소할 수 없도록 변경 * refactor: 공모 참여 취소 응답 상태 코드 변경 * refactor: 에러 메시지 명확한 문구로 변경 * refactor: query parameter를 적용해 어떤 공모의 참여를 취소할 것인지 의도를 명확하게 전달하도록 변경 * refactor: 총대 검증 메서드 네이밍 명확하게 변경 * feat: 댓글방 생성 시점 변경 (#319) * feat: 댓글방 생성 시점 변경 * refactor: 불필요한 도메인 OfferingWithRole 제거 * refactor: 불필요한 도메인 CommentWithRole 제거 * refactor: 댓글의 작성자 확인 메서드 추가 * refactor: 댓글방 목록 조회 dto 생성자 추가 * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 (#322) * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 * refactor: 로그인용 dto 분리 및 공통 dto에 prefix로 auth 추가 * feat: valid 어노테이션 추가 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 (#323) * refactor: 메서드명 구체적으로 변경 * refactor: 변수명 구체적으로 변경 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 * docs: todo 추가 * refactor: 함수명 통일 * feat: 공모자 여부 필드명 변경 * feat: 댓글방 상태 조회 API 확장 (#325) * feat: 댓글방 상태 조회 API 확장 * refactor: 댓글방 관련 로직 댓글 도메인으로 이동 * feat: LoggingFilter에서 던지는 유효하지 않은 요청에 대한 예외 처리 * refactor: 댓글 관련 엔드포인트 수정 * feat: 댓글방 정보 조회 시 조회 권한을 가진 사용자인지 검증 * refactor: 댓글방 상태 확인 로직 도메인으로 이동 * feat: 상태 변경을 시도하는 사용자가 총대인지 검증 * refactor: 댓글 목록 조회 엔드포인트 수정 * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 (#327) * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 * refactor: Response depth 줄이기 및 DTO 생성자 작성 * fix: imminent 필터 버그 해결 (#337) * fix: 커스텀 필터로 인해 h2-console 접속 깨지는 이슈 해결 (#339) * feat: 마이페이지 기능 구현 (#341) * feat: 마이페이지 닉네임 기능 구현 * feat: 로그아웃 로직 구현 * feat: url 연결 로직 구현 * feat: 필요없는 기능 삭제 * style: ktlint 적용 * feat: 공모 테이블에 할인율과 상태 필드 추가 (#342) * refactor: Condition과 Status 이름 변경 * refactor: 사용하지 않는 DTO 제거 * feat: OfferingEntity에 칼럼 추가 * feat: 공모 거래 날짜 필드 이름 변경 (#348) * fix: 상세화면에서 홈화면으로 갔을 때 상태 변경 안되는 오류 수정 (#343) * refactor: 공모상세페이지 Activity -> Fragment로 리팩토링 * fix: 페이지네이션 및 상태변경 미적용 오류 해결 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 주석 제거 및 상수화 * refactor: livedata 자료형 변경 * refactor: progressbar위치 수정 * refactor: lifecycleScope사용 리팩토링 * refactor: adapter에서 전체 아이템이 아닌 특정 아이템만 notify하도록 리팩토링 * refactor: API변경에 따른 대응 (#352) * refactor: api대응 * refactor: api변경에 따른 테스트 수정 * feat: 공모글 작성 화면 ux 개선 (#344) * fix: 각 항목의 설명을 place holder로 이동 * fix: 필수와 선택 항목의 프래그먼트 분리 * feat: 버튼이 항상 보이도록 수정 * fix: 가격과 총원은 숫자만 입력받도록 변경 * fix: 패딩 수정 * fix: ui 수정 * fix: 도메인 변경에 따른 deadline -> tradeDate 수정 * feat: 필수 항목을 모두 입력하면 선택 항목 화면으로 이동하는 기능 구현 * refactor: ktFormat 적용 * refactor: shared viewModel 사용, 미필수 항목을 미필수 입력 화면으로 이동 * refactor: 프래그먼트 이름 변경 * feat: 입력 숫자의 글자수와 라인수 제한 기능 구현 * fix: 총원이 -1이하로 떨어지는 버그 수정, 공동구매 텍스트 띄어쓰기 제거 * fix: 할인율, 엔빵 금액이 유효하지 않을 때는 "-"로 뜨도록 변경 * fix: 공모를 게시하면 필수, 선택 화면 모두 종료되도록 수정 * fix: 날짜 시간 픽커를 날짜만 선택하는 픽커로 변경 * refactor: ktFormat 적용 * refactor: 바인딩어댑터의 파라미터를 nullable하게 수정 * test: 테스트코드 수정 * feat: 낱개 가격의 place holder로 현재 엔빵 금액을 보여주는 기능 구현 * feat: 내용의 최대 글자수와 현재 글자수를 보여주는 기능 구현 * refactor: ktFormat 적용 * refactor: 공모글 작성시 memberId를 보내지 않도록 변경 * fix: 총원 최대 4자리에서 3자리까지만 입력받을 수 있도록 변경 * fix: deadline -> meetingDate 네이밍 수정 * fix: 공모글 작성 후 작성 화면의 입력값이 초기화되지 않는 버그 수정 * refactor: 네이밍 수정(eachPrice -> originPrice) * refactor: 네이밍 수정(individualPrice -> originPrice) * fix: 내용의 현재 글자수 색이 메인컬러가 되지 않는 문제 수정 * refactor: 프래그먼트 종료될 때 바인딩 해제하도록 수정 * refactor: id가 없는 뷰의 id 추가 * refactor: 함수 분리 * fix: 내용 옆의 * 제거 * fix: GA 이벤트 이름 변경(공모글 작성 - 필수 화면에서의 이벤트임을 명시함) * refactor: og 태그 추출 기능 수정 (#349) * refactor: crawler 패키지 이동 * feat: naver api 클라이언트 추가 refactor: 사용하지 않은 기존 og image 크롤러 명칭 변경 * feat: html 크롤링 방식과 naver api 방식을 조합하는 Extractor 구현 * fix: OfferingService ProductImageExtractor 추상화 * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 (#358) * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 * test: 테스트코드 수정 * refactor: 공모글 목록 조회 필터링 수정 및 추가 (#356) * refactor: 마감임박순 필터링 이름 마감임박만으로 변경 * refactor: 필터링 쿼리 수정 * feat: "참여가능만" 필터링 기능 구현 * feat: "참여가능만" 필터링 기능 연결 * fix: 쿼리 내 불필요한 파라미터 제거 * refactor: 할인율이 null일 경우 높은할인율 필터링 대상에서 제외 * feat: 참여가능만 필터링 전략 클래스 추가 * feat: 공모 목록 조회 API 응답값 변경 * fix: 높은 할인율 단위 변경 및 last-id 필터링 로직 수정 * style: 주석 제거 --------- * refactor: 할인율 계산 로직 수정 (#359) * refactor: 할인율 계산 로직 수정 * refactor: 소수점 둘째 자리에서 반올림하도록 변경 * test: 할인율 계산 로직 * fix: 할인율 단위 백분율로 수정 --------- * feat: 총 모집 인원 수 최댓값 설정 (#361) * fix: 필터 오류 수정 (#362) * fix: 필터 오류 수정 - '참여가능만'필터 분기처리 제거 * chore: 주석 제거 * feat: API 스펙 변경에 따른 대응 (#364) * feat: 댓글 목록 조회 api 스펙 변경에 따른 대응 * feat: 댓글방 정보 조회 api 스펙 변경에 따른 대응 * feat: 공모 일정 조회 api 스펙 변경에 따른 대응 * feat: 댓글 상태 변경 api 스펙 변경에 따른 대응 * test: api 스펙 변경에 따른 test 코드 변경 * style: ktlint 적용 * feat: remote dto package 분리 * feat: 자동 확정 기능을 위해 스케줄러 적용 (#363) * chore: todo 추가 및 메서드명 변경 * feat: Scheduled 어노테이션 추가 및 Scheduler 분리 * test: ServiceTest 환경 구축 * feat: offeringStatus 변경 로직 추가 * refactor: 수동 확정 로직 추가 및 코드 스타일 수정 * refactor: 자동 확정 로직을 조회에서 Scheduled로 이동 * fix: 마감임박 설정 기준 내일로 변경 --------- * fix: 공모 작성 후 홈화면 돌아올 때 새로 작성한 글이 보이지 않는 오류 수정 (#369) * feat: Access Token, Refresh Token을 data store에 저장하는 기능 구현 (#372) * feat: 앱 재시작 시 토큰을 데이터스토어에서 꺼내 사용하는 기능 구현 * feat: 로그인이 이미 되어있다면 로그인 화면을 건너뛰는 기능 구현 * feat: 로그아웃 기능 구현 * fix: 마이페이지 화면으로 넘어가면 바텀네비게이션이 사라지는 버그 수정 * fix: 데이터스토어에서 토큰이 꺼내지지 않는 버그 수정 data store에서 토큰을 꺼내는 코루틴 비동기 작업이 끝나기 전에 함수를 종료해 버려서 생기는 버그였습니다. * refactor: ktFormat 적용 * refactor: startActivity 함수를 LoginActivity가 동반객체로 갖고 있도록 변경 * refactor: 함수명과 event명 변경 추가로 GA위치가 조금 잘못된 점이 있어서 수정했습니다. * feat: 공모 상세 화면 추가 기능 반영 (#375) * feat: 신고하기 기능 구현 * feat: 물품 링크가 없으면 보여지지 않도록 구현 * refactor: 마감 시간에서 거래 날짜로 리팩토링 * feat: 이미 참여한 공모게시글에서 채팅방으로 이동하는 기능 구현 * fix: 댓글방 목록의 마지막 댓글방이 보이지 않는 문제 수정 (#376) * fix: 리사이클러뷰 레이아웃의 크기가 화면 밖에 벗어나지 않도록 수정 * fix: 리사이클러뷰 레이아웃의 맨 밑에 구분선 하나 추가 아래로 땡겼을 때 구분선이 사라져버리는게 보기 안좋아서 추가했습니다 * refactor: 코트 포맷 적용 (컨트롤 알트 L) * feat: isManualConfirmed 제거 및 도메인 로직 확인 (#377) * refactor: isManualConfirmed 칼럼 삭제 및 관련 로직 분리 * refactor: 더미 데이터 수정 --------- * feat: API 별 권한 확인 로직 추가 (#371) * feat: 권한 확인 로직 추가 * feat: 인증 필터 적용 * refactor: 더미 데이터 칼럼 위치 변경 (#382) * refactor: 홈화면 api필드 추가에 따른 대응 (#381) * refactor: dto필드 추가 * fix: 상태 변경 오류 해결 * fix: 필터 선택 또는 검색상태일 때 공모 작성 후 나오면 목록 안보이는 오류 수정 * refactor: 세부 주소 api에서 받아오도록 변경 * style: lint적용 * fix: API 문서에 접근할 수 없는 현상 해결 (#384) * fix: API 문서에 접근할 수 없는 현상 해결 * style: 신뢰할 수 있는 URL 개행 수정 * feat: 공모 목록에서 동을 보여주는 기능 구현 (#386) * feat: 공모 단건 조회 API 구현 (#388) * feat: 공모 상세 조회 API 엔드포인트 변경 * feat: 공모 단건 조회 API * style: 공모 관련 API 순서 변경 * test: 불필요한 공모글 생성 코드 제거 * test: 공모 단건 조회 서비스 테스트 * refactor: 상태변경 리팩토링 (#389) * refactor: 공모 상세 조회 api변경 대응 * refactor: 공모 상태 변경 리팩토링 * refactor: 리팩토링에 따른 테스트 수정 * chore: 불필요한 로그 제거 * fix: 댓글 입력 후 뒤로가기 시 최근 댓글이 반영되도록 수정 (#397) * chore: JAR 파일에 OAS 파일 누락되는 이슈 해결 및 중복 task 제거 (#391) * chore: 중복되는 task 제거 * chore: cicd 범위 조정 * fix: 참여자 목록 조회 API에서 totalCount 반환하지 않는 이슈 해결 (#400) * feat: 댓글방 참여자 확인 API 연결 (#401) * feat: 참가자 정보를 가져오는 api service 구현 * refactor: 필요없는 코드 삭제 * feat: 참여 관리 datasource 구현 * feat: 참여자 domain 모델 구현 * feat: 참여를 관리하는 repository 구현 * feat: 참여자 목록을 보여주는 recycler view 연결 및 구현 * refactor: 더보기 버튼 수정 * feat: 필요없는 리소스 파일 삭제 및 상태 기본 이미지 변경 * refactor: 약속 장소 및 시간 ui model 을 사용하여 관리 * refactor: 댓글방의 정보를 불러오는 로직 ui model을 사용하여 관리 * refactor: ui model 변환 로직 변경 * feat: 공동구매 참여 인원 확인 기능 구현 * feat: 신고하기 폼 연결 구현 * test: 코드 변경에 따른 테스트 코드 수정 * style: ktlint 적용 * refactor: xml id 추가 * feat: 댓글방 공동구매 나가기 API 연결 (#402) * feat: 공동구매 나가기 기능 api service 구현 * feat: 공동구매 나가기 기능 data source 구현 * feat: 공동구매 나가기 기능 repository 구현 * feat: 공동구매 나가기 기능 연결 * style:ktlint 적용 * fix: /auth/refresh endpoint accessToken 검증 예외 추가 (#407) * refactor: 더미 데이터 정합성 확보 (#406) * refactor: 더미 데이터 정합성 확보 * refactor: 추가된 칼럼 반영 * feat: CallApiHandler 구현 (#403) * feat: CallApiHandler 구현 * refactor: CommentRoomsDataSource 수정 * feat: CommentRemoteDataSourceImpl 에러핸들링을 통해 수정 * feat: 에러 핸들링에 따른 DataSource 리팩토링 - OfferingDetailDataSource - OfferingRemoteDataSource * feat: ParticipantRemoteDataSourceImpl 에러핸들링을 통해 수정 * style: ktlint 적용 * refactor: AuthRemoteDataSource 수정 * feat: Result의 map 과 getOrThrow 함수 생성 * feat: 에러 핸들링에 따른 Repository 리팩토링 - OfferingDetailRepository - OfferingRepository * refactor: Result 변경에 따른 레포지토리 수정 (AuthRepository, CommentRoomsRepository) * feat: 에러 핸들링에 따른 CommentDetailRepository 리팩토링 * feat: 에러 핸들링에 따른 ParticipantRepository 리팩토링 * feat: 에러 핸들링에 따른 viewmodel 리팩토링 - OfferingViewModel - OfferingDetailViewModel * refactor: 에러 핸들링에 따른 LoginViewModel 리팩토링 * refactor: 에러 핸들링에 따른 CommentRoomsViewModel 리팩토링 * refactor: 토큰 리프레쉬 후 다시 함수 호출하도록 추가 * feat: 에러 핸들링에 따른 CommentDetailViewModel 리팩토링 * refactor: 에러 핸들링에 따른 OfferingWriteViewModel 리팩토링 * refactor: 공모 목록 토큰 리프래시 적용 * fix: 잘못된 코드 수정 * refactor: 필요없는 주석 제거 * refactor: 공모 목록 리팩토링 * fix: 리빌드시 쿠키가 제대로 저장되지 않는 현상 수정 * refactor: 필요없는 코드 삭제 및 상수화 추가 * test: 에러핸들링에 따른 FakeAuthRepository, OfferingWriteViewModelTest 수정 * refactor: ktFormat 적용 * test: 코드 변경에 따른 Fake Repository 변경 * test: CommentDetailViewModelTest 코드 수정 * style: ktlint 적용 * refactor: 가독성 개선(에러 로그 함수명 추가, Success가 Error보다 위에 나오도록 수정) * refactor: 불필요한 로그 제거 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 람다 넘겨주는 방식 수정 * style: lint 적용 * test: 테스트코드 수정 --------- * feat: proguard를 사용한 난독화 적용 (#413) * chore: 환경에 따른 yml 파일 분리 (#411) * chore: 환경 별로 yml 파일 분리 * chore: 불필요한 yml 설정 제거 * fix: 공구 상세 페이지 오류 해결 (#417) * fix: 바로가기 클릭되지 않는 오류 수정 * refactor: 주소 표시할 때 최대 2줄까지 그리고 넘어갈 시 말줄임 나오도록 수정 * refactor: 공모 목록, 공모 상세 에러 핸들링 (#418) * refactor: 공모 목록에서 401에러를 제외하고는 에러코드 올 시 빈화면 보여주도록 에러핸들링 수정 * refactor: 필터및 업데이트된 공모 목록 가져오는 로직 에러핸들링 수정 - 400: 토스트 메시지 띄어줌 - 401: refresh - 그외에는 로그로 에러 코드를 보여줌 * refactor: strings네이밍 통일 * refactor: 공모 상세 에러 핸들링 수정 * refactor: strings정리 - offering_detail부분 정리 * feat: 카카오 로그인 중 사용자 정보 확인 로직을 안드로이드에서 백엔드로 이관 (#404) * feat: 카카오 로그인 API 구현 * feat: providerId를 loginId로 수정 * feat: 소셜 로그인 시 랜덤 생성된 비밀번호 사용 * refactor: 불필요한 api 제거 * test: 로그인 로직 변경 * test: MemberFixture 불필요한 함수 제거 및 통일 * refactor: 불필요한 정보 제거 * feat: 카카오 로그인 에러 핸들러 추가 * feat: 민감 정보 로깅에서 제외 --------- * feat: cookie 관련 예외 처리 (#409) * refactor: 더미 데이터 http 추가 (#422) * fix: 더미데이터 정합성 맞추기 (#425) * feat: 로그인 api 변경 반영 (#426) * feat: 카카오 로그인 후 총대마켓 서버로 email을 보내던 방식에서 카카오 access token을 보내는 방식으로 변경 * feat: login과 signup을 하나로 api로 통합된 것 반영 * refactor: ktFormat 적용 * refactor: 테스트코드 수정 * feat: 로깅 시 UUID가 아닌 회원 번호가 기록되도록 변경 (#428) * feat: logging 시 memberId가 나오도록 기능 추가 * feat: logging 시 memberId 및 identifier가 함께 나오도록 변경 * refactor: lombok getter 적용 * feat: Spring Timezone KST로 설정 (#430) * chore: Dockerfile 타임존 변경 (#432) * fix: Offering 목록 조회 시 NPE 해결 (#434) * refactor: 에러 핸들링 리팩토링 (#436) * feat: 리프레시 토큰 만료 시 데이터스토어를 비우고 로그인 화면으로 이동하는 기능 구현 (#438) * feat: 댓글방 에러 헨들링 (#439) * refactor: refresh시 401이 오는 경우에 대한 에러핸들링 추가 (#441) * chore: 버전 업데이트 (#443) * refactor: 외래키 필드 notnull 조건 추가 (#445) * chore: prod CI/CD 구축 (#423) * chore: 환경 별로 yml 파일 분리 * chore: 운영 서버 CI/CD 스크립트 작성 * chore: 운영 환경 내 swagger 문서 제거 * chore: 운영 환경 포트포워딩 명령어 제거 * chore: prod ci/cd 스크립트 트리거 추가 * chore: prod ci/cd 스크립트 트리거 변경 * chore: prod ci/cd 스크립트 트리거 path 구체화 * chore: prod ci/cd 스크립트 docker 실행 명령어 오타 수정 * chore: prod ci/cd 스크립트 path 롤백 * chore: dev 및 prod ci/cd 스크립트 data.sql 실행 비활성화 * chore: prod ci/cd 스크립트 path 롤백 * chore: dev script test --------- * chore: prod 불필요한 트리거 주석 처리 (#447) --------- Co-authored-by: Namyunsuk <84739562+Namyunsuk@users.noreply.github.com> Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: 채현 Co-authored-by: SCY Co-authored-by: alsong <138569524+songpink@users.noreply.github.com> Co-authored-by: masonkimseoul <87306418+masonkimseoul@users.noreply.github.com> Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> Co-authored-by: masonkimseoul Co-authored-by: fromitive Co-authored-by: Namyunsuk Co-authored-by: songpink * merge: main to develop-AN (v.1.1.0) * feat: 게시글 상세 화면 구현 (#8) * feat: 게시글 상세 화면 레이아웃 작성 * feat: Data layer코드 작성 * refactor: dto패키지 분리, dto에 serialName추가 * refactor: 도메인 모델 수정 - 가변에서 불변으로 변경 - 사용하지 않는 메서드 제거 * refactor: 공통으로 사용되거나 사용될 수 있는 확장함수를 별도의 파일로 분리 * style: lint 적용 * refactor: 메서드명 컨벤션 적용 * refactor: request Dto에 SerialName적용 * refactor: 메서드명 수정 * feat: 도메인 추가 (#15) * feat: BaseTimeEntity 추가 * feat: Member Entity 추가 * feat: Offering Entity 추가 * feat: OfferingMember Entity 추가 * feat: Comment Entity 추가 --------- * feat: BottomNavigation 구현 (#16) * chore: jetpack navigation 라이브러리 추가 * feat: 필요한 바텀 네비게이션 리소스 추가 * feat: bottom navigation fragment 추가 * feat: bottom navigation graph 구현 * refactor: 컨벤션에 맞게 id 수정 * feat: 공동구매 상세 조회 기능 구현 (#18) * chore: h2 환경설정 추가 * docs: http client 추가 * refactor: entity 접미어 적용 * chore: dummy data 추가 * docs: http client 값 변경 * refactor: repository 와 domain 패키지 분리 * feat: 공동구매 상세 조회 API 구현 * refactor: entity 접미어 적용 * style: 클래스 컨벤션 적용 * chore: h2 console 설정 제거 * refactor: OfferingCondition enum값 결정로직을 enum 안으로 이동 * feat: 홈화면, 마이페이지 화면 레이아웃 작성 (#19) * refactor: FragmentContainer width 속성 수정 * feat: 홈 화면 레이아웃 작성 * feat: 마이페이지 화면 레이아웃 작성 * fix: 플로팅 버튼이 홈에서만 보이도록 수정 * refactor: 리소스 네이밍 컨벤션에 맞게 수정 * feat: API 문서화 적용 (#23) * chore: springdoc-openapi 의존성 추가 * chore: springdoc 설정 추가 * feat: SwaggerConfig 파일 추가 * feat: 공모 상세 조회 API 문서화 --------- * fix: 공모 상세 조희 API의 price 필드 자료형 변경 및 memberId 필드 추가 (#28) * fix: 상세조회 API 금액 필드 자료형 변경 * fix: memberId 추가 * 내가 쓴 글인지 아닌지 확인 위해 --------- * chore: 백엔드 CI 및 도커 파일 작성 (#27) * chore: actions 적용 브랜치 설정 (#30) * chore: actions 적용 브랜치 설정 * chore: path 및 ref 태그 제거 * chore: working-directory 태그 추가 * chore: Dockerfile jar 경로 수정 * feat: 댓글방 목록 구현 (#26) * feat: 댓글방 목록 UI 구현 * fix: 구분선을 ImageView에서 View로 변경 * feat: 댓글방 목록 도메인 모델 구현 * feat: 댓글방 어답터 구현 * feat: "채팅" string 추가 * refactor: 불필요한 코드 제거 * fix: xmls 중복 속성 제거 * refactor: 댓글방 클래스들을 comment 패키지로 분리 * refactor: 컬러와 폰트 사이즈를 values 파일로 분리 * feat: 공모 목록 조회 기능 구현 (#35) * feat: 공모 목록 조회 API 구현 * docs: 공모 목록 조회 API http client에 추가 * fix: 공모 상세 조회 API의 status 필드를 condition으로 명칭 변경 * feat: 공모 목록 조회 API의 isClosed 필드 이름을 isOpen으로 변경 * feat: 댓글방 디테일 화면 구현 (#32) * feat: font 설정 * feat: vector 이미지 추가 * feat: 채팅 아이템 뷰 구현 * refactor: 컨벤션에 맞게 네이밍 수정 * feat: 댓글 입력 edit text 구현 * chore: 백엔드 CD 스크립트 작성 (#34) * chore: 백엔드 CD 스크립트 작성 * chore: 도커 백그라운드로 실행 * chore: 도커 설정 및 트리거 설정 변경 * chore: 도커 이미지 제거 로직 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 강제 제거하도록 수정 * chore: gradle 캐싱 로직 추가 (#39) * chore: gradle 캐싱 로직 추가 * chore: 이벤트 트리거 조건 수정 * feat: 공모 참여하기 기능 구현 (#40) * fix: BaseTimeEntity 적용 오류 수정 * feat: 참여하기 API 구현 --------- * feat: 공모 상세 조회 API에 참여자 목록 필드 추가 (#42) * feat: 공모 상세 조회 API의 request에 memberId 필드 추가 (#45) * feat: 공모 참여 API의 불필요한 응답값 전부 제거 (#48) * feat: 공모 참여 API의 불필요한 반환값 제거 * chore: 자주 쓰는 h2 console enabled 설정 주석 처리 * feat: 이미 참여한 공모에 참여 못하게 예외 처리 (#51) * feat: 공모 상세 페이지 API 연결 (#46) * build: 불필요한 의존성 제거, properties관련 코드 작성 * refactor: base_url코드상에서 제거 * feat: api수정에 따른 필드 변경 및 네이밍 반영 * refactor: 네이밍 변경 * refactor: OfferingDetail의 변경, mapper변경 * refactor: service분리 * refactor: DataSource, Repository분리 * refactor: API변경에 따른 리팩토링 * feat: 공모 상세 조회 기능 구현 * refactor: 참여하기 api변경에 따른 data, domain 코드 수정 * feat: 공모 상세 페이지 참여하기 기능 구현 * feat: 공모 상세 화면에서 이미지를 불러올 수 없을 시 기본이미지를 보여주는 기능 구현 * feat: 게시물 상세 화면 폰트 적용 * style: lint적용 * refactor: 액티비티 destroy시 binding해제하도록 코드 추가 * refactor: glide옵션 변경 - 에러 발생 시 보여줄 이미지 - url이 null일 시 보여줄 이미지 * refactor: viewModel에 custom getter추가 * fix: 내용이 짧을 시 뒷 배경이 회색으로 보이는 버그 수정 * fix: 참여하기 버튼을 눌렀을 시 텍스트가 바뀌지 않는 버그 수정 * feat: 테스트 데이터 다양화 (#52) * refactor: 공모 엔티티에 currentCount 필드 추가 (#55) * feat: 댓글 작성 API 구현 (#57) * feat: 댓글방 내 공모 일정 조회 기능 구현 (#58) * feat: 댓글방 내 공모 일정 조회 기능 구현 * refactor: 공모 일정 조회 api 명세 변경 --------- * refactor: common 패키지명을 global로 변경 (#61) * chore: 안드로이드 CI 파일 작성 (#63) * feat: 댓글 목록 조회 API 구현 (#66) * chore: build CI 작업을 위한 manifest 파일 수정 (#65) * chore: 알람 권한 추가 * chore: local properties 속성 추가 * chore: local properties null 체크 로직 추가 * chore: buildConfigField null 체크 * style: lint 적용 * chore: secret 값 설정 * fix: secret 값 오류 수정 * fix: 문법 오류 수정 * chore: 경로 수정 * chore: 문법 수정 * style: lint 적용 * feat: 댓글방 목록 조회 API 구현 (#70) * feat 댓글방 접히는 공지 뷰 구현 (#72) * chore: manifest에 CommentDetailActivity 추가 * feat: BindingAdatper을 사용하여 접힐 때 애니메이션 적용 및 픽셀 변환 * feat: viewmodel 구현 및 click 마다 접히고 펴지는 로직 구현 * style: ktlint 적용 * refactor: binding adpater을 사용하여 가시성 변경 * refactor: 댓글방 및 댓글 목록 조회 서비스 계층 (#78) * fix: 댓글방 목록 조회 시 가장 최근 댓글 조회 (#80) * feat: 홈화면 API 연결 (#74) * refactor: API변경에 따른 data, domain 코드 변경 * feat: 공모 목록 기능 구현 * refactor: 함수 분리 * style: lint적용 * style: font 적용 * fix: 시간순 정렬 쿼리 추가 (#83) * chore: 더미 데이터 추가 (#87) * feat: 댓글방 목록 API 연결 (#82) * feat: bottom navigation fragment 추가 * feat: vector 이미지 추가 * feat: 댓글방이 없으면 "채팅 목록이 없어요" 라는 텍스트뷰와 이미지뷰를 띄우는 기능 구현 * feat: 댓글방 띄우는 기능 구현 * test: 댓글방 UI 테스트 작성 * refactor: 테스트 클래스명 수정 * refactor: 줄바꿈 수정 * feat: 댓글방 API 서비스 구현 * refactor: API 명세에 따라 도메인 모델 수정 * feat: API 연결 * refactor: API명세에 따라 데이터바인딩 변수명 수정 * feat: 댓글방 목록 API 연결 * refactor: ktlint Format 적용 * refactor: 메모리 누수 방지를 위해 fragment가 destroy 될 때 _binding을 null로 설정 * refactor: 어답터를 방어적복사 하지 않아도 되어서 수정 * refactor: 채팅방이 없다는 이미지뷰를 띄워주는 방식 수정(바인딩 어댑터 수정) * refactor: 함수분리 * refactor: ktFormat 적용 --------- * feat: 댓글방 접히는 공지 API 연결 (#85) * feat: 미팅 일정 API 연결을 위한 data layer 구현 * feat: 미팅 일정 API 연결을 위한 domain layer 구현 * feat: 미팅 일정 API 연결을 위한 presentation layer 구현 * style: ktlint 적용 * feat: 공동 구매 제목 databinding 적용 * refactor: 변수명 수정 * fix: 펼치기 접기 버튼 로직 반대로 수정 * style: ktlint 적용 * chore: 더미 데이터 바로가기 url 수정 (#93) * feat: 공모 상세 페이지 기능 추가 (#94) * chore: 마이페이지 닉네임 임시로 지정 * feat: 바로가기 기능 구현 * feat: 참여버튼 클릭 시 댓글방으로 가도록 기능 구현 * feat: 신고하기 이미지 추가 * style: lint적용 * refactor: 불러오는 공모 페이지 사이즈 변경 * refactor: 댓글 도메인 코드 리팩터링 (#96) * refactor: 로그인 멤버 변수명 변경 * refactor: JPQL 쿼리 컨벤션 및 멤버로 공모 조회 메서드명 변경 * refactor: 최근 댓글 응답 클래스명 변경 * refactor: 컨트롤러 및 서비스 API 순서 변경 * refactor: 로그인 사용자 유효성 검증 * feat: 댓글방 댓글 작성 api 연결 (#95) * chore: windowSoftInputMode 추가 * feat: post comment api service 구현 * feat: post comment DataSource 구현 * feat: post comment Repository 구현 * feat: post comment Presentation 구현 * chore: 더미 데이터 시간 변경 (#100) * feat: 댓글방 입장 기능, 본인이 총대인 방은 다르게 보이는 기능 구현 (#99) * feat: 댓글방의 마지막 댓글 시간을 띄우는 기능 구현 * feat: 자신이 총대인 댓글방을 표시하는 기능 구현 * feat: 댓글방 목록을 클릭해 댓글방 상세로 이동하는 기능 구현 * test: UI테스트 수정 * refactor: 클릭시 id 뿐만 아니라 title도 받아오는 방식으로 수정 * refactor: 오전/오후와 시간을 텍스트뷰에 띄우는 바인딩 어댑터를 DateTimeFormatter의 기능을 사용하는 것으로 수정 * refactor: memberId를 local.properties의 token을 가져다 쓰는 것으로 변경(임시 조치) * refactor: 댓글방 목록의 시간을 띄우는 바인딩 어댑터의 속성명을 수정함 * refactor: 데이터바인딩 variable 변수명을 구체적으로 수정, 일관성을 위해 앞에 `on` 붙임 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정(빠트린것 수정함) * feat: 전반적인 예외 처리 (#103) * feat: 예외 처리 핸들러 추가 * feat: Offering 예외 처리 코드 추가 * feat: Comment 예외 처리 코드 추가 * feat: Member 예외 처리 코드 추가 * feat: OfferingMember 예외 처리 코드 추가 * feat: Offering 예외 처리 상세 코드 추가 * feat: 에러 코드 적용 * feat: 도메인 검증 로직 * feat: DTO 검증 로직 --------- * feat: swagger와 restdocs 연동 (#104) * chore: swagger ui 정적 파일 설치 및 static routing 세팅 * chore: restdocs-api-spec을 이용한 OAS 생성 * chore: swagger ui 정적 파일을 swagger-ui 디렉토리로 이동 * chore: swagger ui 정적 파일 및 static routing 세팅 제거 * chore: 생성된 OAS 파일을 Swagger 디렉터리로 복사하는 스크립트 작성 * chore: openapi3 yaml 파일 gitignore 처리 * chore: static routing 세팅 다시 추가 openapi3.yaml을 사용하기 위함 * test: RestAssured RestDocs 테스트 코드 작성 * test: 공모 목록 조회 API 문서화 * test: 공모 일정 조회 API 및 공모 참여 API 문서화 * test: 댓글 관련 API 문서화 * docs: 논의된 TODO 제거 * refactor: swagger 어노테이션 제거 * chore: 개발 API 서버 목록 설정 --------- * refactor: 에러메시지 필드명 변경 (#108) * fix: restdocs 관련 테스트 실패 이슈 해결 (#106) * chore: cicd 테스트 * chore: 테스트 위해 actions 범위 조정 * chore: 배포 스크립트 띄어쓰기 오타 수정 * chore: 빌드 캐싱 제거 * chore: logging * chore: --warning-mode all 옵션 줘서 gradle 호환 무시하도록 설정 * fix: status 달라서 실패하는 테스트 수정 * chore: actions 범위 수정 * chore: action 범위 수정 * chore: test용 static 파일 추가 * chore: static 하위 폴더를 jar 파일에 포함하도록 설정 * chore: swagger-ui 하위 폴더 제거 * chore: task 순서 조정 * chore: build 스크립트 수정 * chore: 불필요한 설정 변경 제거 * chore: clean build 대신 clean bootJar 사용 * chore: clean, build 각각 하도록 변경 * chore: test 까지 두 번 돌리도록 수정 * chore: openapi3까지 두 번 실행하도록 수정 * chore: copyOasToSwagger 까지 두번 실행하도록 수정 * chore: actions 활성화 범위 수정 * fix: 댓글방 목록 조회 시 참여자 수 조건 추가 (#111) * fix: 댓글방 조회 테스트 수정 (#113) * feat: 홈 화면 무한 스크롤 기능 구현 (#109) * build: pagination라이브러리 추가 * feat: 홈 화면 무한 스크롤 기능 구현 * fix: 마지막 댓글 response를 nullable하게 수정 (#115) * fix: 마지막 댓글 response를 nullable하게 수정 * refactor: ktFormat 적용 * feat: 댓글방 댓글 조회 api 연결 (#116) * feat: dto 및 mapper 구현 * feat: 댓글방 목록 service 구현 * feat: 댓글방 목록 data source 구현 * feat: 댓글방 목록 repository 및 model 구현 * feat: 댓글방 목록 view type을 활용한 recyclerview 구현 및 데이터 바인딩 * feat: polling 기능 구현 * feat: 댓글 스크롤 구현 (새로운 댓글이 생길시 스크롤 아래로) * feat: 총대와 다른 참가자 이미지 리소스 파일 * feat: 댓글방 디테일 공동 구매 상태별 관리 (#117) * feat: 공동구매 상태 관리 리소스 파일 * feat: 공동구매 상태를 관리하는 enum class 구현 * feat: 데이터바인딩을 사용하여 공동 구매 상태 뷰 업데이트 구현 * style: ktlint 적용 * feat: 공동구매 상태 관리 리소스 파일 추가 * fix: 이미지 링크 임시 수정 (#119) * fix: 이미지 링크 수정 (#120) * refactor: 네이밍 수정 (#123) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 (#125) * refactor: 뷰모델 팩토리 방식 변경 (#130) * refactor: 뷰모델 팩토리를 뷰모델의 동반객체로 이동 * style: lint적용 * refactor: Service분리 (#132) * refactor: service분리 * refactor: 패키지명 변경 * style: lint적용 * feat: 공모글 작성 UI 구현 (#134) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 뷰 구현 * fix: 뷰 수정사항 반영 * fix: @+id로 참조하는 부분을 수정 * fix: drawable의 네이밍에 where을 추가 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 (#136) * feat: 참여자 목록 drawer에 필요한 리소스 파일 추가 * refactor: 채팅 text gravity 수정 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 * style: ktlint 적용 * refactor: drawer early return 하는 방식으로 변경 * refactor: ivMore -> ivMoreOptions으로 네이밍 변경 * feat: 공구 참여자 item view 및 댓글방 view 사용자 친화적으로 수정 * chore: CI 빌드 스크립트 중 중복되는 task 제거해 성능 개선 (#128) * chore: jar태스크 비활성화하고 bootJar 태스크로만 JAR 파일 생성 * chore: cicd 범위 조정 * feat: 공모 작성 API 구현 (#139) * feat: 공모 작성 API 구현 * refactor: create를 save로 변경 * refactor: dto entity 매핑로직을 dto로 이동 * refactor: controller request 매개변수 명 컨벤션 적용 --------- * refactor: 공모에 저장하는 주소 값 구체화 (#141) * refactor: 공모에 저장하는 주소 값 구체화 * chore: github-action 스크립트 수정 * chore: CI/CD test 설정 추가 * chore: static/swagger-ui 폴더 추가 * chore: 설정 원상 복구 * chore: ci/cd 범위 수정 --------- * feat: 홈화면(공모목록) UI 추가 구현 및 상태 변경 대응 (#142) * feat: 공모의 상태 변경이 반영되도록 기능 구현 * feat: 공모 목록 ui변경 * feat: 필터 ui추가 * feat: API변경에 따른 DTO수정 * style: lint적용 * feat: resource추가 * refactor: ui위치 수정 * chore: 불필요한 괄호 제거 * refactor: item 수직 정렬 * feat: 댓글방 메시지 조회 시 commentId 필드 추가 (#150) * feat: OG 태그 크롤링 API 구현 (#148) * feat: OG 태그 크롤링 API 구현 * refactor: OG 태그 크롤링 API 엔드포인트 수정 --------- * refactor: 제품 코드와 API 문서 동기화 (#153) * refactor: API 문서 개선 (#157) * refactor: 댓글 작성 시 성공 상태 코드 변경 * refactor: 요청 필수 상태 설명 추가 --------- * feat: s3 이미지 업로드 API 구현 (#147) * feat: s3 이미지 업로드 API 구현 * chore: cicd 액션 범위 수정 * fix: 이미지 업로드 경로의 특수문자 제거 * chore: yml multipart 설정 추가 * chore: S3 업로드 결과 테스트 * fix: inputstream 변환로직 위치 이동 * fix: 업로드할 s3 path 올바르게 수정 * fix: 사진 url 속에 버킷이름을 cloudfront 도메인으로 수정 * chore: actions 범위 재조정 * feat: API endpoint 변경 * chore: docker image 지우는 작업을 마지막으로 이동 * chore: 다른 브랜치로 이전 커밋 이동하기 위해 제거 * chore: 충돌 해결 및 코드 스타일 변경 * test: S3 이미지 업로드 성공 케이스 추가 * test: multipart form data 문서화 * test: 공모 상태 enum 문서화 * feat: 파일 업로드 크기 제한 100MB에서 20MB로 변경 --------- * feat: 주소검색 기능구현 (#161) * refactor: 네이밍 컨벤션 적용 * build: webview 라이브러리 추가 * feat: 스크립트 실행위한 html파일 추가 * refactor: 인터페이스명 변경에 따른 변경 * feat: 주소검색 다이얼로그 레이아웃 작성 * feat: 주소검색 기능 구현 * style: lint적용 * refactor: 불필요한 코드 제거 * build: Firebase의존성 추가 (#165) * feat: 공모글 작성 API 연결 (#162) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 API 연결 구현 * feat: 공모글 작성 뷰모델 구현 * fix: edit text 데이터바인딩 추가 * chore: 테스트를 위해 MutableLiveData default값 넣어둠 * chore: deadline defualt값 형식에 맞게 수정 * feat: 글작성 화면을 액티비티에서 프래그먼트로 수정 * chore: 테스트목적이었던 주석과 mutable livedata 디폴트값 제거 * refactor: 임시 함수명 수정 * fix: 글작성 프래그먼트가 올라오기 전에 바텀 네비게이션이 사라지는 문제 수정 * feat: 필수 항목이 모두 입력되어야 버튼이 활성화 되는 기능 구현 * feat: 가격, 총원 입력이 잘못되었을 시 토스트를 띄우는 기능 구현 * fix: 버튼 비활성화 시 텍스트 변경 * feat: 앱 아이콘 변경 * feat: 앱 이름 변경(chongdae -> 총대마켓) * feat: 예상 엔빵 가격을 보여주는 기능 구현 * refactor: 상수화 * refactor: 예상 엔빵 가격에 ,가 들어가는 기능 구현, 콜론 뒤 white space 추가 * feat: 공구 할인율을 계산해 주는 기능 구현 * feat: +, - 버튼으로 총원을 조절하는 기능 구현 * fix: 할인율과 엔빵가격 계산 시 0으로 나눠지는 상황을 제거 * fix: 맞춤법 수정 할인률 -> 할인율 * fix: 총원 버튼 크기가 너무 작아서 확대 * fix: 항목간 간격이 좁아서 확대 * refactor: Offering Write의 API service, DataSource, Repository를 Offerings와 합침 * refactor: 디버깅용 코드 삭제 * refactor: 버튼 활성화/비활성화를 selector와 삼항연산자로 구현 * refactor: 바인딩어댑터 대신 뷰모델이 visibility 상태를 갖고 있는 방식으로 변경 * refactor: 바인딩어댑터 대신 xml에서 처리하는 방식으로 변경 * refactor: 총원 디폴트 라이브데이터값 상수화 * refactor: +, - 텍스트뷰 버튼으로 수정 * refactor: textStyle bold대신 fontFamily suit_bold를 쓰는 것으로 수정 * refactor: 변수명 뒤에 Int를 붙이는 것 대신 Value를 붙이는 것으로 수정 * refactor: 글작성 제출 버튼의 아이디를 추가 * refactor: ktFormat * refactor: 토스트를 띄우는 함수 분리 * refactor: 도메인 객체 분리 * refactor: UI모델 적용 * refactor: ktFormat 적용 * feat: 댓글방 디테일 Room을 사용하여 data 저장 (#166) * feat: local database 구현 * feat: entity 구현 * feat: dao 구현 * feat: LocalDataSourceImpl 구현 * feat: entity mapper 구현 * refactor: CommentResponse 에 id 값 추가 * refactor: datasource 이름 변경 및 패키지 변경 * refactor: article -> offering으로 네이밍 변경 * refactor: repository 패키지 변경에 따른 수정 * refactor: datasource 패키지 변경 및 local 과 remote 분리 * refactor: repository Application 클래스를 통한 주입으로 변경 * style: ktlint 적용 * refactor: api service 리네이밍 * refactor: git conflict 해결 * refactor: 함수 이름 컨벤션에 맞도록 변경 (getMeetings -> fetchMeetings) * chore: CI 스크립트 추가 (#173) * chore: ci 스크립트 추가 * chore: ci 스크립트 수정 * fix: og 태그 추출 시 크롤링 이슈 해결 (#174) * feat: 날짜, 시간 선택 기능 구현, 주소검색 기능 연결 (#171) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 모집마감 시간 클릭 시 date time picker를 띄우는 기능 구현 * feat: 날짜, 시간 선택 기능 구현 * feat: 주소 검색 기능 연결 * refactor: 함수명 수정, 함수분리 * refactor: ktFormat 적용 * refactor: string으로 분리, 상수화 * fix: string 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정3 * chore: CI workflow 파일 수정4 * feat: 공모가 정상적으로 게시되었을 시 "공모가 게시되었어요!" 라는 토스트를 띄우고 공모글 작성 프래그먼트를 종료하는 기능 구현 * feat: 토스트가 화면 중앙에 뜨는 문제 수정 * refactor: 사용되지 않는 파일 삭제 * refactor: xml 뷰 id 수정 * refactor: 버튼이 TextView인 문제 수정 * refactor: 사용되지 않는 data binding variable 제거 * refactor: 함수명 수정 * refactor: 다이얼로그, dateTimePickerBinding 전역으로 선언 * refactor: dateTimePicker 클릭 이벤트를 추상화 해 xml에서 처리하도록 변경 * refactor: ktFormat * feat: 상품 URL 이미지 추출 API 연결 (#180) * refactor: 사용하지 않는 파일 제거 * refactor: 가시성 변경 * feat: api service 구현 * feat: datasource 구현 * refactor: repository 네이밍 수정 (offeringsRepository -> offeringRepository) * feat: 사진 업로드 관련 리소스 파일 추가 * feat: repository 및 model 구현 * feat: 이미지 링크를 통한 크롤링 이미지 불러오는 api 연결 및 이미지 삭제 로직 구현 * style: ktlint 적용 * refactor: 이미지 prefix 추가 및 에러 메시지 수정 * refactor: build 오류 수정 * fix: git conflict 해결 * feat: 공모 목록 조회 API에 필터링과 검색 기능 추가 (#169) * feat: 공모 필터 목록 조회 API 구현 * test: 공모 필터 목록 조회 API 테스트 * style: 개행 형식 통일 * feat: 공모 필터 목록 조회 API Specification 도입 준비 * fix: url에 큰따움표 제거 * feat: Specification 도입 * refactor: queryString 구체화 * refactor: 함수명 변경 * feat: 최신순 필터링 적용 * feat: 마감임박순 필터링 적용 * feat: 높은할인률순 필터링 적용 * refactor: 전략 패턴 적용해 여러 갈래의 분기문과 중복되는 코드 처리 * test: 변경된 API 스펙에 맞게 문서화 작업 * refactor: 관련있는 메서드들끼리 모이게 순서 재배치 * refactor: 맞춤법 수정 * style: 개행 제거 --------- * feat: 상태 변경 API 구현 (#175) * feat: 댓글방 상태 변경 및 조회 API 구현 * feat: 공모글 상태 조회 API 구현 * feat: 댓글방 상태 변경 중 수동 확정 기능 구현 * refactor: 상태 변경 관련 메서드명 수정 * refactor: 추상 클래스 메서드 컨벤션 통일 * refactor: errorCode 사용 시 클래스 명시 * refactor: 댓글방 상태 관련 API 엔드포인트 수정 및 패키지 변경 * refactor: 댓글방 상태 변경 API HTTP 메서드 수정 * feat: 공모 모집 자동 확정 시 댓글방 상태 변경 --------- * feat: 로그인 기능 구현 (#177) * feat: password 일방향 암호화 기능 구현 * feat: cookie 생산-소비 기능 구현 * chore: jwt 관련 의존성 추가 * feat: 토큰 생성 기능 구현 * feat: 로그인 API 구현 * test: 로그인 API 테스트 * feat: 회원가입 API 구현 * test: 회원가입 API 테스트 * feat: 닉네임 생성 기능 구현 * test: 닉네임 생성 기능 테스트 * fix: postconstruct 여러 개라 발생한 에러 해결 * feat: 회원가입 응답값에 랜덤생성한 닉네임 추가 * feat: MemberArgumentResolver 구현 * feat: MemberArgumentResolver 일부 적용 * test: 바뀐 스펙에 맞게 변경 * test: TestConfig 설정해 빈충돌 오류 해결 * test: 공모 작성 API로 MemberArgumentResolver 사용 * feat: 토큰 재발급 API 구현 * test: 토큰 재발급 API 테스트 * test: 토큰 재발급 API 에러 테스트 * feat: MemberArgumentResolver commant에 적용 * feat: MemberArgumentResolver offering에 적용 * feat: MemberArgumentResolver participant에 적용 * refactor: ci값이 일치하지 않을경우 오류메시지 문구 변경 * refactor: 클래스명 일관적으로 변경 * refactor: 직관적인 명명으로 enum 네이밍 변경 * refactor: Custom Exception 적용 * refactor: 컨트롤러 메서드에 접근제어자 명시 * fix: 중복된 enum 값 제거 * test: 바뀐 API 스펙에 맞게 변경 --------- * fix: nicknameWordInitializer 설정 오류 해결 (#182) * fix: keyword null일 때 처리 및 docs에서 required 제거 (#184) * fix: keyword null일 때 처리 * test: optional() 붙여서 required 제거 * chore: 브랜치에 상관없이 pr 머지 시 자동으로 관련 이슈 닫는 스크립트 구현 (#187) * fix: og 이미지 태그 크롤링 문제 해결 (#190) * refactor: 댓글방 상태 도메인 설계 변경 (#189) * feat: 공모 목록 API 응답값에 낱개 가격 추가 (#193) * chore: readtimeout 5초로 수정 (#195) * feat: 댓글방 상태 조회 시 상태별 이미지 함께 반환 (#196) * feat: 공모 목록 조회 API연결 (#201) * refactor: Condition 수정에 따른 변경 * refactor: api변경에 따른 리팩토링 * refactor: api변경에 따른 목록 무한 스크롤 기능 리팩토링 * feat: 검색 기능 구현 * feat: 필터링 기능 구현 - 참여 가능은 서버 에러로 추후 추가 예정 * feat: 아이템을 불러온 후 recyclerview의 최상단으로 이동하는 기능 구현 - 검색, 필터링 수행 후 최상단으로 이동 * feat: 필터링 목록 불러오는 api연결 * feat: 마감임박 상태 추가 * refactor: default parameter제거 * style: lint적용 * feat: 토큰 반환 시 cookie가 아닌 body 사용하도록 변경 (#206) * feat: 발급한 토큰을 header가 아닌 body로 반환하도록 수정 * refactor: 사용안하는 클래스와 메서드 제거 * test: 바뀐 API 스펙에 맞게 명세 수정 * feat: 이미지 더미 데이터 수정 및 부정확한 가격 데이터 수정 (#207) * refactor: 공모 글 작성 시 총대 참여자 추가 (#208) * feat: 바텀 네비게이션 고정 기능 구현 (#211) * feat: 데이터에서 5자 이상 제거 (#212) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 (#202) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 * refactor: 도메인 명칭 변경 (낱개가격 -> 원가격) * refactor: 도메인 명칭 변경 (공모 -> 댓글방) * refactor: originPrice로 http client 변경 * feat: 키보드 이외 영역 터치 시 키보드 내려가도록 구현 (#214) * feat: 키보드외 화면 클릭 시 키보드 내려가도록 구현 * refactor: api변경에 다른 dto수정 * feat: 이미지 업로드 및 권한 설정 (#216) * chore: 이미지 권한 추가 * feat: permission manager을 생성하여 권한 체크 및 request * feat: 이미지 추가 버튼을 클릭할 시 권한 설정 연결 * feat: 이미지 피커를 사용하여 uri 전달 구현 * feat: 이미지 파일 업로드 api service 구현 * feat: 이미지 파일 업로드 data source 구현 * feat: 이미지 파일 업로드 repository 구현 * feat: 이미지 파일 martipart로 변환해주는 기능 구현 * feat: 이미지 업로드 관련 뷰 수정 * feat: 이미지 파일 업로드 및 api 연결 구현 * style: ktlint format * fix: git conflict 해결 * refactor: 이미지 scaleType 변경 * refactor: string value 컨벤션 적용 * feat: 토큰 반환 시 body가 아닌 cookie로 반환하도록 원상복구 (#223) * feat: 토큰 재발급 API에서 requestHeader로 refreshToken 받도록 수정 (#227) * feat: 토큰 재발급 API에서 body가 아닌 cookie로 토큰 반환 * feat: 회원가입 API도 body가 아닌 cookie로 토큰 반환 * refactor: service 용 dto 명 컨벤션에 맞춰 수정 * feat: 댓글방 일정 수정 API 구현 (#226) * feat: 댓글방 일정 수정 API 구현 * test: 총대가 아닌 참여자가 공모 일정 정보를 수정할 경우 예외 발생 * feat: 댓글방 상태 조회 시 버튼 텍스트 추가 (#229) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 (#222) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 * refactor: 구현 방식 변경 * style: lint적용 * Feature/217 offering status (#230) * feat: 댓글방 상태 조회 api service 구현 * feat: 댓글방 상태 조회 model 및 dto 구현 * feat: 댓글방 상태 조회 datasource 구현 * feat: 댓글방 상태 조회 repository 구현 * feat: 댓글방 상태 조회 api 연결 구현 * style: ktlint 적용 * feat: 댓글방 상태 변경 (#231) * feat: 댓글방 상태 변경 api service 구현 * feat: 댓글방 상태 변경 data source 구현 * Revert "feat: 댓글방 상태 변경 data source 구현" This reverts commit 052691a8de945c60a60586ee66a05a6a3b264217. * feat: 댓글방 상태 변경 data source 구현 * feat: 댓글방 상태 변경 repository 구현 * feat: 댓글방 상태 변경 api 연결 구현 * style: ktlint 적용 * feature: 카카오 로그인 구현 (#235) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * feat: 공모 참여자 목록 조회 API 구현 (#225) * feat: 공모 참여자 목록 조회 API 구현 * test: 실패 테스트 오류 수정 * style: 띄어쓰기 적용 * refactor: MemberEntity를 받도록 변경 * refactor: isParticipant를 구현하여 가독성 개선 * refactor: 총대를 찾을 수 없는 상황의 예외 추가 * refactor: 참여 검증로직을 서비스로 이동 * refactor: 사용하지 않는 메서드 제거 * refactor: 검증 로직 가장 상단에 위치 * refactor: 총대 추출 로직 수정 --------- * refactor: 마감임박순 필터링 쿼리 조건 수정 (#239) * refactor: 마감임박순 필터링 조건 수정 * refactor: 더미 데이터 시간 수정 * fix: 필터링 오류 수정 (#243) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 (#247) * feat: 공동구매 상태 변경 다이얼로그 구현 (#245) * feat: 공동구매 상태 변경 다이얼로그 view 구현 * feat: 공동구매 상태 변경 다이얼로그 Listener 구현 * feat: 공동구매 상태 변경 다이얼로그 연결 및 상태 변경 로직 수정 * test: 테스트 코드 작성을 위한 기본 세팅 (#255) * feat: CoroutinesTestExtension 구현 * feat: Livedata getOrAwaitValue 구현 * feat: InstantTaskExecutorExtension 구현 * feat: TestFixture 생성 * style: ktlint 적용 * feat: 공모글 목록 화면 UI 개선, 공모글 작성에서 낱개 금액이 엔빵 가격보다 저렴할 시 글 작성 막는 기능 구현 (#246) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * fix: 구분선을 각각의 아이템의 하단에 넣고 프래그먼트 뷰의 "채팅" 텍스트 밑에 하나 추가 * fix: 텍스트뷰에 font 적용, 마지막 댓글 시간 텍스트를 조금 왼쪽으로 이동 * fix: 낱개 가격 이름을 eachPrice -> originPrice 수정 * fix: 낱개 가격이 엔빵 가격보다 싸면 토스트를 띄우고 글작성을 막는 기능 구현 * fix: 네이티브앱키 로컬프로퍼티로 이동 * refactor: 함수명 변경 * fix: 카카오 계정으로 로그인 후 액티비티 전환하지 않는 문제 수정 * refactor: 사용되지 않는 클래스 삭제 * refactor: 패키지 수정 * refactor: alsong 로그 수정 * refactor: 변수명 수정 * refactor: Manifest의 네이티브앱 키 숨김 * refactor: 로컬프로퍼티의 데이터 형식 수정 * Update android.yml * refactor: alsong 로그 삭제 * ci 빌드 실패가 manifest때문인지 테스트 * refactor: 매니페스트에 앱 키 넣을 수 있게 하는 gradle 설정 수정 * 매니페스트 수정하고 재테스트 * 매니페스트 수정하고 재테스트 * chore: 그래들 수정 * chore: 그래들 수정2 * chore: 그래들 수정3 * chore: 그래들 수정4 * chore: 카카오 계정으로 로그인하는 기능 제외 * feat: 홈화면 테스트 작성 (#257) * chore: mockk의존성 추가 * test: OfferingViewModel 테스트 작성 * style: lint적용 * refactor: stub를 TestFixture로 이동 * test: 댓글방 테스트 코드 작성 (#258) * refactor: 댓글 보내는 함수명 변경 * refactor: 공구 약속 장소 및 시간 캐시 기능 * test: 테스트를 위한 fake repository 구현 * test: 댓글방 viewmodel test 작성 * feat: 댓글방 ActivityTest 작성 * feat: 댓글방 ActivityTest 작성 * style: ktlint 적용 * refactor: test fixture에서 사용하지 않는 것 삭제 * style: ktlint 적용 * feat: GA 모니터링 환경 구축 및 로깅 전략 적용 (#242) * chore: Firebase Crashlytics 의존성 추가 * feat: Firebase 초기화 * feat: FirebaseManager 구현 * feat: 총대가 공구 진행 상황을 다음 단계로 변경했을 때 event 추가 * feat: 로깅 기능 구현 - 검색 - 필터링 - 공모글 클릭 - 공모 참여 * style: lint적용 * feat: 글 작성 완료 시 event 추가 * feat: 로그인 시 event 추가 --------- * test: 공모글 작성 이미지 테스트 코드 작성 (#260) * refactor: 상수 가시성 변경 * feat: test fixture 구현 * feat: fake repository 이미지 업로드 기능 추가 * test: OfferingWriteViewModelTest 이미지 업로드 test 코드 작성 * feat: 로그인 후 홈화면으로 이동해도 로그인 화면이 종료되지 않는 문제 수정 (#261) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 로그인 후 LoginActivity가 종료되도록 수정 * feat: 공모 상세 화면 테스트 작성 (#264) * feat: OfferingDetailViewModel 테스트 작성 * refactor: 테스트 수정 * style: lint적용 * style: lint적용 * feat: 로깅 코드 삽입 (#266) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 * feature: 로깅 샘플 구현 * refactor: 불필요한 코드 제거 * feat: logging 적용 --------- * fix: 마감 임박 필터링 쿼리 수정 (#267) * chore: logback 설정 진행 (#270) * chore: logback 설정 * fix: multipart 요청 필터링 * chore: logback 설정 변경 * chore: pull request ci/cd 닫기 * fix: 이미지 업로드 API의 responseBody가 두 번 뜨는 오류 해결 (#273) * fix: 이미지 업로드 API 두 번 도는 문제 해결 * test: 이미지 업로드 API의 누락된 response field 추가 * refactor: 홈화면 수정 (#271) * refactor: 할인율 마진 추가 * refactor: 공구상태에 대한 문구 수정 * refactor: 클릭 시 최상단으로 이동하는 버튼 구현 * feat: 공모글 작성 화면 테스트코드 작성 (#274) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: 공모글 작성 테스트 구현 * feat: 댓글방 목록 화면 테스트코드 작성 (#276) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: "댓글방 목록을 확인할 수 있어야 한다" 테스트 작성 * feat: pageSize validation 추가 (#279) * feat: pageSize validation 추가 * feat: magic number 추출 * fix: 공모 상세 화면 오류 수정 (#280) * fix: 총대 여부 확인 로직 수정 * fix: 마감 임박 시 보여주는 버튼 수정 * fix: 공모 작성 후 홈화면으로 돌아왔을 떄 목록이 새로고침 되지 않는 오류 수정 * test: 테스트 코드 수정 * style: lint적용 * feat: 댓글방 목록 화면 자동 업데이트 되지 않는 문제 수정, 회원가입 이후 자동으로 로그인되지 않는 문제 수정 (#282) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 라이플사이클 오너 설정 * fix: 회원가입 후 자동으로 로그인 되도록 수정 * chore: change version name (#291) * feat: 카카오 계정 로그인 기능 구현 시 CI가 실패하는 문제 해결 (#296) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * feat: 로그인 화면 리팩토링 (#298) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * refactor: SimpleCookieJar의 패키지 변경(presentation 레이어에서 data레이어의 source 패키지로 이동) * refactor: data store를 관리하는 클래스를 생성하고 이 클래스를 사용하도록 변경 * refactor: 사용하지 않는 의존성과 주석 제거 * refactor: http status code 추가 * refactor: 함수분리 * refactor: ktFormat 적용 * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentRooms) * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentDetail), 사용되지 않게 된 memberId 제거 * refactor: ktFormat 적용 * test: 테스트코드 수정 * refactor: Preferences -> DataStore 이름 변경 * refactor: 채팅방 UI UX 개선 (#303) * feat: 키보드가 아닌 다른 영역을 클릭하면 키보드 내리는 기능 구현 * feat: 뒤로가는 버튼 기능 추가 * feat: 댓글 입력 maxLines 설정 및 maxLength 설정 * style: ktlint 적용 * 필요 없는 코드 제거 * feat: 댓글방 목록에서 자신이 총대인 댓글방의 UI 개선 (#304) * refactor: 댓글방의 자신이 총대인 댓글방 ui 개선 * fix: Binding 클래스 네이밍 수정 * feat: 가로모드, 다크모드 설정 (#305) * refactor: api변경에 따른 리팩토링 (#310) * feat: 로그인 화면 해상도 대응 (#313) * feat: 이미지 업로드 중일 때 로딩 상태 설정 (#317) * feat: 공모 글 작성 ui state 구현 * feat: 로딩 progressbar 생성 * feat: UI 상태에 따른 토스트 메시지 처리 * refactor: 잘못된 입력에 대한 에러 처리 변경 * refactor: 홈화면 리팩토링 (#324) * refactor: textSize dp로 변경 * refactor: 검색 버튼 크기 변경 - 검색 버튼 패딩 추가 - 검색창 끝에 패딩 추가 * refactor: 엔터키를 통해 검색하도록 수정 * refactor: 필터 단일 선택되도록 수정 * style: lint적용 * feat: 댓글방 새로운 기능 GA 연결 (#328) * feat: 댓글방 참여자 확인 Event 구현 * feat: 댓글방 상태 변경 다이얼로그 취소 Event * feat: 참여자가 공구에서 참여 포기 Event 구현 * style: ktlint 적용 * test: 테스트 데이터 수정 (#330) * feat: Fragment GA 모니터링 수집 (#332) * feat: fragment logScreenView 추적 함수 구현 * feat: 각 fragment에서 화면 감지 GA 설정 * feat: 마이페이지 기본 세팅 및 뷰 변경 (#335) * feat: 공모 참여 취소 기능 구현 (#318) * test: 공모 참여 취소 테스트코드 작성 * feat: 공모 참여 취소 기능 구현 * refactor: 불필요한 쿼리 메서드 제거 * style: 불필요한 개행 제거 * refactor: 모집중인 상태가 아닌 경우 공모 참여를 취소할 수 없도록 변경 * refactor: 공모 참여 취소 응답 상태 코드 변경 * refactor: 에러 메시지 명확한 문구로 변경 * refactor: query parameter를 적용해 어떤 공모의 참여를 취소할 것인지 의도를 명확하게 전달하도록 변경 * refactor: 총대 검증 메서드 네이밍 명확하게 변경 * feat: 댓글방 생성 시점 변경 (#319) * feat: 댓글방 생성 시점 변경 * refactor: 불필요한 도메인 OfferingWithRole 제거 * refactor: 불필요한 도메인 CommentWithRole 제거 * refactor: 댓글의 작성자 확인 메서드 추가 * refactor: 댓글방 목록 조회 dto 생성자 추가 * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 (#322) * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 * refactor: 로그인용 dto 분리 및 공통 dto에 prefix로 auth 추가 * feat: valid 어노테이션 추가 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 (#323) * refactor: 메서드명 구체적으로 변경 * refactor: 변수명 구체적으로 변경 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 * docs: todo 추가 * refactor: 함수명 통일 * feat: 공모자 여부 필드명 변경 * feat: 댓글방 상태 조회 API 확장 (#325) * feat: 댓글방 상태 조회 API 확장 * refactor: 댓글방 관련 로직 댓글 도메인으로 이동 * feat: LoggingFilter에서 던지는 유효하지 않은 요청에 대한 예외 처리 * refactor: 댓글 관련 엔드포인트 수정 * feat: 댓글방 정보 조회 시 조회 권한을 가진 사용자인지 검증 * refactor: 댓글방 상태 확인 로직 도메인으로 이동 * feat: 상태 변경을 시도하는 사용자가 총대인지 검증 * refactor: 댓글 목록 조회 엔드포인트 수정 * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 (#327) * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 * refactor: Response depth 줄이기 및 DTO 생성자 작성 * fix: imminent 필터 버그 해결 (#337) * fix: 커스텀 필터로 인해 h2-console 접속 깨지는 이슈 해결 (#339) * feat: 마이페이지 기능 구현 (#341) * feat: 마이페이지 닉네임 기능 구현 * feat: 로그아웃 로직 구현 * feat: url 연결 로직 구현 * feat: 필요없는 기능 삭제 * style: ktlint 적용 * feat: 공모 테이블에 할인율과 상태 필드 추가 (#342) * refactor: Condition과 Status 이름 변경 * refactor: 사용하지 않는 DTO 제거 * feat: OfferingEntity에 칼럼 추가 * feat: 공모 거래 날짜 필드 이름 변경 (#348) * fix: 상세화면에서 홈화면으로 갔을 때 상태 변경 안되는 오류 수정 (#343) * refactor: 공모상세페이지 Activity -> Fragment로 리팩토링 * fix: 페이지네이션 및 상태변경 미적용 오류 해결 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 주석 제거 및 상수화 * refactor: livedata 자료형 변경 * refactor: progressbar위치 수정 * refactor: lifecycleScope사용 리팩토링 * refactor: adapter에서 전체 아이템이 아닌 특정 아이템만 notify하도록 리팩토링 * refactor: API변경에 따른 대응 (#352) * refactor: api대응 * refactor: api변경에 따른 테스트 수정 * feat: 공모글 작성 화면 ux 개선 (#344) * fix: 각 항목의 설명을 place holder로 이동 * fix: 필수와 선택 항목의 프래그먼트 분리 * feat: 버튼이 항상 보이도록 수정 * fix: 가격과 총원은 숫자만 입력받도록 변경 * fix: 패딩 수정 * fix: ui 수정 * fix: 도메인 변경에 따른 deadline -> tradeDate 수정 * feat: 필수 항목을 모두 입력하면 선택 항목 화면으로 이동하는 기능 구현 * refactor: ktFormat 적용 * refactor: shared viewModel 사용, 미필수 항목을 미필수 입력 화면으로 이동 * refactor: 프래그먼트 이름 변경 * feat: 입력 숫자의 글자수와 라인수 제한 기능 구현 * fix: 총원이 -1이하로 떨어지는 버그 수정, 공동구매 텍스트 띄어쓰기 제거 * fix: 할인율, 엔빵 금액이 유효하지 않을 때는 "-"로 뜨도록 변경 * fix: 공모를 게시하면 필수, 선택 화면 모두 종료되도록 수정 * fix: 날짜 시간 픽커를 날짜만 선택하는 픽커로 변경 * refactor: ktFormat 적용 * refactor: 바인딩어댑터의 파라미터를 nullable하게 수정 * test: 테스트코드 수정 * feat: 낱개 가격의 place holder로 현재 엔빵 금액을 보여주는 기능 구현 * feat: 내용의 최대 글자수와 현재 글자수를 보여주는 기능 구현 * refactor: ktFormat 적용 * refactor: 공모글 작성시 memberId를 보내지 않도록 변경 * fix: 총원 최대 4자리에서 3자리까지만 입력받을 수 있도록 변경 * fix: deadline -> meetingDate 네이밍 수정 * fix: 공모글 작성 후 작성 화면의 입력값이 초기화되지 않는 버그 수정 * refactor: 네이밍 수정(eachPrice -> originPrice) * refactor: 네이밍 수정(individualPrice -> originPrice) * fix: 내용의 현재 글자수 색이 메인컬러가 되지 않는 문제 수정 * refactor: 프래그먼트 종료될 때 바인딩 해제하도록 수정 * refactor: id가 없는 뷰의 id 추가 * refactor: 함수 분리 * fix: 내용 옆의 * 제거 * fix: GA 이벤트 이름 변경(공모글 작성 - 필수 화면에서의 이벤트임을 명시함) * refactor: og 태그 추출 기능 수정 (#349) * refactor: crawler 패키지 이동 * feat: naver api 클라이언트 추가 refactor: 사용하지 않은 기존 og image 크롤러 명칭 변경 * feat: html 크롤링 방식과 naver api 방식을 조합하는 Extractor 구현 * fix: OfferingService ProductImageExtractor 추상화 * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 (#358) * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 * test: 테스트코드 수정 * refactor: 공모글 목록 조회 필터링 수정 및 추가 (#356) * refactor: 마감임박순 필터링 이름 마감임박만으로 변경 * refactor: 필터링 쿼리 수정 * feat: "참여가능만" 필터링 기능 구현 * feat: "참여가능만" 필터링 기능 연결 * fix: 쿼리 내 불필요한 파라미터 제거 * refactor: 할인율이 null일 경우 높은할인율 필터링 대상에서 제외 * feat: 참여가능만 필터링 전략 클래스 추가 * feat: 공모 목록 조회 API 응답값 변경 * fix: 높은 할인율 단위 변경 및 last-id 필터링 로직 수정 * style: 주석 제거 --------- * refactor: 할인율 계산 로직 수정 (#359) * refactor: 할인율 계산 로직 수정 * refactor: 소수점 둘째 자리에서 반올림하도록 변경 * test: 할인율 계산 로직 * fix: 할인율 단위 백분율로 수정 --------- * feat: 총 모집 인원 수 최댓값 설정 (#361) * fix: 필터 오류 수정 (#362) * fix: 필터 오류 수정 - '참여가능만'필터 분기처리 제거 * chore: 주석 제거 * feat: API 스펙 변경에 따른 대응 (#364) * feat: 댓글 목록 조회 api 스펙 변경에 따른 대응 * feat: 댓글방 정보 조회 api 스펙 변경에 따른 대응 * feat: 공모 일정 조회 api 스펙 변경에 따른 대응 * feat: 댓글 상태 변경 api 스펙 변경에 따른 대응 * test: api 스펙 변경에 따른 test 코드 변경 * style: ktlint 적용 * feat: remote dto package 분리 * feat: 자동 확정 기능을 위해 스케줄러 적용 (#363) * chore: todo 추가 및 메서드명 변경 * feat: Scheduled 어노테이션 추가 및 Scheduler 분리 * test: ServiceTest 환경 구축 * feat: offeringStatus 변경 로직 추가 * refactor: 수동 확정 로직 추가 및 코드 스타일 수정 * refactor: 자동 확정 로직을 조회에서 Scheduled로 이동 * fix: 마감임박 설정 기준 내일로 변경 --------- * fix: 공모 작성 후 홈화면 돌아올 때 새로 작성한 글이 보이지 않는 오류 수정 (#369) * feat: Access Token, Refresh Token을 data store에 저장하는 기능 구현 (#372) * feat: 앱 재시작 시 토큰을 데이터스토어에서 꺼내 사용하는 기능 구현 * feat: 로그인이 이미 되어있다면 로그인 화면을 건너뛰는 기능 구현 * feat: 로그아웃 기능 구현 * fix: 마이페이지 화면으로 넘어가면 바텀네비게이션이 사라지는 버그 수정 * fix: 데이터스토어에서 토큰이 꺼내지지 않는 버그 수정 data store에서 토큰을 꺼내는 코루틴 비동기 작업이 끝나기 전에 함수를 종료해 버려서 생기는 버그였습니다. * refactor: ktFormat 적용 * refactor: startActivity 함수를 LoginActivity가 동반객체로 갖고 있도록 변경 * refactor: 함수명과 event명 변경 추가로 GA위치가 조금 잘못된 점이 있어서 수정했습니다. * feat: 공모 상세 화면 추가 기능 반영 (#375) * feat: 신고하기 기능 구현 * feat: 물품 링크가 없으면 보여지지 않도록 구현 * refactor: 마감 시간에서 거래 날짜로 리팩토링 * feat: 이미 참여한 공모게시글에서 채팅방으로 이동하는 기능 구현 * fix: 댓글방 목록의 마지막 댓글방이 보이지 않는 문제 수정 (#376) * fix: 리사이클러뷰 레이아웃의 크기가 화면 밖에 벗어나지 않도록 수정 * fix: 리사이클러뷰 레이아웃의 맨 밑에 구분선 하나 추가 아래로 땡겼을 때 구분선이 사라져버리는게 보기 안좋아서 추가했습니다 * refactor: 코트 포맷 적용 (컨트롤 알트 L) * feat: isManualConfirmed 제거 및 도메인 로직 확인 (#377) * refactor: isManualConfirmed 칼럼 삭제 및 관련 로직 분리 * refactor: 더미 데이터 수정 --------- * feat: API 별 권한 확인 로직 추가 (#371) * feat: 권한 확인 로직 추가 * feat: 인증 필터 적용 * refactor: 더미 데이터 칼럼 위치 변경 (#382) * refactor: 홈화면 api필드 추가에 따른 대응 (#381) * refactor: dto필드 추가 * fix: 상태 변경 오류 해결 * fix: 필터 선택 또는 검색상태일 때 공모 작성 후 나오면 목록 안보이는 오류 수정 * refactor: 세부 주소 api에서 받아오도록 변경 * style: lint적용 * fix: API 문서에 접근할 수 없는 현상 해결 (#384) * fix: API 문서에 접근할 수 없는 현상 해결 * style: 신뢰할 수 있는 URL 개행 수정 * feat: 공모 목록에서 동을 보여주는 기능 구현 (#386) * feat: 공모 단건 조회 API 구현 (#388) * feat: 공모 상세 조회 API 엔드포인트 변경 * feat: 공모 단건 조회 API * style: 공모 관련 API 순서 변경 * test: 불필요한 공모글 생성 코드 제거 * test: 공모 단건 조회 서비스 테스트 * refactor: 상태변경 리팩토링 (#389) * refactor: 공모 상세 조회 api변경 대응 * refactor: 공모 상태 변경 리팩토링 * refactor: 리팩토링에 따른 테스트 수정 * chore: 불필요한 로그 제거 * fix: 댓글 입력 후 뒤로가기 시 최근 댓글이 반영되도록 수정 (#397) * chore: JAR 파일에 OAS 파일 누락되는 이슈 해결 및 중복 task 제거 (#391) * chore: 중복되는 task 제거 * chore: cicd 범위 조정 * fix: 참여자 목록 조회 API에서 totalCount 반환하지 않는 이슈 해결 (#400) * feat: 댓글방 참여자 확인 API 연결 (#401) * feat: 참가자 정보를 가져오는 api service 구현 * refactor: 필요없는 코드 삭제 * feat: 참여 관리 datasource 구현 * feat: 참여자 domain 모델 구현 * feat: 참여를 관리하는 repository 구현 * feat: 참여자 목록을 보여주는 recycler view 연결 및 구현 * refactor: 더보기 버튼 수정 * feat: 필요없는 리소스 파일 삭제 및 상태 기본 이미지 변경 * refactor: 약속 장소 및 시간 ui model 을 사용하여 관리 * refactor: 댓글방의 정보를 불러오는 로직 ui model을 사용하여 관리 * refactor: ui model 변환 로직 변경 * feat: 공동구매 참여 인원 확인 기능 구현 * feat: 신고하기 폼 연결 구현 * test: 코드 변경에 따른 테스트 코드 수정 * style: ktlint 적용 * refactor: xml id 추가 * feat: 댓글방 공동구매 나가기 API 연결 (#402) * feat: 공동구매 나가기 기능 api service 구현 * feat: 공동구매 나가기 기능 data source 구현 * feat: 공동구매 나가기 기능 repository 구현 * feat: 공동구매 나가기 기능 연결 * style:ktlint 적용 * fix: /auth/refresh endpoint accessToken 검증 예외 추가 (#407) * refactor: 더미 데이터 정합성 확보 (#406) * refactor: 더미 데이터 정합성 확보 * refactor: 추가된 칼럼 반영 * feat: CallApiHandler 구현 (#403) * feat: CallApiHandler 구현 * refactor: CommentRoomsDataSource 수정 * feat: CommentRemoteDataSourceImpl 에러핸들링을 통해 수정 * feat: 에러 핸들링에 따른 DataSource 리팩토링 - OfferingDetailDataSource - OfferingRemoteDataSource * feat: ParticipantRemoteDataSourceImpl 에러핸들링을 통해 수정 * style: ktlint 적용 * refactor: AuthRemoteDataSource 수정 * feat: Result의 map 과 getOrThrow 함수 생성 * feat: 에러 핸들링에 따른 Repository 리팩토링 - OfferingDetailRepository - OfferingRepository * refactor: Result 변경에 따른 레포지토리 수정 (AuthRepository, CommentRoomsRepository) * feat: 에러 핸들링에 따른 CommentDetailRepository 리팩토링 * feat: 에러 핸들링에 따른 ParticipantRepository 리팩토링 * feat: 에러 핸들링에 따른 viewmodel 리팩토링 - OfferingViewModel - OfferingDetailViewModel * refactor: 에러 핸들링에 따른 LoginViewModel 리팩토링 * refactor: 에러 핸들링에 따른 CommentRoomsViewModel 리팩토링 * refactor: 토큰 리프레쉬 후 다시 함수 호출하도록 추가 * feat: 에러 핸들링에 따른 CommentDetailViewModel 리팩토링 * refactor: 에러 핸들링에 따른 OfferingWriteViewModel 리팩토링 * refactor: 공모 목록 토큰 리프래시 적용 * fix: 잘못된 코드 수정 * refactor: 필요없는 주석 제거 * refactor: 공모 목록 리팩토링 * fix: 리빌드시 쿠키가 제대로 저장되지 않는 현상 수정 * refactor: 필요없는 코드 삭제 및 상수화 추가 * test: 에러핸들링에 따른 FakeAuthRepository, OfferingWriteViewModelTest 수정 * refactor: ktFormat 적용 * test: 코드 변경에 따른 Fake Repository 변경 * test: CommentDetailViewModelTest 코드 수정 * style: ktlint 적용 * refactor: 가독성 개선(에러 로그 함수명 추가, Success가 Error보다 위에 나오도록 수정) * refactor: 불필요한 로그 제거 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 람다 넘겨주는 방식 수정 * style: lint 적용 * test: 테스트코드 수정 --------- * feat: proguard를 사용한 난독화 적용 (#413) * chore: 환경에 따른 yml 파일 분리 (#411) * chore: 환경 별로 yml 파일 분리 * chore: 불필요한 yml 설정 제거 * fix: 공구 상세 페이지 오류 해결 (#417) * fix: 바로가기 클릭되지 않는 오류 수정 * refactor: 주소 표시할 때 최대 2줄까지 그리고 넘어갈 시 말줄임 나오도록 수정 * refactor: 공모 목록, 공모 상세 에러 핸들링 (#418) * refactor: 공모 목록에서 401에러를 제외하고는 에러코드 올 시 빈화면 보여주도록 에러핸들링 수정 * refactor: 필터및 업데이트된 공모 목록 가져오는 로직 에러핸들링 수정 - 400: 토스트 메시지 띄어줌 - 401: refresh - 그외에는 로그로 에러 코드를 보여줌 * refactor: strings네이밍 통일 * refactor: 공모 상세 에러 핸들링 수정 * refactor: strings정리 - offering_detail부분 정리 * feat: 카카오 로그인 중 사용자 정보 확인 로직을 안드로이드에서 백엔드로 이관 (#404) * feat: 카카오 로그인 API 구현 * feat: providerId를 loginId로 수정 * feat: 소셜 로그인 시 랜덤 생성된 비밀번호 사용 * refactor: 불필요한 api 제거 * test: 로그인 로직 변경 * test: MemberFixture 불필요한 함수 제거 및 통일 * refactor: 불필요한 정보 제거 * feat: 카카오 로그인 에러 핸들러 추가 * feat: 민감 정보 로깅에서 제외 --------- * feat: cookie 관련 예외 처리 (#409) * refactor: 더미 데이터 http 추가 (#422) * fix: 더미데이터 정합성 맞추기 (#425) * feat: 로그인 api 변경 반영 (#426) * feat: 카카오 로그인 후 총대마켓 서버로 email을 보내던 방식에서 카카오 access token을 보내는 방식으로 변경 * feat: login과 signup을 하나로 api로 통합된 것 반영 * refactor: ktFormat 적용 * refactor: 테스트코드 수정 * feat: 로깅 시 UUID가 아닌 회원 번호가 기록되도록 변경 (#428) * feat: logging 시 memberId가 나오도록 기능 추가 * feat: logging 시 memberId 및 identifier가 함께 나오도록 변경 * refactor: lombok getter 적용 * feat: Spring Timezone KST로 설정 (#430) * chore: Dockerfile 타임존 변경 (#432) * fix: Offering 목록 조회 시 NPE 해결 (#434) * refactor: 에러 핸들링 리팩토링 (#436) * feat: 리프레시 토큰 만료 시 데이터스토어를 비우고 로그인 화면으로 이동하는 기능 구현 (#438) * feat: 댓글방 에러 헨들링 (#439) * refactor: refresh시 401이 오는 경우에 대한 에러핸들링 추가 (#441) * chore: 버전 업데이트 (#443) * refactor: 외래키 필드 notnull 조건 추가 (#445) * chore: prod CI/CD 구축 (#423) * chore: 환경 별로 yml 파일 분리 * chore: 운영 서버 CI/CD 스크립트 작성 * chore: 운영 환경 내 swagger 문서 제거 * chore: 운영 환경 포트포워딩 명령어 제거 * chore: prod ci/cd 스크립트 트리거 추가 * chore: prod ci/cd 스크립트 트리거 변경 * chore: prod ci/cd 스크립트 트리거 path 구체화 * chore: prod ci/cd 스크립트 docker 실행 명령어 오타 수정 * chore: prod ci/cd 스크립트 path 롤백 * chore: dev 및 prod ci/cd 스크립트 data.sql 실행 비활성화 * chore: prod ci/cd 스크립트 path 롤백 * chore: dev script test --------- * chore: prod 불필요한 트리거 주석 처리 (#447) --------- Co-authored-by: Namyunsuk <84739562+Namyunsuk@users.noreply.github.com> Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: 채현 Co-authored-by: SCY Co-authored-by: alsong <138569524+songpink@users.noreply.github.com> Co-authored-by: masonkimseoul <87306418+masonkimseoul@users.noreply.github.com> Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> Co-authored-by: masonkimseoul Co-authored-by: fromitive Co-authored-by: Namyunsuk Co-authored-by: songpink * feat: 안드로이드 CD 구축 (#415) * feat: 안드로이드 CD 구축 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * feat: 테스트 * chore: 버전 변경 * chore: 버전 변경 * feat: 비공개테스트 트랙으로 변경 * feat: 비공개테스트 트랙으로 변경 * chore: 버전 변경 * feat: release로 시작하는 branch에서만 CD 작업 --------- Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> Co-authored-by: 채현 * feat: 키보드 이벤트 감지 기능 수정 (#463) * feat: 이미지 로딩 기능 복원 (#465) * fix: 공모 제목 및 가격 줄바꿈, 말줄임 되도록 수정 (#466) * refactor: 홈 화면 UX개선 (#473) * refactor: 필터 텍스트 크기 수정 * refactor: 검색 결과가 없을 시 텍스트를 통해 명시적으로 알려주도록 수정 * refactor: 검색창에 지우기 버튼 만들기 - 클릭 시 검색 텍스트 지워짐 + 전체 공모 보여지는 초기화면보여주도록 * build: SwipeRefreshLayout의존성 추가 * feat: 하단으로 스와이프 시 새로고침 되는 기능 구현 * refactor: 검색창 문구 변경 * refactor: 채팅 UX 개선 (#479) * feat: 나의 채팅 글자 크기 조정 * feat: 채팅 전송 사이즈 변경 * feat: 토큰 리프레시가 제대로 이루어지지 않는 오류 수정 (#480) * fix: Access Token Refresh가 실패하면 이후 로직 처리 * style: ktFormat 적용 * refactor: 필요 없어진 코드 제거 * chore: 필요 없는 주석 제거 * fix: access_token, refresh_token 만료 시 오류 응답 값이 다르게 나오도록 변경 (#478) * test: refreshSecret 키 불일치 수정 * fix: accessToken 만료 시 401 코드를 응답하도록 수정 * chore: 불필요한 파일 삭제 * fix: POSIX 오류 적용 * feat: 공모글 작성 시 이전 날짜 선택 불가하도록 수정, Calendar 방식으로 DatePicker를 변경 (#481) * feat: Date Picker를 달력 형태로 변경 * feat: 현재보다 이전 날짜는 선택할 수 없도록 제한하는 기능 구현 * hotfix: og 크롤링 정상 작동 시 http https 프로토콜 정보 제거 (#458) * feat: 게시글 상세 화면 구현 (#8) * feat: 게시글 상세 화면 레이아웃 작성 * feat: Data layer코드 작성 * refactor: dto패키지 분리, dto에 serialName추가 * refactor: 도메인 모델 수정 - 가변에서 불변으로 변경 - 사용하지 않는 메서드 제거 * refactor: 공통으로 사용되거나 사용될 수 있는 확장함수를 별도의 파일로 분리 * style: lint 적용 * refactor: 메서드명 컨벤션 적용 * refactor: request Dto에 SerialName적용 * refactor: 메서드명 수정 * feat: BottomNavigation 구현 (#16) * chore: jetpack navigation 라이브러리 추가 * feat: 필요한 바텀 네비게이션 리소스 추가 * feat: bottom navigation fragment 추가 * feat: bottom navigation graph 구현 * refactor: 컨벤션에 맞게 id 수정 * feat: 홈화면, 마이페이지 화면 레이아웃 작성 (#19) * refactor: FragmentContainer width 속성 수정 * feat: 홈 화면 레이아웃 작성 * feat: 마이페이지 화면 레이아웃 작성 * fix: 플로팅 버튼이 홈에서만 보이도록 수정 * refactor: 리소스 네이밍 컨벤션에 맞게 수정 * feat: 댓글방 목록 구현 (#26) * feat: 댓글방 목록 UI 구현 * fix: 구분선을 ImageView에서 View로 변경 * feat: 댓글방 목록 도메인 모델 구현 * feat: 댓글방 어답터 구현 * feat: "채팅" string 추가 * refactor: 불필요한 코드 제거 * fix: xmls 중복 속성 제거 * refactor: 댓글방 클래스들을 comment 패키지로 분리 * refactor: 컬러와 폰트 사이즈를 values 파일로 분리 * feat: 댓글방 디테일 화면 구현 (#32) * feat: font 설정 * feat: vector 이미지 추가 * feat: 채팅 아이템 뷰 구현 * refactor: 컨벤션에 맞게 네이밍 수정 * feat: 댓글 입력 edit text 구현 * feat: 공모 상세 페이지 API 연결 (#46) * build: 불필요한 의존성 제거, properties관련 코드 작성 * refactor: base_url코드상에서 제거 * feat: api수정에 따른 필드 변경 및 네이밍 반영 * refactor: 네이밍 변경 * refactor: OfferingDetail의 변경, mapper변경 * refactor: service분리 * refactor: DataSource, Repository분리 * refactor: API변경에 따른 리팩토링 * feat: 공모 상세 조회 기능 구현 * refactor: 참여하기 api변경에 따른 data, domain 코드 수정 * feat: 공모 상세 페이지 참여하기 기능 구현 * feat: 공모 상세 화면에서 이미지를 불러올 수 없을 시 기본이미지를 보여주는 기능 구현 * feat: 게시물 상세 화면 폰트 적용 * style: lint적용 * refactor: 액티비티 destroy시 binding해제하도록 코드 추가 * refactor: glide옵션 변경 - 에러 발생 시 보여줄 이미지 - url이 null일 시 보여줄 이미지 * refactor: viewModel에 custom getter추가 * fix: 내용이 짧을 시 뒷 배경이 회색으로 보이는 버그 수정 * fix: 참여하기 버튼을 눌렀을 시 텍스트가 바뀌지 않는 버그 수정 * chore: 안드로이드 CI 파일 작성 (#63) * chore: build CI 작업을 위한 manifest 파일 수정 (#65) * chore: 알람 권한 추가 * chore: local properties 속성 추가 * chore: local properties null 체크 로직 추가 * chore: buildConfigField null 체크 * style: lint 적용 * chore: secret 값 설정 * fix: secret 값 오류 수정 * fix: 문법 오류 수정 * chore: 경로 수정 * chore: 문법 수정 * style: lint 적용 * feat 댓글방 접히는 공지 뷰 구현 (#72) * chore: manifest에 CommentDetailActivity 추가 * feat: BindingAdatper을 사용하여 접힐 때 애니메이션 적용 및 픽셀 변환 * feat: viewmodel 구현 및 click 마다 접히고 펴지는 로직 구현 * style: ktlint 적용 * refactor: binding adpater을 사용하여 가시성 변경 * feat: 홈화면 API 연결 (#74) * refactor: API변경에 따른 data, domain 코드 변경 * feat: 공모 목록 기능 구현 * refactor: 함수 분리 * style: lint적용 * style: font 적용 * feat: 댓글방 목록 API 연결 (#82) * feat: bottom navigation fragment 추가 * feat: vector 이미지 추가 * feat: 댓글방이 없으면 "채팅 목록이 없어요" 라는 텍스트뷰와 이미지뷰를 띄우는 기능 구현 * feat: 댓글방 띄우는 기능 구현 * test: 댓글방 UI 테스트 작성 * refactor: 테스트 클래스명 수정 * refactor: 줄바꿈 수정 * feat: 댓글방 API 서비스 구현 * refactor: API 명세에 따라 도메인 모델 수정 * feat: API 연결 * refactor: API명세에 따라 데이터바인딩 변수명 수정 * feat: 댓글방 목록 API 연결 * refactor: ktlint Format 적용 * refactor: 메모리 누수 방지를 위해 fragment가 destroy 될 때 _binding을 null로 설정 * refactor: 어답터를 방어적복사 하지 않아도 되어서 수정 * refactor: 채팅방이 없다는 이미지뷰를 띄워주는 방식 수정(바인딩 어댑터 수정) * refactor: 함수분리 * refactor: ktFormat 적용 --------- Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> * feat: 댓글방 접히는 공지 API 연결 (#85) * feat: 미팅 일정 API 연결을 위한 data layer 구현 * feat: 미팅 일정 API 연결을 위한 domain layer 구현 * feat: 미팅 일정 API 연결을 위한 presentation layer 구현 * style: ktlint 적용 * feat: 공동 구매 제목 databinding 적용 * refactor: 변수명 수정 * fix: 펼치기 접기 버튼 로직 반대로 수정 * style: ktlint 적용 * feat: 공모 상세 페이지 기능 추가 (#94) * chore: 마이페이지 닉네임 임시로 지정 * feat: 바로가기 기능 구현 * feat: 참여버튼 클릭 시 댓글방으로 가도록 기능 구현 * feat: 신고하기 이미지 추가 * style: lint적용 * refactor: 불러오는 공모 페이지 사이즈 변경 * feat: 댓글방 댓글 작성 api 연결 (#95) * chore: windowSoftInputMode 추가 * feat: post comment api service 구현 * feat: post comment DataSource 구현 * feat: post comment Repository 구현 * feat: post comment Presentation 구현 * feat: 댓글방 입장 기능, 본인이 총대인 방은 다르게 보이는 기능 구현 (#99) * feat: 댓글방의 마지막 댓글 시간을 띄우는 기능 구현 * feat: 자신이 총대인 댓글방을 표시하는 기능 구현 * feat: 댓글방 목록을 클릭해 댓글방 상세로 이동하는 기능 구현 * test: UI테스트 수정 * refactor: 클릭시 id 뿐만 아니라 title도 받아오는 방식으로 수정 * refactor: 오전/오후와 시간을 텍스트뷰에 띄우는 바인딩 어댑터를 DateTimeFormatter의 기능을 사용하는 것으로 수정 * refactor: memberId를 local.properties의 token을 가져다 쓰는 것으로 변경(임시 조치) * refactor: 댓글방 목록의 시간을 띄우는 바인딩 어댑터의 속성명을 수정함 * refactor: 데이터바인딩 variable 변수명을 구체적으로 수정, 일관성을 위해 앞에 `on` 붙임 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정(빠트린것 수정함) * feat: 홈 화면 무한 스크롤 기능 구현 (#109) * build: pagination라이브러리 추가 * feat: 홈 화면 무한 스크롤 기능 구현 * fix: 마지막 댓글 response를 nullable하게 수정 (#115) * fix: 마지막 댓글 response를 nullable하게 수정 * refactor: ktFormat 적용 * feat: 댓글방 댓글 조회 api 연결 (#116) * feat: dto 및 mapper 구현 * feat: 댓글방 목록 service 구현 * feat: 댓글방 목록 data source 구현 * feat: 댓글방 목록 repository 및 model 구현 * feat: 댓글방 목록 view type을 활용한 recyclerview 구현 및 데이터 바인딩 * feat: polling 기능 구현 * feat: 댓글 스크롤 구현 (새로운 댓글이 생길시 스크롤 아래로) * feat: 총대와 다른 참가자 이미지 리소스 파일 * feat: 댓글방 디테일 공동 구매 상태별 관리 (#117) * feat: 공동구매 상태 관리 리소스 파일 * feat: 공동구매 상태를 관리하는 enum class 구현 * feat: 데이터바인딩을 사용하여 공동 구매 상태 뷰 업데이트 구현 * style: ktlint 적용 * feat: 공동구매 상태 관리 리소스 파일 추가 * refactor: 네이밍 수정 (#123) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 (#125) * refactor: 뷰모델 팩토리 방식 변경 (#130) * refactor: 뷰모델 팩토리를 뷰모델의 동반객체로 이동 * style: lint적용 * refactor: Service분리 (#132) * refactor: service분리 * refactor: 패키지명 변경 * style: lint적용 * feat: 공모글 작성 UI 구현 (#134) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 뷰 구현 * fix: 뷰 수정사항 반영 * fix: @+id로 참조하는 부분을 수정 * fix: drawable의 네이밍에 where을 추가 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 (#136) * feat: 참여자 목록 drawer에 필요한 리소스 파일 추가 * refactor: 채팅 text gravity 수정 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 * style: ktlint 적용 * refactor: drawer early return 하는 방식으로 변경 * refactor: ivMore -> ivMoreOptions으로 네이밍 변경 * feat: 공구 참여자 item view 및 댓글방 view 사용자 친화적으로 수정 * feat: 홈화면(공모목록) UI 추가 구현 및 상태 변경 대응 (#142) * feat: 공모의 상태 변경이 반영되도록 기능 구현 * feat: 공모 목록 ui변경 * feat: 필터 ui추가 * feat: API변경에 따른 DTO수정 * style: lint적용 * feat: resource추가 * refactor: ui위치 수정 * chore: 불필요한 괄호 제거 * refactor: item 수직 정렬 * feat: 주소검색 기능구현 (#161) * refactor: 네이밍 컨벤션 적용 * build: webview 라이브러리 추가 * feat: 스크립트 실행위한 html파일 추가 * refactor: 인터페이스명 변경에 따른 변경 * feat: 주소검색 다이얼로그 레이아웃 작성 * feat: 주소검색 기능 구현 * style: lint적용 * refactor: 불필요한 코드 제거 * build: Firebase의존성 추가 (#165) * feat: 공모글 작성 API 연결 (#162) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 API 연결 구현 * feat: 공모글 작성 뷰모델 구현 * fix: edit text 데이터바인딩 추가 * chore: 테스트를 위해 MutableLiveData default값 넣어둠 * chore: deadline defualt값 형식에 맞게 수정 * feat: 글작성 화면을 액티비티에서 프래그먼트로 수정 * chore: 테스트목적이었던 주석과 mutable livedata 디폴트값 제거 * refactor: 임시 함수명 수정 * fix: 글작성 프래그먼트가 올라오기 전에 바텀 네비게이션이 사라지는 문제 수정 * feat: 필수 항목이 모두 입력되어야 버튼이 활성화 되는 기능 구현 * feat: 가격, 총원 입력이 잘못되었을 시 토스트를 띄우는 기능 구현 * fix: 버튼 비활성화 시 텍스트 변경 * feat: 앱 아이콘 변경 * feat: 앱 이름 변경(chongdae -> 총대마켓) * feat: 예상 엔빵 가격을 보여주는 기능 구현 * refactor: 상수화 * refactor: 예상 엔빵 가격에 ,가 들어가는 기능 구현, 콜론 뒤 white space 추가 * feat: 공구 할인율을 계산해 주는 기능 구현 * feat: +, - 버튼으로 총원을 조절하는 기능 구현 * fix: 할인율과 엔빵가격 계산 시 0으로 나눠지는 상황을 제거 * fix: 맞춤법 수정 할인률 -> 할인율 * fix: 총원 버튼 크기가 너무 작아서 확대 * fix: 항목간 간격이 좁아서 확대 * refactor: Offering Write의 API service, DataSource, Repository를 Offerings와 합침 * refactor: 디버깅용 코드 삭제 * refactor: 버튼 활성화/비활성화를 selector와 삼항연산자로 구현 * refactor: 바인딩어댑터 대신 뷰모델이 visibility 상태를 갖고 있는 방식으로 변경 * refactor: 바인딩어댑터 대신 xml에서 처리하는 방식으로 변경 * refactor: 총원 디폴트 라이브데이터값 상수화 * refactor: +, - 텍스트뷰 버튼으로 수정 * refactor: textStyle bold대신 fontFamily suit_bold를 쓰는 것으로 수정 * refactor: 변수명 뒤에 Int를 붙이는 것 대신 Value를 붙이는 것으로 수정 * refactor: 글작성 제출 버튼의 아이디를 추가 * refactor: ktFormat * refactor: 토스트를 띄우는 함수 분리 * refactor: 도메인 객체 분리 * refactor: UI모델 적용 * refactor: ktFormat 적용 * feat: 댓글방 디테일 Room을 사용하여 data 저장 (#166) * feat: local database 구현 * feat: entity 구현 * feat: dao 구현 * feat: LocalDataSourceImpl 구현 * feat: entity mapper 구현 * refactor: CommentResponse 에 id 값 추가 * refactor: datasource 이름 변경 및 패키지 변경 * refactor: article -> offering으로 네이밍 변경 * refactor: repository 패키지 변경에 따른 수정 * refactor: datasource 패키지 변경 및 local 과 remote 분리 * refactor: repository Application 클래스를 통한 주입으로 변경 * style: ktlint 적용 * refactor: api service 리네이밍 * refactor: git conflict 해결 * refactor: 함수 이름 컨벤션에 맞도록 변경 (getMeetings -> fetchMeetings) * chore: CI 스크립트 추가 (#173) * chore: ci 스크립트 추가 * chore: ci 스크립트 수정 * feat: 날짜, 시간 선택 기능 구현, 주소검색 기능 연결 (#171) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 모집마감 시간 클릭 시 date time picker를 띄우는 기능 구현 * feat: 날짜, 시간 선택 기능 구현 * feat: 주소 검색 기능 연결 * refactor: 함수명 수정, 함수분리 * refactor: ktFormat 적용 * refactor: string으로 분리, 상수화 * fix: string 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정3 * chore: CI workflow 파일 수정4 * feat: 공모가 정상적으로 게시되었을 시 "공모가 게시되었어요!" 라는 토스트를 띄우고 공모글 작성 프래그먼트를 종료하는 기능 구현 * feat: 토스트가 화면 중앙에 뜨는 문제 수정 * refactor: 사용되지 않는 파일 삭제 * refactor: xml 뷰 id 수정 * refactor: 버튼이 TextView인 문제 수정 * refactor: 사용되지 않는 data binding variable 제거 * refactor: 함수명 수정 * refactor: 다이얼로그, dateTimePickerBinding 전역으로 선언 * refactor: dateTimePicker 클릭 이벤트를 추상화 해 xml에서 처리하도록 변경 * refactor: ktFormat * feat: 상품 URL 이미지 추출 API 연결 (#180) * refactor: 사용하지 않는 파일 제거 * refactor: 가시성 변경 * feat: api service 구현 * feat: datasource 구현 * refactor: repository 네이밍 수정 (offeringsRepository -> offeringRepository) * feat: 사진 업로드 관련 리소스 파일 추가 * feat: repository 및 model 구현 * feat: 이미지 링크를 통한 크롤링 이미지 불러오는 api 연결 및 이미지 삭제 로직 구현 * style: ktlint 적용 * refactor: 이미지 prefix 추가 및 에러 메시지 수정 * refactor: build 오류 수정 * fix: git conflict 해결 * feat: 공모 목록 조회 API연결 (#201) * refactor: Condition 수정에 따른 변경 * refactor: api변경에 따른 리팩토링 * refactor: api변경에 따른 목록 무한 스크롤 기능 리팩토링 * feat: 검색 기능 구현 * feat: 필터링 기능 구현 - 참여 가능은 서버 에러로 추후 추가 예정 * feat: 아이템을 불러온 후 recyclerview의 최상단으로 이동하는 기능 구현 - 검색, 필터링 수행 후 최상단으로 이동 * feat: 필터링 목록 불러오는 api연결 * feat: 마감임박 상태 추가 * refactor: default parameter제거 * style: lint적용 * feat: 바텀 네비게이션 고정 기능 구현 (#211) * feat: 키보드 이외 영역 터치 시 키보드 내려가도록 구현 (#214) * feat: 키보드외 화면 클릭 시 키보드 내려가도록 구현 * refactor: api변경에 다른 dto수정 * feat: 이미지 업로드 및 권한 설정 (#216) * chore: 이미지 권한 추가 * feat: permission manager을 생성하여 권한 체크 및 request * feat: 이미지 추가 버튼을 클릭할 시 권한 설정 연결 * feat: 이미지 피커를 사용하여 uri 전달 구현 * feat: 이미지 파일 업로드 api service 구현 * feat: 이미지 파일 업로드 data source 구현 * feat: 이미지 파일 업로드 repository 구현 * feat: 이미지 파일 martipart로 변환해주는 기능 구현 * feat: 이미지 업로드 관련 뷰 수정 * feat: 이미지 파일 업로드 및 api 연결 구현 * style: ktlint format * fix: git conflict 해결 * refactor: 이미지 scaleType 변경 * refactor: string value 컨벤션 적용 * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 (#222) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 * refactor: 구현 방식 변경 * style: lint적용 * Feature/217 offering status (#230) * feat: 댓글방 상태 조회 api service 구현 * feat: 댓글방 상태 조회 model 및 dto 구현 * feat: 댓글방 상태 조회 datasource 구현 * feat: 댓글방 상태 조회 repository 구현 * feat: 댓글방 상태 조회 api 연결 구현 * style: ktlint 적용 * feat: 댓글방 상태 변경 (#231) * feat: 댓글방 상태 변경 api service 구현 * feat: 댓글방 상태 변경 data source 구현 * Revert "feat: 댓글방 상태 변경 data source 구현" This reverts commit 052691a8de945c60a60586ee66a05a6a3b264217. * feat: 댓글방 상태 변경 data source 구현 * feat: 댓글방 상태 변경 repository 구현 * feat: 댓글방 상태 변경 api 연결 구현 * style: ktlint 적용 * feature: 카카오 로그인 구현 (#235) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * fix: 필터링 오류 수정 (#243) * feat: 공동구매 상태 변경 다이얼로그 구현 (#245) * feat: 공동구매 상태 변경 다이얼로그 view 구현 * feat: 공동구매 상태 변경 다이얼로그 Listener 구현 * feat: 공동구매 상태 변경 다이얼로그 연결 및 상태 변경 로직 수정 * test: 테스트 코드 작성을 위한 기본 세팅 (#255) * feat: CoroutinesTestExtension 구현 * feat: Livedata getOrAwaitValue 구현 * feat: InstantTaskExecutorExtension 구현 * feat: TestFixture 생성 * style: ktlint 적용 * feat: 공모글 목록 화면 UI 개선, 공모글 작성에서 낱개 금액이 엔빵 가격보다 저렴할 시 글 작성 막는 기능 구현 (#246) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * fix: 구분선을 각각의 아이템의 하단에 넣고 프래그먼트 뷰의 "채팅" 텍스트 밑에 하나 추가 * fix: 텍스트뷰에 font 적용, 마지막 댓글 시간 텍스트를 조금 왼쪽으로 이동 * fix: 낱개 가격 이름을 eachPrice -> originPrice 수정 * fix: 낱개 가격이 엔빵 가격보다 싸면 토스트를 띄우고 글작성을 막는 기능 구현 * fix: 네이티브앱키 로컬프로퍼티로 이동 * refactor: 함수명 변경 * fix: 카카오 계정으로 로그인 후 액티비티 전환하지 않는 문제 수정 * refactor: 사용되지 않는 클래스 삭제 * refactor: 패키지 수정 * refactor: alsong 로그 수정 * refactor: 변수명 수정 * refactor: Manifest의 네이티브앱 키 숨김 * refactor: 로컬프로퍼티의 데이터 형식 수정 * Update android.yml * refactor: alsong 로그 삭제 * ci 빌드 실패가 manifest때문인지 테스트 * refactor: 매니페스트에 앱 키 넣을 수 있게 하는 gradle 설정 수정 * 매니페스트 수정하고 재테스트 * 매니페스트 수정하고 재테스트 * chore: 그래들 수정 * chore: 그래들 수정2 * chore: 그래들 수정3 * chore: 그래들 수정4 * chore: 카카오 계정으로 로그인하는 기능 제외 * feat: 홈화면 테스트 작성 (#257) * chore: mockk의존성 추가 * test: OfferingViewModel 테스트 작성 * style: lint적용 * refactor: stub를 TestFixture로 이동 * test: 댓글방 테스트 코드 작성 (#258) * refactor: 댓글 보내는 함수명 변경 * refactor: 공구 약속 장소 및 시간 캐시 기능 * test: 테스트를 위한 fake repository 구현 * test: 댓글방 viewmodel test 작성 * feat: 댓글방 ActivityTest 작성 * feat: 댓글방 ActivityTest 작성 * style: ktlint 적용 * refactor: test fixture에서 사용하지 않는 것 삭제 * style: ktlint 적용 * feat: GA 모니터링 환경 구축 및 로깅 전략 적용 (#242) * chore: Firebase Crashlytics 의존성 추가 * feat: Firebase 초기화 * feat: FirebaseManager 구현 * feat: 총대가 공구 진행 상황을 다음 단계로 변경했을 때 event 추가 * feat: 로깅 기능 구현 - 검색 - 필터링 - 공모글 클릭 - 공모 참여 * style: lint적용 * feat: 글 작성 완료 시 event 추가 * feat: 로그인 시 event 추가 --------- Co-authored-by: Namyunsuk Co-authored-by: songpink * test: 공모글 작성 이미지 테스트 코드 작성 (#260) * refactor: 상수 가시성 변경 * feat: test fixture 구현 * feat: fake repository 이미지 업로드 기능 추가 * test: OfferingWriteViewModelTest 이미지 업로드 test 코드 작성 * feat: 로그인 후 홈화면으로 이동해도 로그인 화면이 종료되지 않는 문제 수정 (#261) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 로그인 후 LoginActivity가 종료되도록 수정 * feat: 공모 상세 화면 테스트 작성 (#264) * feat: OfferingDetailViewModel 테스트 작성 * refactor: 테스트 수정 * style: lint적용 * style: lint적용 * refactor: 홈화면 수정 (#271) * refactor: 할인율 마진 추가 * refactor: 공구상태에 대한 문구 수정 * refactor: 클릭 시 최상단으로 이동하는 버튼 구현 * feat: 공모글 작성 화면 테스트코드 작성 (#274) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: 공모글 작성 테스트 구현 * feat: 댓글방 목록 화면 테스트코드 작성 (#276) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: "댓글방 목록을 확인할 수 있어야 한다" 테스트 작성 * fix: 공모 상세 화면 오류 수정 (#280) * fix: 총대 여부 확인 로직 수정 * fix: 마감 임박 시 보여주는 버튼 수정 * fix: 공모 작성 후 홈화면으로 돌아왔을 떄 목록이 새로고침 되지 않는 오류 수정 * test: 테스트 코드 수정 * style: lint적용 * feat: 댓글방 목록 화면 자동 업데이트 되지 않는 문제 수정, 회원가입 이후 자동으로 로그인되지 않는 문제 수정 (#282) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 라이플사이클 오너 설정 * fix: 회원가입 후 자동으로 로그인 되도록 수정 * chore: change version name (#291) * feat: 카카오 계정 로그인 기능 구현 시 CI가 실패하는 문제 해결 (#296) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * feat: 로그인 화면 리팩토링 (#298) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * refactor: SimpleCookieJar의 패키지 변경(presentation 레이어에서 data레이어의 source 패키지로 이동) * refactor: data store를 관리하는 클래스를 생성하고 이 클래스를 사용하도록 변경 * refactor: 사용하지 않는 의존성과 주석 제거 * refactor: http status code 추가 * refactor: 함수분리 * refactor: ktFormat 적용 * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentRooms) * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentDetail), 사용되지 않게 된 memberId 제거 * refactor: ktFormat 적용 * test: 테스트코드 수정 * refactor: Preferences -> DataStore 이름 변경 * refactor: 채팅방 UI UX 개선 (#303) * feat: 키보드가 아닌 다른 영역을 클릭하면 키보드 내리는 기능 구현 * feat: 뒤로가는 버튼 기능 추가 * feat: 댓글 입력 maxLines 설정 및 maxLength 설정 * style: ktlint 적용 * 필요 없는 코드 제거 * feat: 댓글방 목록에서 자신이 총대인 댓글방의 UI 개선 (#304) * refactor: 댓글방의 자신이 총대인 댓글방 ui 개선 * fix: Binding 클래스 네이밍 수정 * feat: 가로모드, 다크모드 설정 (#305) * refactor: api변경에 따른 리팩토링 (#310) * feat: 로그인 화면 해상도 대응 (#313) * feat: 이미지 업로드 중일 때 로딩 상태 설정 (#317) * feat: 공모 글 작성 ui state 구현 * feat: 로딩 progressbar 생성 * feat: UI 상태에 따른 토스트 메시지 처리 * refactor: 잘못된 입력에 대한 에러 처리 변경 * refactor: 홈화면 리팩토링 (#324) * refactor: textSize dp로 변경 * refactor: 검색 버튼 크기 변경 - 검색 버튼 패딩 추가 - 검색창 끝에 패딩 추가 * refactor: 엔터키를 통해 검색하도록 수정 * refactor: 필터 단일 선택되도록 수정 * style: lint적용 * feat: 댓글방 새로운 기능 GA 연결 (#328) * feat: 댓글방 참여자 확인 Event 구현 * feat: 댓글방 상태 변경 다이얼로그 취소 Event * feat: 참여자가 공구에서 참여 포기 Event 구현 * style: ktlint 적용 * feat: Fragment GA 모니터링 수집 (#332) * feat: fragment logScreenView 추적 함수 구현 * feat: 각 fragment에서 화면 감지 GA 설정 * feat: 마이페이지 기본 세팅 및 뷰 변경 (#335) * feat: 마이페이지 기능 구현 (#341) * feat: 마이페이지 닉네임 기능 구현 * feat: 로그아웃 로직 구현 * feat: url 연결 로직 구현 * feat: 필요없는 기능 삭제 * style: ktlint 적용 * fix: 상세화면에서 홈화면으로 갔을 때 상태 변경 안되는 오류 수정 (#343) * refactor: 공모상세페이지 Activity -> Fragment로 리팩토링 * fix: 페이지네이션 및 상태변경 미적용 오류 해결 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 주석 제거 및 상수화 * refactor: livedata 자료형 변경 * refactor: progressbar위치 수정 * refactor: lifecycleScope사용 리팩토링 * refactor: adapter에서 전체 아이템이 아닌 특정 아이템만 notify하도록 리팩토링 * refactor: API변경에 따른 대응 (#352) * refactor: api대응 * refactor: api변경에 따른 테스트 수정 * feat: 공모글 작성 화면 ux 개선 (#344) * fix: 각 항목의 설명을 place holder로 이동 * fix: 필수와 선택 항목의 프래그먼트 분리 * feat: 버튼이 항상 보이도록 수정 * fix: 가격과 총원은 숫자만 입력받도록 변경 * fix: 패딩 수정 * fix: ui 수정 * fix: 도메인 변경에 따른 deadline -> tradeDate 수정 * feat: 필수 항목을 모두 입력하면 선택 항목 화면으로 이동하는 기능 구현 * refactor: ktFormat 적용 * refactor: shared viewModel 사용, 미필수 항목을 미필수 입력 화면으로 이동 * refactor: 프래그먼트 이름 변경 * feat: 입력 숫자의 글자수와 라인수 제한 기능 구현 * fix: 총원이 -1이하로 떨어지는 버그 수정, 공동구매 텍스트 띄어쓰기 제거 * fix: 할인율, 엔빵 금액이 유효하지 않을 때는 "-"로 뜨도록 변경 * fix: 공모를 게시하면 필수, 선택 화면 모두 종료되도록 수정 * fix: 날짜 시간 픽커를 날짜만 선택하는 픽커로 변경 * refactor: ktFormat 적용 * refactor: 바인딩어댑터의 파라미터를 nullable하게 수정 * test: 테스트코드 수정 * feat: 낱개 가격의 place holder로 현재 엔빵 금액을 보여주는 기능 구현 * feat: 내용의 최대 글자수와 현재 글자수를 보여주는 기능 구현 * refactor: ktFormat 적용 * refactor: 공모글 작성시 memberId를 보내지 않도록 변경 * fix: 총원 최대 4자리에서 3자리까지만 입력받을 수 있도록 변경 * fix: deadline -> meetingDate 네이밍 수정 * fix: 공모글 작성 후 작성 화면의 입력값이 초기화되지 않는 버그 수정 * refactor: 네이밍 수정(eachPrice -> originPrice) * refactor: 네이밍 수정(individualPrice -> originPrice) * fix: 내용의 현재 글자수 색이 메인컬러가 되지 않는 문제 수정 * refactor: 프래그먼트 종료될 때 바인딩 해제하도록 수정 * refactor: id가 없는 뷰의 id 추가 * refactor: 함수 분리 * fix: 내용 옆의 * 제거 * fix: GA 이벤트 이름 변경(공모글 작성 - 필수 화면에서의 이벤트임을 명시함) * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 (#358) * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 * test: 테스트코드 수정 * fix: 필터 오류 수정 (#362) * fix: 필터 오류 수정 - '참여가능만'필터 분기처리 제거 * chore: 주석 제거 * feat: API 스펙 변경에 따른 대응 (#364) * feat: 댓글 목록 조회 api 스펙 변경에 따른 대응 * feat: 댓글방 정보 조회 api 스펙 변경에 따른 대응 * feat: 공모 일정 조회 api 스펙 변경에 따른 대응 * feat: 댓글 상태 변경 api 스펙 변경에 따른 대응 * test: api 스펙 변경에 따른 test 코드 변경 * style: ktlint 적용 * feat: remote dto package 분리 * fix: 공모 작성 후 홈화면 돌아올 때 새로 작성한 글이 보이지 않는 오류 수정 (#369) * feat: Access Token, Refresh Token을 data store에 저장하는 기능 구현 (#372) * feat: 앱 재시작 시 토큰을 데이터스토어에서 꺼내 사용하는 기능 구현 * feat: 로그인이 이미 되어있다면 로그인 화면을 건너뛰는 기능 구현 * feat: 로그아웃 기능 구현 * fix: 마이페이지 화면으로 넘어가면 바텀네비게이션이 사라지는 버그 수정 * fix: 데이터스토어에서 토큰이 꺼내지지 않는 버그 수정 data store에서 토큰을 꺼내는 코루틴 비동기 작업이 끝나기 전에 함수를 종료해 버려서 생기는 버그였습니다. * refactor: ktFormat 적용 * refactor: startActivity 함수를 LoginActivity가 동반객체로 갖고 있도록 변경 * refactor: 함수명과 event명 변경 추가로 GA위치가 조금 잘못된 점이 있어서 수정했습니다. * feat: 공모 상세 화면 추가 기능 반영 (#375) * feat: 신고하기 기능 구현 * feat: 물품 링크가 없으면 보여지지 않도록 구현 * refactor: 마감 시간에서 거래 날짜로 리팩토링 * feat: 이미 참여한 공모게시글에서 채팅방으로 이동하는 기능 구현 * fix: 댓글방 목록의 마지막 댓글방이 보이지 않는 문제 수정 (#376) * fix: 리사이클러뷰 레이아웃의 크기가 화면 밖에 벗어나지 않도록 수정 * fix: 리사이클러뷰 레이아웃의 맨 밑에 구분선 하나 추가 아래로 땡겼을 때 구분선이 사라져버리는게 보기 안좋아서 추가했습니다 * refactor: 코트 포맷 적용 (컨트롤 알트 L) * refactor: 홈화면 api필드 추가에 따른 대응 (#381) * refactor: dto필드 추가 * fix: 상태 변경 오류 해결 * fix: 필터 선택 또는 검색상태일 때 공모 작성 후 나오면 목록 안보이는 오류 수정 * refactor: 세부 주소 api에서 받아오도록 변경 * style: lint적용 * feat: 공모 목록에서 동을 보여주는 기능 구현 (#386) * refactor: 상태변경 리팩토링 (#389) * refactor: 공모 상세 조회 api변경 대응 * refactor: 공모 상태 변경 리팩토링 * refactor: 리팩토링에 따른 테스트 수정 * chore: 불필요한 로그 제거 * fix: 댓글 입력 후 뒤로가기 시 최근 댓글이 반영되도록 수정 (#397) * feat: 댓글방 참여자 확인 API 연결 (#401) * feat: 참가자 정보를 가져오는 api service 구현 * refactor: 필요없는 코드 삭제 * feat: 참여 관리 datasource 구현 * feat: 참여자 domain 모델 구현 * feat: 참여를 관리하는 repository 구현 * feat: 참여자 목록을 보여주는 recycler view 연결 및 구현 * refactor: 더보기 버튼 수정 * feat: 필요없는 리소스 파일 삭제 및 상태 기본 이미지 변경 * refactor: 약속 장소 및 시간 ui model 을 사용하여 관리 * refactor: 댓글방의 정보를 불러오는 로직 ui model을 사용하여 관리 * refactor: ui model 변환 로직 변경 * feat: 공동구매 참여 인원 확인 기능 구현 * feat: 신고하기 폼 연결 구현 * test: 코드 변경에 따른 테스트 코드 수정 * style: ktlint 적용 * refactor: xml id 추가 * feat: 댓글방 공동구매 나가기 API 연결 (#402) * feat: 공동구매 나가기 기능 api service 구현 * feat: 공동구매 나가기 기능 data source 구현 * feat: 공동구매 나가기 기능 repository 구현 * feat: 공동구매 나가기 기능 연결 * style:ktlint 적용 * feat: CallApiHandler 구현 (#403) * feat: CallApiHandler 구현 * refactor: CommentRoomsDataSource 수정 * feat: CommentRemoteDataSourceImpl 에러핸들링을 통해 수정 * feat: 에러 핸들링에 따른 DataSource 리팩토링 - OfferingDetailDataSource - OfferingRemoteDataSource * feat: ParticipantRemoteDataSourceImpl 에러핸들링을 통해 수정 * style: ktlint 적용 * refactor: AuthRemoteDataSource 수정 * feat: Result의 map 과 getOrThrow 함수 생성 * feat: 에러 핸들링에 따른 Repository 리팩토링 - OfferingDetailRepository - OfferingRepository * refactor: Result 변경에 따른 레포지토리 수정 (AuthRepository, CommentRoomsRepository) * feat: 에러 핸들링에 따른 CommentDetailRepository 리팩토링 * feat: 에러 핸들링에 따른 ParticipantRepository 리팩토링 * feat: 에러 핸들링에 따른 viewmodel 리팩토링 - OfferingViewModel - OfferingDetailViewModel * refactor: 에러 핸들링에 따른 LoginViewModel 리팩토링 * refactor: 에러 핸들링에 따른 CommentRoomsViewModel 리팩토링 * refactor: 토큰 리프레쉬 후 다시 함수 호출하도록 추가 * feat: 에러 핸들링에 따른 CommentDetailViewModel 리팩토링 * refactor: 에러 핸들링에 따른 OfferingWriteViewModel 리팩토링 * refactor: 공모 목록 토큰 리프래시 적용 * fix: 잘못된 코드 수정 * refactor: 필요없는 주석 제거 * refactor: 공모 목록 리팩토링 * fix: 리빌드시 쿠키가 제대로 저장되지 않는 현상 수정 * refactor: 필요없는 코드 삭제 및 상수화 추가 * test: 에러핸들링에 따른 FakeAuthRepository, OfferingWriteViewModelTest 수정 * refactor: ktFormat 적용 * test: 코드 변경에 따른 Fake Repository 변경 * test: CommentDetailViewModelTest 코드 수정 * style: ktlint 적용 * refactor: 가독성 개선(에러 로그 함수명 추가, Success가 Error보다 위에 나오도록 수정) * refactor: 불필요한 로그 제거 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 람다 넘겨주는 방식 수정 * style: lint 적용 * test: 테스트코드 수정 --------- Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> Co-authored-by: Namyunsuk * feat: proguard를 사용한 난독화 적용 (#413) * fix: 공구 상세 페이지 오류 해결 (#417) * fix: 바로가기 클릭되지 않는 오류 수정 * refactor: 주소 표시할 때 최대 2줄까지 그리고 넘어갈 시 말줄임 나오도록 수정 * refactor: 공모 목록, 공모 상세 에러 핸들링 (#418) * refactor: 공모 목록에서 401에러를 제외하고는 에러코드 올 시 빈화면 보여주도록 에러핸들링 수정 * refactor: 필터및 업데이트된 공모 목록 가져오는 로직 에러핸들링 수정 - 400: 토스트 메시지 띄어줌 - 401: refresh - 그외에는 로그로 에러 코드를 보여줌 * refactor: strings네이밍 통일 * refactor: 공모 상세 에러 핸들링 수정 * refactor: strings정리 - offering_detail부분 정리 * feat: 로그인 api 변경 반영 (#426) * feat: 카카오 로그인 후 총대마켓 서버로 email을 보내던 방식에서 카카오 access token을 보내는 방식으로 변경 * feat: login과 signup을 하나로 api로 통합된 것 반영 * refactor: ktFormat 적용 * refactor: 테스트코드 수정 * refactor: 에러 핸들링 리팩토링 (#436) * feat: 리프레시 토큰 만료 시 데이터스토어를 비우고 로그인 화면으로 이동하는 기능 구현 (#438) * feat: 댓글방 에러 헨들링 (#439) * refactor: refresh시 401이 오는 경우에 대한 에러핸들링 추가 (#441) * chore: 버전 업데이트 (#443) * v1.1.0 (#448) * feat: 게시글 상세 화면 구현 (#8) * feat: 게시글 상세 화면 레이아웃 작성 * feat: Data layer코드 작성 * refactor: dto패키지 분리, dto에 serialName추가 * refactor: 도메인 모델 수정 - 가변에서 불변으로 변경 - 사용하지 않는 메서드 제거 * refactor: 공통으로 사용되거나 사용될 수 있는 확장함수를 별도의 파일로 분리 * style: lint 적용 * refactor: 메서드명 컨벤션 적용 * refactor: request Dto에 SerialName적용 * refactor: 메서드명 수정 * feat: 도메인 추가 (#15) * feat: BaseTimeEntity 추가 Co-authored-by: Dora Choo * feat: Member Entity 추가 Co-authored-by: Dora Choo * feat: Offering Entity 추가 Co-authored-by: Dora Choo * feat: OfferingMember Entity 추가 Co-authored-by: Dora Choo * feat: Comment Entity 추가 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * feat: BottomNavigation 구현 (#16) * chore: jetpack navigation 라이브러리 추가 * feat: 필요한 바텀 네비게이션 리소스 추가 * feat: bottom navigation fragment 추가 * feat: bottom navigation graph 구현 * refactor: 컨벤션에 맞게 id 수정 * feat: 공동구매 상세 조회 기능 구현 (#18) * chore: h2 환경설정 추가 * docs: http client 추가 * refactor: entity 접미어 적용 * chore: dummy data 추가 * docs: http client 값 변경 * refactor: repository 와 domain 패키지 분리 * feat: 공동구매 상세 조회 API 구현 * refactor: entity 접미어 적용 * style: 클래스 컨벤션 적용 * chore: h2 console 설정 제거 * refactor: OfferingCondition enum값 결정로직을 enum 안으로 이동 * feat: 홈화면, 마이페이지 화면 레이아웃 작성 (#19) * refactor: FragmentContainer width 속성 수정 * feat: 홈 화면 레이아웃 작성 * feat: 마이페이지 화면 레이아웃 작성 * fix: 플로팅 버튼이 홈에서만 보이도록 수정 * refactor: 리소스 네이밍 컨벤션에 맞게 수정 * feat: API 문서화 적용 (#23) * chore: springdoc-openapi 의존성 추가 Co-authored-by: Dora Choo * chore: springdoc 설정 추가 Co-authored-by: Dora Choo * feat: SwaggerConfig 파일 추가 Co-authored-by: Dora Choo * feat: 공모 상세 조회 API 문서화 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * fix: 공모 상세 조희 API의 price 필드 자료형 변경 및 memberId 필드 추가 (#28) * fix: 상세조회 API 금액 필드 자료형 변경 Co-authored-by: Dora Choo * fix: memberId 추가 * 내가 쓴 글인지 아닌지 확인 위해 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * chore: 백엔드 CI 및 도커 파일 작성 (#27) * chore: actions 적용 브랜치 설정 (#30) * chore: actions 적용 브랜치 설정 * chore: path 및 ref 태그 제거 * chore: working-directory 태그 추가 * chore: Dockerfile jar 경로 수정 * feat: 댓글방 목록 구현 (#26) * feat: 댓글방 목록 UI 구현 * fix: 구분선을 ImageView에서 View로 변경 * feat: 댓글방 목록 도메인 모델 구현 * feat: 댓글방 어답터 구현 * feat: "채팅" string 추가 * refactor: 불필요한 코드 제거 * fix: xmls 중복 속성 제거 * refactor: 댓글방 클래스들을 comment 패키지로 분리 * refactor: 컬러와 폰트 사이즈를 values 파일로 분리 * feat: 공모 목록 조회 기능 구현 (#35) * feat: 공모 목록 조회 API 구현 * docs: 공모 목록 조회 API http client에 추가 * fix: 공모 상세 조회 API의 status 필드를 condition으로 명칭 변경 * feat: 공모 목록 조회 API의 isClosed 필드 이름을 isOpen으로 변경 * feat: 댓글방 디테일 화면 구현 (#32) * feat: font 설정 * feat: vector 이미지 추가 * feat: 채팅 아이템 뷰 구현 * refactor: 컨벤션에 맞게 네이밍 수정 * feat: 댓글 입력 edit text 구현 * chore: 백엔드 CD 스크립트 작성 (#34) * chore: 백엔드 CD 스크립트 작성 * chore: 도커 백그라운드로 실행 * chore: 도커 설정 및 트리거 설정 변경 * chore: 도커 이미지 제거 로직 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 강제 제거하도록 수정 * chore: gradle 캐싱 로직 추가 (#39) * chore: gradle 캐싱 로직 추가 * chore: 이벤트 트리거 조건 수정 * feat: 공모 참여하기 기능 구현 (#40) * fix: BaseTimeEntity 적용 오류 수정 Co-authored-by: Dora Choo * feat: 참여하기 API 구현 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * feat: 공모 상세 조회 API에 참여자 목록 필드 추가 (#42) * feat: 공모 상세 조회 API의 request에 memberId 필드 추가 (#45) * feat: 공모 참여 API의 불필요한 응답값 전부 제거 (#48) * feat: 공모 참여 API의 불필요한 반환값 제거 * chore: 자주 쓰는 h2 console enabled 설정 주석 처리 * feat: 이미 참여한 공모에 참여 못하게 예외 처리 (#51) * feat: 공모 상세 페이지 API 연결 (#46) * build: 불필요한 의존성 제거, properties관련 코드 작성 * refactor: base_url코드상에서 제거 * feat: api수정에 따른 필드 변경 및 네이밍 반영 * refactor: 네이밍 변경 * refactor: OfferingDetail의 변경, mapper변경 * refactor: service분리 * refactor: DataSource, Repository분리 * refactor: API변경에 따른 리팩토링 * feat: 공모 상세 조회 기능 구현 * refactor: 참여하기 api변경에 따른 data, domain 코드 수정 * feat: 공모 상세 페이지 참여하기 기능 구현 * feat: 공모 상세 화면에서 이미지를 불러올 수 없을 시 기본이미지를 보여주는 기능 구현 * feat: 게시물 상세 화면 폰트 적용 * style: lint적용 * refactor: 액티비티 destroy시 binding해제하도록 코드 추가 * refactor: glide옵션 변경 - 에러 발생 시 보여줄 이미지 - url이 null일 시 보여줄 이미지 * refactor: viewModel에 custom getter추가 * fix: 내용이 짧을 시 뒷 배경이 회색으로 보이는 버그 수정 * fix: 참여하기 버튼을 눌렀을 시 텍스트가 바뀌지 않는 버그 수정 * feat: 테스트 데이터 다양화 (#52) Co-authored-by: Dora Choo * refactor: 공모 엔티티에 currentCount 필드 추가 (#55) * feat: 댓글 작성 API 구현 (#57) * feat: 댓글방 내 공모 일정 조회 기능 구현 (#58) * feat: 댓글방 내 공모 일정 조회 기능 구현 Co-authored-by: Dora Choo * refactor: 공모 일정 조회 api 명세 변경 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * refactor: common 패키지명을 global로 변경 (#61) * chore: 안드로이드 CI 파일 작성 (#63) * feat: 댓글 목록 조회 API 구현 (#66) * chore: build CI 작업을 위한 manifest 파일 수정 (#65) * chore: 알람 권한 추가 * chore: local properties 속성 추가 * chore: local properties null 체크 로직 추가 * chore: buildConfigField null 체크 * style: lint 적용 * chore: secret 값 설정 * fix: secret 값 오류 수정 * fix: 문법 오류 수정 * chore: 경로 수정 * chore: 문법 수정 * style: lint 적용 * feat: 댓글방 목록 조회 API 구현 (#70) * feat 댓글방 접히는 공지 뷰 구현 (#72) * chore: manifest에 CommentDetailActivity 추가 * feat: BindingAdatper을 사용하여 접힐 때 애니메이션 적용 및 픽셀 변환 * feat: viewmodel 구현 및 click 마다 접히고 펴지는 로직 구현 * style: ktlint 적용 * refactor: binding adpater을 사용하여 가시성 변경 * refactor: 댓글방 및 댓글 목록 조회 서비스 계층 (#78) * fix: 댓글방 목록 조회 시 가장 최근 댓글 조회 (#80) * feat: 홈화면 API 연결 (#74) * refactor: API변경에 따른 data, domain 코드 변경 * feat: 공모 목록 기능 구현 * refactor: 함수 분리 * style: lint적용 * style: font 적용 * fix: 시간순 정렬 쿼리 추가 (#83) * chore: 더미 데이터 추가 (#87) * feat: 댓글방 목록 API 연결 (#82) * feat: bottom navigation fragment 추가 * feat: vector 이미지 추가 * feat: 댓글방이 없으면 "채팅 목록이 없어요" 라는 텍스트뷰와 이미지뷰를 띄우는 기능 구현 * feat: 댓글방 띄우는 기능 구현 * test: 댓글방 UI 테스트 작성 * refactor: 테스트 클래스명 수정 * refactor: 줄바꿈 수정 * feat: 댓글방 API 서비스 구현 * refactor: API 명세에 따라 도메인 모델 수정 * feat: API 연결 * refactor: API명세에 따라 데이터바인딩 변수명 수정 * feat: 댓글방 목록 API 연결 * refactor: ktlint Format 적용 * refactor: 메모리 누수 방지를 위해 fragment가 destroy 될 때 _binding을 null로 설정 * refactor: 어답터를 방어적복사 하지 않아도 되어서 수정 * refactor: 채팅방이 없다는 이미지뷰를 띄워주는 방식 수정(바인딩 어댑터 수정) * refactor: 함수분리 * refactor: ktFormat 적용 --------- Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> * feat: 댓글방 접히는 공지 API 연결 (#85) * feat: 미팅 일정 API 연결을 위한 data layer 구현 * feat: 미팅 일정 API 연결을 위한 domain layer 구현 * feat: 미팅 일정 API 연결을 위한 presentation layer 구현 * style: ktlint 적용 * feat: 공동 구매 제목 databinding 적용 * refactor: 변수명 수정 * fix: 펼치기 접기 버튼 로직 반대로 수정 * style: ktlint 적용 * chore: 더미 데이터 바로가기 url 수정 (#93) * feat: 공모 상세 페이지 기능 추가 (#94) * chore: 마이페이지 닉네임 임시로 지정 * feat: 바로가기 기능 구현 * feat: 참여버튼 클릭 시 댓글방으로 가도록 기능 구현 * feat: 신고하기 이미지 추가 * style: lint적용 * refactor: 불러오는 공모 페이지 사이즈 변경 * refactor: 댓글 도메인 코드 리팩터링 (#96) * refactor: 로그인 멤버 변수명 변경 * refactor: JPQL 쿼리 컨벤션 및 멤버로 공모 조회 메서드명 변경 * refactor: 최근 댓글 응답 클래스명 변경 * refactor: 컨트롤러 및 서비스 API 순서 변경 * refactor: 로그인 사용자 유효성 검증 * feat: 댓글방 댓글 작성 api 연결 (#95) * chore: windowSoftInputMode 추가 * feat: post comment api service 구현 * feat: post comment DataSource 구현 * feat: post comment Repository 구현 * feat: post comment Presentation 구현 * chore: 더미 데이터 시간 변경 (#100) * feat: 댓글방 입장 기능, 본인이 총대인 방은 다르게 보이는 기능 구현 (#99) * feat: 댓글방의 마지막 댓글 시간을 띄우는 기능 구현 * feat: 자신이 총대인 댓글방을 표시하는 기능 구현 * feat: 댓글방 목록을 클릭해 댓글방 상세로 이동하는 기능 구현 * test: UI테스트 수정 * refactor: 클릭시 id 뿐만 아니라 title도 받아오는 방식으로 수정 * refactor: 오전/오후와 시간을 텍스트뷰에 띄우는 바인딩 어댑터를 DateTimeFormatter의 기능을 사용하는 것으로 수정 * refactor: memberId를 local.properties의 token을 가져다 쓰는 것으로 변경(임시 조치) * refactor: 댓글방 목록의 시간을 띄우는 바인딩 어댑터의 속성명을 수정함 * refactor: 데이터바인딩 variable 변수명을 구체적으로 수정, 일관성을 위해 앞에 `on` 붙임 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정(빠트린것 수정함) * feat: 전반적인 예외 처리 (#103) * feat: 예외 처리 핸들러 추가 * feat: Offering 예외 처리 코드 추가 * feat: Comment 예외 처리 코드 추가 * feat: Member 예외 처리 코드 추가 * feat: OfferingMember 예외 처리 코드 추가 * feat: Offering 예외 처리 상세 코드 추가 * feat: 에러 코드 적용 * feat: 도메인 검증 로직 * feat: DTO 검증 로직 --------- Co-authored-by: masonkimseoul * feat: swagger와 restdocs 연동 (#104) * chore: swagger ui 정적 파일 설치 및 static routing 세팅 * chore: restdocs-api-spec을 이용한 OAS 생성 * chore: swagger ui 정적 파일을 swagger-ui 디렉토리로 이동 * chore: swagger ui 정적 파일 및 static routing 세팅 제거 * chore: 생성된 OAS 파일을 Swagger 디렉터리로 복사하는 스크립트 작성 * chore: openapi3 yaml 파일 gitignore 처리 * chore: static routing 세팅 다시 추가 openapi3.yaml을 사용하기 위함 * test: RestAssured RestDocs 테스트 코드 작성 * test: 공모 목록 조회 API 문서화 * test: 공모 일정 조회 API 및 공모 참여 API 문서화 * test: 댓글 관련 API 문서화 * docs: 논의된 TODO 제거 * refactor: swagger 어노테이션 제거 * chore: 개발 API 서버 목록 설정 --------- Co-authored-by: fromitive * refactor: 에러메시지 필드명 변경 (#108) * fix: restdocs 관련 테스트 실패 이슈 해결 (#106) * chore: cicd 테스트 * chore: 테스트 위해 actions 범위 조정 * chore: 배포 스크립트 띄어쓰기 오타 수정 * chore: 빌드 캐싱 제거 * chore: logging * chore: --warning-mode all 옵션 줘서 gradle 호환 무시하도록 설정 * fix: status 달라서 실패하는 테스트 수정 * chore: actions 범위 수정 * chore: action 범위 수정 * chore: test용 static 파일 추가 * chore: static 하위 폴더를 jar 파일에 포함하도록 설정 * chore: swagger-ui 하위 폴더 제거 * chore: task 순서 조정 * chore: build 스크립트 수정 * chore: 불필요한 설정 변경 제거 * chore: clean build 대신 clean bootJar 사용 * chore: clean, build 각각 하도록 변경 * chore: test 까지 두 번 돌리도록 수정 * chore: openapi3까지 두 번 실행하도록 수정 * chore: copyOasToSwagger 까지 두번 실행하도록 수정 * chore: actions 활성화 범위 수정 * fix: 댓글방 목록 조회 시 참여자 수 조건 추가 (#111) * fix: 댓글방 조회 테스트 수정 (#113) * feat: 홈 화면 무한 스크롤 기능 구현 (#109) * build: pagination라이브러리 추가 * feat: 홈 화면 무한 스크롤 기능 구현 * fix: 마지막 댓글 response를 nullable하게 수정 (#115) * fix: 마지막 댓글 response를 nullable하게 수정 * refactor: ktFormat 적용 * feat: 댓글방 댓글 조회 api 연결 (#116) * feat: dto 및 mapper 구현 * feat: 댓글방 목록 service 구현 * feat: 댓글방 목록 data source 구현 * feat: 댓글방 목록 repository 및 model 구현 * feat: 댓글방 목록 view type을 활용한 recyclerview 구현 및 데이터 바인딩 * feat: polling 기능 구현 * feat: 댓글 스크롤 구현 (새로운 댓글이 생길시 스크롤 아래로) * feat: 총대와 다른 참가자 이미지 리소스 파일 * feat: 댓글방 디테일 공동 구매 상태별 관리 (#117) * feat: 공동구매 상태 관리 리소스 파일 * feat: 공동구매 상태를 관리하는 enum class 구현 * feat: 데이터바인딩을 사용하여 공동 구매 상태 뷰 업데이트 구현 * style: ktlint 적용 * feat: 공동구매 상태 관리 리소스 파일 추가 * fix: 이미지 링크 임시 수정 (#119) * fix: 이미지 링크 수정 (#120) * refactor: 네이밍 수정 (#123) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 (#125) * refactor: 뷰모델 팩토리 방식 변경 (#130) * refactor: 뷰모델 팩토리를 뷰모델의 동반객체로 이동 * style: lint적용 * refactor: Service분리 (#132) * refactor: service분리 * refactor: 패키지명 변경 * style: lint적용 * feat: 공모글 작성 UI 구현 (#134) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 뷰 구현 * fix: 뷰 수정사항 반영 * fix: @+id로 참조하는 부분을 수정 * fix: drawable의 네이밍에 where을 추가 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 (#136) * feat: 참여자 목록 drawer에 필요한 리소스 파일 추가 * refactor: 채팅 text gravity 수정 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 * style: ktlint 적용 * refactor: drawer early return 하는 방식으로 변경 * refactor: ivMore -> ivMoreOptions으로 네이밍 변경 * feat: 공구 참여자 item view 및 댓글방 view 사용자 친화적으로 수정 * chore: CI 빌드 스크립트 중 중복되는 task 제거해 성능 개선 (#128) * chore: jar태스크 비활성화하고 bootJar 태스크로만 JAR 파일 생성 * chore: cicd 범위 조정 * feat: 공모 작성 API 구현 (#139) * feat: 공모 작성 API 구현 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: create를 save로 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: dto entity 매핑로직을 dto로 이동 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: controller request 매개변수 명 컨벤션 적용 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 공모에 저장하는 주소 값 구체화 (#141) * refactor: 공모에 저장하는 주소 값 구체화 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: github-action 스크립트 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: CI/CD test 설정 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: static/swagger-ui 폴더 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: 설정 원상 복구 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: ci/cd 범위 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 홈화면(공모목록) UI 추가 구현 및 상태 변경 대응 (#142) * feat: 공모의 상태 변경이 반영되도록 기능 구현 * feat: 공모 목록 ui변경 * feat: 필터 ui추가 * feat: API변경에 따른 DTO수정 * style: lint적용 * feat: resource추가 * refactor: ui위치 수정 * chore: 불필요한 괄호 제거 * refactor: item 수직 정렬 * feat: 댓글방 메시지 조회 시 commentId 필드 추가 (#150) Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: OG 태그 크롤링 API 구현 (#148) * feat: OG 태그 크롤링 API 구현 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: OG 태그 크롤링 API 엔드포인트 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 제품 코드와 API 문서 동기화 (#153) * refactor: API 문서 개선 (#157) * refactor: 댓글 작성 시 성공 상태 코드 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 요청 필수 상태 설명 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: s3 이미지 업로드 API 구현 (#147) * feat: s3 이미지 업로드 API 구현 * chore: cicd 액션 범위 수정 * fix: 이미지 업로드 경로의 특수문자 제거 * chore: yml multipart 설정 추가 * chore: S3 업로드 결과 테스트 * fix: inputstream 변환로직 위치 이동 * fix: 업로드할 s3 path 올바르게 수정 * fix: 사진 url 속에 버킷이름을 cloudfront 도메인으로 수정 * chore: actions 범위 재조정 * feat: API endpoint 변경 * chore: docker image 지우는 작업을 마지막으로 이동 * chore: 다른 브랜치로 이전 커밋 이동하기 위해 제거 * chore: 충돌 해결 및 코드 스타일 변경 * test: S3 이미지 업로드 성공 케이스 추가 * test: multipart form data 문서화 * test: 공모 상태 enum 문서화 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 파일 업로드 크기 제한 100MB에서 20MB로 변경 --------- Co-authored-by: Choo Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 주소검색 기능구현 (#161) * refactor: 네이밍 컨벤션 적용 * build: webview 라이브러리 추가 * feat: 스크립트 실행위한 html파일 추가 * refactor: 인터페이스명 변경에 따른 변경 * feat: 주소검색 다이얼로그 레이아웃 작성 * feat: 주소검색 기능 구현 * style: lint적용 * refactor: 불필요한 코드 제거 * build: Firebase의존성 추가 (#165) * feat: 공모글 작성 API 연결 (#162) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 API 연결 구현 * feat: 공모글 작성 뷰모델 구현 * fix: edit text 데이터바인딩 추가 * chore: 테스트를 위해 MutableLiveData default값 넣어둠 * chore: deadline defualt값 형식에 맞게 수정 * feat: 글작성 화면을 액티비티에서 프래그먼트로 수정 * chore: 테스트목적이었던 주석과 mutable livedata 디폴트값 제거 * refactor: 임시 함수명 수정 * fix: 글작성 프래그먼트가 올라오기 전에 바텀 네비게이션이 사라지는 문제 수정 * feat: 필수 항목이 모두 입력되어야 버튼이 활성화 되는 기능 구현 * feat: 가격, 총원 입력이 잘못되었을 시 토스트를 띄우는 기능 구현 * fix: 버튼 비활성화 시 텍스트 변경 * feat: 앱 아이콘 변경 * feat: 앱 이름 변경(chongdae -> 총대마켓) * feat: 예상 엔빵 가격을 보여주는 기능 구현 * refactor: 상수화 * refactor: 예상 엔빵 가격에 ,가 들어가는 기능 구현, 콜론 뒤 white space 추가 * feat: 공구 할인율을 계산해 주는 기능 구현 * feat: +, - 버튼으로 총원을 조절하는 기능 구현 * fix: 할인율과 엔빵가격 계산 시 0으로 나눠지는 상황을 제거 * fix: 맞춤법 수정 할인률 -> 할인율 * fix: 총원 버튼 크기가 너무 작아서 확대 * fix: 항목간 간격이 좁아서 확대 * refactor: Offering Write의 API service, DataSource, Repository를 Offerings와 합침 * refactor: 디버깅용 코드 삭제 * refactor: 버튼 활성화/비활성화를 selector와 삼항연산자로 구현 * refactor: 바인딩어댑터 대신 뷰모델이 visibility 상태를 갖고 있는 방식으로 변경 * refactor: 바인딩어댑터 대신 xml에서 처리하는 방식으로 변경 * refactor: 총원 디폴트 라이브데이터값 상수화 * refactor: +, - 텍스트뷰 버튼으로 수정 * refactor: textStyle bold대신 fontFamily suit_bold를 쓰는 것으로 수정 * refactor: 변수명 뒤에 Int를 붙이는 것 대신 Value를 붙이는 것으로 수정 * refactor: 글작성 제출 버튼의 아이디를 추가 * refactor: ktFormat * refactor: 토스트를 띄우는 함수 분리 * refactor: 도메인 객체 분리 * refactor: UI모델 적용 * refactor: ktFormat 적용 * feat: 댓글방 디테일 Room을 사용하여 data 저장 (#166) * feat: local database 구현 * feat: entity 구현 * feat: dao 구현 * feat: LocalDataSourceImpl 구현 * feat: entity mapper 구현 * refactor: CommentResponse 에 id 값 추가 * refactor: datasource 이름 변경 및 패키지 변경 * refactor: article -> offering으로 네이밍 변경 * refactor: repository 패키지 변경에 따른 수정 * refactor: datasource 패키지 변경 및 local 과 remote 분리 * refactor: repository Application 클래스를 통한 주입으로 변경 * style: ktlint 적용 * refactor: api service 리네이밍 * refactor: git conflict 해결 * refactor: 함수 이름 컨벤션에 맞도록 변경 (getMeetings -> fetchMeetings) * chore: CI 스크립트 추가 (#173) * chore: ci 스크립트 추가 * chore: ci 스크립트 수정 * fix: og 태그 추출 시 크롤링 이슈 해결 (#174) * feat: 날짜, 시간 선택 기능 구현, 주소검색 기능 연결 (#171) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 모집마감 시간 클릭 시 date time picker를 띄우는 기능 구현 * feat: 날짜, 시간 선택 기능 구현 * feat: 주소 검색 기능 연결 * refactor: 함수명 수정, 함수분리 * refactor: ktFormat 적용 * refactor: string으로 분리, 상수화 * fix: string 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정3 * chore: CI workflow 파일 수정4 * feat: 공모가 정상적으로 게시되었을 시 "공모가 게시되었어요!" 라는 토스트를 띄우고 공모글 작성 프래그먼트를 종료하는 기능 구현 * feat: 토스트가 화면 중앙에 뜨는 문제 수정 * refactor: 사용되지 않는 파일 삭제 * refactor: xml 뷰 id 수정 * refactor: 버튼이 TextView인 문제 수정 * refactor: 사용되지 않는 data binding variable 제거 * refactor: 함수명 수정 * refactor: 다이얼로그, dateTimePickerBinding 전역으로 선언 * refactor: dateTimePicker 클릭 이벤트를 추상화 해 xml에서 처리하도록 변경 * refactor: ktFormat * feat: 상품 URL 이미지 추출 API 연결 (#180) * refactor: 사용하지 않는 파일 제거 * refactor: 가시성 변경 * feat: api service 구현 * feat: datasource 구현 * refactor: repository 네이밍 수정 (offeringsRepository -> offeringRepository) * feat: 사진 업로드 관련 리소스 파일 추가 * feat: repository 및 model 구현 * feat: 이미지 링크를 통한 크롤링 이미지 불러오는 api 연결 및 이미지 삭제 로직 구현 * style: ktlint 적용 * refactor: 이미지 prefix 추가 및 에러 메시지 수정 * refactor: build 오류 수정 * fix: git conflict 해결 * feat: 공모 목록 조회 API에 필터링과 검색 기능 추가 (#169) * feat: 공모 필터 목록 조회 API 구현 * test: 공모 필터 목록 조회 API 테스트 * style: 개행 형식 통일 * feat: 공모 필터 목록 조회 API Specification 도입 준비 * fix: url에 큰따움표 제거 * feat: Specification 도입 * refactor: queryString 구체화 * refactor: 함수명 변경 * feat: 최신순 필터링 적용 * feat: 마감임박순 필터링 적용 * feat: 높은할인률순 필터링 적용 * refactor: 전략 패턴 적용해 여러 갈래의 분기문과 중복되는 코드 처리 * test: 변경된 API 스펙에 맞게 문서화 작업 * refactor: 관련있는 메서드들끼리 모이게 순서 재배치 * refactor: 맞춤법 수정 * style: 개행 제거 --------- Co-authored-by: masonkimseoul * feat: 상태 변경 API 구현 (#175) * feat: 댓글방 상태 변경 및 조회 API 구현 Co-authored-by: masonkimseoul * feat: 공모글 상태 조회 API 구현 * feat: 댓글방 상태 변경 중 수동 확정 기능 구현 * refactor: 상태 변경 관련 메서드명 수정 * refactor: 추상 클래스 메서드 컨벤션 통일 * refactor: errorCode 사용 시 클래스 명시 * refactor: 댓글방 상태 관련 API 엔드포인트 수정 및 패키지 변경 * refactor: 댓글방 상태 변경 API HTTP 메서드 수정 * feat: 공모 모집 자동 확정 시 댓글방 상태 변경 --------- Co-authored-by: masonkimseoul Co-authored-by: Choo * feat: 로그인 기능 구현 (#177) * feat: password 일방향 암호화 기능 구현 * feat: cookie 생산-소비 기능 구현 * chore: jwt 관련 의존성 추가 * feat: 토큰 생성 기능 구현 * feat: 로그인 API 구현 * test: 로그인 API 테스트 * feat: 회원가입 API 구현 * test: 회원가입 API 테스트 * feat: 닉네임 생성 기능 구현 * test: 닉네임 생성 기능 테스트 * fix: postconstruct 여러 개라 발생한 에러 해결 * feat: 회원가입 응답값에 랜덤생성한 닉네임 추가 * feat: MemberArgumentResolver 구현 * feat: MemberArgumentResolver 일부 적용 * test: 바뀐 스펙에 맞게 변경 * test: TestConfig 설정해 빈충돌 오류 해결 * test: 공모 작성 API로 MemberArgumentResolver 사용 * feat: 토큰 재발급 API 구현 * test: 토큰 재발급 API 테스트 * test: 토큰 재발급 API 에러 테스트 * feat: MemberArgumentResolver commant에 적용 * feat: MemberArgumentResolver offering에 적용 * feat: MemberArgumentResolver participant에 적용 * refactor: ci값이 일치하지 않을경우 오류메시지 문구 변경 * refactor: 클래스명 일관적으로 변경 * refactor: 직관적인 명명으로 enum 네이밍 변경 * refactor: Custom Exception 적용 * refactor: 컨트롤러 메서드에 접근제어자 명시 * fix: 중복된 enum 값 제거 * test: 바뀐 API 스펙에 맞게 변경 --------- Co-authored-by: fromitive * fix: nicknameWordInitializer 설정 오류 해결 (#182) * fix: keyword null일 때 처리 및 docs에서 required 제거 (#184) * fix: keyword null일 때 처리 * test: optional() 붙여서 required 제거 * chore: 브랜치에 상관없이 pr 머지 시 자동으로 관련 이슈 닫는 스크립트 구현 (#187) * fix: og 이미지 태그 크롤링 문제 해결 (#190) * refactor: 댓글방 상태 도메인 설계 변경 (#189) * feat: 공모 목록 API 응답값에 낱개 가격 추가 (#193) * chore: readtimeout 5초로 수정 (#195) * feat: 댓글방 상태 조회 시 상태별 이미지 함께 반환 (#196) * feat: 공모 목록 조회 API연결 (#201) * refactor: Condition 수정에 따른 변경 * refactor: api변경에 따른 리팩토링 * refactor: api변경에 따른 목록 무한 스크롤 기능 리팩토링 * feat: 검색 기능 구현 * feat: 필터링 기능 구현 - 참여 가능은 서버 에러로 추후 추가 예정 * feat: 아이템을 불러온 후 recyclerview의 최상단으로 이동하는 기능 구현 - 검색, 필터링 수행 후 최상단으로 이동 * feat: 필터링 목록 불러오는 api연결 * feat: 마감임박 상태 추가 * refactor: default parameter제거 * style: lint적용 * feat: 토큰 반환 시 cookie가 아닌 body 사용하도록 변경 (#206) * feat: 발급한 토큰을 header가 아닌 body로 반환하도록 수정 * refactor: 사용안하는 클래스와 메서드 제거 * test: 바뀐 API 스펙에 맞게 명세 수정 * feat: 이미지 더미 데이터 수정 및 부정확한 가격 데이터 수정 (#207) * refactor: 공모 글 작성 시 총대 참여자 추가 (#208) * feat: 바텀 네비게이션 고정 기능 구현 (#211) * feat: 데이터에서 5자 이상 제거 (#212) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 (#202) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 * refactor: 도메인 명칭 변경 (낱개가격 -> 원가격) * refactor: 도메인 명칭 변경 (공모 -> 댓글방) * refactor: originPrice로 http client 변경 * feat: 키보드 이외 영역 터치 시 키보드 내려가도록 구현 (#214) * feat: 키보드외 화면 클릭 시 키보드 내려가도록 구현 * refactor: api변경에 다른 dto수정 * feat: 이미지 업로드 및 권한 설정 (#216) * chore: 이미지 권한 추가 * feat: permission manager을 생성하여 권한 체크 및 request * feat: 이미지 추가 버튼을 클릭할 시 권한 설정 연결 * feat: 이미지 피커를 사용하여 uri 전달 구현 * feat: 이미지 파일 업로드 api service 구현 * feat: 이미지 파일 업로드 data source 구현 * feat: 이미지 파일 업로드 repository 구현 * feat: 이미지 파일 martipart로 변환해주는 기능 구현 * feat: 이미지 업로드 관련 뷰 수정 * feat: 이미지 파일 업로드 및 api 연결 구현 * style: ktlint format * fix: git conflict 해결 * refactor: 이미지 scaleType 변경 * refactor: string value 컨벤션 적용 * feat: 토큰 반환 시 body가 아닌 cookie로 반환하도록 원상복구 (#223) * feat: 토큰 재발급 API에서 requestHeader로 refreshToken 받도록 수정 (#227) * feat: 토큰 재발급 API에서 body가 아닌 cookie로 토큰 반환 * feat: 회원가입 API도 body가 아닌 cookie로 토큰 반환 * refactor: service 용 dto 명 컨벤션에 맞춰 수정 * feat: 댓글방 일정 수정 API 구현 (#226) * feat: 댓글방 일정 수정 API 구현 * test: 총대가 아닌 참여자가 공모 일정 정보를 수정할 경우 예외 발생 * feat: 댓글방 상태 조회 시 버튼 텍스트 추가 (#229) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 (#222) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 * refactor: 구현 방식 변경 * style: lint적용 * Feature/217 offering status (#230) * feat: 댓글방 상태 조회 api service 구현 * feat: 댓글방 상태 조회 model 및 dto 구현 * feat: 댓글방 상태 조회 datasource 구현 * feat: 댓글방 상태 조회 repository 구현 * feat: 댓글방 상태 조회 api 연결 구현 * style: ktlint 적용 * feat: 댓글방 상태 변경 (#231) * feat: 댓글방 상태 변경 api service 구현 * feat: 댓글방 상태 변경 data source 구현 * Revert "feat: 댓글방 상태 변경 data source 구현" This reverts commit 052691a8de945c60a60586ee66a05a6a3b264217. * feat: 댓글방 상태 변경 data source 구현 * feat: 댓글방 상태 변경 repository 구현 * feat: 댓글방 상태 변경 api 연결 구현 * style: ktlint 적용 * feature: 카카오 로그인 구현 (#235) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * feat: 공모 참여자 목록 조회 API 구현 (#225) * feat: 공모 참여자 목록 조회 API 구현 * test: 실패 테스트 오류 수정 * style: 띄어쓰기 적용 * refactor: MemberEntity를 받도록 변경 * refactor: isParticipant를 구현하여 가독성 개선 * refactor: 총대를 찾을 수 없는 상황의 예외 추가 * refactor: 참여 검증로직을 서비스로 이동 * refactor: 사용하지 않는 메서드 제거 * refactor: 검증 로직 가장 상단에 위치 * refactor: 총대 추출 로직 수정 --------- Co-authored-by: masonkimseoul Co-authored-by: SCY * refactor: 마감임박순 필터링 쿼리 조건 수정 (#239) * refactor: 마감임박순 필터링 조건 수정 * refactor: 더미 데이터 시간 수정 * fix: 필터링 오류 수정 (#243) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 (#247) * feat: 공동구매 상태 변경 다이얼로그 구현 (#245) * feat: 공동구매 상태 변경 다이얼로그 view 구현 * feat: 공동구매 상태 변경 다이얼로그 Listener 구현 * feat: 공동구매 상태 변경 다이얼로그 연결 및 상태 변경 로직 수정 * test: 테스트 코드 작성을 위한 기본 세팅 (#255) * feat: CoroutinesTestExtension 구현 * feat: Livedata getOrAwaitValue 구현 * feat: InstantTaskExecutorExtension 구현 * feat: TestFixture 생성 * style: ktlint 적용 * feat: 공모글 목록 화면 UI 개선, 공모글 작성에서 낱개 금액이 엔빵 가격보다 저렴할 시 글 작성 막는 기능 구현 (#246) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * fix: 구분선을 각각의 아이템의 하단에 넣고 프래그먼트 뷰의 "채팅" 텍스트 밑에 하나 추가 * fix: 텍스트뷰에 font 적용, 마지막 댓글 시간 텍스트를 조금 왼쪽으로 이동 * fix: 낱개 가격 이름을 eachPrice -> originPrice 수정 * fix: 낱개 가격이 엔빵 가격보다 싸면 토스트를 띄우고 글작성을 막는 기능 구현 * fix: 네이티브앱키 로컬프로퍼티로 이동 * refactor: 함수명 변경 * fix: 카카오 계정으로 로그인 후 액티비티 전환하지 않는 문제 수정 * refactor: 사용되지 않는 클래스 삭제 * refactor: 패키지 수정 * refactor: alsong 로그 수정 * refactor: 변수명 수정 * refactor: Manifest의 네이티브앱 키 숨김 * refactor: 로컬프로퍼티의 데이터 형식 수정 * Update android.yml * refactor: alsong 로그 삭제 * ci 빌드 실패가 manifest때문인지 테스트 * refactor: 매니페스트에 앱 키 넣을 수 있게 하는 gradle 설정 수정 * 매니페스트 수정하고 재테스트 * 매니페스트 수정하고 재테스트 * chore: 그래들 수정 * chore: 그래들 수정2 * chore: 그래들 수정3 * chore: 그래들 수정4 * chore: 카카오 계정으로 로그인하는 기능 제외 * feat: 홈화면 테스트 작성 (#257) * chore: mockk의존성 추가 * test: OfferingViewModel 테스트 작성 * style: lint적용 * refactor: stub를 TestFixture로 이동 * test: 댓글방 테스트 코드 작성 (#258) * refactor: 댓글 보내는 함수명 변경 * refactor: 공구 약속 장소 및 시간 캐시 기능 * test: 테스트를 위한 fake repository 구현 * test: 댓글방 viewmodel test 작성 * feat: 댓글방 ActivityTest 작성 * feat: 댓글방 ActivityTest 작성 * style: ktlint 적용 * refactor: test fixture에서 사용하지 않는 것 삭제 * style: ktlint 적용 * feat: GA 모니터링 환경 구축 및 로깅 전략 적용 (#242) * chore: Firebase Crashlytics 의존성 추가 * feat: Firebase 초기화 * feat: FirebaseManager 구현 * feat: 총대가 공구 진행 상황을 다음 단계로 변경했을 때 event 추가 * feat: 로깅 기능 구현 - 검색 - 필터링 - 공모글 클릭 - 공모 참여 * style: lint적용 * feat: 글 작성 완료 시 event 추가 * feat: 로그인 시 event 추가 --------- Co-authored-by: Namyunsuk Co-authored-by: songpink * test: 공모글 작성 이미지 테스트 코드 작성 (#260) * refactor: 상수 가시성 변경 * feat: test fixture 구현 * feat: fake repository 이미지 업로드 기능 추가 * test: OfferingWriteViewModelTest 이미지 업로드 test 코드 작성 * feat: 로그인 후 홈화면으로 이동해도 로그인 화면이 종료되지 않는 문제 수정 (#261) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 로그인 후 LoginActivity가 종료되도록 수정 * feat: 공모 상세 화면 테스트 작성 (#264) * feat: OfferingDetailViewModel 테스트 작성 * refactor: 테스트 수정 * style: lint적용 * style: lint적용 * feat: 로깅 코드 삽입 (#266) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 * feature: 로깅 샘플 구현 * refactor: 불필요한 코드 제거 * feat: logging 적용 --------- Co-authored-by: fromitive * fix: 마감 임박 필터링 쿼리 수정 (#267) * chore: logback 설정 진행 (#270) * chore: logback 설정 * fix: multipart 요청 필터링 * chore: logback 설정 변경 * chore: pull request ci/cd 닫기 * fix: 이미지 업로드 API의 responseBody가 두 번 뜨는 오류 해결 (#273) * fix: 이미지 업로드 API 두 번 도는 문제 해결 * test: 이미지 업로드 API의 누락된 response field 추가 * refactor: 홈화면 수정 (#271) * refactor: 할인율 마진 추가 * refactor: 공구상태에 대한 문구 수정 * refactor: 클릭 시 최상단으로 이동하는 버튼 구현 * feat: 공모글 작성 화면 테스트코드 작성 (#274) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: 공모글 작성 테스트 구현 * feat: 댓글방 목록 화면 테스트코드 작성 (#276) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: "댓글방 목록을 확인할 수 있어야 한다" 테스트 작성 * feat: pageSize validation 추가 (#279) * feat: pageSize validation 추가 * feat: magic number 추출 * fix: 공모 상세 화면 오류 수정 (#280) * fix: 총대 여부 확인 로직 수정 * fix: 마감 임박 시 보여주는 버튼 수정 * fix: 공모 작성 후 홈화면으로 돌아왔을 떄 목록이 새로고침 되지 않는 오류 수정 * test: 테스트 코드 수정 * style: lint적용 * feat: 댓글방 목록 화면 자동 업데이트 되지 않는 문제 수정, 회원가입 이후 자동으로 로그인되지 않는 문제 수정 (#282) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 라이플사이클 오너 설정 * fix: 회원가입 후 자동으로 로그인 되도록 수정 * chore: change version name (#291) * feat: 카카오 계정 로그인 기능 구현 시 CI가 실패하는 문제 해결 (#296) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * feat: 로그인 화면 리팩토링 (#298) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * refactor: SimpleCookieJar의 패키지 변경(presentation 레이어에서 data레이어의 source 패키지로 이동) * refactor: data store를 관리하는 클래스를 생성하고 이 클래스를 사용하도록 변경 * refactor: 사용하지 않는 의존성과 주석 제거 * refactor: http status code 추가 * refactor: 함수분리 * refactor: ktFormat 적용 * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentRooms) * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentDetail), 사용되지 않게 된 memberId 제거 * refactor: ktFormat 적용 * test: 테스트코드 수정 * refactor: Preferences -> DataStore 이름 변경 * refactor: 채팅방 UI UX 개선 (#303) * feat: 키보드가 아닌 다른 영역을 클릭하면 키보드 내리는 기능 구현 * feat: 뒤로가는 버튼 기능 추가 * feat: 댓글 입력 maxLines 설정 및 maxLength 설정 * style: ktlint 적용 * 필요 없는 코드 제거 * feat: 댓글방 목록에서 자신이 총대인 댓글방의 UI 개선 (#304) * refactor: 댓글방의 자신이 총대인 댓글방 ui 개선 * fix: Binding 클래스 네이밍 수정 * feat: 가로모드, 다크모드 설정 (#305) * refactor: api변경에 따른 리팩토링 (#310) * feat: 로그인 화면 해상도 대응 (#313) * feat: 이미지 업로드 중일 때 로딩 상태 설정 (#317) * feat: 공모 글 작성 ui state 구현 * feat: 로딩 progressbar 생성 * feat: UI 상태에 따른 토스트 메시지 처리 * refactor: 잘못된 입력에 대한 에러 처리 변경 * refactor: 홈화면 리팩토링 (#324) * refactor: textSize dp로 변경 * refactor: 검색 버튼 크기 변경 - 검색 버튼 패딩 추가 - 검색창 끝에 패딩 추가 * refactor: 엔터키를 통해 검색하도록 수정 * refactor: 필터 단일 선택되도록 수정 * style: lint적용 * feat: 댓글방 새로운 기능 GA 연결 (#328) * feat: 댓글방 참여자 확인 Event 구현 * feat: 댓글방 상태 변경 다이얼로그 취소 Event * feat: 참여자가 공구에서 참여 포기 Event 구현 * style: ktlint 적용 * test: 테스트 데이터 수정 (#330) * feat: Fragment GA 모니터링 수집 (#332) * feat: fragment logScreenView 추적 함수 구현 * feat: 각 fragment에서 화면 감지 GA 설정 * feat: 마이페이지 기본 세팅 및 뷰 변경 (#335) * feat: 공모 참여 취소 기능 구현 (#318) * test: 공모 참여 취소 테스트코드 작성 * feat: 공모 참여 취소 기능 구현 * refactor: 불필요한 쿼리 메서드 제거 * style: 불필요한 개행 제거 * refactor: 모집중인 상태가 아닌 경우 공모 참여를 취소할 수 없도록 변경 * refactor: 공모 참여 취소 응답 상태 코드 변경 * refactor: 에러 메시지 명확한 문구로 변경 * refactor: query parameter를 적용해 어떤 공모의 참여를 취소할 것인지 의도를 명확하게 전달하도록 변경 * refactor: 총대 검증 메서드 네이밍 명확하게 변경 * feat: 댓글방 생성 시점 변경 (#319) * feat: 댓글방 생성 시점 변경 * refactor: 불필요한 도메인 OfferingWithRole 제거 * refactor: 불필요한 도메인 CommentWithRole 제거 * refactor: 댓글의 작성자 확인 메서드 추가 * refactor: 댓글방 목록 조회 dto 생성자 추가 * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 (#322) * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 * refactor: 로그인용 dto 분리 및 공통 dto에 prefix로 auth 추가 * feat: valid 어노테이션 추가 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 (#323) * refactor: 메서드명 구체적으로 변경 * refactor: 변수명 구체적으로 변경 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 * docs: todo 추가 * refactor: 함수명 통일 * feat: 공모자 여부 필드명 변경 * feat: 댓글방 상태 조회 API 확장 (#325) * feat: 댓글방 상태 조회 API 확장 * refactor: 댓글방 관련 로직 댓글 도메인으로 이동 * feat: LoggingFilter에서 던지는 유효하지 않은 요청에 대한 예외 처리 * refactor: 댓글 관련 엔드포인트 수정 * feat: 댓글방 정보 조회 시 조회 권한을 가진 사용자인지 검증 * refactor: 댓글방 상태 확인 로직 도메인으로 이동 * feat: 상태 변경을 시도하는 사용자가 총대인지 검증 * refactor: 댓글 목록 조회 엔드포인트 수정 * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 (#327) * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 * refactor: Response depth 줄이기 및 DTO 생성자 작성 * fix: imminent 필터 버그 해결 (#337) * fix: 커스텀 필터로 인해 h2-console 접속 깨지는 이슈 해결 (#339) * feat: 마이페이지 기능 구현 (#341) * feat: 마이페이지 닉네임 기능 구현 * feat: 로그아웃 로직 구현 * feat: url 연결 로직 구현 * feat: 필요없는 기능 삭제 * style: ktlint 적용 * feat: 공모 테이블에 할인율과 상태 필드 추가 (#342) * refactor: Condition과 Status 이름 변경 * refactor: 사용하지 않는 DTO 제거 * feat: OfferingEntity에 칼럼 추가 * feat: 공모 거래 날짜 필드 이름 변경 (#348) * fix: 상세화면에서 홈화면으로 갔을 때 상태 변경 안되는 오류 수정 (#343) * refactor: 공모상세페이지 Activity -> Fragment로 리팩토링 * fix: 페이지네이션 및 상태변경 미적용 오류 해결 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 주석 제거 및 상수화 * refactor: livedata 자료형 변경 * refactor: progressbar위치 수정 * refactor: lifecycleScope사용 리팩토링 * refactor: adapter에서 전체 아이템이 아닌 특정 아이템만 notify하도록 리팩토링 * refactor: API변경에 따른 대응 (#352) * refactor: api대응 * refactor: api변경에 따른 테스트 수정 * feat: 공모글 작성 화면 ux 개선 (#344) * fix: 각 항목의 설명을 place holder로 이동 * fix: 필수와 선택 항목의 프래그먼트 분리 * feat: 버튼이 항상 보이도록 수정 * fix: 가격과 총원은 숫자만 입력받도록 변경 * fix: 패딩 수정 * fix: ui 수정 * fix: 도메인 변경에 따른 deadline -> tradeDate 수정 * feat: 필수 항목을 모두 입력하면 선택 항목 화면으로 이동하는 기능 구현 * refactor: ktFormat 적용 * refactor: shared viewModel 사용, 미필수 항목을 미필수 입력 화면으로 이동 * refactor: 프래그먼트 이름 변경 * feat: 입력 숫자의 글자수와 라인수 제한 기능 구현 * fix: 총원이 -1이하로 떨어지는 버그 수정, 공동구매 텍스트 띄어쓰기 제거 * fix: 할인율, 엔빵 금액이 유효하지 않을 때는 "-"로 뜨도록 변경 * fix: 공모를 게시하면 필수, 선택 화면 모두 종료되도록 수정 * fix: 날짜 시간 픽커를 날짜만 선택하는 픽커로 변경 * refactor: ktFormat 적용 * refactor: 바인딩어댑터의 파라미터를 nullable하게 수정 * test: 테스트코드 수정 * feat: 낱개 가격의 place holder로 현재 엔빵 금액을 보여주는 기능 구현 * feat: 내용의 최대 글자수와 현재 글자수를 보여주는 기능 구현 * refactor: ktFormat 적용 * refactor: 공모글 작성시 memberId를 보내지 않도록 변경 * fix: 총원 최대 4자리에서 3자리까지만 입력받을 수 있도록 변경 * fix: deadline -> meetingDate 네이밍 수정 * fix: 공모글 작성 후 작성 화면의 입력값이 초기화되지 않는 버그 수정 * refactor: 네이밍 수정(eachPrice -> originPrice) * refactor: 네이밍 수정(individualPrice -> originPrice) * fix: 내용의 현재 글자수 색이 메인컬러가 되지 않는 문제 수정 * refactor: 프래그먼트 종료될 때 바인딩 해제하도록 수정 * refactor: id가 없는 뷰의 id 추가 * refactor: 함수 분리 * fix: 내용 옆의 * 제거 * fix: GA 이벤트 이름 변경(공모글 작성 - 필수 화면에서의 이벤트임을 명시함) * refactor: og 태그 추출 기능 수정 (#349) * refactor: crawler 패키지 이동 * feat: naver api 클라이언트 추가 refactor: 사용하지 않은 기존 og image 크롤러 명칭 변경 * feat: html 크롤링 방식과 naver api 방식을 조합하는 Extractor 구현 * fix: OfferingService ProductImageExtractor 추상화 * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 (#358) * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 * test: 테스트코드 수정 * refactor: 공모글 목록 조회 필터링 수정 및 추가 (#356) * refactor: 마감임박순 필터링 이름 마감임박만으로 변경 Co-authored-by: fromitive * refactor: 필터링 쿼리 수정 Co-authored-by: fromitive * feat: "참여가능만" 필터링 기능 구현 Co-authored-by: fromitive * feat: "참여가능만" 필터링 기능 연결 Co-authored-by: fromitive * fix: 쿼리 내 불필요한 파라미터 제거 Co-authored-by: fromitive * refactor: 할인율이 null일 경우 높은할인율 필터링 대상에서 제외 Co-authored-by: fromitive * feat: 참여가능만 필터링 전략 클래스 추가 * feat: 공모 목록 조회 API 응답값 변경 * fix: 높은 할인율 단위 변경 및 last-id 필터링 로직 수정 * style: 주석 제거 --------- Co-authored-by: fromitive * refactor: 할인율 계산 로직 수정 (#359) * refactor: 할인율 계산 로직 수정 Co-authored-by: fromitive * refactor: 소수점 둘째 자리에서 반올림하도록 변경 Co-authored-by: fromitive * test: 할인율 계산 로직 * fix: 할인율 단위 백분율로 수정 --------- Co-authored-by: fromitive * feat: 총 모집 인원 수 최댓값 설정 (#361) Co-authored-by: fromitive * fix: 필터 오류 수정 (#362) * fix: 필터 오류 수정 - '참여가능만'필터 분기처리 제거 * chore: 주석 제거 * feat: API 스펙 변경에 따른 대응 (#364) * feat: 댓글 목록 조회 api 스펙 변경에 따른 대응 * feat: 댓글방 정보 조회 api 스펙 변경에 따른 대응 * feat: 공모 일정 조회 api 스펙 변경에 따른 대응 * feat: 댓글 상태 변경 api 스펙 변경에 따른 대응 * test: api 스펙 변경에 따른 test 코드 변경 * style: ktlint 적용 * feat: remote dto package 분리 * feat: 자동 확정 기능을 위해 스케줄러 적용 (#363) * chore: todo 추가 및 메서드명 변경 * feat: Scheduled 어노테이션 추가 및 Scheduler 분리 * test: ServiceTest 환경 구축 * feat: offeringStatus 변경 로직 추가 * refactor: 수동 확정 로직 추가 및 코드 스타일 수정 * refactor: 자동 확정 로직을 조회에서 Scheduled로 이동 * fix: 마감임박 설정 기준 내일로 변경 --------- Co-authored-by: Choo Co-authored-by: SCY * fix: 공모 작성 후 홈화면 돌아올 때 새로 작성한 글이 보이지 않는 오류 수정 (#369) * feat: Access Token, Refresh Token을 data store에 저장하는 기능 구현 (#372) * feat: 앱 재시작 시 토큰을 데이터스토어에서 꺼내 사용하는 기능 구현 * feat: 로그인이 이미 되어있다면 로그인 화면을 건너뛰는 기능 구현 * feat: 로그아웃 기능 구현 * fix: 마이페이지 화면으로 넘어가면 바텀네비게이션이 사라지는 버그 수정 * fix: 데이터스토어에서 토큰이 꺼내지지 않는 버그 수정 data store에서 토큰을 꺼내는 코루틴 비동기 작업이 끝나기 전에 함수를 종료해 버려서 생기는 버그였습니다. * refactor: ktFormat 적용 * refactor: startActivity 함수를 LoginActivity가 동반객체로 갖고 있도록 변경 * refactor: 함수명과 event명 변경 추가로 GA위치가 조금 잘못된 점이 있어서 수정했습니다. * feat: 공모 상세 화면 추가 기능 반영 (#375) * feat: 신고하기 기능 구현 * feat: 물품 링크가 없으면 보여지지 않도록 구현 * refactor: 마감 시간에서 거래 날짜로 리팩토링 * feat: 이미 참여한 공모게시글에서 채팅방으로 이동하는 기능 구현 * fix: 댓글방 목록의 마지막 댓글방이 보이지 않는 문제 수정 (#376) * fix: 리사이클러뷰 레이아웃의 크기가 화면 밖에 벗어나지 않도록 수정 * fix: 리사이클러뷰 레이아웃의 맨 밑에 구분선 하나 추가 아래로 땡겼을 때 구분선이 사라져버리는게 보기 안좋아서 추가했습니다 * refactor: 코트 포맷 적용 (컨트롤 알트 L) * feat: isManualConfirmed 제거 및 도메인 로직 확인 (#377) * refactor: isManualConfirmed 칼럼 삭제 및 관련 로직 분리 * refactor: 더미 데이터 수정 --------- Co-authored-by: fromitive * feat: API 별 권한 확인 로직 추가 (#371) * feat: 권한 확인 로직 추가 * feat: 인증 필터 적용 * refactor: 더미 데이터 칼럼 위치 변경 (#382) * refactor: 홈화면 api필드 추가에 따른 대응 (#381) * refactor: dto필드 추가 * fix: 상태 변경 오류 해결 * fix: 필터 선택 또는 검색상태일 때 공모 작성 후 나오면 목록 안보이는 오류 수정 * refactor: 세부 주소 api에서 받아오도록 변경 * style: lint적용 * fix: API 문서에 접근할 수 없는 현상 해결 (#384) * fix: API 문서에 접근할 수 없는 현상 해결 * style: 신뢰할 수 있는 URL 개행 수정 * feat: 공모 목록에서 동을 보여주는 기능 구현 (… * hotfix: og 크롤링 정상 작동 시 http https 프로토콜 정보 제거 (#459) * feat: 도메인 추가 (#15) * feat: BaseTimeEntity 추가 Co-authored-by: Dora Choo * feat: Member Entity 추가 Co-authored-by: Dora Choo * feat: Offering Entity 추가 Co-authored-by: Dora Choo * feat: OfferingMember Entity 추가 Co-authored-by: Dora Choo * feat: Comment Entity 추가 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * feat: 공동구매 상세 조회 기능 구현 (#18) * chore: h2 환경설정 추가 * docs: http client 추가 * refactor: entity 접미어 적용 * chore: dummy data 추가 * docs: http client 값 변경 * refactor: repository 와 domain 패키지 분리 * feat: 공동구매 상세 조회 API 구현 * refactor: entity 접미어 적용 * style: 클래스 컨벤션 적용 * chore: h2 console 설정 제거 * refactor: OfferingCondition enum값 결정로직을 enum 안으로 이동 * feat: API 문서화 적용 (#23) * chore: springdoc-openapi 의존성 추가 Co-authored-by: Dora Choo * chore: springdoc 설정 추가 Co-authored-by: Dora Choo * feat: SwaggerConfig 파일 추가 Co-authored-by: Dora Choo * feat: 공모 상세 조회 API 문서화 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * fix: 공모 상세 조희 API의 price 필드 자료형 변경 및 memberId 필드 추가 (#28) * fix: 상세조회 API 금액 필드 자료형 변경 Co-authored-by: Dora Choo * fix: memberId 추가 * 내가 쓴 글인지 아닌지 확인 위해 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * chore: 백엔드 CI 및 도커 파일 작성 (#27) * chore: actions 적용 브랜치 설정 (#30) * chore: actions 적용 브랜치 설정 * chore: path 및 ref 태그 제거 * chore: working-directory 태그 추가 * chore: Dockerfile jar 경로 수정 * feat: 공모 목록 조회 기능 구현 (#35) * feat: 공모 목록 조회 API 구현 * docs: 공모 목록 조회 API http client에 추가 * fix: 공모 상세 조회 API의 status 필드를 condition으로 명칭 변경 * feat: 공모 목록 조회 API의 isClosed 필드 이름을 isOpen으로 변경 * chore: 백엔드 CD 스크립트 작성 (#34) * chore: 백엔드 CD 스크립트 작성 * chore: 도커 백그라운드로 실행 * chore: 도커 설정 및 트리거 설정 변경 * chore: 도커 이미지 제거 로직 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 강제 제거하도록 수정 * chore: gradle 캐싱 로직 추가 (#39) * chore: gradle 캐싱 로직 추가 * chore: 이벤트 트리거 조건 수정 * feat: 공모 참여하기 기능 구현 (#40) * fix: BaseTimeEntity 적용 오류 수정 Co-authored-by: Dora Choo * feat: 참여하기 API 구현 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * feat: 공모 상세 조회 API에 참여자 목록 필드 추가 (#42) * feat: 공모 상세 조회 API의 request에 memberId 필드 추가 (#45) * feat: 공모 참여 API의 불필요한 응답값 전부 제거 (#48) * feat: 공모 참여 API의 불필요한 반환값 제거 * chore: 자주 쓰는 h2 console enabled 설정 주석 처리 * feat: 이미 참여한 공모에 참여 못하게 예외 처리 (#51) * feat: 테스트 데이터 다양화 (#52) Co-authored-by: Dora Choo * refactor: 공모 엔티티에 currentCount 필드 추가 (#55) * feat: 댓글 작성 API 구현 (#57) * feat: 댓글방 내 공모 일정 조회 기능 구현 (#58) * feat: 댓글방 내 공모 일정 조회 기능 구현 Co-authored-by: Dora Choo * refactor: 공모 일정 조회 api 명세 변경 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * refactor: common 패키지명을 global로 변경 (#61) * feat: 댓글 목록 조회 API 구현 (#66) * feat: 댓글방 목록 조회 API 구현 (#70) * refactor: 댓글방 및 댓글 목록 조회 서비스 계층 (#78) * fix: 댓글방 목록 조회 시 가장 최근 댓글 조회 (#80) * fix: 시간순 정렬 쿼리 추가 (#83) * chore: 더미 데이터 추가 (#87) * chore: 더미 데이터 바로가기 url 수정 (#93) * refactor: 댓글 도메인 코드 리팩터링 (#96) * refactor: 로그인 멤버 변수명 변경 * refactor: JPQL 쿼리 컨벤션 및 멤버로 공모 조회 메서드명 변경 * refactor: 최근 댓글 응답 클래스명 변경 * refactor: 컨트롤러 및 서비스 API 순서 변경 * refactor: 로그인 사용자 유효성 검증 * chore: 더미 데이터 시간 변경 (#100) * feat: 전반적인 예외 처리 (#103) * feat: 예외 처리 핸들러 추가 * feat: Offering 예외 처리 코드 추가 * feat: Comment 예외 처리 코드 추가 * feat: Member 예외 처리 코드 추가 * feat: OfferingMember 예외 처리 코드 추가 * feat: Offering 예외 처리 상세 코드 추가 * feat: 에러 코드 적용 * feat: 도메인 검증 로직 * feat: DTO 검증 로직 --------- Co-authored-by: masonkimseoul * feat: swagger와 restdocs 연동 (#104) * chore: swagger ui 정적 파일 설치 및 static routing 세팅 * chore: restdocs-api-spec을 이용한 OAS 생성 * chore: swagger ui 정적 파일을 swagger-ui 디렉토리로 이동 * chore: swagger ui 정적 파일 및 static routing 세팅 제거 * chore: 생성된 OAS 파일을 Swagger 디렉터리로 복사하는 스크립트 작성 * chore: openapi3 yaml 파일 gitignore 처리 * chore: static routing 세팅 다시 추가 openapi3.yaml을 사용하기 위함 * test: RestAssured RestDocs 테스트 코드 작성 * test: 공모 목록 조회 API 문서화 * test: 공모 일정 조회 API 및 공모 참여 API 문서화 * test: 댓글 관련 API 문서화 * docs: 논의된 TODO 제거 * refactor: swagger 어노테이션 제거 * chore: 개발 API 서버 목록 설정 --------- Co-authored-by: fromitive * refactor: 에러메시지 필드명 변경 (#108) * fix: restdocs 관련 테스트 실패 이슈 해결 (#106) * chore: cicd 테스트 * chore: 테스트 위해 actions 범위 조정 * chore: 배포 스크립트 띄어쓰기 오타 수정 * chore: 빌드 캐싱 제거 * chore: logging * chore: --warning-mode all 옵션 줘서 gradle 호환 무시하도록 설정 * fix: status 달라서 실패하는 테스트 수정 * chore: actions 범위 수정 * chore: action 범위 수정 * chore: test용 static 파일 추가 * chore: static 하위 폴더를 jar 파일에 포함하도록 설정 * chore: swagger-ui 하위 폴더 제거 * chore: task 순서 조정 * chore: build 스크립트 수정 * chore: 불필요한 설정 변경 제거 * chore: clean build 대신 clean bootJar 사용 * chore: clean, build 각각 하도록 변경 * chore: test 까지 두 번 돌리도록 수정 * chore: openapi3까지 두 번 실행하도록 수정 * chore: copyOasToSwagger 까지 두번 실행하도록 수정 * chore: actions 활성화 범위 수정 * fix: 댓글방 목록 조회 시 참여자 수 조건 추가 (#111) * fix: 댓글방 조회 테스트 수정 (#113) * fix: 이미지 링크 임시 수정 (#119) * fix: 이미지 링크 수정 (#120) * chore: CI 빌드 스크립트 중 중복되는 task 제거해 성능 개선 (#128) * chore: jar태스크 비활성화하고 bootJar 태스크로만 JAR 파일 생성 * chore: cicd 범위 조정 * feat: 공모 작성 API 구현 (#139) * feat: 공모 작성 API 구현 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: create를 save로 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: dto entity 매핑로직을 dto로 이동 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: controller request 매개변수 명 컨벤션 적용 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 공모에 저장하는 주소 값 구체화 (#141) * refactor: 공모에 저장하는 주소 값 구체화 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: github-action 스크립트 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: CI/CD test 설정 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: static/swagger-ui 폴더 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: 설정 원상 복구 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: ci/cd 범위 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 댓글방 메시지 조회 시 commentId 필드 추가 (#150) Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: OG 태그 크롤링 API 구현 (#148) * feat: OG 태그 크롤링 API 구현 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: OG 태그 크롤링 API 엔드포인트 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 제품 코드와 API 문서 동기화 (#153) * refactor: API 문서 개선 (#157) * refactor: 댓글 작성 시 성공 상태 코드 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 요청 필수 상태 설명 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: s3 이미지 업로드 API 구현 (#147) * feat: s3 이미지 업로드 API 구현 * chore: cicd 액션 범위 수정 * fix: 이미지 업로드 경로의 특수문자 제거 * chore: yml multipart 설정 추가 * chore: S3 업로드 결과 테스트 * fix: inputstream 변환로직 위치 이동 * fix: 업로드할 s3 path 올바르게 수정 * fix: 사진 url 속에 버킷이름을 cloudfront 도메인으로 수정 * chore: actions 범위 재조정 * feat: API endpoint 변경 * chore: docker image 지우는 작업을 마지막으로 이동 * chore: 다른 브랜치로 이전 커밋 이동하기 위해 제거 * chore: 충돌 해결 및 코드 스타일 변경 * test: S3 이미지 업로드 성공 케이스 추가 * test: multipart form data 문서화 * test: 공모 상태 enum 문서화 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 파일 업로드 크기 제한 100MB에서 20MB로 변경 --------- Co-authored-by: Choo Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * fix: og 태그 추출 시 크롤링 이슈 해결 (#174) * feat: 공모 목록 조회 API에 필터링과 검색 기능 추가 (#169) * feat: 공모 필터 목록 조회 API 구현 * test: 공모 필터 목록 조회 API 테스트 * style: 개행 형식 통일 * feat: 공모 필터 목록 조회 API Specification 도입 준비 * fix: url에 큰따움표 제거 * feat: Specification 도입 * refactor: queryString 구체화 * refactor: 함수명 변경 * feat: 최신순 필터링 적용 * feat: 마감임박순 필터링 적용 * feat: 높은할인률순 필터링 적용 * refactor: 전략 패턴 적용해 여러 갈래의 분기문과 중복되는 코드 처리 * test: 변경된 API 스펙에 맞게 문서화 작업 * refactor: 관련있는 메서드들끼리 모이게 순서 재배치 * refactor: 맞춤법 수정 * style: 개행 제거 --------- Co-authored-by: masonkimseoul * feat: 상태 변경 API 구현 (#175) * feat: 댓글방 상태 변경 및 조회 API 구현 Co-authored-by: masonkimseoul * feat: 공모글 상태 조회 API 구현 * feat: 댓글방 상태 변경 중 수동 확정 기능 구현 * refactor: 상태 변경 관련 메서드명 수정 * refactor: 추상 클래스 메서드 컨벤션 통일 * refactor: errorCode 사용 시 클래스 명시 * refactor: 댓글방 상태 관련 API 엔드포인트 수정 및 패키지 변경 * refactor: 댓글방 상태 변경 API HTTP 메서드 수정 * feat: 공모 모집 자동 확정 시 댓글방 상태 변경 --------- Co-authored-by: masonkimseoul Co-authored-by: Choo * feat: 로그인 기능 구현 (#177) * feat: password 일방향 암호화 기능 구현 * feat: cookie 생산-소비 기능 구현 * chore: jwt 관련 의존성 추가 * feat: 토큰 생성 기능 구현 * feat: 로그인 API 구현 * test: 로그인 API 테스트 * feat: 회원가입 API 구현 * test: 회원가입 API 테스트 * feat: 닉네임 생성 기능 구현 * test: 닉네임 생성 기능 테스트 * fix: postconstruct 여러 개라 발생한 에러 해결 * feat: 회원가입 응답값에 랜덤생성한 닉네임 추가 * feat: MemberArgumentResolver 구현 * feat: MemberArgumentResolver 일부 적용 * test: 바뀐 스펙에 맞게 변경 * test: TestConfig 설정해 빈충돌 오류 해결 * test: 공모 작성 API로 MemberArgumentResolver 사용 * feat: 토큰 재발급 API 구현 * test: 토큰 재발급 API 테스트 * test: 토큰 재발급 API 에러 테스트 * feat: MemberArgumentResolver commant에 적용 * feat: MemberArgumentResolver offering에 적용 * feat: MemberArgumentResolver participant에 적용 * refactor: ci값이 일치하지 않을경우 오류메시지 문구 변경 * refactor: 클래스명 일관적으로 변경 * refactor: 직관적인 명명으로 enum 네이밍 변경 * refactor: Custom Exception 적용 * refactor: 컨트롤러 메서드에 접근제어자 명시 * fix: 중복된 enum 값 제거 * test: 바뀐 API 스펙에 맞게 변경 --------- Co-authored-by: fromitive * fix: nicknameWordInitializer 설정 오류 해결 (#182) * fix: keyword null일 때 처리 및 docs에서 required 제거 (#184) * fix: keyword null일 때 처리 * test: optional() 붙여서 required 제거 * chore: 브랜치에 상관없이 pr 머지 시 자동으로 관련 이슈 닫는 스크립트 구현 (#187) * fix: og 이미지 태그 크롤링 문제 해결 (#190) * refactor: 댓글방 상태 도메인 설계 변경 (#189) * feat: 공모 목록 API 응답값에 낱개 가격 추가 (#193) * chore: readtimeout 5초로 수정 (#195) * feat: 댓글방 상태 조회 시 상태별 이미지 함께 반환 (#196) * feat: 토큰 반환 시 cookie가 아닌 body 사용하도록 변경 (#206) * feat: 발급한 토큰을 header가 아닌 body로 반환하도록 수정 * refactor: 사용안하는 클래스와 메서드 제거 * test: 바뀐 API 스펙에 맞게 명세 수정 * feat: 이미지 더미 데이터 수정 및 부정확한 가격 데이터 수정 (#207) * refactor: 공모 글 작성 시 총대 참여자 추가 (#208) * feat: 데이터에서 5자 이상 제거 (#212) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 (#202) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 * refactor: 도메인 명칭 변경 (낱개가격 -> 원가격) * refactor: 도메인 명칭 변경 (공모 -> 댓글방) * refactor: originPrice로 http client 변경 * feat: 토큰 반환 시 body가 아닌 cookie로 반환하도록 원상복구 (#223) * feat: 토큰 재발급 API에서 requestHeader로 refreshToken 받도록 수정 (#227) * feat: 토큰 재발급 API에서 body가 아닌 cookie로 토큰 반환 * feat: 회원가입 API도 body가 아닌 cookie로 토큰 반환 * refactor: service 용 dto 명 컨벤션에 맞춰 수정 * feat: 댓글방 일정 수정 API 구현 (#226) * feat: 댓글방 일정 수정 API 구현 * test: 총대가 아닌 참여자가 공모 일정 정보를 수정할 경우 예외 발생 * feat: 댓글방 상태 조회 시 버튼 텍스트 추가 (#229) * feat: 공모 참여자 목록 조회 API 구현 (#225) * feat: 공모 참여자 목록 조회 API 구현 * test: 실패 테스트 오류 수정 * style: 띄어쓰기 적용 * refactor: MemberEntity를 받도록 변경 * refactor: isParticipant를 구현하여 가독성 개선 * refactor: 총대를 찾을 수 없는 상황의 예외 추가 * refactor: 참여 검증로직을 서비스로 이동 * refactor: 사용하지 않는 메서드 제거 * refactor: 검증 로직 가장 상단에 위치 * refactor: 총대 추출 로직 수정 --------- Co-authored-by: masonkimseoul Co-authored-by: SCY * refactor: 마감임박순 필터링 쿼리 조건 수정 (#239) * refactor: 마감임박순 필터링 조건 수정 * refactor: 더미 데이터 시간 수정 * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 (#247) * feat: 로깅 코드 삽입 (#266) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 * feature: 로깅 샘플 구현 * refactor: 불필요한 코드 제거 * feat: logging 적용 --------- Co-authored-by: fromitive * fix: 마감 임박 필터링 쿼리 수정 (#267) * chore: logback 설정 진행 (#270) * chore: logback 설정 * fix: multipart 요청 필터링 * chore: logback 설정 변경 * chore: pull request ci/cd 닫기 * fix: 이미지 업로드 API의 responseBody가 두 번 뜨는 오류 해결 (#273) * fix: 이미지 업로드 API 두 번 도는 문제 해결 * test: 이미지 업로드 API의 누락된 response field 추가 * feat: pageSize validation 추가 (#279) * feat: pageSize validation 추가 * feat: magic number 추출 * test: 테스트 데이터 수정 (#330) * feat: 공모 참여 취소 기능 구현 (#318) * test: 공모 참여 취소 테스트코드 작성 * feat: 공모 참여 취소 기능 구현 * refactor: 불필요한 쿼리 메서드 제거 * style: 불필요한 개행 제거 * refactor: 모집중인 상태가 아닌 경우 공모 참여를 취소할 수 없도록 변경 * refactor: 공모 참여 취소 응답 상태 코드 변경 * refactor: 에러 메시지 명확한 문구로 변경 * refactor: query parameter를 적용해 어떤 공모의 참여를 취소할 것인지 의도를 명확하게 전달하도록 변경 * refactor: 총대 검증 메서드 네이밍 명확하게 변경 * feat: 댓글방 생성 시점 변경 (#319) * feat: 댓글방 생성 시점 변경 * refactor: 불필요한 도메인 OfferingWithRole 제거 * refactor: 불필요한 도메인 CommentWithRole 제거 * refactor: 댓글의 작성자 확인 메서드 추가 * refactor: 댓글방 목록 조회 dto 생성자 추가 * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 (#322) * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 * refactor: 로그인용 dto 분리 및 공통 dto에 prefix로 auth 추가 * feat: valid 어노테이션 추가 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 (#323) * refactor: 메서드명 구체적으로 변경 * refactor: 변수명 구체적으로 변경 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 * docs: todo 추가 * refactor: 함수명 통일 * feat: 공모자 여부 필드명 변경 * feat: 댓글방 상태 조회 API 확장 (#325) * feat: 댓글방 상태 조회 API 확장 * refactor: 댓글방 관련 로직 댓글 도메인으로 이동 * feat: LoggingFilter에서 던지는 유효하지 않은 요청에 대한 예외 처리 * refactor: 댓글 관련 엔드포인트 수정 * feat: 댓글방 정보 조회 시 조회 권한을 가진 사용자인지 검증 * refactor: 댓글방 상태 확인 로직 도메인으로 이동 * feat: 상태 변경을 시도하는 사용자가 총대인지 검증 * refactor: 댓글 목록 조회 엔드포인트 수정 * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 (#327) * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 * refactor: Response depth 줄이기 및 DTO 생성자 작성 * fix: imminent 필터 버그 해결 (#337) * fix: 커스텀 필터로 인해 h2-console 접속 깨지는 이슈 해결 (#339) * feat: 공모 테이블에 할인율과 상태 필드 추가 (#342) * refactor: Condition과 Status 이름 변경 * refactor: 사용하지 않는 DTO 제거 * feat: OfferingEntity에 칼럼 추가 * feat: 공모 거래 날짜 필드 이름 변경 (#348) * refactor: og 태그 추출 기능 수정 (#349) * refactor: crawler 패키지 이동 * feat: naver api 클라이언트 추가 refactor: 사용하지 않은 기존 og image 크롤러 명칭 변경 * feat: html 크롤링 방식과 naver api 방식을 조합하는 Extractor 구현 * fix: OfferingService ProductImageExtractor 추상화 * refactor: 공모글 목록 조회 필터링 수정 및 추가 (#356) * refactor: 마감임박순 필터링 이름 마감임박만으로 변경 Co-authored-by: fromitive * refactor: 필터링 쿼리 수정 Co-authored-by: fromitive * feat: "참여가능만" 필터링 기능 구현 Co-authored-by: fromitive * feat: "참여가능만" 필터링 기능 연결 Co-authored-by: fromitive * fix: 쿼리 내 불필요한 파라미터 제거 Co-authored-by: fromitive * refactor: 할인율이 null일 경우 높은할인율 필터링 대상에서 제외 Co-authored-by: fromitive * feat: 참여가능만 필터링 전략 클래스 추가 * feat: 공모 목록 조회 API 응답값 변경 * fix: 높은 할인율 단위 변경 및 last-id 필터링 로직 수정 * style: 주석 제거 --------- Co-authored-by: fromitive * refactor: 할인율 계산 로직 수정 (#359) * refactor: 할인율 계산 로직 수정 Co-authored-by: fromitive * refactor: 소수점 둘째 자리에서 반올림하도록 변경 Co-authored-by: fromitive * test: 할인율 계산 로직 * fix: 할인율 단위 백분율로 수정 --------- Co-authored-by: fromitive * feat: 총 모집 인원 수 최댓값 설정 (#361) Co-authored-by: fromitive * feat: 자동 확정 기능을 위해 스케줄러 적용 (#363) * chore: todo 추가 및 메서드명 변경 * feat: Scheduled 어노테이션 추가 및 Scheduler 분리 * test: ServiceTest 환경 구축 * feat: offeringStatus 변경 로직 추가 * refactor: 수동 확정 로직 추가 및 코드 스타일 수정 * refactor: 자동 확정 로직을 조회에서 Scheduled로 이동 * fix: 마감임박 설정 기준 내일로 변경 --------- Co-authored-by: Choo Co-authored-by: SCY * feat: isManualConfirmed 제거 및 도메인 로직 확인 (#377) * refactor: isManualConfirmed 칼럼 삭제 및 관련 로직 분리 * refactor: 더미 데이터 수정 --------- Co-authored-by: fromitive * feat: API 별 권한 확인 로직 추가 (#371) * feat: 권한 확인 로직 추가 * feat: 인증 필터 적용 * refactor: 더미 데이터 칼럼 위치 변경 (#382) * fix: API 문서에 접근할 수 없는 현상 해결 (#384) * fix: API 문서에 접근할 수 없는 현상 해결 * style: 신뢰할 수 있는 URL 개행 수정 * feat: 공모 단건 조회 API 구현 (#388) * feat: 공모 상세 조회 API 엔드포인트 변경 * feat: 공모 단건 조회 API * style: 공모 관련 API 순서 변경 * test: 불필요한 공모글 생성 코드 제거 * test: 공모 단건 조회 서비스 테스트 * chore: JAR 파일에 OAS 파일 누락되는 이슈 해결 및 중복 task 제거 (#391) * chore: 중복되는 task 제거 * chore: cicd 범위 조정 * fix: 참여자 목록 조회 API에서 totalCount 반환하지 않는 이슈 해결 (#400) * fix: /auth/refresh endpoint accessToken 검증 예외 추가 (#407) * refactor: 더미 데이터 정합성 확보 (#406) * refactor: 더미 데이터 정합성 확보 * refactor: 추가된 칼럼 반영 * chore: 환경에 따른 yml 파일 분리 (#411) * chore: 환경 별로 yml 파일 분리 * chore: 불필요한 yml 설정 제거 * feat: 카카오 로그인 중 사용자 정보 확인 로직을 안드로이드에서 백엔드로 이관 (#404) * feat: 카카오 로그인 API 구현 * feat: providerId를 loginId로 수정 * feat: 소셜 로그인 시 랜덤 생성된 비밀번호 사용 * refactor: 불필요한 api 제거 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY * test: 로그인 로직 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY * test: MemberFixture 불필요한 함수 제거 및 통일 Co-authored-by: fromitive Co-authored-by: Dora Choo * refactor: 불필요한 정보 제거 Co-authored-by: fromitive Co-authored-by: Dora Choo * feat: 카카오 로그인 에러 핸들러 추가 Co-authored-by: fromitive Co-authored-by: Dora Choo * feat: 민감 정보 로깅에서 제외 Co-authored-by: fromitive Co-authored-by: Dora Choo --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY Co-authored-by: fromitive * feat: cookie 관련 예외 처리 (#409) * refactor: 더미 데이터 http 추가 (#422) * fix: 더미데이터 정합성 맞추기 (#425) * feat: 로깅 시 UUID가 아닌 회원 번호가 기록되도록 변경 (#428) * feat: logging 시 memberId가 나오도록 기능 추가 * feat: logging 시 memberId 및 identifier가 함께 나오도록 변경 * refactor: lombok getter 적용 * feat: Spring Timezone KST로 설정 (#430) * chore: Dockerfile 타임존 변경 (#432) * fix: Offering 목록 조회 시 NPE 해결 (#434) * refactor: 외래키 필드 notnull 조건 추가 (#445) * chore: prod CI/CD 구축 (#423) * chore: 환경 별로 yml 파일 분리 * chore: 운영 서버 CI/CD 스크립트 작성 * chore: 운영 환경 내 swagger 문서 제거 * chore: 운영 환경 포트포워딩 명령어 제거 * chore: prod ci/cd 스크립트 트리거 추가 * chore: prod ci/cd 스크립트 트리거 변경 * chore: prod ci/cd 스크립트 트리거 path 구체화 * chore: prod ci/cd 스크립트 docker 실행 명령어 오타 수정 * chore: prod ci/cd 스크립트 path 롤백 * chore: dev 및 prod ci/cd 스크립트 data.sql 실행 비활성화 * chore: prod ci/cd 스크립트 path 롤백 * chore: dev script test --------- Co-authored-by: Choo * chore: prod 불필요한 트리거 주석 처리 (#447) * v1.1.0 (#448) * feat: 게시글 상세 화면 구현 (#8) * feat: 게시글 상세 화면 레이아웃 작성 * feat: Data layer코드 작성 * refactor: dto패키지 분리, dto에 serialName추가 * refactor: 도메인 모델 수정 - 가변에서 불변으로 변경 - 사용하지 않는 메서드 제거 * refactor: 공통으로 사용되거나 사용될 수 있는 확장함수를 별도의 파일로 분리 * style: lint 적용 * refactor: 메서드명 컨벤션 적용 * refactor: request Dto에 SerialName적용 * refactor: 메서드명 수정 * feat: 도메인 추가 (#15) * feat: BaseTimeEntity 추가 Co-authored-by: Dora Choo * feat: Member Entity 추가 Co-authored-by: Dora Choo * feat: Offering Entity 추가 Co-authored-by: Dora Choo * feat: OfferingMember Entity 추가 Co-authored-by: Dora Choo * feat: Comment Entity 추가 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * feat: BottomNavigation 구현 (#16) * chore: jetpack navigation 라이브러리 추가 * feat: 필요한 바텀 네비게이션 리소스 추가 * feat: bottom navigation fragment 추가 * feat: bottom navigation graph 구현 * refactor: 컨벤션에 맞게 id 수정 * feat: 공동구매 상세 조회 기능 구현 (#18) * chore: h2 환경설정 추가 * docs: http client 추가 * refactor: entity 접미어 적용 * chore: dummy data 추가 * docs: http client 값 변경 * refactor: repository 와 domain 패키지 분리 * feat: 공동구매 상세 조회 API 구현 * refactor: entity 접미어 적용 * style: 클래스 컨벤션 적용 * chore: h2 console 설정 제거 * refactor: OfferingCondition enum값 결정로직을 enum 안으로 이동 * feat: 홈화면, 마이페이지 화면 레이아웃 작성 (#19) * refactor: FragmentContainer width 속성 수정 * feat: 홈 화면 레이아웃 작성 * feat: 마이페이지 화면 레이아웃 작성 * fix: 플로팅 버튼이 홈에서만 보이도록 수정 * refactor: 리소스 네이밍 컨벤션에 맞게 수정 * feat: API 문서화 적용 (#23) * chore: springdoc-openapi 의존성 추가 Co-authored-by: Dora Choo * chore: springdoc 설정 추가 Co-authored-by: Dora Choo * feat: SwaggerConfig 파일 추가 Co-authored-by: Dora Choo * feat: 공모 상세 조회 API 문서화 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * fix: 공모 상세 조희 API의 price 필드 자료형 변경 및 memberId 필드 추가 (#28) * fix: 상세조회 API 금액 필드 자료형 변경 Co-authored-by: Dora Choo * fix: memberId 추가 * 내가 쓴 글인지 아닌지 확인 위해 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * chore: 백엔드 CI 및 도커 파일 작성 (#27) * chore: actions 적용 브랜치 설정 (#30) * chore: actions 적용 브랜치 설정 * chore: path 및 ref 태그 제거 * chore: working-directory 태그 추가 * chore: Dockerfile jar 경로 수정 * feat: 댓글방 목록 구현 (#26) * feat: 댓글방 목록 UI 구현 * fix: 구분선을 ImageView에서 View로 변경 * feat: 댓글방 목록 도메인 모델 구현 * feat: 댓글방 어답터 구현 * feat: "채팅" string 추가 * refactor: 불필요한 코드 제거 * fix: xmls 중복 속성 제거 * refactor: 댓글방 클래스들을 comment 패키지로 분리 * refactor: 컬러와 폰트 사이즈를 values 파일로 분리 * feat: 공모 목록 조회 기능 구현 (#35) * feat: 공모 목록 조회 API 구현 * docs: 공모 목록 조회 API http client에 추가 * fix: 공모 상세 조회 API의 status 필드를 condition으로 명칭 변경 * feat: 공모 목록 조회 API의 isClosed 필드 이름을 isOpen으로 변경 * feat: 댓글방 디테일 화면 구현 (#32) * feat: font 설정 * feat: vector 이미지 추가 * feat: 채팅 아이템 뷰 구현 * refactor: 컨벤션에 맞게 네이밍 수정 * feat: 댓글 입력 edit text 구현 * chore: 백엔드 CD 스크립트 작성 (#34) * chore: 백엔드 CD 스크립트 작성 * chore: 도커 백그라운드로 실행 * chore: 도커 설정 및 트리거 설정 변경 * chore: 도커 이미지 제거 로직 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 제거 방식 수정 * chore: 도커 이미지 강제 제거하도록 수정 * chore: gradle 캐싱 로직 추가 (#39) * chore: gradle 캐싱 로직 추가 * chore: 이벤트 트리거 조건 수정 * feat: 공모 참여하기 기능 구현 (#40) * fix: BaseTimeEntity 적용 오류 수정 Co-authored-by: Dora Choo * feat: 참여하기 API 구현 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * feat: 공모 상세 조회 API에 참여자 목록 필드 추가 (#42) * feat: 공모 상세 조회 API의 request에 memberId 필드 추가 (#45) * feat: 공모 참여 API의 불필요한 응답값 전부 제거 (#48) * feat: 공모 참여 API의 불필요한 반환값 제거 * chore: 자주 쓰는 h2 console enabled 설정 주석 처리 * feat: 이미 참여한 공모에 참여 못하게 예외 처리 (#51) * feat: 공모 상세 페이지 API 연결 (#46) * build: 불필요한 의존성 제거, properties관련 코드 작성 * refactor: base_url코드상에서 제거 * feat: api수정에 따른 필드 변경 및 네이밍 반영 * refactor: 네이밍 변경 * refactor: OfferingDetail의 변경, mapper변경 * refactor: service분리 * refactor: DataSource, Repository분리 * refactor: API변경에 따른 리팩토링 * feat: 공모 상세 조회 기능 구현 * refactor: 참여하기 api변경에 따른 data, domain 코드 수정 * feat: 공모 상세 페이지 참여하기 기능 구현 * feat: 공모 상세 화면에서 이미지를 불러올 수 없을 시 기본이미지를 보여주는 기능 구현 * feat: 게시물 상세 화면 폰트 적용 * style: lint적용 * refactor: 액티비티 destroy시 binding해제하도록 코드 추가 * refactor: glide옵션 변경 - 에러 발생 시 보여줄 이미지 - url이 null일 시 보여줄 이미지 * refactor: viewModel에 custom getter추가 * fix: 내용이 짧을 시 뒷 배경이 회색으로 보이는 버그 수정 * fix: 참여하기 버튼을 눌렀을 시 텍스트가 바뀌지 않는 버그 수정 * feat: 테스트 데이터 다양화 (#52) Co-authored-by: Dora Choo * refactor: 공모 엔티티에 currentCount 필드 추가 (#55) * feat: 댓글 작성 API 구현 (#57) * feat: 댓글방 내 공모 일정 조회 기능 구현 (#58) * feat: 댓글방 내 공모 일정 조회 기능 구현 Co-authored-by: Dora Choo * refactor: 공모 일정 조회 api 명세 변경 Co-authored-by: Dora Choo --------- Co-authored-by: Dora Choo * refactor: common 패키지명을 global로 변경 (#61) * chore: 안드로이드 CI 파일 작성 (#63) * feat: 댓글 목록 조회 API 구현 (#66) * chore: build CI 작업을 위한 manifest 파일 수정 (#65) * chore: 알람 권한 추가 * chore: local properties 속성 추가 * chore: local properties null 체크 로직 추가 * chore: buildConfigField null 체크 * style: lint 적용 * chore: secret 값 설정 * fix: secret 값 오류 수정 * fix: 문법 오류 수정 * chore: 경로 수정 * chore: 문법 수정 * style: lint 적용 * feat: 댓글방 목록 조회 API 구현 (#70) * feat 댓글방 접히는 공지 뷰 구현 (#72) * chore: manifest에 CommentDetailActivity 추가 * feat: BindingAdatper을 사용하여 접힐 때 애니메이션 적용 및 픽셀 변환 * feat: viewmodel 구현 및 click 마다 접히고 펴지는 로직 구현 * style: ktlint 적용 * refactor: binding adpater을 사용하여 가시성 변경 * refactor: 댓글방 및 댓글 목록 조회 서비스 계층 (#78) * fix: 댓글방 목록 조회 시 가장 최근 댓글 조회 (#80) * feat: 홈화면 API 연결 (#74) * refactor: API변경에 따른 data, domain 코드 변경 * feat: 공모 목록 기능 구현 * refactor: 함수 분리 * style: lint적용 * style: font 적용 * fix: 시간순 정렬 쿼리 추가 (#83) * chore: 더미 데이터 추가 (#87) * feat: 댓글방 목록 API 연결 (#82) * feat: bottom navigation fragment 추가 * feat: vector 이미지 추가 * feat: 댓글방이 없으면 "채팅 목록이 없어요" 라는 텍스트뷰와 이미지뷰를 띄우는 기능 구현 * feat: 댓글방 띄우는 기능 구현 * test: 댓글방 UI 테스트 작성 * refactor: 테스트 클래스명 수정 * refactor: 줄바꿈 수정 * feat: 댓글방 API 서비스 구현 * refactor: API 명세에 따라 도메인 모델 수정 * feat: API 연결 * refactor: API명세에 따라 데이터바인딩 변수명 수정 * feat: 댓글방 목록 API 연결 * refactor: ktlint Format 적용 * refactor: 메모리 누수 방지를 위해 fragment가 destroy 될 때 _binding을 null로 설정 * refactor: 어답터를 방어적복사 하지 않아도 되어서 수정 * refactor: 채팅방이 없다는 이미지뷰를 띄워주는 방식 수정(바인딩 어댑터 수정) * refactor: 함수분리 * refactor: ktFormat 적용 --------- Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> * feat: 댓글방 접히는 공지 API 연결 (#85) * feat: 미팅 일정 API 연결을 위한 data layer 구현 * feat: 미팅 일정 API 연결을 위한 domain layer 구현 * feat: 미팅 일정 API 연결을 위한 presentation layer 구현 * style: ktlint 적용 * feat: 공동 구매 제목 databinding 적용 * refactor: 변수명 수정 * fix: 펼치기 접기 버튼 로직 반대로 수정 * style: ktlint 적용 * chore: 더미 데이터 바로가기 url 수정 (#93) * feat: 공모 상세 페이지 기능 추가 (#94) * chore: 마이페이지 닉네임 임시로 지정 * feat: 바로가기 기능 구현 * feat: 참여버튼 클릭 시 댓글방으로 가도록 기능 구현 * feat: 신고하기 이미지 추가 * style: lint적용 * refactor: 불러오는 공모 페이지 사이즈 변경 * refactor: 댓글 도메인 코드 리팩터링 (#96) * refactor: 로그인 멤버 변수명 변경 * refactor: JPQL 쿼리 컨벤션 및 멤버로 공모 조회 메서드명 변경 * refactor: 최근 댓글 응답 클래스명 변경 * refactor: 컨트롤러 및 서비스 API 순서 변경 * refactor: 로그인 사용자 유효성 검증 * feat: 댓글방 댓글 작성 api 연결 (#95) * chore: windowSoftInputMode 추가 * feat: post comment api service 구현 * feat: post comment DataSource 구현 * feat: post comment Repository 구현 * feat: post comment Presentation 구현 * chore: 더미 데이터 시간 변경 (#100) * feat: 댓글방 입장 기능, 본인이 총대인 방은 다르게 보이는 기능 구현 (#99) * feat: 댓글방의 마지막 댓글 시간을 띄우는 기능 구현 * feat: 자신이 총대인 댓글방을 표시하는 기능 구현 * feat: 댓글방 목록을 클릭해 댓글방 상세로 이동하는 기능 구현 * test: UI테스트 수정 * refactor: 클릭시 id 뿐만 아니라 title도 받아오는 방식으로 수정 * refactor: 오전/오후와 시간을 텍스트뷰에 띄우는 바인딩 어댑터를 DateTimeFormatter의 기능을 사용하는 것으로 수정 * refactor: memberId를 local.properties의 token을 가져다 쓰는 것으로 변경(임시 조치) * refactor: 댓글방 목록의 시간을 띄우는 바인딩 어댑터의 속성명을 수정함 * refactor: 데이터바인딩 variable 변수명을 구체적으로 수정, 일관성을 위해 앞에 `on` 붙임 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정 * refactor: 어댑터가 뷰모델을 갖고 있지 않도록 수정(빠트린것 수정함) * feat: 전반적인 예외 처리 (#103) * feat: 예외 처리 핸들러 추가 * feat: Offering 예외 처리 코드 추가 * feat: Comment 예외 처리 코드 추가 * feat: Member 예외 처리 코드 추가 * feat: OfferingMember 예외 처리 코드 추가 * feat: Offering 예외 처리 상세 코드 추가 * feat: 에러 코드 적용 * feat: 도메인 검증 로직 * feat: DTO 검증 로직 --------- Co-authored-by: masonkimseoul * feat: swagger와 restdocs 연동 (#104) * chore: swagger ui 정적 파일 설치 및 static routing 세팅 * chore: restdocs-api-spec을 이용한 OAS 생성 * chore: swagger ui 정적 파일을 swagger-ui 디렉토리로 이동 * chore: swagger ui 정적 파일 및 static routing 세팅 제거 * chore: 생성된 OAS 파일을 Swagger 디렉터리로 복사하는 스크립트 작성 * chore: openapi3 yaml 파일 gitignore 처리 * chore: static routing 세팅 다시 추가 openapi3.yaml을 사용하기 위함 * test: RestAssured RestDocs 테스트 코드 작성 * test: 공모 목록 조회 API 문서화 * test: 공모 일정 조회 API 및 공모 참여 API 문서화 * test: 댓글 관련 API 문서화 * docs: 논의된 TODO 제거 * refactor: swagger 어노테이션 제거 * chore: 개발 API 서버 목록 설정 --------- Co-authored-by: fromitive * refactor: 에러메시지 필드명 변경 (#108) * fix: restdocs 관련 테스트 실패 이슈 해결 (#106) * chore: cicd 테스트 * chore: 테스트 위해 actions 범위 조정 * chore: 배포 스크립트 띄어쓰기 오타 수정 * chore: 빌드 캐싱 제거 * chore: logging * chore: --warning-mode all 옵션 줘서 gradle 호환 무시하도록 설정 * fix: status 달라서 실패하는 테스트 수정 * chore: actions 범위 수정 * chore: action 범위 수정 * chore: test용 static 파일 추가 * chore: static 하위 폴더를 jar 파일에 포함하도록 설정 * chore: swagger-ui 하위 폴더 제거 * chore: task 순서 조정 * chore: build 스크립트 수정 * chore: 불필요한 설정 변경 제거 * chore: clean build 대신 clean bootJar 사용 * chore: clean, build 각각 하도록 변경 * chore: test 까지 두 번 돌리도록 수정 * chore: openapi3까지 두 번 실행하도록 수정 * chore: copyOasToSwagger 까지 두번 실행하도록 수정 * chore: actions 활성화 범위 수정 * fix: 댓글방 목록 조회 시 참여자 수 조건 추가 (#111) * fix: 댓글방 조회 테스트 수정 (#113) * feat: 홈 화면 무한 스크롤 기능 구현 (#109) * build: pagination라이브러리 추가 * feat: 홈 화면 무한 스크롤 기능 구현 * fix: 마지막 댓글 response를 nullable하게 수정 (#115) * fix: 마지막 댓글 response를 nullable하게 수정 * refactor: ktFormat 적용 * feat: 댓글방 댓글 조회 api 연결 (#116) * feat: dto 및 mapper 구현 * feat: 댓글방 목록 service 구현 * feat: 댓글방 목록 data source 구현 * feat: 댓글방 목록 repository 및 model 구현 * feat: 댓글방 목록 view type을 활용한 recyclerview 구현 및 데이터 바인딩 * feat: polling 기능 구현 * feat: 댓글 스크롤 구현 (새로운 댓글이 생길시 스크롤 아래로) * feat: 총대와 다른 참가자 이미지 리소스 파일 * feat: 댓글방 디테일 공동 구매 상태별 관리 (#117) * feat: 공동구매 상태 관리 리소스 파일 * feat: 공동구매 상태를 관리하는 enum class 구현 * feat: 데이터바인딩을 사용하여 공동 구매 상태 뷰 업데이트 구현 * style: ktlint 적용 * feat: 공동구매 상태 관리 리소스 파일 추가 * fix: 이미지 링크 임시 수정 (#119) * fix: 이미지 링크 수정 (#120) * refactor: 네이밍 수정 (#123) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 (#125) * refactor: 뷰모델 팩토리 방식 변경 (#130) * refactor: 뷰모델 팩토리를 뷰모델의 동반객체로 이동 * style: lint적용 * refactor: Service분리 (#132) * refactor: service분리 * refactor: 패키지명 변경 * style: lint적용 * feat: 공모글 작성 UI 구현 (#134) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 뷰 구현 * fix: 뷰 수정사항 반영 * fix: @+id로 참조하는 부분을 수정 * fix: drawable의 네이밍에 where을 추가 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 (#136) * feat: 참여자 목록 drawer에 필요한 리소스 파일 추가 * refactor: 채팅 text gravity 수정 * feat: 댓글방 참여자 목록 Drawer Layout UI 구현 * style: ktlint 적용 * refactor: drawer early return 하는 방식으로 변경 * refactor: ivMore -> ivMoreOptions으로 네이밍 변경 * feat: 공구 참여자 item view 및 댓글방 view 사용자 친화적으로 수정 * chore: CI 빌드 스크립트 중 중복되는 task 제거해 성능 개선 (#128) * chore: jar태스크 비활성화하고 bootJar 태스크로만 JAR 파일 생성 * chore: cicd 범위 조정 * feat: 공모 작성 API 구현 (#139) * feat: 공모 작성 API 구현 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: create를 save로 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: dto entity 매핑로직을 dto로 이동 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: controller request 매개변수 명 컨벤션 적용 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 공모에 저장하는 주소 값 구체화 (#141) * refactor: 공모에 저장하는 주소 값 구체화 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: github-action 스크립트 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: CI/CD test 설정 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: static/swagger-ui 폴더 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: 설정 원상 복구 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * chore: ci/cd 범위 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 홈화면(공모목록) UI 추가 구현 및 상태 변경 대응 (#142) * feat: 공모의 상태 변경이 반영되도록 기능 구현 * feat: 공모 목록 ui변경 * feat: 필터 ui추가 * feat: API변경에 따른 DTO수정 * style: lint적용 * feat: resource추가 * refactor: ui위치 수정 * chore: 불필요한 괄호 제거 * refactor: item 수직 정렬 * feat: 댓글방 메시지 조회 시 commentId 필드 추가 (#150) Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: OG 태그 크롤링 API 구현 (#148) * feat: OG 태그 크롤링 API 구현 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: OG 태그 크롤링 API 엔드포인트 수정 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 제품 코드와 API 문서 동기화 (#153) * refactor: API 문서 개선 (#157) * refactor: 댓글 작성 시 성공 상태 코드 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * refactor: 요청 필수 상태 설명 추가 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: s3 이미지 업로드 API 구현 (#147) * feat: s3 이미지 업로드 API 구현 * chore: cicd 액션 범위 수정 * fix: 이미지 업로드 경로의 특수문자 제거 * chore: yml multipart 설정 추가 * chore: S3 업로드 결과 테스트 * fix: inputstream 변환로직 위치 이동 * fix: 업로드할 s3 path 올바르게 수정 * fix: 사진 url 속에 버킷이름을 cloudfront 도메인으로 수정 * chore: actions 범위 재조정 * feat: API endpoint 변경 * chore: docker image 지우는 작업을 마지막으로 이동 * chore: 다른 브랜치로 이전 커밋 이동하기 위해 제거 * chore: 충돌 해결 및 코드 스타일 변경 * test: S3 이미지 업로드 성공 케이스 추가 * test: multipart form data 문서화 * test: 공모 상태 enum 문서화 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 파일 업로드 크기 제한 100MB에서 20MB로 변경 --------- Co-authored-by: Choo Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> * feat: 주소검색 기능구현 (#161) * refactor: 네이밍 컨벤션 적용 * build: webview 라이브러리 추가 * feat: 스크립트 실행위한 html파일 추가 * refactor: 인터페이스명 변경에 따른 변경 * feat: 주소검색 다이얼로그 레이아웃 작성 * feat: 주소검색 기능 구현 * style: lint적용 * refactor: 불필요한 코드 제거 * build: Firebase의존성 추가 (#165) * feat: 공모글 작성 API 연결 (#162) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 공모글 작성 API 연결 구현 * feat: 공모글 작성 뷰모델 구현 * fix: edit text 데이터바인딩 추가 * chore: 테스트를 위해 MutableLiveData default값 넣어둠 * chore: deadline defualt값 형식에 맞게 수정 * feat: 글작성 화면을 액티비티에서 프래그먼트로 수정 * chore: 테스트목적이었던 주석과 mutable livedata 디폴트값 제거 * refactor: 임시 함수명 수정 * fix: 글작성 프래그먼트가 올라오기 전에 바텀 네비게이션이 사라지는 문제 수정 * feat: 필수 항목이 모두 입력되어야 버튼이 활성화 되는 기능 구현 * feat: 가격, 총원 입력이 잘못되었을 시 토스트를 띄우는 기능 구현 * fix: 버튼 비활성화 시 텍스트 변경 * feat: 앱 아이콘 변경 * feat: 앱 이름 변경(chongdae -> 총대마켓) * feat: 예상 엔빵 가격을 보여주는 기능 구현 * refactor: 상수화 * refactor: 예상 엔빵 가격에 ,가 들어가는 기능 구현, 콜론 뒤 white space 추가 * feat: 공구 할인율을 계산해 주는 기능 구현 * feat: +, - 버튼으로 총원을 조절하는 기능 구현 * fix: 할인율과 엔빵가격 계산 시 0으로 나눠지는 상황을 제거 * fix: 맞춤법 수정 할인률 -> 할인율 * fix: 총원 버튼 크기가 너무 작아서 확대 * fix: 항목간 간격이 좁아서 확대 * refactor: Offering Write의 API service, DataSource, Repository를 Offerings와 합침 * refactor: 디버깅용 코드 삭제 * refactor: 버튼 활성화/비활성화를 selector와 삼항연산자로 구현 * refactor: 바인딩어댑터 대신 뷰모델이 visibility 상태를 갖고 있는 방식으로 변경 * refactor: 바인딩어댑터 대신 xml에서 처리하는 방식으로 변경 * refactor: 총원 디폴트 라이브데이터값 상수화 * refactor: +, - 텍스트뷰 버튼으로 수정 * refactor: textStyle bold대신 fontFamily suit_bold를 쓰는 것으로 수정 * refactor: 변수명 뒤에 Int를 붙이는 것 대신 Value를 붙이는 것으로 수정 * refactor: 글작성 제출 버튼의 아이디를 추가 * refactor: ktFormat * refactor: 토스트를 띄우는 함수 분리 * refactor: 도메인 객체 분리 * refactor: UI모델 적용 * refactor: ktFormat 적용 * feat: 댓글방 디테일 Room을 사용하여 data 저장 (#166) * feat: local database 구현 * feat: entity 구현 * feat: dao 구현 * feat: LocalDataSourceImpl 구현 * feat: entity mapper 구현 * refactor: CommentResponse 에 id 값 추가 * refactor: datasource 이름 변경 및 패키지 변경 * refactor: article -> offering으로 네이밍 변경 * refactor: repository 패키지 변경에 따른 수정 * refactor: datasource 패키지 변경 및 local 과 remote 분리 * refactor: repository Application 클래스를 통한 주입으로 변경 * style: ktlint 적용 * refactor: api service 리네이밍 * refactor: git conflict 해결 * refactor: 함수 이름 컨벤션에 맞도록 변경 (getMeetings -> fetchMeetings) * chore: CI 스크립트 추가 (#173) * chore: ci 스크립트 추가 * chore: ci 스크립트 수정 * fix: og 태그 추출 시 크롤링 이슈 해결 (#174) * feat: 날짜, 시간 선택 기능 구현, 주소검색 기능 연결 (#171) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 모집마감 시간 클릭 시 date time picker를 띄우는 기능 구현 * feat: 날짜, 시간 선택 기능 구현 * feat: 주소 검색 기능 연결 * refactor: 함수명 수정, 함수분리 * refactor: ktFormat 적용 * refactor: string으로 분리, 상수화 * fix: string 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정 * chore: CI workflow 파일 수정3 * chore: CI workflow 파일 수정4 * feat: 공모가 정상적으로 게시되었을 시 "공모가 게시되었어요!" 라는 토스트를 띄우고 공모글 작성 프래그먼트를 종료하는 기능 구현 * feat: 토스트가 화면 중앙에 뜨는 문제 수정 * refactor: 사용되지 않는 파일 삭제 * refactor: xml 뷰 id 수정 * refactor: 버튼이 TextView인 문제 수정 * refactor: 사용되지 않는 data binding variable 제거 * refactor: 함수명 수정 * refactor: 다이얼로그, dateTimePickerBinding 전역으로 선언 * refactor: dateTimePicker 클릭 이벤트를 추상화 해 xml에서 처리하도록 변경 * refactor: ktFormat * feat: 상품 URL 이미지 추출 API 연결 (#180) * refactor: 사용하지 않는 파일 제거 * refactor: 가시성 변경 * feat: api service 구현 * feat: datasource 구현 * refactor: repository 네이밍 수정 (offeringsRepository -> offeringRepository) * feat: 사진 업로드 관련 리소스 파일 추가 * feat: repository 및 model 구현 * feat: 이미지 링크를 통한 크롤링 이미지 불러오는 api 연결 및 이미지 삭제 로직 구현 * style: ktlint 적용 * refactor: 이미지 prefix 추가 및 에러 메시지 수정 * refactor: build 오류 수정 * fix: git conflict 해결 * feat: 공모 목록 조회 API에 필터링과 검색 기능 추가 (#169) * feat: 공모 필터 목록 조회 API 구현 * test: 공모 필터 목록 조회 API 테스트 * style: 개행 형식 통일 * feat: 공모 필터 목록 조회 API Specification 도입 준비 * fix: url에 큰따움표 제거 * feat: Specification 도입 * refactor: queryString 구체화 * refactor: 함수명 변경 * feat: 최신순 필터링 적용 * feat: 마감임박순 필터링 적용 * feat: 높은할인률순 필터링 적용 * refactor: 전략 패턴 적용해 여러 갈래의 분기문과 중복되는 코드 처리 * test: 변경된 API 스펙에 맞게 문서화 작업 * refactor: 관련있는 메서드들끼리 모이게 순서 재배치 * refactor: 맞춤법 수정 * style: 개행 제거 --------- Co-authored-by: masonkimseoul * feat: 상태 변경 API 구현 (#175) * feat: 댓글방 상태 변경 및 조회 API 구현 Co-authored-by: masonkimseoul * feat: 공모글 상태 조회 API 구현 * feat: 댓글방 상태 변경 중 수동 확정 기능 구현 * refactor: 상태 변경 관련 메서드명 수정 * refactor: 추상 클래스 메서드 컨벤션 통일 * refactor: errorCode 사용 시 클래스 명시 * refactor: 댓글방 상태 관련 API 엔드포인트 수정 및 패키지 변경 * refactor: 댓글방 상태 변경 API HTTP 메서드 수정 * feat: 공모 모집 자동 확정 시 댓글방 상태 변경 --------- Co-authored-by: masonkimseoul Co-authored-by: Choo * feat: 로그인 기능 구현 (#177) * feat: password 일방향 암호화 기능 구현 * feat: cookie 생산-소비 기능 구현 * chore: jwt 관련 의존성 추가 * feat: 토큰 생성 기능 구현 * feat: 로그인 API 구현 * test: 로그인 API 테스트 * feat: 회원가입 API 구현 * test: 회원가입 API 테스트 * feat: 닉네임 생성 기능 구현 * test: 닉네임 생성 기능 테스트 * fix: postconstruct 여러 개라 발생한 에러 해결 * feat: 회원가입 응답값에 랜덤생성한 닉네임 추가 * feat: MemberArgumentResolver 구현 * feat: MemberArgumentResolver 일부 적용 * test: 바뀐 스펙에 맞게 변경 * test: TestConfig 설정해 빈충돌 오류 해결 * test: 공모 작성 API로 MemberArgumentResolver 사용 * feat: 토큰 재발급 API 구현 * test: 토큰 재발급 API 테스트 * test: 토큰 재발급 API 에러 테스트 * feat: MemberArgumentResolver commant에 적용 * feat: MemberArgumentResolver offering에 적용 * feat: MemberArgumentResolver participant에 적용 * refactor: ci값이 일치하지 않을경우 오류메시지 문구 변경 * refactor: 클래스명 일관적으로 변경 * refactor: 직관적인 명명으로 enum 네이밍 변경 * refactor: Custom Exception 적용 * refactor: 컨트롤러 메서드에 접근제어자 명시 * fix: 중복된 enum 값 제거 * test: 바뀐 API 스펙에 맞게 변경 --------- Co-authored-by: fromitive * fix: nicknameWordInitializer 설정 오류 해결 (#182) * fix: keyword null일 때 처리 및 docs에서 required 제거 (#184) * fix: keyword null일 때 처리 * test: optional() 붙여서 required 제거 * chore: 브랜치에 상관없이 pr 머지 시 자동으로 관련 이슈 닫는 스크립트 구현 (#187) * fix: og 이미지 태그 크롤링 문제 해결 (#190) * refactor: 댓글방 상태 도메인 설계 변경 (#189) * feat: 공모 목록 API 응답값에 낱개 가격 추가 (#193) * chore: readtimeout 5초로 수정 (#195) * feat: 댓글방 상태 조회 시 상태별 이미지 함께 반환 (#196) * feat: 공모 목록 조회 API연결 (#201) * refactor: Condition 수정에 따른 변경 * refactor: api변경에 따른 리팩토링 * refactor: api변경에 따른 목록 무한 스크롤 기능 리팩토링 * feat: 검색 기능 구현 * feat: 필터링 기능 구현 - 참여 가능은 서버 에러로 추후 추가 예정 * feat: 아이템을 불러온 후 recyclerview의 최상단으로 이동하는 기능 구현 - 검색, 필터링 수행 후 최상단으로 이동 * feat: 필터링 목록 불러오는 api연결 * feat: 마감임박 상태 추가 * refactor: default parameter제거 * style: lint적용 * feat: 토큰 반환 시 cookie가 아닌 body 사용하도록 변경 (#206) * feat: 발급한 토큰을 header가 아닌 body로 반환하도록 수정 * refactor: 사용안하는 클래스와 메서드 제거 * test: 바뀐 API 스펙에 맞게 명세 수정 * feat: 이미지 더미 데이터 수정 및 부정확한 가격 데이터 수정 (#207) * refactor: 공모 글 작성 시 총대 참여자 추가 (#208) * feat: 바텀 네비게이션 고정 기능 구현 (#211) * feat: 데이터에서 5자 이상 제거 (#212) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 (#202) * feat: n빵 가격이 낱개가격보다 큰경우 예외가 발생하도록 변경 * refactor: 도메인 명칭 변경 (낱개가격 -> 원가격) * refactor: 도메인 명칭 변경 (공모 -> 댓글방) * refactor: originPrice로 http client 변경 * feat: 키보드 이외 영역 터치 시 키보드 내려가도록 구현 (#214) * feat: 키보드외 화면 클릭 시 키보드 내려가도록 구현 * refactor: api변경에 다른 dto수정 * feat: 이미지 업로드 및 권한 설정 (#216) * chore: 이미지 권한 추가 * feat: permission manager을 생성하여 권한 체크 및 request * feat: 이미지 추가 버튼을 클릭할 시 권한 설정 연결 * feat: 이미지 피커를 사용하여 uri 전달 구현 * feat: 이미지 파일 업로드 api service 구현 * feat: 이미지 파일 업로드 data source 구현 * feat: 이미지 파일 업로드 repository 구현 * feat: 이미지 파일 martipart로 변환해주는 기능 구현 * feat: 이미지 업로드 관련 뷰 수정 * feat: 이미지 파일 업로드 및 api 연결 구현 * style: ktlint format * fix: git conflict 해결 * refactor: 이미지 scaleType 변경 * refactor: string value 컨벤션 적용 * feat: 토큰 반환 시 body가 아닌 cookie로 반환하도록 원상복구 (#223) * feat: 토큰 재발급 API에서 requestHeader로 refreshToken 받도록 수정 (#227) * feat: 토큰 재발급 API에서 body가 아닌 cookie로 토큰 반환 * feat: 회원가입 API도 body가 아닌 cookie로 토큰 반환 * refactor: service 용 dto 명 컨벤션에 맞춰 수정 * feat: 댓글방 일정 수정 API 구현 (#226) * feat: 댓글방 일정 수정 API 구현 * test: 총대가 아닌 참여자가 공모 일정 정보를 수정할 경우 예외 발생 * feat: 댓글방 상태 조회 시 버튼 텍스트 추가 (#229) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 (#222) * feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 * refactor: 구현 방식 변경 * style: lint적용 * Feature/217 offering status (#230) * feat: 댓글방 상태 조회 api service 구현 * feat: 댓글방 상태 조회 model 및 dto 구현 * feat: 댓글방 상태 조회 datasource 구현 * feat: 댓글방 상태 조회 repository 구현 * feat: 댓글방 상태 조회 api 연결 구현 * style: ktlint 적용 * feat: 댓글방 상태 변경 (#231) * feat: 댓글방 상태 변경 api service 구현 * feat: 댓글방 상태 변경 data source 구현 * Revert "feat: 댓글방 상태 변경 data source 구현" This reverts commit 052691a8de945c60a60586ee66a05a6a3b264217. * feat: 댓글방 상태 변경 data source 구현 * feat: 댓글방 상태 변경 repository 구현 * feat: 댓글방 상태 변경 api 연결 구현 * style: ktlint 적용 * feature: 카카오 로그인 구현 (#235) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * feat: 공모 참여자 목록 조회 API 구현 (#225) * feat: 공모 참여자 목록 조회 API 구현 * test: 실패 테스트 오류 수정 * style: 띄어쓰기 적용 * refactor: MemberEntity를 받도록 변경 * refactor: isParticipant를 구현하여 가독성 개선 * refactor: 총대를 찾을 수 없는 상황의 예외 추가 * refactor: 참여 검증로직을 서비스로 이동 * refactor: 사용하지 않는 메서드 제거 * refactor: 검증 로직 가장 상단에 위치 * refactor: 총대 추출 로직 수정 --------- Co-authored-by: masonkimseoul Co-authored-by: SCY * refactor: 마감임박순 필터링 쿼리 조건 수정 (#239) * refactor: 마감임박순 필터링 조건 수정 * refactor: 더미 데이터 시간 수정 * fix: 필터링 오류 수정 (#243) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 (#247) * feat: 공동구매 상태 변경 다이얼로그 구현 (#245) * feat: 공동구매 상태 변경 다이얼로그 view 구현 * feat: 공동구매 상태 변경 다이얼로그 Listener 구현 * feat: 공동구매 상태 변경 다이얼로그 연결 및 상태 변경 로직 수정 * test: 테스트 코드 작성을 위한 기본 세팅 (#255) * feat: CoroutinesTestExtension 구현 * feat: Livedata getOrAwaitValue 구현 * feat: InstantTaskExecutorExtension 구현 * feat: TestFixture 생성 * style: ktlint 적용 * feat: 공모글 목록 화면 UI 개선, 공모글 작성에서 낱개 금액이 엔빵 가격보다 저렴할 시 글 작성 막는 기능 구현 (#246) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * feat: 카카오 로그인 기능 초기 설정 * feat: 카카오 로그인 기능 구현 * feat: 카카오 로그인 UI 구현 * feat: 카카오 로그인 구현 * feat: 카카오 로그인 - 회원가입 기능 구현 * feat: 카카오 로그인 버튼 이미지 다운로드 * refactor: 함수명 수정 * refactor: 필요 없는 파일 제거 * refactor: 패키지 이동 * feat: 데이터 스토어에 memberId, nickName 저장하는 기능 구현 * feat: 로그인 post 기능 구현 * feat: 로그인 시도 후 실패할 경우 회원가입 하는 기능 구현 * fix: 바뀐 auth api 적용 * feat: 서기 pr 충돌 해결 * fix: api 필드명 수정 * refactor: ktFormat 적용 * fix: 테스트용 임의 문자열 제거 * feat: CookieJar 구현 * feat: API 수정에 맞춰 서비스 함수 수정 * refactor: 사용되지 않는 코드 제거 * refactor: http 상태 코드 enum 클래스로 묶음 * fix: 구분선을 각각의 아이템의 하단에 넣고 프래그먼트 뷰의 "채팅" 텍스트 밑에 하나 추가 * fix: 텍스트뷰에 font 적용, 마지막 댓글 시간 텍스트를 조금 왼쪽으로 이동 * fix: 낱개 가격 이름을 eachPrice -> originPrice 수정 * fix: 낱개 가격이 엔빵 가격보다 싸면 토스트를 띄우고 글작성을 막는 기능 구현 * fix: 네이티브앱키 로컬프로퍼티로 이동 * refactor: 함수명 변경 * fix: 카카오 계정으로 로그인 후 액티비티 전환하지 않는 문제 수정 * refactor: 사용되지 않는 클래스 삭제 * refactor: 패키지 수정 * refactor: alsong 로그 수정 * refactor: 변수명 수정 * refactor: Manifest의 네이티브앱 키 숨김 * refactor: 로컬프로퍼티의 데이터 형식 수정 * Update android.yml * refactor: alsong 로그 삭제 * ci 빌드 실패가 manifest때문인지 테스트 * refactor: 매니페스트에 앱 키 넣을 수 있게 하는 gradle 설정 수정 * 매니페스트 수정하고 재테스트 * 매니페스트 수정하고 재테스트 * chore: 그래들 수정 * chore: 그래들 수정2 * chore: 그래들 수정3 * chore: 그래들 수정4 * chore: 카카오 계정으로 로그인하는 기능 제외 * feat: 홈화면 테스트 작성 (#257) * chore: mockk의존성 추가 * test: OfferingViewModel 테스트 작성 * style: lint적용 * refactor: stub를 TestFixture로 이동 * test: 댓글방 테스트 코드 작성 (#258) * refactor: 댓글 보내는 함수명 변경 * refactor: 공구 약속 장소 및 시간 캐시 기능 * test: 테스트를 위한 fake repository 구현 * test: 댓글방 viewmodel test 작성 * feat: 댓글방 ActivityTest 작성 * feat: 댓글방 ActivityTest 작성 * style: ktlint 적용 * refactor: test fixture에서 사용하지 않는 것 삭제 * style: ktlint 적용 * feat: GA 모니터링 환경 구축 및 로깅 전략 적용 (#242) * chore: Firebase Crashlytics 의존성 추가 * feat: Firebase 초기화 * feat: FirebaseManager 구현 * feat: 총대가 공구 진행 상황을 다음 단계로 변경했을 때 event 추가 * feat: 로깅 기능 구현 - 검색 - 필터링 - 공모글 클릭 - 공모 참여 * style: lint적용 * feat: 글 작성 완료 시 event 추가 * feat: 로그인 시 event 추가 --------- Co-authored-by: Namyunsuk Co-authored-by: songpink * test: 공모글 작성 이미지 테스트 코드 작성 (#260) * refactor: 상수 가시성 변경 * feat: test fixture 구현 * feat: fake repository 이미지 업로드 기능 추가 * test: OfferingWriteViewModelTest 이미지 업로드 test 코드 작성 * feat: 로그인 후 홈화면으로 이동해도 로그인 화면이 종료되지 않는 문제 수정 (#261) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 로그인 후 LoginActivity가 종료되도록 수정 * feat: 공모 상세 화면 테스트 작성 (#264) * feat: OfferingDetailViewModel 테스트 작성 * refactor: 테스트 수정 * style: lint적용 * style: lint적용 * feat: 로깅 코드 삽입 (#266) * fix: 원 가격이 없는 경우 n빵 가격을 비교하지 않도록 변경 * feature: 로깅 샘플 구현 * refactor: 불필요한 코드 제거 * feat: logging 적용 --------- Co-authored-by: fromitive * fix: 마감 임박 필터링 쿼리 수정 (#267) * chore: logback 설정 진행 (#270) * chore: logback 설정 * fix: multipart 요청 필터링 * chore: logback 설정 변경 * chore: pull request ci/cd 닫기 * fix: 이미지 업로드 API의 responseBody가 두 번 뜨는 오류 해결 (#273) * fix: 이미지 업로드 API 두 번 도는 문제 해결 * test: 이미지 업로드 API의 누락된 response field 추가 * refactor: 홈화면 수정 (#271) * refactor: 할인율 마진 추가 * refactor: 공구상태에 대한 문구 수정 * refactor: 클릭 시 최상단으로 이동하는 버튼 구현 * feat: 공모글 작성 화면 테스트코드 작성 (#274) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: 공모글 작성 테스트 구현 * feat: 댓글방 목록 화면 테스트코드 작성 (#276) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * test: "댓글방 목록을 확인할 수 있어야 한다" 테스트 작성 * feat: pageSize validation 추가 (#279) * feat: pageSize validation 추가 * feat: magic number 추출 * fix: 공모 상세 화면 오류 수정 (#280) * fix: 총대 여부 확인 로직 수정 * fix: 마감 임박 시 보여주는 버튼 수정 * fix: 공모 작성 후 홈화면으로 돌아왔을 떄 목록이 새로고침 되지 않는 오류 수정 * test: 테스트 코드 수정 * style: lint적용 * feat: 댓글방 목록 화면 자동 업데이트 되지 않는 문제 수정, 회원가입 이후 자동으로 로그인되지 않는 문제 수정 (#282) * refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 * fix: 라이플사이클 오너 설정 * fix: 회원가입 후 자동으로 로그인 되도록 수정 * chore: change version name (#291) * feat: 카카오 계정 로그인 기능 구현 시 CI가 실패하는 문제 해결 (#296) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * feat: 로그인 화면 리팩토링 (#298) * fix: ci가 실패하는 문제 수정(오타수정..) * fix: 카카오 계정 로그인 기능 추가 * refactor: SimpleCookieJar의 패키지 변경(presentation 레이어에서 data레이어의 source 패키지로 이동) * refactor: data store를 관리하는 클래스를 생성하고 이 클래스를 사용하도록 변경 * refactor: 사용하지 않는 의존성과 주석 제거 * refactor: http status code 추가 * refactor: 함수분리 * refactor: ktFormat 적용 * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentRooms) * feat: 액세스 토큰 만료 시 토큰 재발급 기능 구현(CommentDetail), 사용되지 않게 된 memberId 제거 * refactor: ktFormat 적용 * test: 테스트코드 수정 * refactor: Preferences -> DataStore 이름 변경 * refactor: 채팅방 UI UX 개선 (#303) * feat: 키보드가 아닌 다른 영역을 클릭하면 키보드 내리는 기능 구현 * feat: 뒤로가는 버튼 기능 추가 * feat: 댓글 입력 maxLines 설정 및 maxLength 설정 * style: ktlint 적용 * 필요 없는 코드 제거 * feat: 댓글방 목록에서 자신이 총대인 댓글방의 UI 개선 (#304) * refactor: 댓글방의 자신이 총대인 댓글방 ui 개선 * fix: Binding 클래스 네이밍 수정 * feat: 가로모드, 다크모드 설정 (#305) * refactor: api변경에 따른 리팩토링 (#310) * feat: 로그인 화면 해상도 대응 (#313) * feat: 이미지 업로드 중일 때 로딩 상태 설정 (#317) * feat: 공모 글 작성 ui state 구현 * feat: 로딩 progressbar 생성 * feat: UI 상태에 따른 토스트 메시지 처리 * refactor: 잘못된 입력에 대한 에러 처리 변경 * refactor: 홈화면 리팩토링 (#324) * refactor: textSize dp로 변경 * refactor: 검색 버튼 크기 변경 - 검색 버튼 패딩 추가 - 검색창 끝에 패딩 추가 * refactor: 엔터키를 통해 검색하도록 수정 * refactor: 필터 단일 선택되도록 수정 * style: lint적용 * feat: 댓글방 새로운 기능 GA 연결 (#328) * feat: 댓글방 참여자 확인 Event 구현 * feat: 댓글방 상태 변경 다이얼로그 취소 Event * feat: 참여자가 공구에서 참여 포기 Event 구현 * style: ktlint 적용 * test: 테스트 데이터 수정 (#330) * feat: Fragment GA 모니터링 수집 (#332) * feat: fragment logScreenView 추적 함수 구현 * feat: 각 fragment에서 화면 감지 GA 설정 * feat: 마이페이지 기본 세팅 및 뷰 변경 (#335) * feat: 공모 참여 취소 기능 구현 (#318) * test: 공모 참여 취소 테스트코드 작성 * feat: 공모 참여 취소 기능 구현 * refactor: 불필요한 쿼리 메서드 제거 * style: 불필요한 개행 제거 * refactor: 모집중인 상태가 아닌 경우 공모 참여를 취소할 수 없도록 변경 * refactor: 공모 참여 취소 응답 상태 코드 변경 * refactor: 에러 메시지 명확한 문구로 변경 * refactor: query parameter를 적용해 어떤 공모의 참여를 취소할 것인지 의도를 명확하게 전달하도록 변경 * refactor: 총대 검증 메서드 네이밍 명확하게 변경 * feat: 댓글방 생성 시점 변경 (#319) * feat: 댓글방 생성 시점 변경 * refactor: 불필요한 도메인 OfferingWithRole 제거 * refactor: 불필요한 도메인 CommentWithRole 제거 * refactor: 댓글의 작성자 확인 메서드 추가 * refactor: 댓글방 목록 조회 dto 생성자 추가 * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 (#322) * feat: 로그인 API 응답에 memberId와 nickname 필드 추가 * refactor: 로그인용 dto 분리 및 공통 dto에 prefix로 auth 추가 * feat: valid 어노테이션 추가 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 (#323) * refactor: 메서드명 구체적으로 변경 * refactor: 변수명 구체적으로 변경 * feat: 공모 상세 조회 API 응답에 총대여부 알려주는 boolean 필드 추가 * docs: todo 추가 * refactor: 함수명 통일 * feat: 공모자 여부 필드명 변경 * feat: 댓글방 상태 조회 API 확장 (#325) * feat: 댓글방 상태 조회 API 확장 * refactor: 댓글방 관련 로직 댓글 도메인으로 이동 * feat: LoggingFilter에서 던지는 유효하지 않은 요청에 대한 예외 처리 * refactor: 댓글 관련 엔드포인트 수정 * feat: 댓글방 정보 조회 시 조회 권한을 가진 사용자인지 검증 * refactor: 댓글방 상태 확인 로직 도메인으로 이동 * feat: 상태 변경을 시도하는 사용자가 총대인지 검증 * refactor: 댓글 목록 조회 엔드포인트 수정 * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 (#327) * feat: ParticipantResponse에 참여 인원 현황, 예상 정산 가격 추가 * refactor: Response depth 줄이기 및 DTO 생성자 작성 * fix: imminent 필터 버그 해결 (#337) * fix: 커스텀 필터로 인해 h2-console 접속 깨지는 이슈 해결 (#339) * feat: 마이페이지 기능 구현 (#341) * feat: 마이페이지 닉네임 기능 구현 * feat: 로그아웃 로직 구현 * feat: url 연결 로직 구현 * feat: 필요없는 기능 삭제 * style: ktlint 적용 * feat: 공모 테이블에 할인율과 상태 필드 추가 (#342) * refactor: Condition과 Status 이름 변경 * refactor: 사용하지 않는 DTO 제거 * feat: OfferingEntity에 칼럼 추가 * feat: 공모 거래 날짜 필드 이름 변경 (#348) * fix: 상세화면에서 홈화면으로 갔을 때 상태 변경 안되는 오류 수정 (#343) * refactor: 공모상세페이지 Activity -> Fragment로 리팩토링 * fix: 페이지네이션 및 상태변경 미적용 오류 해결 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 주석 제거 및 상수화 * refactor: livedata 자료형 변경 * refactor: progressbar위치 수정 * refactor: lifecycleScope사용 리팩토링 * refactor: adapter에서 전체 아이템이 아닌 특정 아이템만 notify하도록 리팩토링 * refactor: API변경에 따른 대응 (#352) * refactor: api대응 * refactor: api변경에 따른 테스트 수정 * feat: 공모글 작성 화면 ux 개선 (#344) * fix: 각 항목의 설명을 place holder로 이동 * fix: 필수와 선택 항목의 프래그먼트 분리 * feat: 버튼이 항상 보이도록 수정 * fix: 가격과 총원은 숫자만 입력받도록 변경 * fix: 패딩 수정 * fix: ui 수정 * fix: 도메인 변경에 따른 deadline -> tradeDate 수정 * feat: 필수 항목을 모두 입력하면 선택 항목 화면으로 이동하는 기능 구현 * refactor: ktFormat 적용 * refactor: shared viewModel 사용, 미필수 항목을 미필수 입력 화면으로 이동 * refactor: 프래그먼트 이름 변경 * feat: 입력 숫자의 글자수와 라인수 제한 기능 구현 * fix: 총원이 -1이하로 떨어지는 버그 수정, 공동구매 텍스트 띄어쓰기 제거 * fix: 할인율, 엔빵 금액이 유효하지 않을 때는 "-"로 뜨도록 변경 * fix: 공모를 게시하면 필수, 선택 화면 모두 종료되도록 수정 * fix: 날짜 시간 픽커를 날짜만 선택하는 픽커로 변경 * refactor: ktFormat 적용 * refactor: 바인딩어댑터의 파라미터를 nullable하게 수정 * test: 테스트코드 수정 * feat: 낱개 가격의 place holder로 현재 엔빵 금액을 보여주는 기능 구현 * feat: 내용의 최대 글자수와 현재 글자수를 보여주는 기능 구현 * refactor: ktFormat 적용 * refactor: 공모글 작성시 memberId를 보내지 않도록 변경 * fix: 총원 최대 4자리에서 3자리까지만 입력받을 수 있도록 변경 * fix: deadline -> meetingDate 네이밍 수정 * fix: 공모글 작성 후 작성 화면의 입력값이 초기화되지 않는 버그 수정 * refactor: 네이밍 수정(eachPrice -> originPrice) * refactor: 네이밍 수정(individualPrice -> originPrice) * fix: 내용의 현재 글자수 색이 메인컬러가 되지 않는 문제 수정 * refactor: 프래그먼트 종료될 때 바인딩 해제하도록 수정 * refactor: id가 없는 뷰의 id 추가 * refactor: 함수 분리 * fix: 내용 옆의 * 제거 * fix: GA 이벤트 이름 변경(공모글 작성 - 필수 화면에서의 이벤트임을 명시함) * refactor: og 태그 추출 기능 수정 (#349) * refactor: crawler 패키지 이동 * feat: naver api 클라이언트 추가 refactor: 사용하지 않은 기존 og image 크롤러 명칭 변경 * feat: html 크롤링 방식과 naver api 방식을 조합하는 Extractor 구현 * fix: OfferingService ProductImageExtractor 추상화 * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 (#358) * feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 * test: 테스트코드 수정 * refactor: 공모글 목록 조회 필터링 수정 및 추가 (#356) * refactor: 마감임박순 필터링 이름 마감임박만으로 변경 Co-authored-by: fromitive * refactor: 필터링 쿼리 수정 Co-authored-by: fromitive * feat: "참여가능만" 필터링 기능 구현 Co-authored-by: fromitive * feat: "참여가능만" 필터링 기능 연결 Co-authored-by: fromitive * fix: 쿼리 내 불필요한 파라미터 제거 Co-authored-by: fromitive * refactor: 할인율이 null일 경우 높은할인율 필터링 대상에서 제외 Co-authored-by: fromitive * feat: 참여가능만 필터링 전략 클래스 추가 * feat: 공모 목록 조회 API 응답값 변경 * fix: 높은 할인율 단위 변경 및 last-id 필터링 로직 수정 * style: 주석 제거 --------- Co-authored-by: fromitive * refactor: 할인율 계산 로직 수정 (#359) * refactor: 할인율 계산 로직 수정 Co-authored-by: fromitive * refactor: 소수점 둘째 자리에서 반올림하도록 변경 Co-authored-by: fromitive * test: 할인율 계산 로직 * fix: 할인율 단위 백분율로 수정 --------- Co-authored-by: fromitive * feat: 총 모집 인원 수 최댓값 설정 (#361) Co-authored-by: fromitive * fix: 필터 오류 수정 (#362) * fix: 필터 오류 수정 - '참여가능만'필터 분기처리 제거 * chore: 주석 제거 * feat: API 스펙 변경에 따른 대응 (#364) * feat: 댓글 목록 조회 api 스펙 변경에 따른 대응 * feat: 댓글방 정보 조회 api 스펙 변경에 따른 대응 * feat: 공모 일정 조회 api 스펙 변경에 따른 대응 * feat: 댓글 상태 변경 api 스펙 변경에 따른 대응 * test: api 스펙 변경에 따른 test 코드 변경 * style: ktlint 적용 * feat: remote dto package 분리 * feat: 자동 확정 기능을 위해 스케줄러 적용 (#363) * chore: todo 추가 및 메서드명 변경 * feat: Scheduled 어노테이션 추가 및 Scheduler 분리 * test: ServiceTest 환경 구축 * feat: offeringStatus 변경 로직 추가 * refactor: 수동 확정 로직 추가 및 코드 스타일 수정 * refactor: 자동 확정 로직을 조회에서 Scheduled로 이동 * fix: 마감임박 설정 기준 내일로 변경 --------- Co-authored-by: Choo Co-authored-by: SCY * fix: 공모 작성 후 홈화면 돌아올 때 새로 작성한 글이 보이지 않는 오류 수정 (#369) * feat: Access Token, Refresh Token을 data store에 저장하는 기능 구현 (#372) * feat: 앱 재시작 시 토큰을 데이터스토어에서 꺼내 사용하는 기능 구현 * feat: 로그인이 이미 되어있다면 로그인 화면을 건너뛰는 기능 구현 * feat: 로그아웃 기능 구현 * fix: 마이페이지 화면으로 넘어가면 바텀네비게이션이 사라지는 버그 수정 * fix: 데이터스토어에서 토큰이 꺼내지지 않는 버그 수정 data store에서 토큰을 꺼내는 코루틴 비동기 작업이 끝나기 전에 함수를 종료해 버려서 생기는 버그였습니다. * refactor: ktFormat 적용 * refactor: startActivity 함수를 LoginActivity가 동반객체로 갖고 있도록 변경 * refactor: 함수명과 event명 변경 추가로 GA위치가 조금 잘못된 점이 있어서 수정했습니다. * feat: 공모 상세 화면 추가 기능 반영 (#375) * feat: 신고하기 기능 구현 * feat: 물품 링크가 없으면 보여지지 않도록 구현 * refactor: 마감 시간에서 거래 날짜로 리팩토링 * feat: 이미 참여한 공모게시글에서 채팅방으로 이동하는 기능 구현 * fix: 댓글방 목록의 마지막 댓글방이 보이지 않는 문제 수정 (#376) * fix: 리사이클러뷰 레이아웃의 크기가 화면 밖에 벗어나지 않도록 수정 * fix: 리사이클러뷰 레이아웃의 맨 밑에 구분선 하나 추가 아래로 땡겼을 때 구분선이 사라져버리는게 보기 안좋아서 추가했습니다 * refactor: 코트 포맷 적용 (컨트롤 알트 L) * feat: isManualConfirmed 제거 및 도메인 로직 확인 (#377) * refactor: isManualConfirmed 칼럼 삭제 및 관련 로직 분리 * refactor: 더미 데이터 수정 --------- Co-authored-by: fromitive * feat: API 별 권한 확인 로직 추가 (#371) * feat: 권한 확인 로직 추가 * feat: 인증 필터 적용 * refactor: 더미 데이터 칼럼 위치 변경 (#382) * refactor: 홈화면 api필드 추가에 따른 대응 (#381) * refactor: dto필드 추가 * fix: 상태 변경 오류 해결 * fix: 필터 선택 또는 검색상태일 때 공모 작성 후 나오면 목록 안보이는 오류 수정 * refactor: 세부 주소 api에서 받아오도록 변경 * style: lint적용 * fix: API 문서에 접근할 수 없는 현상 해결 (#384) * fix: API 문서에 접근할 수 없는 현상 해결 * style: 신뢰할 수 있는 URL 개행 수정 * feat: 공모 목록에서 동을 보여주는 기능 구현 (#386) * feat: 공모 단건 조회 API 구현 (#388) * feat: 공모 상세 조회 API 엔드포인트 변경 * feat: 공모 단건 조회 API * style: 공모 관련 API 순서 변경 * test: 불필요한 공모글 생성 코드 제거 * test: 공모 단건 조회 서비스 테스트 * refactor: 상태변경 리팩토링 (#389) * refactor: 공모 상세 조회 api변경 대응 * refactor: 공모 상태 변경 리팩토링 * refactor: 리팩토링에 따른 테스트 수정 * chore: 불필요한 로그 제거 * fix: 댓글 입력 후 뒤로가기 시 최근 댓글이 반영되도록 수정 (#397) * chore: JAR 파일에 OAS 파일 누락되는 이슈 해결 및 중복 task 제거 (#391) * chore: 중복되는 task 제거 * chore: cicd 범위 조정 * fix: 참여자 목록 조회 API에서 totalCount 반환하지 않는 이슈 해결 (#400) * feat: 댓글방 참여자 확인 API 연결 (#401) * feat: 참가자 정보를 가져오는 api service 구현 * refactor: 필요없는 코드 삭제 * feat: 참여 관리 datasource 구현 * feat: 참여자 domain 모델 구현 * feat: 참여를 관리하는 repository 구현 * feat: 참여자 목록을 보여주는 recycler view 연결 및 구현 * refactor: 더보기 버튼 수정 * feat: 필요없는 리소스 파일 삭제 및 상태 기본 이미지 변경 * refactor: 약속 장소 및 시간 ui model 을 사용하여 관리 * refactor: 댓글방의 정보를 불러오는 로직 ui model을 사용하여 관리 * refactor: ui model 변환 로직 변경 * feat: 공동구매 참여 인원 확인 기능 구현 * feat: 신고하기 폼 연결 구현 * test: 코드 변경에 따른 테스트 코드 수정 * style: ktlint 적용 * refactor: xml id 추가 * feat: 댓글방 공동구매 나가기 API 연결 (#402) * feat: 공동구매 나가기 기능 api service 구현 * feat: 공동구매 나가기 기능 data source 구현 * feat: 공동구매 나가기 기능 repository 구현 * feat: 공동구매 나가기 기능 연결 * style:ktlint 적용 * fix: /auth/refresh endpoint accessToken 검증 예외 추가 (#407) * refactor: 더미 데이터 정합성 확보 (#406) * refactor: 더미 데이터 정합성 확보 * refactor: 추가된 칼럼 반영 * feat: CallApiHandler 구현 (#403) * feat: CallApiHandler 구현 * refactor: CommentRoomsDataSource 수정 * feat: CommentRemoteDataSourceImpl 에러핸들링을 통해 수정 * feat: 에러 핸들링에 따른 DataSource 리팩토링 - OfferingDetailDataSource - OfferingRemoteDataSource * feat: ParticipantRemoteDataSourceImpl 에러핸들링을 통해 수정 * style: ktlint 적용 * refactor: AuthRemoteDataSource 수정 * feat: Result의 map 과 getOrThrow 함수 생성 * feat: 에러 핸들링에 따른 Repository 리팩토링 - OfferingDetailRepository - OfferingRepository * refactor: Result 변경에 따른 레포지토리 수정 (AuthRepository, CommentRoomsRepository) * feat: 에러 핸들링에 따른 CommentDetailRepository 리팩토링 * feat: 에러 핸들링에 따른 ParticipantRepository 리팩토링 * feat: 에러 핸들링에 따른 viewmodel 리팩토링 - OfferingViewModel - OfferingDetailViewModel * refactor: 에러 핸들링에 따른 LoginViewModel 리팩토링 * refactor: 에러 핸들링에 따른 CommentRoomsViewModel 리팩토링 * refactor: 토큰 리프레쉬 후 다시 함수 호출하도록 추가 * feat: 에러 핸들링에 따른 CommentDetailViewModel 리팩토링 * refactor: 에러 핸들링에 따른 OfferingWriteViewModel 리팩토링 * refactor: 공모 목록 토큰 리프래시 적용 * fix: 잘못된 코드 수정 * refactor: 필요없는 주석 제거 * refactor: 공모 목록 리팩토링 * fix: 리빌드시 쿠키가 제대로 저장되지 않는 현상 수정 * refactor: 필요없는 코드 삭제 및 상수화 추가 * test: 에러핸들링에 따른 FakeAuthRepository, OfferingWriteViewModelTest 수정 * refactor: ktFormat 적용 * test: 코드 변경에 따른 Fake Repository 변경 * test: CommentDetailViewModelTest 코드 수정 * style: ktlint 적용 * refactor: 가독성 개선(에러 로그 함수명 추가, Success가 Error보다 위에 나오도록 수정) * refactor: 불필요한 로그 제거 * refactor: 리팩토링에 따른 테스트 수정 * refactor: 람다 넘겨주는 방식 수정 * style: lint 적용 * test: 테스트코드 수정 --------- Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> Co-authored-by: Namyunsuk * feat: proguard를 사용한 난독화 적용 (#413) * chore: 환경에 따른 yml 파일 분리 (#411) * chore: 환경 별로 yml 파일 분리 * chore: 불필요한 yml 설정 제거 * fix: 공구 상세 페이지 오류 해결 (#417) * fix: 바로가기 클릭되지 않는 오류 수정 * refactor: 주소 표시할 때 최대 2줄까지 그리고 넘어갈 시 말줄임 나오도록 수정 * refactor: 공모 목록, 공모 상세 에러 핸들링 (#418) * refactor: 공모 목록에서 401에러를 제외하고는 에러코드 올 시 빈화면 보여주도록 에러핸들링 수정 * refactor: 필터및 업데이트된 공모 목록 가져오는 로직 에러핸들링 수정 - 400: 토스트 메시지 띄어줌 - 401: refresh - 그외에는 로그로 에러 코드를 보여줌 * refactor: strings네이밍 통일 * refactor: 공모 상세 에러 핸들링 수정 * refactor: strings정리 - offering_detail부분 정리 * feat: 카카오 로그인 중 사용자 정보 확인 로직을 안드로이드에서 백엔드로 이관 (#404) * feat: 카카오 로그인 API 구현 * feat: providerId를 loginId로 수정 * feat: 소셜 로그인 시 랜덤 생성된 비밀번호 사용 * refactor: 불필요한 api 제거 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY * test: 로그인 로직 변경 Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY * test: MemberFixture 불필요한 함수 제거 및 통일 Co-authored-by: fromitive Co-authored-by: Dora Choo * refactor: 불필요한 정보 제거 Co-authored-by: fromitive Co-authored-by: Dora Choo * feat: 카카오 로그인 에러 핸들러 추가 Co-authored-by: fromitive Co-authored-by: Dora Choo * feat: 민감 정보 로깅에서 제외 Co-authored-by: fromitive Co-authored-by: Dora Choo --------- Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: SCY Co-authored-by: fromitive * feat: cookie 관련 예외 처리 (#409) * refactor: 더미 데이터 http 추가 (#422) * fix: 더미데이터 정합성 맞추기 (#425) * feat: 로그인 api 변경 반영 (#426) * feat: 카카오 로그인 후 총대마켓 서버로 email을 보내던 방식에서 카카오 access token을 보내는 방식으로 변경 * feat: login과 signup을 하나로 api로 통합된 것 반영 * refactor: ktFormat 적용 * refactor: 테스트코드 수정 * feat: 로깅 시 UUID가 아닌 회원 번호가 기록되도록 변경 (#428) * feat: logging 시 memberId가 나오도록 기능 추가 * feat: logging 시 memberId 및 identifier가 함께 나오도록 변경 * refactor: lombok getter 적용 * feat: Spring Timezone KST로 설정 (#430) * chore: Dockerfile 타임존 변경 (#432) * fix: Offering 목록 조회 시 NPE 해결 (#434) * refactor: 에러… * feat: OfferingEntity Soft Delete 적용 (#483) * feat: 거래 날짜 검증 로직 추가 (#471) * feat: 거래 날짜 검증 로직 추가 * refactor: 검증 로직을 서비스로 이동 * test: 공모 목록 조회 시 soft delete 결과 적용되었는지 확인하는 테스트 추가 (#487) * test: 공모 목록 조회 시 soft delete 결과 적용되었는지 확인하는 테스트 추가 * test: given 주석 누락 수정 * test: 모호한 테스트명 수정 * feat: 공모 수정 API 구현 (#485) * test: 공모 수정 API 문서화 * feat: 총대가 아닌 사용자가 공모를 수정할 때 예외 발생 기능 구현 * feat: 참여 인원수 이하로 총인원을 수정할 수 없는 기능 구현 * feat: 모집날짜가 다음날 이전으로 수정할 수 없는 기능 구현 * feat: 공모 수정 시 n빵 가격보다 작을 경우 수정할 수 없는 기능 구현 * feat: 공모 수정 변경 감지를 위해 트렌젝션 적용 * style: posix 컨벤션 적용 * fix: 테스트 검증 필드 수정 * refactor: 공모 수정 modify -> update로 변경 * style: 불필요한 개행 제거 * refactor: offeringUpdateRequest 의존 제거 todo: Null을 어떤 값으로 채울지 고민하기. null을 허용하는게 옳은가? * fix: 참여 인원이 만석일 때 수정하지 못하는 버그 해결 * refector: 검증 로직 네이밍을 어떤 값을 검증하는지 구체화 하도록 변경 * refector: 검증 로직의 매개변수를 검증하는 대상을 알 수 있도록 구체화 * feat: 수정 성공 시 수정 된 내용을 반환하는 기능 구현 * feat: createMembers 기능 구현 * refector: UpdatedOffering을 추가하여 도메인에서 검증하도록 변경 * feat: 공모 삭제 API 구현 (#489) * feat: 공모 삭제 API 구현 * feat: 거래 진행 중 삭제 시도 시 예외 발생 * test: 거래 완료 시 공모 삭제 가능한 경우 * refactor: 인원 확정 상태 여부 확인 메서드명 변경 * test: 참여자가 삭제를 시도할 경우 실패 * test: 서비스 테스트 Nested 구조 적용 * feat: Spring Actuator로 health check api 생성 (#493) * chore: prod-a, prod-b에 어플리케이션을 배포하도록 변경 (#496) * chore: main branch ci/cd 설정 변경 * chore: 로드 벨런스 대상 포트 변경 * chore: ci/cd deploy 설명 변경 * chore: 포트 번호 변경 * chore: PR 테스트 설정 제거 * chore: 80 포트로 변경 * chore: PR 트리거 제거 * chore: dockerfile 트리거 등록 * feat: 멀티 모듈화를 위한 패키지 분리 (#491) * feat: local 과 remote mapper 분리 * fix: 잘못 import된 코드 수정 * feat: local 및 remote 패키지 분리 * fix: 잘못된 import코드 수정 * feat: common 패키지 생성 및 변경 * feat: auth 패키지 분리 * style: ktlint 적용 * feat: remote 와 local 패키지 data로 이동 * style: ktlint 적용 * feat: error handler 관련 로직 common으로 이동 * refactor: 잘못된 의존성 관계 변경 * feat: DataStore을 common 패키지로 변경 * feat: build.gradle 중복 로직 수정 및 version catalog를 통한 관리 * fix: build 오류 수정 --------- Co-authored-by: Namyunsuk * refactor: 의존성 주입 라이브러리(Hilt) 적용 (#500) * feat: Hilt 의존성 추가 * feat: Auth, CommentRooms Hilt 적용 * feat: Data Store Hilt 적용 * style: ktFormat 적용 * feat: OfferingWrite Hilt 적용 * feat: CommentDetail Hilt 적용 * feat: Participant Hilt 적용 * feat: Assisted Inject 구현 * feat: OfferingDetail Hilt 적용 * feat: ktFormat 적용 * chore: gradle에서 hilt 버전 수정 * refactor: 불필요한 코드 제거 * chore: 중복된 의존성 제거 및 정리 * feat: (빠트린것) MyPageViewModel에 Hilt 적용 * feat: (빠트린것) OfferingDao에도 Hilt 적용 * refactor: 뷰모델 팩토리 제공 함수들 제거 * feat: 채팅방 조회 시 soft delete 된 공모 별도 처리 (#502) * feat: 채팅방 상세 조회 시 isDeleted 필드 추가 * feat: 채팅방 목록 조회 시 삭제된 공모 별도 처리 * feat: Comment-Offering 사이에도 FetchType.LAZY 적용 * refactor: 불필요한 nativeQuery 사용 제거 * refactor: 직접적인 필드 아닌 도메인은 서비스에서 넘겨주도록 수정 * refactor: 불필요한 기존 로직 제거 * docs: httpClient에 추가된 api 반영 * chore: local 환경에서 h2 console 활성화 * feat: isDeleted 필드 제거 * feat: AOP 적용해 읽기/쓰기 DB로 요청 분산 (#503) * chore: 커스텀하게 만든 datasource 사용해 db 연결 * feat: transactional readonly 값에 따라 datasource 변경 * feat: transactional을 writerDatabase 어노테이션으로 대체 * feat: DataSource 관련 동작 prod 프로필로 제한 * feat: WriterDatabase 어노테이션 적용 * feat: writerDatasource 사용 후 readerDatasource로 변경 * feat: writer db와 user db의 권한 분리 * chore: 배포 테스트 * chore: 직렬로 deploy * chore: cicd 범위 원래대로 수정 * chore: osiv 꺼서 인증필터가 사용한 datasource의 영향 제거 * chore: 바뀐 properties 반영 * chore: prod 배포 * chore: cicd 범위 원복 * chore: health-check 요청으로 불필요하게 찍히는 로그 제거 * chore: prod 배포 * chore: cicd 범위 원복 * chore: log 레벨 info에서 debug로 변경 * chore: prod 배포 * chore: cicd 범위 원복 * chore: db 스키마에 대한 validate 검사 * refactor: 불필요한 어노테이션 제거 * refactor: 메서드 순서 사용 순대로 변경 * refactor: OfferingRepository 쿼리 최적화 (#506) * test: osiv 끄면서 깨지는 테스트 수정 (#521) * test: 지연로딩 동작하도록 트랜잭션 어노테이션 추가 * test: 삭제된 필드 restdocs에도 반영 * feat: 읽기 전용 공모 API 구현 (#514) * feat: 공모 상세 정보 조회 시 원가격 정보도 포함 (#517) * feat: 공모 상세 정보 조회 시 원가격 정보도 포함하도록 변경 * style: 개행 제거 * refactor: 필수로 들어있는 필드 설명을 명시 * refactor: 닉네임 생성 명사 파일 변경 (#518) * refactor: 닉네임 생성 명사 파일 변경 * refactor: 닉네임 사용 단어 수정 * test: 닉네임 생성 파일 변경 후 테스트 수정 (#524) * fix: read-only API가 문서화 되지 않은 오류 수정 (#526) * test: 읽기 전용 API 분리 및 문서화 적용 * refactor: test에서 사용하지 않은 필드를 setUp으로 이동 * feat: 총대마켓 읽기 전용 web 페이지 구축 (#528) * test: 읽기 전용 API 분리 및 문서화 적용 * refactor: test에서 사용하지 않은 필드를 setUp으로 이동 * feat: 총대마켓 상세 페이지 기능 구현 * feat: og image url 변경 * refactor: 공'고' -> '모' 로 수정 * feat: 공모 목록 웹페이지 구현 * refactor: 공모 마감 문구 변경 * fix: 필터 변경시 검색어가 초기화 되는 문제 해결 * style: 주석 제거 * feat: 검색 및 필터창 고정하도록 변경 * feat: 타이틀 감성 한 스푼 * feat: 목록 스크롤 시 어색해 보이는 부분 개선 * feat: Offering 쿼리에 Native Query 적용(+ 테스트 코드 수정) (#556) * feat: Soft Delete된 데이터도 검증에 활용할 수 있는 쿼리 구현 * test: 하드 코딩된 날짜로 인해 fail하는 테스트 수정 * refactor: 불필요한 쿼리 삭제 * style: 불필요한 import 삭제 * fix: Native Query 미반영 서비스 코드 수정 (#558) * feat: 딥링크 기능 구현 (#542) * chore: deep-link 테스트 * feat: deeplink redirect 기능 구현 * fix: 페이지가 아닌 URI로 이동되도록 수정 * feat: detail 페이지에 deeplink 적용 * chore: CI/CD 비활성화 * refactor: 딥링크 결정 로직 리팩터링 * style: 개행 컨밴션 맞추기 * refactor: 딥링크 방식 변경 * fix: deeplink 방식 변경 * fix: fallback link 삽입 * refactor: 불필요한 서비스 및 URI 제거 * chore: ci/cd 비활성화 * refactor: else 제거 * fix: 웹 페이지에서 공모 데이터에 선택 필드 값이 존재하지 않을 때 예외 처리 (#546) * fix: 나오지 않은 데이터 예외처리 적용 * feat: 필터 버튼 폰트 색상 변경 * refactor: 머지 해결 * fix: null 처리 해결 (#561) * chore: CI/CD 스크립트 트리거 브랜치 수정 (#567) * chore: 안드로이드 버전 v1.1.2로 변경 (#512) * feat: 공모글 수정 기능 구현 (#522) * feat: 공모글 수정 API Service 함수 정의 * feat: OfferingDetailRepository에 공모글 수정 함수 정의 * feat: 공모 수정 프래그먼트 구현 * refactor: patch 함수 위치 수정 * style: ktFormat 적용 * feat: 수정 기능 구현 * feat: offeringId 주입 구현 * feat: OfferingModifyResponse 구현 * feat: 수정기능 구현(Response 안씀) * feat: 수정 후 OfferingDetail 화면에서 바로 수정된 정보가 보이도록 수정 * feat: 수정 후 OfferingDetail 화면에서 바로 수정된 정보가 보이도록 수정 * style: ktFormat 적용 * feat: 공모글 수정 문구 수정 * feat: 모집 마감 이후에는 공모글 수정이 안되도록 구현 * feat: 수정 버튼 텍스트 변경 * fix: 공모글 작성 중단하고 나왔을 때 작성하던 글이 남아있는 문제 수정 * fix: 상품 url이 빈칸일 경우 서버로 null을 보내도록 변경 * test: patchOffering override * feat: OfferingDetail response에 originPrice 추가 * feat: 공모글 수정 시 원가격이 표시되도록 변경 * fix: originPrice nullable로 수정 * fix: originPrice가 null이면 blank를 edit text에 넣도록 수정 * feat: 공구 삭제 기능 구현 (#532) * feat: 삭제 api추가 * feat: 삭제버튼 클릭 시 나오는 dialog생성 * feat: 삭제 기능 구현 * refactor: 다이얼로그 문자 string로 분리 * chore: 중복 코드 제거 * refactor: Binding Class 사용해 dialogBinding하도록 변경 * refactor: 인터페이스 네이밍 변경 * refactor: 공모 삭제 할 수 없을 대 알림 메세지 수정 * feat: 게시물 삭제 시 toast 띄어주는 기능 추가 * feat: 더블클릭 방지 기능 구현 (#534) * refactor: 더블클릭 방지 기능 구현 * refactor: 디바운스 시간을 설정할 수 있도록 수정 * feat: setOnClickListener함수도 디바운스 적용 가능하게 수정, 디폴트 디바운스타임 200ms로 변경 * fix: 함수 수정 * fix: 공모글작성, 공모글수정, 거래장소선택, 사진업로드, 사진추출, 검색 디바운스타임 800ms로 변경 * fix: 체크박스 디바운스 해제 * feat: playstore Deeplink 연결 (#545) * feat: 딥링크 설정을 위한 manifest 설정 * feat: 딥링크를 통해 offering detail로 이동하는 기능 구현 * feat: 딥링크로 참여하기를 누르는 경우 로그인 처리 * feat: 특정 기능 사용 시 확인/취소 다이얼로그 띄워주는 기능 구현 (#547) * feat: 로그아웃 alert 구현 * feat: 로그아웃 시 alert를 통해 확인받는 기능 구현 * feat: 공구 참여 시 확인받는 기능 구현 * feat: 공모 퇴장 시 확인받는 기능 구현 * style: ktlint format 적용 * feat: 릴리즈 버전 업데이트 (#550) * test: test fix (#555) * chore: release-* 에서 CD 작동하도록 수정 * chore: release-* 에서 CD 작동하도록 수정 * chore: release-* 에서 CD 작동하도록 수정 * feat: 웹 접근성 개선 (#575) * feat: 파비콘 추가 :) * feat: 공유 시 메타 정보가 보이도록 변경 * fix: AN 누락된 파일 추가 * fix: BE 누락된 파일 추가 * fix: workflows 누락된 파일 추가 * refactor: 스케줄링 시점 수정 (#586) * refactor: 스케줄링 시점 수정 오늘이 마감일이면, 다음 날로 넘어가는 시점에 마감으로 바꾼다. * refactor: 공모 작성 당일을 마감일로 설정할 수 있도록 수정 * test: 변화한 비즈니스 로직 반영 * refactor: OfferingRepository 쿼리 최적화 (#578) * refactor: 최근순 공모 조회 쿼리 최적화 * test: 테스트 날짜 변경 * refactor: 마감임박만 공모 조회 쿼리 최적화 * refactor: 높은할인율순 공모 조회 쿼리 최적화 * refactor: 참여가능만 공모 조회 쿼리 최적화 * refactor: 스케쥴러 쿼리 최적화 * refactor: 최근순 공모 조회 쿼리 최적화 * refactor: 마감임박만 공모 조회 쿼리 최적화 * refactor: 높은할인율순 공모 조회 쿼리 최적화 * refactor: 참여가능만 공모 조회 쿼리 최적화 * refactor: 쿼리 메서드 이름 컨벤션 통일 * refactor: offerings 합치는 로직 추출 * refactor: offering fetch 로직 메서드명 축약 * refactor: Strategy 별 구조 통일 * style: 파라미터 코드 개행 통일 * refactor: sortCondition 생성 메서드 추출 * chore: 트리거 path 설정 (#583) * chore: 트리거 path 설정 * chore: CI CD 테스트 * chore: CI CD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CI CD 테스트 * chore: CI CD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CI CD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CI CD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: CICD 테스트 * chore: ktlint check 수정 완료 * chore: ktlint check 수정 완료 * chore: ktlint check 수정 완료 * chore: ktlint check 수정 완료 * chore: deploy 수정 * chore: 안드코드 수정 * chore: 안드코드 수정 * chore: 안드코드 수정 * chore: 안드코드 수정 * chore: 안드코드 수정 * chore: 백엔드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: 안드 코드 수정 * chore: path 설정 * chore: 백엔드 코드 수정 * chore: 안드코드 수정 * chore: 안드 코드 수정 * chore: 백엔드 트리거 테스트 * chore: 백엔드 트리거 테스트 원복 * chore: 안드 트리거 테스트 원복 * chore: 안드 트리거 테스트 원복 * chore: push 트리거 테스트 * chore: push 트리거 테스트 * chore: push 트리거 테스트 원복 * chore: push 트리거 테스트 원복 * chore: 안드 트리거 테스트 마지막 * chore: 안드 트리거 테스트 원복 * feat: 채팅 view type 관리 및 날짜 view 추가 (#588) * feat: 안드로이드 프로젝트 구조 기초 세팅 (#2) * feat: 백엔드 프로젝트 구조 기초 세팅 (#5) * feat: comment detail event 관리를 위한 sealed class 구현 * refactor: comment detail event를 사용하도록 viewmodel, activity 변경 * refactor: 채팅 view type을 사용 * style: ktlint 적용 * feat: 채팅 날짜를 알려주는 view 추가 * refactor: 필요없는 파일 삭제 * refactor: handleRepositoryError -> handleNetworkError 로 네이밍 변경 * refactor: 날짜 조건식 함수 분리 --------- Co-authored-by: Dora Choo * refactor: Update 시 상태를 변경할 수 있도록 수정 (#589) * refactor: MeetingDate 검증 시 OfferingEntity 객체가 아닌 LocalDateTime 객체를 인자로 넣도록 수정 * refactor: Update 시 변경된 인원과 마감날짜로 상태 초기화 * refactor: Clock mocking 할 수 있도록 수정 * refactor: 메서드명 수정 * refactor: IMMINENT 조건 추가 * fix: 현재 시간 계산 로직에 누락된 clock 추가 (#580) * fix: 모집 마감 상태 스타일 미적용 해결 (#591) * feat: 채팅 목록 조회 시 최신순 정렬 적용 (#594) * feat: CommentRoom 정렬 방식 변경 * fix: null 일 땐 맨 아래에 배치하도록 정렬 로직 수정 * test: 잘못 들어온 contextLoads 테스트 제거 * test: 순서 보장 테스트에 containsExactly 사용 --------- Co-authored-by: Choo * test: 실패하는 테스트 수정 (#597) --------- Co-authored-by: SCY Co-authored-by: fromitive <46563149+fromitive@users.noreply.github.com> Co-authored-by: 채현 Co-authored-by: Namyunsuk <84739562+Namyunsuk@users.noreply.github.com> Co-authored-by: masonkimseoul <87306418+masonkimseoul@users.noreply.github.com> Co-authored-by: alsong <138569524+songpink@users.noreply.github.com> Co-authored-by: chaehyun <80222352+chaehyuns@users.noreply.github.com> Co-authored-by: masonkimseoul Co-authored-by: fromitive Co-authored-by: Namyunsuk Co-authored-by: songpink --- .github/workflows/android.yml | 2 + .../presentation/util/BindingAdapters.kt | 7 + .../commentdetail/CommentDetailActivity.kt | 106 +++++----- .../commentdetail/CommentDetailViewModel.kt | 196 +++++++----------- .../adapter/comment/CommentAdapter.kt | 72 +++++-- .../adapter/comment/CommentViewType.kt | 21 ++ .../comment/DateSeparatorViewHolder.kt | 13 ++ .../commentdetail/event/CommentDetailEvent.kt | 17 ++ .../OnUpdateStatusClickListener.kt | 2 +- .../main/res/layout/dialog_update_status.xml | 2 +- ...m_calendar.xml => item_date_separator.xml} | 8 +- .../main/res/mipmap-anydpi/ic_launcher.xml | 6 + .../res/mipmap-anydpi/ic_launcher_round.xml | 6 + .../comment/service/CommentService.java | 1 + .../service/dto/CommentLatestResponse.java | 16 +- .../dto/CommentRoomAllResponseItem.java | 7 +- .../offering/domain/UpdatedOffering.java | 2 +- .../HighDiscountOfferingStrategy.java | 38 +++- .../ImminentOfferingStrategy.java | 39 +++- .../JoinableOfferingStrategy.java | 18 +- .../OfferingFetchStrategy.java | 43 ++-- .../RecentOfferingStrategy.java | 18 +- .../repository/OfferingRepository.java | 88 ++++++-- .../offering/service/OfferingFetcher.java | 2 +- .../offering/service/OfferingService.java | 27 ++- .../scheduler/service/SchedulerService.java | 9 +- .../src/main/resources/templates/index.html | 2 +- .../comment/service/CommentServiceTest.java | 37 +++- .../chongdae/global/service/ServiceTest.java | 4 + .../integration/OfferingIntegrationTest.java | 12 +- .../offering/service/OfferingServiceTest.java | 2 +- 31 files changed, 541 insertions(+), 282 deletions(-) create mode 100644 android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/CommentViewType.kt create mode 100644 android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/DateSeparatorViewHolder.kt create mode 100644 android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/event/CommentDetailEvent.kt rename android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/{ => event}/OnUpdateStatusClickListener.kt (58%) rename android/app/src/main/res/layout/{item_calendar.xml => item_date_separator.xml} (81%) create mode 100644 android/app/src/main/res/mipmap-anydpi/ic_launcher.xml create mode 100644 android/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 37ce2af8e..bc81cd5e9 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -5,6 +5,8 @@ on: branches: - "develop" - "release*" + paths: + - 'android/**' defaults: run: diff --git a/android/app/src/main/java/com/zzang/chongdae/presentation/util/BindingAdapters.kt b/android/app/src/main/java/com/zzang/chongdae/presentation/util/BindingAdapters.kt index 4bf4eec18..eaa770bf0 100644 --- a/android/app/src/main/java/com/zzang/chongdae/presentation/util/BindingAdapters.kt +++ b/android/app/src/main/java/com/zzang/chongdae/presentation/util/BindingAdapters.kt @@ -18,6 +18,7 @@ import androidx.databinding.BindingAdapter import com.bumptech.glide.Glide import com.zzang.chongdae.R import com.zzang.chongdae.domain.model.OfferingCondition +import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime import java.time.format.DateTimeFormatter @@ -196,6 +197,12 @@ fun TextView.bindFormattedDate(datetime: LocalDateTime?) { datetime?.format(DateTimeFormatter.ofPattern(context.getString(R.string.all_due_datetime))) } +@BindingAdapter("formattedOnlyDate") +fun TextView.bindFormattedOnlyDate(datetime: LocalDate?) { + this.text = + datetime?.format(DateTimeFormatter.ofPattern(context.getString(R.string.all_due_datetime))) +} + @BindingAdapter("currentCount", "totalCount", "condition") fun TextView.bindStatusComment( currentCount: Int, diff --git a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/CommentDetailActivity.kt b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/CommentDetailActivity.kt index f3ab4ed57..8d5056e87 100644 --- a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/CommentDetailActivity.kt +++ b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/CommentDetailActivity.kt @@ -24,6 +24,8 @@ import com.zzang.chongdae.databinding.DialogUpdateStatusBinding import com.zzang.chongdae.presentation.util.setDebouncedOnClickListener import com.zzang.chongdae.presentation.view.commentdetail.adapter.comment.CommentAdapter import com.zzang.chongdae.presentation.view.commentdetail.adapter.participant.ParticipantAdapter +import com.zzang.chongdae.presentation.view.commentdetail.event.CommentDetailEvent +import com.zzang.chongdae.presentation.view.commentdetail.event.OnUpdateStatusClickListener import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -103,19 +105,14 @@ class CommentDetailActivity : AppCompatActivity(), OnUpdateStatusClickListener { private fun setUpObserve() { observeComments() observeParticipants() - observeUpdateOfferingEvent() - observeReportEvent() - observeExitOfferingEvent() - observeBackEvent() - observeErrorEvent() + observeEvent() } private fun observeComments() { viewModel.comments.observe(this) { comments -> - commentAdapter.submitList(comments) { - binding.rvComments.doOnPreDraw { - binding.rvComments.scrollToPosition(comments.size - 1) - } + commentAdapter.submitComments(comments) + binding.rvComments.doOnPreDraw { + binding.rvComments.scrollToPosition(comments.size - 1) } } } @@ -128,12 +125,39 @@ class CommentDetailActivity : AppCompatActivity(), OnUpdateStatusClickListener { } } - private fun observeReportEvent() { - viewModel.reportEvent.observe(this) { reportUrlId -> - openUrlInBrowser(getString(reportUrlId)) + private fun observeEvent() { + viewModel.event.observe(this) { event -> + event.getContentIfNotHandled()?.let { handleEvent(it) } + } + } + + private fun handleEvent(event: CommentDetailEvent) { + when (event) { + is CommentDetailEvent.BackPressed -> finish() + is CommentDetailEvent.ShowError -> showError(event.message) + is CommentDetailEvent.ShowReport -> reportEvent(event.reportUrlId) + is CommentDetailEvent.ShowUpdateStatusDialog -> showUpdateStatusDialog() + is CommentDetailEvent.ShowAlert -> showExitDialog() + is CommentDetailEvent.ExitOffering -> exitOfferingEvent() + is CommentDetailEvent.AlertCancelled -> cancelDialog() } } + private fun showError(message: String) { + toast?.cancel() + toast = + Toast.makeText( + this, + message, + Toast.LENGTH_SHORT, + ) + toast?.show() + } + + private fun reportEvent(reportUrlId: Int) { + openUrlInBrowser(getString(reportUrlId)) + } + private fun openUrlInBrowser(url: String) { val intent = Intent(Intent.ACTION_VIEW).apply { @@ -142,52 +166,26 @@ class CommentDetailActivity : AppCompatActivity(), OnUpdateStatusClickListener { startActivity(intent) } - private fun observeUpdateOfferingEvent() { - viewModel.showStatusDialogEvent.observe(this) { - showUpdateStatusDialog() - } - } - - private fun observeExitOfferingEvent() { - viewModel.onExitOfferingEvent.observe(this) { - firebaseAnalyticsManager.logSelectContentEvent( - id = "exit_offering_event", - name = "exit_offering_event", - contentType = "button", - ) - finish() - dialog.dismiss() - } - viewModel.showAlertEvent.observe(this) { - val alertBinding = DialogAlertBinding.inflate(layoutInflater, null, false) - alertBinding.tvDialogMessage.text = getString(R.string.comment_detail_exit_alert) - alertBinding.listener = viewModel - - dialog.setContentView(alertBinding.root) - dialog.show() - } - viewModel.alertCancelEvent.observe(this) { - dialog.dismiss() - } + private fun exitOfferingEvent() { + firebaseAnalyticsManager.logSelectContentEvent( + id = "exit_offering_event", + name = "exit_offering_event", + contentType = "button", + ) + finish() + dialog.dismiss() } - private fun observeBackEvent() { - viewModel.onBackPressedEvent.observe(this) { - finish() - } + private fun showExitDialog() { + val alertBinding = DialogAlertBinding.inflate(layoutInflater, null, false) + alertBinding.tvDialogMessage.text = getString(R.string.comment_detail_exit_alert) + alertBinding.listener = viewModel + dialog.setContentView(alertBinding.root) + dialog.show() } - private fun observeErrorEvent() { - viewModel.errorEvent.observe(this) { - toast?.cancel() - toast = - Toast.makeText( - this, - it, - Toast.LENGTH_SHORT, - ) - toast?.show() - } + private fun cancelDialog() { + dialog.dismiss() } private fun showUpdateStatusDialog() { diff --git a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/CommentDetailViewModel.kt b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/CommentDetailViewModel.kt index d67785fb6..e81fbfba5 100644 --- a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/CommentDetailViewModel.kt +++ b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/CommentDetailViewModel.kt @@ -17,8 +17,8 @@ import com.zzang.chongdae.domain.model.Comment import com.zzang.chongdae.domain.repository.CommentDetailRepository import com.zzang.chongdae.domain.repository.OfferingRepository import com.zzang.chongdae.domain.repository.ParticipantRepository -import com.zzang.chongdae.presentation.util.MutableSingleLiveData -import com.zzang.chongdae.presentation.util.SingleLiveData +import com.zzang.chongdae.presentation.util.Event +import com.zzang.chongdae.presentation.view.commentdetail.event.CommentDetailEvent import com.zzang.chongdae.presentation.view.commentdetail.model.information.CommentOfferingInfoUiModel import com.zzang.chongdae.presentation.view.commentdetail.model.information.CommentOfferingInfoUiModel.Companion.toUiModel import com.zzang.chongdae.presentation.view.commentdetail.model.meeting.MeetingsUiModel @@ -49,12 +49,13 @@ class CommentDetailViewModel fun create(offeringId: Long): CommentDetailViewModel } - private var cachedComments: List = emptyList() private var pollJob: Job? = null + val commentContent = MutableLiveData("") private val _comments: MutableLiveData> = MutableLiveData() val comments: LiveData> get() = _comments + private var cachedComments: List = emptyList() private val _commentOfferingInfo = MutableLiveData() val commentOfferingInfo: LiveData get() = _commentOfferingInfo @@ -62,32 +63,14 @@ class CommentDetailViewModel private val _meetings = MutableLiveData() val meetings: LiveData get() = _meetings - private val _isCollapsibleViewVisible = MutableLiveData(false) - val isCollapsibleViewVisible: LiveData get() = _isCollapsibleViewVisible - private val _participants = MutableLiveData() val participants: LiveData get() = _participants - private val _showStatusDialogEvent = MutableLiveData() - val showStatusDialogEvent: LiveData get() = _showStatusDialogEvent - - private val _reportEvent: MutableSingleLiveData = MutableSingleLiveData() - val reportEvent: SingleLiveData get() = _reportEvent - - private val _onExitOfferingEvent = MutableSingleLiveData() - val onExitOfferingEvent: SingleLiveData get() = _onExitOfferingEvent - - private val _onBackPressedEvent = MutableSingleLiveData() - val onBackPressedEvent: SingleLiveData get() = _onBackPressedEvent - - private val _errorEvent = MutableLiveData() - val errorEvent: MutableLiveData get() = _errorEvent - - private val _showAlertEvent = MutableSingleLiveData() - val showAlertEvent: SingleLiveData get() = _showAlertEvent + private val _isCollapsibleViewVisible = MutableLiveData(false) + val isCollapsibleViewVisible: LiveData get() = _isCollapsibleViewVisible - private val _alertCancelEvent = MutableSingleLiveData() - val alertCancelEvent: SingleLiveData get() = _alertCancelEvent + private val _event = MutableLiveData>() + val event: LiveData> get() = _event init { startPolling() @@ -97,7 +80,7 @@ class CommentDetailViewModel } private fun startPolling() { - pollJob?.cancel() + stopPolling() pollJob = viewModelScope.launch { while (this.isActive) { @@ -107,29 +90,40 @@ class CommentDetailViewModel } } + private fun handleNetworkError( + error: DataError.Network, + retryAction: suspend () -> Unit, + ) { + when (error) { + DataError.Network.UNAUTHORIZED -> { + viewModelScope.launch { + when (authRepository.saveRefresh()) { + is Result.Success -> retryAction() + is Result.Error -> + _event.value = + Event(CommentDetailEvent.ShowError("로그아웃 후 다시 진행해주세요.")) + } + } + } + + else -> _event.value = Event(CommentDetailEvent.ShowError(error.name)) + } + } + private fun updateCommentInfo() { viewModelScope.launch { when (val result = commentDetailRepository.fetchCommentOfferingInfo(offeringId)) { is Result.Success -> _commentOfferingInfo.value = result.data.toUiModel() is Result.Error -> - when (result.error) { - DataError.Network.UNAUTHORIZED -> { - when (authRepository.saveRefresh()) { - is Result.Success -> updateCommentInfo() - is Result.Error -> return@launch - } - } - - else -> { - errorEvent.value = result.error.name - } + handleNetworkError(result.error) { + updateCommentInfo() } } } } fun updateOfferingEvent() { - _showStatusDialogEvent.value = Unit + _event.value = Event(CommentDetailEvent.ShowUpdateStatusDialog) } fun updateOfferingStatus() { @@ -137,17 +131,8 @@ class CommentDetailViewModel when (val result = commentDetailRepository.updateOfferingStatus(offeringId)) { is Result.Success -> updateCommentInfo() is Result.Error -> - when (result.error) { - DataError.Network.UNAUTHORIZED -> { - when (authRepository.saveRefresh()) { - is Result.Success -> updateOfferingStatus() - is Result.Error -> return@launch - } - } - - else -> { - errorEvent.value = result.error.name - } + handleNetworkError(result.error) { + updateOfferingStatus() } } } @@ -165,18 +150,8 @@ class CommentDetailViewModel } is Result.Error -> - when (result.error) { - DataError.Network.UNAUTHORIZED -> { - when (authRepository.saveRefresh()) { - is Result.Success -> loadComments() - is Result.Error -> return@launch - } - } - - else -> { - pollJob?.cancel() - errorEvent.value = result.error.name - } + handleNetworkError(result.error) { + loadComments() } } } @@ -184,27 +159,14 @@ class CommentDetailViewModel fun postComment() { val content = commentContent.value?.trim() - if (content.isNullOrEmpty()) { - return - } + if (content.isNullOrEmpty()) return + viewModelScope.launch { when (val result = commentDetailRepository.saveComment(offeringId, content)) { - is Result.Success -> { - commentContent.value = "" - } - + is Result.Success -> commentContent.value = "" is Result.Error -> - when (result.error) { - DataError.Network.UNAUTHORIZED -> { - when (authRepository.saveRefresh()) { - is Result.Success -> postComment() - is Result.Error -> return@launch - } - } - - else -> { - errorEvent.value = result.error.name - } + handleNetworkError(result.error) { + postComment() } } } @@ -222,17 +184,8 @@ class CommentDetailViewModel when (val result = participantRepository.fetchParticipants(offeringId)) { is Result.Success -> _participants.value = result.data.toUiModel() is Result.Error -> - when (result.error) { - DataError.Network.UNAUTHORIZED -> { - when (authRepository.saveRefresh()) { - is Result.Success -> loadParticipants() - is Result.Error -> return@launch - } - } - - else -> { - errorEvent.value = result.error.name - } + handleNetworkError(result.error) { + loadParticipants() } } } @@ -243,50 +196,43 @@ class CommentDetailViewModel when (val result = offeringRepository.fetchMeetings(offeringId)) { is Result.Success -> _meetings.value = result.data.toUiModel() is Result.Error -> - when (result.error) { - DataError.Network.UNAUTHORIZED -> { - when (authRepository.saveRefresh()) { - is Result.Success -> loadMeetings() - is Result.Error -> return@launch - } - } - - else -> { - errorEvent.value = result.error.name - } + handleNetworkError(result.error) { + loadMeetings() } } } } fun onClickReport() { - _reportEvent.setValue(R.string.report_url) + _event.value = Event(CommentDetailEvent.ShowReport(R.string.report_url)) } - fun exitOffering() { + private fun exitOffering() { viewModelScope.launch { when (val result = participantRepository.deleteParticipations(offeringId)) { is Result.Success -> { - _onExitOfferingEvent.setValue(Unit) - pollJob?.cancel() + _event.value = Event(CommentDetailEvent.ExitOffering) + stopPolling() } is Result.Error -> when (result.error) { DataError.Network.NULL -> { - _onExitOfferingEvent.setValue(Unit) - pollJob?.cancel() + _event.value = Event(CommentDetailEvent.ExitOffering) + stopPolling() } DataError.Network.UNAUTHORIZED -> { when (authRepository.saveRefresh()) { is Result.Success -> exitOffering() - is Result.Error -> return@launch + is Result.Error -> + _event.value = + Event(CommentDetailEvent.ShowError("로그아웃 후 다시 진행해주세요.")) } } else -> { - _errorEvent.value = result.error.name + return@launch } } } @@ -294,18 +240,30 @@ class CommentDetailViewModel } fun onBackClick() { - _onBackPressedEvent.setValue(Unit) + _event.value = Event(CommentDetailEvent.BackPressed) } - override fun onCleared() { - super.onCleared() - stopPolling() + fun onExitClick() { + _event.value = Event(CommentDetailEvent.ShowAlert) + } + + override fun onClickConfirm() { + exitOffering() + } + + override fun onClickCancel() { + _event.value = Event(CommentDetailEvent.AlertCancelled) } private fun stopPolling() { pollJob?.cancel() } + override fun onCleared() { + super.onCleared() + stopPolling() + } + companion object { @Suppress("UNCHECKED_CAST") fun getFactory( @@ -317,16 +275,4 @@ class CommentDetailViewModel } } } - - fun onExitClick() { - _showAlertEvent.setValue(Unit) - } - - override fun onClickConfirm() { - exitOffering() - } - - override fun onClickCancel() { - _alertCancelEvent.setValue(Unit) - } } diff --git a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/CommentAdapter.kt b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/CommentAdapter.kt index d07124302..9357a609e 100644 --- a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/CommentAdapter.kt +++ b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/CommentAdapter.kt @@ -5,15 +5,34 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import com.zzang.chongdae.databinding.ItemDateSeparatorBinding import com.zzang.chongdae.databinding.ItemMyCommentBinding import com.zzang.chongdae.databinding.ItemOtherCommentBinding import com.zzang.chongdae.domain.model.Comment -class CommentAdapter : ListAdapter(DIFF_CALLBACK) { - override fun getItemViewType(position: Int): Int { - return if (getItem(position).isMine) VIEW_TYPE_MY_COMMENT else VIEW_TYPE_OTHER_COMMENT +class CommentAdapter : ListAdapter(DIFF_CALLBACK) { + fun submitComments(comments: List) { + val newItems = mutableListOf() + + for (i in comments.indices) { + val currentComment = comments[i] + val previousComment = if (i > 0) comments[i - 1] else null + + if (previousComment == null || isDifferentDates(currentComment, previousComment)) { + newItems.add(CommentViewType.DateSeparator(currentComment)) + } + + newItems.add(CommentViewType.fromComment(currentComment)) + } + + submitList(newItems) } + private fun isDifferentDates( + currentComment: Comment, + previousComment: Comment, + ) = currentComment.commentCreatedAt.date != previousComment.commentCreatedAt.date + override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, @@ -23,10 +42,17 @@ class CommentAdapter : ListAdapter(DIFF_CALLBA val binding = ItemMyCommentBinding.inflate(LayoutInflater.from(parent.context), parent, false) MyCommentViewHolder(binding) } + VIEW_TYPE_OTHER_COMMENT -> { val binding = ItemOtherCommentBinding.inflate(LayoutInflater.from(parent.context), parent, false) OtherCommentViewHolder(binding) } + + VIEW_TYPE_DATE_SEPARATOR -> { + val binding = ItemDateSeparatorBinding.inflate(LayoutInflater.from(parent.context), parent, false) + DateSeparatorViewHolder(binding) + } + else -> throw IllegalArgumentException("CommentAdapter viewType error") } } @@ -35,29 +61,49 @@ class CommentAdapter : ListAdapter(DIFF_CALLBA holder: RecyclerView.ViewHolder, position: Int, ) { - val comment = getItem(position) - when (holder.itemViewType) { - VIEW_TYPE_MY_COMMENT -> (holder as MyCommentViewHolder).bind(comment) - VIEW_TYPE_OTHER_COMMENT -> (holder as OtherCommentViewHolder).bind(comment) + when (val item = getItem(position)) { + is CommentViewType.MyComment -> (holder as MyCommentViewHolder).bind(item.comment) + is CommentViewType.OtherComment -> (holder as OtherCommentViewHolder).bind(item.comment) + is CommentViewType.DateSeparator -> (holder as DateSeparatorViewHolder).bind(item.comment) + } + } + + override fun getItemViewType(position: Int): Int { + return when (getItem(position)) { + is CommentViewType.MyComment -> VIEW_TYPE_MY_COMMENT + is CommentViewType.OtherComment -> VIEW_TYPE_OTHER_COMMENT + is CommentViewType.DateSeparator -> VIEW_TYPE_DATE_SEPARATOR } } companion object { private const val VIEW_TYPE_MY_COMMENT = 1 private const val VIEW_TYPE_OTHER_COMMENT = 2 + private const val VIEW_TYPE_DATE_SEPARATOR = 3 private val DIFF_CALLBACK = - object : DiffUtil.ItemCallback() { + object : DiffUtil.ItemCallback() { override fun areItemsTheSame( - oldItem: Comment, - newItem: Comment, + oldItem: CommentViewType, + newItem: CommentViewType, ): Boolean { - return oldItem == newItem + return when { + oldItem is CommentViewType.MyComment && newItem is CommentViewType.MyComment -> + oldItem.comment == newItem.comment + + oldItem is CommentViewType.OtherComment && newItem is CommentViewType.OtherComment -> + oldItem.comment == newItem.comment + + oldItem is CommentViewType.DateSeparator && newItem is CommentViewType.DateSeparator -> + oldItem.comment == newItem.comment + + else -> false + } } override fun areContentsTheSame( - oldItem: Comment, - newItem: Comment, + oldItem: CommentViewType, + newItem: CommentViewType, ): Boolean { return oldItem == newItem } diff --git a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/CommentViewType.kt b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/CommentViewType.kt new file mode 100644 index 000000000..8b8f30ec8 --- /dev/null +++ b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/CommentViewType.kt @@ -0,0 +1,21 @@ +package com.zzang.chongdae.presentation.view.commentdetail.adapter.comment + +import com.zzang.chongdae.domain.model.Comment + +sealed class CommentViewType { + data class MyComment(val comment: Comment) : CommentViewType() + + data class OtherComment(val comment: Comment) : CommentViewType() + + data class DateSeparator(val comment: Comment) : CommentViewType() + + companion object { + fun fromComment(comment: Comment): CommentViewType { + return if (comment.isMine) { + MyComment(comment) + } else { + OtherComment(comment) + } + } + } +} diff --git a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/DateSeparatorViewHolder.kt b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/DateSeparatorViewHolder.kt new file mode 100644 index 000000000..332edbbdd --- /dev/null +++ b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/adapter/comment/DateSeparatorViewHolder.kt @@ -0,0 +1,13 @@ +package com.zzang.chongdae.presentation.view.commentdetail.adapter.comment + +import androidx.recyclerview.widget.RecyclerView +import com.zzang.chongdae.databinding.ItemDateSeparatorBinding +import com.zzang.chongdae.domain.model.Comment + +class DateSeparatorViewHolder( + private val binding: ItemDateSeparatorBinding, +) : RecyclerView.ViewHolder(binding.root) { + fun bind(comment: Comment) { + binding.comment = comment + } +} diff --git a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/event/CommentDetailEvent.kt b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/event/CommentDetailEvent.kt new file mode 100644 index 000000000..7e8b69708 --- /dev/null +++ b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/event/CommentDetailEvent.kt @@ -0,0 +1,17 @@ +package com.zzang.chongdae.presentation.view.commentdetail.event + +sealed class CommentDetailEvent { + data object ShowUpdateStatusDialog : CommentDetailEvent() + + data object ExitOffering : CommentDetailEvent() + + data object BackPressed : CommentDetailEvent() + + data class ShowError(val message: String) : CommentDetailEvent() + + data class ShowReport(val reportUrlId: Int) : CommentDetailEvent() + + data object ShowAlert : CommentDetailEvent() + + data object AlertCancelled : CommentDetailEvent() +} diff --git a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/OnUpdateStatusClickListener.kt b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/event/OnUpdateStatusClickListener.kt similarity index 58% rename from android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/OnUpdateStatusClickListener.kt rename to android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/event/OnUpdateStatusClickListener.kt index ccc427296..21c8d5011 100644 --- a/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/OnUpdateStatusClickListener.kt +++ b/android/app/src/main/java/com/zzang/chongdae/presentation/view/commentdetail/event/OnUpdateStatusClickListener.kt @@ -1,4 +1,4 @@ -package com.zzang.chongdae.presentation.view.commentdetail +package com.zzang.chongdae.presentation.view.commentdetail.event interface OnUpdateStatusClickListener { fun onSubmitClick() diff --git a/android/app/src/main/res/layout/dialog_update_status.xml b/android/app/src/main/res/layout/dialog_update_status.xml index 72752abb0..c94fb6707 100644 --- a/android/app/src/main/res/layout/dialog_update_status.xml +++ b/android/app/src/main/res/layout/dialog_update_status.xml @@ -11,7 +11,7 @@ + type="com.zzang.chongdae.presentation.view.commentdetail.event.OnUpdateStatusClickListener" /> + - - diff --git a/android/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi/ic_launcher.xml new file mode 100644 index 000000000..b3e26b4c6 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml new file mode 100644 index 000000000..b3e26b4c6 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/backend/src/main/java/com/zzang/chongdae/comment/service/CommentService.java b/backend/src/main/java/com/zzang/chongdae/comment/service/CommentService.java index 7183087f9..11a00d412 100644 --- a/backend/src/main/java/com/zzang/chongdae/comment/service/CommentService.java +++ b/backend/src/main/java/com/zzang/chongdae/comment/service/CommentService.java @@ -57,6 +57,7 @@ public CommentRoomAllResponse getAllCommentRoom(MemberEntity member) { List offeringIds = offeringMemberRepository.findOfferingIdsByMemberId(member.getId()); List responseItems = offeringIds.stream() .map(offeringId -> getCommentRoom(offeringId, member)) + .sorted() .toList(); return new CommentRoomAllResponse(responseItems); } diff --git a/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentLatestResponse.java b/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentLatestResponse.java index 118d2d55e..1faabc601 100644 --- a/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentLatestResponse.java +++ b/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentLatestResponse.java @@ -3,9 +3,23 @@ import com.zzang.chongdae.comment.repository.entity.CommentEntity; import java.time.LocalDateTime; -public record CommentLatestResponse(String content, LocalDateTime createdAt) { +public record CommentLatestResponse(String content, LocalDateTime createdAt) implements Comparable { public CommentLatestResponse(CommentEntity comment) { this(comment.getContent(), comment.getCreatedAt()); } + + @Override + public int compareTo(CommentLatestResponse other) { + if (this.createdAt == null && other.createdAt == null) { + return 0; + } + if (this.createdAt == null) { + return 1; + } + if (other.createdAt == null) { + return -1; + } + return other.createdAt.compareTo(this.createdAt); + } } diff --git a/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentRoomAllResponseItem.java b/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentRoomAllResponseItem.java index 0f1d4a977..841096a74 100644 --- a/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentRoomAllResponseItem.java +++ b/backend/src/main/java/com/zzang/chongdae/comment/service/dto/CommentRoomAllResponseItem.java @@ -6,7 +6,7 @@ public record CommentRoomAllResponseItem(Long offeringId, String offeringTitle, Boolean isProposer, - CommentLatestResponse latestComment) { + CommentLatestResponse latestComment) implements Comparable{ public CommentRoomAllResponseItem(OfferingEntity offering, OfferingMemberEntity offeringMember, @@ -25,4 +25,9 @@ public CommentRoomAllResponseItem(Long offeringId, offeringMember.isProposer(), latestComment); } + + @Override + public int compareTo(CommentRoomAllResponseItem other) { + return this.latestComment.compareTo(other.latestComment); + } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/domain/UpdatedOffering.java b/backend/src/main/java/com/zzang/chongdae/offering/domain/UpdatedOffering.java index 6f28c17cf..d68c1ef2c 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/domain/UpdatedOffering.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/domain/UpdatedOffering.java @@ -35,7 +35,7 @@ public UpdatedOffering(String title, String productUrl, String thumbnailUrl, Int private void validateMeetingDate() { LocalDateTime today = LocalDateTime.now(); - if (meetingDate.isBefore(today) || meetingDate.isEqual(today)) { + if (meetingDate.isBefore(today)) { throw new MarketException(OfferingErrorCode.CANNOT_UPDATE_BEFORE_NOW_MEETING_DATE); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/HighDiscountOfferingStrategy.java b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/HighDiscountOfferingStrategy.java index 0d00c6805..a9e1a6872 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/HighDiscountOfferingStrategy.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/HighDiscountOfferingStrategy.java @@ -2,6 +2,7 @@ import com.zzang.chongdae.offering.repository.OfferingRepository; import com.zzang.chongdae.offering.repository.entity.OfferingEntity; +import java.util.Comparator; import java.util.List; import org.springframework.data.domain.Pageable; @@ -12,18 +13,39 @@ public HighDiscountOfferingStrategy(OfferingRepository offeringRepository) { } @Override - protected List fetchOfferingsWithoutLastId(String searchKeyword, Pageable pageable) { + protected List fetchWithoutLast(Long outOfRangeId, String searchKeyword, Pageable pageable) { double outOfRangeDiscountRate = 100; - Long outOfRangeId = findOutOfRangeId(); - return offeringRepository.findHighDiscountOfferingsWithKeyword( - outOfRangeDiscountRate, outOfRangeId, searchKeyword, pageable); + return fetchOfferings(outOfRangeId, outOfRangeDiscountRate, searchKeyword, pageable); } @Override - protected List fetchOfferingsWithLastOffering( - OfferingEntity lastOffering, String searchKeyword, Pageable pageable) { + protected List fetchWithLast(OfferingEntity lastOffering, String searchKeyword, Pageable pageable) { + Long lastId = lastOffering.getId(); Double lastDiscountRate = lastOffering.getDiscountRate(); - return offeringRepository.findHighDiscountOfferingsWithKeyword( - lastDiscountRate, lastOffering.getId(), searchKeyword, pageable); + return fetchOfferings(lastId, lastDiscountRate, searchKeyword, pageable); + } + + private List fetchOfferings(Long lastId, double lastDiscountRate, + String searchKeyword, Pageable pageable) { + if (searchKeyword == null) { + return offeringRepository.findHighDiscountOfferingsWithoutKeyword(lastDiscountRate, lastId, pageable); + } + List offeringsSearchedByTitle = offeringRepository.findHighDiscountOfferingsWithTitleKeyword( + lastDiscountRate, + lastId, + searchKeyword, + pageable); + List offeringsSearchedByMeetingAddress = offeringRepository.findHighDiscountOfferingsWithMeetingAddressKeyword( + lastDiscountRate, + lastId, + searchKeyword, + pageable); + return concat(pageable, sortCondition(), offeringsSearchedByTitle, offeringsSearchedByMeetingAddress); + } + + private Comparator sortCondition() { + return Comparator + .comparing(OfferingEntity::getDiscountRate) + .thenComparing(OfferingEntity::getId, Comparator.reverseOrder()); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/ImminentOfferingStrategy.java b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/ImminentOfferingStrategy.java index 5966f6c5c..04d699386 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/ImminentOfferingStrategy.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/ImminentOfferingStrategy.java @@ -3,6 +3,7 @@ import com.zzang.chongdae.offering.repository.OfferingRepository; import com.zzang.chongdae.offering.repository.entity.OfferingEntity; import java.time.LocalDateTime; +import java.util.Comparator; import java.util.List; import org.springframework.data.domain.Pageable; @@ -13,19 +14,39 @@ public ImminentOfferingStrategy(OfferingRepository offeringRepository) { } @Override - protected List fetchOfferingsWithoutLastId(String searchKeyword, Pageable pageable) { + protected List fetchWithoutLast(Long outOfRangeId, String searchKeyword, Pageable pageable) { LocalDateTime outOfRangeMeetingDate = LocalDateTime.now(); - Long outOfRangeId = findOutOfRangeId(); - return offeringRepository.findImminentOfferingsWithKeyword( - outOfRangeMeetingDate, outOfRangeId, searchKeyword, pageable); + return fetchOfferings(outOfRangeId, outOfRangeMeetingDate, searchKeyword, pageable); } @Override - protected List fetchOfferingsWithLastOffering( - OfferingEntity lastOffering, String searchKeyword, Pageable pageable) { - LocalDateTime lastMeetingDate = lastOffering.getMeetingDate(); + protected List fetchWithLast(OfferingEntity lastOffering, String searchKeyword, Pageable pageable) { Long lastId = lastOffering.getId(); - return offeringRepository.findImminentOfferingsWithKeyword( - lastMeetingDate, lastId, searchKeyword, pageable); + LocalDateTime lastMeetingDate = lastOffering.getMeetingDate(); + return fetchOfferings(lastId, lastMeetingDate, searchKeyword, pageable); + } + + private List fetchOfferings(Long lastId, LocalDateTime lastMeetingDate, + String searchKeyword, Pageable pageable) { + if (searchKeyword == null) { + return offeringRepository.findImminentOfferingsWithoutKeyword(lastMeetingDate, lastId, pageable); + } + List offeringsSearchedByTitle = offeringRepository.findImminentOfferingsWithTitleKeyword( + lastMeetingDate, + lastId, + searchKeyword, + pageable); + List offeringsSearchedByMeetingAddress = offeringRepository.findImminentOfferingsWithMeetingAddressKeyword( + lastMeetingDate, + lastId, + searchKeyword, + pageable); + return concat(pageable, sortCondition(), offeringsSearchedByTitle, offeringsSearchedByMeetingAddress); + } + + private Comparator sortCondition() { + return Comparator + .comparing(OfferingEntity::getMeetingDate) + .thenComparing(OfferingEntity::getId, Comparator.reverseOrder()); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/JoinableOfferingStrategy.java b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/JoinableOfferingStrategy.java index 53f39210e..7c15a3574 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/JoinableOfferingStrategy.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/JoinableOfferingStrategy.java @@ -12,14 +12,20 @@ public JoinableOfferingStrategy(OfferingRepository offeringRepository) { } @Override - protected List fetchOfferingsWithoutLastId(String searchKeyword, Pageable pageable) { - Long outOfRangeId = findOutOfRangeId(); - return offeringRepository.findJoinableOfferingsWithKeyword(outOfRangeId, searchKeyword, pageable); + protected List fetchWithoutLast(Long outOfRangeId, String searchKeyword, Pageable pageable) { + return fetchOfferings(outOfRangeId, searchKeyword, pageable); } @Override - protected List fetchOfferingsWithLastOffering(OfferingEntity lastOffering, String searchKeyword, - Pageable pageable) { - return offeringRepository.findJoinableOfferingsWithKeyword(lastOffering.getId(), searchKeyword, pageable); + protected List fetchWithLast(OfferingEntity lastOffering, String searchKeyword, Pageable pageable) { + Long lastId = lastOffering.getId(); + return fetchOfferings(lastId, searchKeyword, pageable); + } + + private List fetchOfferings(Long outOfRangeId, String searchKeyword, Pageable pageable) { + if (searchKeyword == null) { + return offeringRepository.findJoinableOfferingsWithoutKeyword(outOfRangeId, pageable); + } + return offeringRepository.findJoinableOfferingsWithKeyword(outOfRangeId, searchKeyword, pageable); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/OfferingFetchStrategy.java b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/OfferingFetchStrategy.java index 76343a80e..0a58f7dab 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/OfferingFetchStrategy.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/OfferingFetchStrategy.java @@ -4,8 +4,11 @@ import com.zzang.chongdae.offering.exception.OfferingErrorCode; import com.zzang.chongdae.offering.repository.OfferingRepository; import com.zzang.chongdae.offering.repository.entity.OfferingEntity; +import java.util.Collection; +import java.util.Comparator; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -16,22 +19,38 @@ public abstract class OfferingFetchStrategy { protected final OfferingRepository offeringRepository; - protected Long findOutOfRangeId() { - return Optional.ofNullable(offeringRepository.findMaxId()) - .orElse(0L) + OUT_OF_RANGE_ID_OFFSET; - } - - public List fetchOfferings(String searchKeyword, Long lastId, Pageable pageable) { + public List fetch(String searchKeyword, Long lastId, Pageable pageable) { if (lastId == null) { - return fetchOfferingsWithoutLastId(searchKeyword, pageable); + return fetchWithoutLast(outOfRangeId(), searchKeyword, pageable); } - OfferingEntity lastOffering = offeringRepository.findById(lastId) + return fetchWithLast(lastOffering(lastId), searchKeyword, pageable); + } + + private Long outOfRangeId() { + Long maxId = offeringRepository.findMaxId(); + return Optional.ofNullable(maxId).orElse(0L) + OUT_OF_RANGE_ID_OFFSET; + } + + private OfferingEntity lastOffering(Long lastId) { + return offeringRepository.findById(lastId) .orElseThrow(() -> new MarketException(OfferingErrorCode.NOT_FOUND)); - return fetchOfferingsWithLastOffering(lastOffering, searchKeyword, pageable); } - protected abstract List fetchOfferingsWithoutLastId(String searchKeyword, Pageable pageable); + protected List concat(Pageable pageable, + Comparator sortCondition, + List... offerings) { + return Stream.of(offerings) + .flatMap(Collection::stream) + .sorted(sortCondition) + .limit(pageable.getPageSize()) + .toList(); + } + + protected abstract List fetchWithoutLast(Long outOfRangeId, + String searchKeyword, + Pageable pageable); - protected abstract List fetchOfferingsWithLastOffering( - OfferingEntity lastOffering, String searchKeyword, Pageable pageable); + protected abstract List fetchWithLast(OfferingEntity lastOffering, + String searchKeyword, + Pageable pageable); } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/RecentOfferingStrategy.java b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/RecentOfferingStrategy.java index 0fe1bc3b2..501a15aaf 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/RecentOfferingStrategy.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/domain/offeringfetchstrategy/RecentOfferingStrategy.java @@ -12,14 +12,20 @@ public RecentOfferingStrategy(OfferingRepository offeringRepository) { } @Override - protected List fetchOfferingsWithoutLastId(String searchKeyword, Pageable pageable) { - Long outOfRangeId = findOutOfRangeId(); - return offeringRepository.findRecentOfferingsWithKeyword(outOfRangeId, searchKeyword, pageable); + protected List fetchWithoutLast(Long outOfRangeId, String searchKeyword, Pageable pageable) { + return fetchOfferings(outOfRangeId, searchKeyword, pageable); } @Override - protected List fetchOfferingsWithLastOffering( - OfferingEntity lastOffering, String searchKeyword, Pageable pageable) { - return offeringRepository.findRecentOfferingsWithKeyword(lastOffering.getId(), searchKeyword, pageable); + protected List fetchWithLast(OfferingEntity lastOffering, String searchKeyword, Pageable pageable) { + Long lastOfferingId = lastOffering.getId(); + return fetchOfferings(lastOfferingId, searchKeyword, pageable); + } + + private List fetchOfferings(Long lastOfferingId, String searchKeyword, Pageable pageable) { + if (searchKeyword == null) { + return offeringRepository.findRecentOfferingsWithoutKeyword(lastOfferingId, pageable); + } + return offeringRepository.findRecentOfferingsWithKeyword(lastOfferingId, searchKeyword, pageable); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/repository/OfferingRepository.java b/backend/src/main/java/com/zzang/chongdae/offering/repository/OfferingRepository.java index 4e3201501..c6c3d4063 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/repository/OfferingRepository.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/repository/OfferingRepository.java @@ -1,7 +1,6 @@ package com.zzang.chongdae.offering.repository; import com.zzang.chongdae.member.repository.entity.MemberEntity; -import com.zzang.chongdae.offering.domain.OfferingStatus; import com.zzang.chongdae.offering.repository.entity.OfferingEntity; import java.time.LocalDateTime; import java.util.List; @@ -31,7 +30,15 @@ public interface OfferingRepository extends JpaRepository SELECT o FROM OfferingEntity o WHERE o.id < :lastId - AND (:keyword IS NULL OR o.title LIKE :keyword% OR o.meetingAddress LIKE :keyword%) + ORDER BY o.id DESC + """) + List findRecentOfferingsWithoutKeyword(Long lastId, Pageable pageable); + + @Query(""" + SELECT o + FROM OfferingEntity o + WHERE o.id < :lastId + AND (o.title LIKE :keyword% OR o.meetingAddress LIKE :keyword%) ORDER BY o.id DESC """) List findRecentOfferingsWithKeyword(Long lastId, String keyword, Pageable pageable); @@ -39,32 +46,82 @@ public interface OfferingRepository extends JpaRepository @Query(""" SELECT o FROM OfferingEntity o - WHERE (o.offeringStatus = 'IMMINENT') + WHERE (o.meetingDate > :lastMeetingDate OR (o.meetingDate = :lastMeetingDate AND o.id < :lastId)) + AND (o.offeringStatus = 'IMMINENT') + ORDER BY o.meetingDate ASC, o.id DESC + """) + List findImminentOfferingsWithoutKeyword( + LocalDateTime lastMeetingDate, Long lastId, Pageable pageable); + + @Query(""" + SELECT o + FROM OfferingEntity o + WHERE (o.meetingAddress LIKE :keyword%) + AND (o.offeringStatus = 'IMMINENT') + AND (o.meetingDate > :lastMeetingDate OR (o.meetingDate = :lastMeetingDate AND o.id < :lastId)) + ORDER BY o.meetingDate ASC, o.id DESC + """) + List findImminentOfferingsWithMeetingAddressKeyword( + LocalDateTime lastMeetingDate, Long lastId, String keyword, Pageable pageable); + + @Query(""" + SELECT o + FROM OfferingEntity o + WHERE (o.title LIKE :keyword%) + AND (o.offeringStatus = 'IMMINENT') AND (o.meetingDate > :lastMeetingDate OR (o.meetingDate = :lastMeetingDate AND o.id < :lastId)) - AND (:keyword IS NULL OR o.title LIKE :keyword% OR o.meetingAddress LIKE :keyword%) ORDER BY o.meetingDate ASC, o.id DESC """) - List findImminentOfferingsWithKeyword( + List findImminentOfferingsWithTitleKeyword( LocalDateTime lastMeetingDate, Long lastId, String keyword, Pageable pageable); @Query(""" SELECT o FROM OfferingEntity o - WHERE (o.offeringStatus != 'CONFIRMED') - AND (o.discountRate IS NOT NULL) - AND (o.discountRate < :lastDiscountRate OR (o.discountRate = :lastDiscountRate AND o.id < :lastId)) - AND (:keyword IS NULL OR o.title LIKE :keyword% OR o.meetingAddress LIKE :keyword%) + WHERE ((o.discountRate < :lastDiscountRate) or (o.discountRate = :lastDiscountRate AND o.id < :lastId)) + AND (o.offeringStatus IN ('AVAILABLE', 'FULL', 'IMMINENT')) + ORDER BY o.discountRate DESC, o.id DESC + """) + List findHighDiscountOfferingsWithoutKeyword( + double lastDiscountRate, Long lastId, Pageable pageable); + + @Query(""" + SELECT o + FROM OfferingEntity o + WHERE (o.title LIKE :keyword%) + AND (o.offeringStatus IN ('AVAILABLE', 'FULL', 'IMMINENT')) + AND ((o.discountRate < :lastDiscountRate) or (o.discountRate = :lastDiscountRate AND o.id < :lastId)) + ORDER BY o.discountRate DESC, o.id DESC + """) + List findHighDiscountOfferingsWithTitleKeyword( + double lastDiscountRate, Long lastId, String keyword, Pageable pageable); + + @Query(""" + SELECT o + FROM OfferingEntity o + WHERE (o.meetingAddress LIKE :keyword%) + AND (o.offeringStatus IN ('AVAILABLE', 'FULL', 'IMMINENT')) + AND ((o.discountRate < :lastDiscountRate) or (o.discountRate = :lastDiscountRate AND o.id < :lastId)) ORDER BY o.discountRate DESC, o.id DESC """) - List findHighDiscountOfferingsWithKeyword( + List findHighDiscountOfferingsWithMeetingAddressKeyword( double lastDiscountRate, Long lastId, String keyword, Pageable pageable); @Query(""" SELECT o FROM OfferingEntity o - WHERE (o.offeringStatus IN ('AVAILABLE', 'IMMINENT')) - AND (o.id < :lastId) - AND (:keyword IS NULL OR o.title LIKE :keyword% OR o.meetingAddress LIKE :keyword%) + WHERE (o.id < :lastId) + AND (o.offeringStatus IN ('AVAILABLE', 'IMMINENT')) + ORDER BY o.id DESC + """) + List findJoinableOfferingsWithoutKeyword(Long lastId, Pageable pageable); + + @Query(""" + SELECT o + FROM OfferingEntity o + WHERE (o.id < :lastId) + AND (o.title LIKE :keyword% OR o.meetingAddress LIKE :keyword%) + AND (o.offeringStatus IN ('AVAILABLE', 'IMMINENT')) ORDER BY o.id DESC """) List findJoinableOfferingsWithKeyword(Long lastId, String keyword, Pageable pageable); @@ -76,8 +133,7 @@ List findHighDiscountOfferingsWithKeyword( SELECT o FROM OfferingEntity o WHERE o.meetingDate = :meetingDate - AND o.offeringStatus != :offeringStatus + AND (o.offeringStatus IN ('AVAILABLE', 'FULL', 'IMMINENT')) """) - List findByMeetingDateAndOfferingStatusNot(LocalDateTime meetingDate, - OfferingStatus offeringStatus); + List findByMeetingDateAndOfferingStatusNotConfirmed(LocalDateTime meetingDate); } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/service/OfferingFetcher.java b/backend/src/main/java/com/zzang/chongdae/offering/service/OfferingFetcher.java index 62a6967af..0f8019cb8 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/service/OfferingFetcher.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/service/OfferingFetcher.java @@ -39,6 +39,6 @@ public List fetchOfferings( if (strategy == null) { throw new MarketException(OfferingErrorCode.NOT_SUPPORTED_FILTER); } - return strategy.fetchOfferings(searchKeyword, lastId, pageable); + return strategy.fetch(searchKeyword, lastId, pageable); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/service/OfferingService.java b/backend/src/main/java/com/zzang/chongdae/offering/service/OfferingService.java index 77ac05781..3d1d4b0b6 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/service/OfferingService.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/service/OfferingService.java @@ -7,6 +7,7 @@ import com.zzang.chongdae.offering.domain.OfferingJoinedCount; import com.zzang.chongdae.offering.domain.OfferingMeeting; import com.zzang.chongdae.offering.domain.OfferingPrice; +import com.zzang.chongdae.offering.domain.OfferingStatus; import com.zzang.chongdae.offering.domain.UpdatedOffering; import com.zzang.chongdae.offering.exception.OfferingErrorCode; import com.zzang.chongdae.offering.repository.OfferingRepository; @@ -28,7 +29,9 @@ import com.zzang.chongdae.offeringmember.repository.OfferingMemberRepository; import com.zzang.chongdae.offeringmember.repository.entity.OfferingMemberEntity; import com.zzang.chongdae.storage.service.StorageService; +import java.time.Clock; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; import lombok.RequiredArgsConstructor; @@ -47,6 +50,7 @@ public class OfferingService { private final StorageService storageService; private final ProductImageExtractor imageExtractor; private final OfferingFetcher offeringFetcher; + private final Clock clock; public OfferingDetailResponse getOfferingDetail(Long offeringId, MemberEntity member) { OfferingEntity offering = offeringRepository.findById(offeringId) @@ -106,6 +110,7 @@ public OfferingMeetingResponse updateOfferingMeeting( OfferingEntity offering = offeringRepository.findById(offeringId) .orElseThrow(() -> new MarketException(OfferingErrorCode.NOT_FOUND)); validateIsProposer(offering, member); + validateMeetingDate(request.meetingDate()); OfferingMeeting offeringMeeting = request.toOfferingMeeting(); offering.updateMeeting(offeringMeeting); return new OfferingMeetingResponse(offering.toOfferingMeeting()); @@ -120,7 +125,7 @@ private void validateIsProposer(OfferingEntity offering, MemberEntity member) { @WriterDatabase public Long saveOffering(OfferingSaveRequest request, MemberEntity member) { OfferingEntity offering = request.toEntity(member); - validateMeetingDate(offering); + validateMeetingDate(offering.getMeetingDate()); OfferingEntity savedOffering = offeringRepository.save(offering); OfferingMemberEntity offeringMember = new OfferingMemberEntity(member, offering, OfferingMemberRole.PROPOSER); @@ -129,9 +134,10 @@ public Long saveOffering(OfferingSaveRequest request, MemberEntity member) { return savedOffering.getId(); } - private void validateMeetingDate(OfferingEntity offering) { - LocalDate thresholdDate = LocalDate.now().plusDays(1); - if (offering.getMeetingDate().toLocalDate().isBefore(thresholdDate)) { + private void validateMeetingDate(LocalDateTime offeringMeetingDateTime) { + LocalDate thresholdDate = LocalDate.now(clock); + LocalDate targetDate = offeringMeetingDateTime.toLocalDate(); + if (targetDate.isBefore(thresholdDate)) { throw new MarketException(OfferingErrorCode.CANNOT_MEETING_DATE_BEFORE_THAN_TOMORROW); } } @@ -151,10 +157,11 @@ public OfferingProductImageResponse extractProductImageFromOg(OfferingProductIma public OfferingUpdateResponse updateOffering(Long offeringId, OfferingUpdateRequest request, MemberEntity member) { OfferingEntity offering = offeringRepository.findById(offeringId) .orElseThrow(() -> new MarketException(OfferingErrorCode.NOT_FOUND)); - UpdatedOffering updatedOffering = request.toUpdatedOffering(); validateIsProposer(offering, member); + UpdatedOffering updatedOffering = request.toUpdatedOffering(); validateUpdatedTotalCount(offering.getCurrentCount(), updatedOffering.getOfferingPrice().getTotalCount()); offering.update(updatedOffering); + updateStatus(offering); return new OfferingUpdateResponse(offering, offering.toOfferingPrice(), offering.toOfferingJoinedCount()); } @@ -164,6 +171,16 @@ private void validateUpdatedTotalCount(Integer currentCount, Integer updatedTota } } + private void updateStatus(OfferingEntity offering) { // TODO : 도메인 분리 필요 + OfferingStatus offeringStatus = offering.toOfferingJoinedCount().decideOfferingStatus(); + LocalDate tomorrow = LocalDate.now(clock).plusDays(1); + LocalDate meetingDate = offering.getMeetingDate().toLocalDate(); + if (meetingDate.isBefore(tomorrow) || meetingDate.isEqual(tomorrow)) { + offeringStatus = OfferingStatus.IMMINENT; + } + offering.updateOfferingStatus(offeringStatus); + } + @WriterDatabase public void deleteOffering(Long offeringId, MemberEntity member) { OfferingEntity offering = offeringRepository.findById(offeringId) diff --git a/backend/src/main/java/com/zzang/chongdae/scheduler/service/SchedulerService.java b/backend/src/main/java/com/zzang/chongdae/scheduler/service/SchedulerService.java index 7b6e1842d..38387450d 100644 --- a/backend/src/main/java/com/zzang/chongdae/scheduler/service/SchedulerService.java +++ b/backend/src/main/java/com/zzang/chongdae/scheduler/service/SchedulerService.java @@ -25,21 +25,20 @@ public class SchedulerService { public void run() { LocalDateTime today = LocalDate.now().atStartOfDay(); LocalDateTime tomorrow = today.plusDays(1); + LocalDateTime yesterday = today.minusDays(1); - updateStatusConfirmedDaily(today); + updateStatusConfirmedDaily(yesterday); updateStatusImminentDaily(tomorrow); } private void updateStatusConfirmedDaily(LocalDateTime meetingDate) { - List offerings - = offeringRepository.findByMeetingDateAndOfferingStatusNot(meetingDate, OfferingStatus.CONFIRMED); + List offerings = offeringRepository.findByMeetingDateAndOfferingStatusNotConfirmed(meetingDate); offerings.forEach(offering -> offering.updateOfferingStatus(OfferingStatus.CONFIRMED)); offerings.forEach(offering -> offering.updateRoomStatus(CommentRoomStatus.BUYING)); } private void updateStatusImminentDaily(LocalDateTime meetingDate) { - List offerings - = offeringRepository.findByMeetingDateAndOfferingStatusNot(meetingDate, OfferingStatus.CONFIRMED); + List offerings = offeringRepository.findByMeetingDateAndOfferingStatusNotConfirmed(meetingDate); offerings.forEach(offering -> offering.updateOfferingStatus(OfferingStatus.IMMINENT)); } } diff --git a/backend/src/main/resources/templates/index.html b/backend/src/main/resources/templates/index.html index 92b36b513..020320325 100644 --- a/backend/src/main/resources/templates/index.html +++ b/backend/src/main/resources/templates/index.html @@ -279,7 +279,7 @@ if (offering.status === 'IMMINENT') { statusClass = 'status-imminent'; statusName = '마감임박'; - } else if (offering.status === 'CLOSED') { + } else if (offering.status === 'CONFIRMED') { statusClass = 'status-closed'; statusName = '모집마감'; } else if (offering.status === 'FULL') { diff --git a/backend/src/test/java/com/zzang/chongdae/comment/service/CommentServiceTest.java b/backend/src/test/java/com/zzang/chongdae/comment/service/CommentServiceTest.java index d582fb2d5..511ebe5d5 100644 --- a/backend/src/test/java/com/zzang/chongdae/comment/service/CommentServiceTest.java +++ b/backend/src/test/java/com/zzang/chongdae/comment/service/CommentServiceTest.java @@ -1,8 +1,10 @@ package com.zzang.chongdae.comment.service; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import com.zzang.chongdae.comment.service.dto.CommentRoomAllResponse; +import com.zzang.chongdae.comment.service.dto.CommentRoomAllResponseItem; import com.zzang.chongdae.comment.service.dto.CommentRoomInfoResponse; import com.zzang.chongdae.global.service.ServiceTest; import com.zzang.chongdae.member.repository.entity.MemberEntity; @@ -24,13 +26,24 @@ public class CommentServiceTest extends ServiceTest { class GetAllCommentRoom { MemberEntity member; - OfferingEntity offering; + OfferingEntity firstOffering; + OfferingEntity secondOffering; + OfferingEntity thirdOffering; + OfferingEntity fourthOffering; @BeforeEach void setUp() { member = memberFixture.createMember("dora"); - offering = offeringFixture.createOffering(member); - offeringMemberFixture.createProposer(member, offering); + firstOffering = offeringFixture.createOffering(member); + secondOffering = offeringFixture.createOffering(member); + thirdOffering = offeringFixture.createOffering(member); + fourthOffering = offeringFixture.createOffering(member); + offeringMemberFixture.createProposer(member, firstOffering); + offeringMemberFixture.createProposer(member, secondOffering); + offeringMemberFixture.createProposer(member, thirdOffering); + offeringMemberFixture.createProposer(member, fourthOffering); + commentFixture.createComment(member, firstOffering); + commentFixture.createComment(member, secondOffering); } @DisplayName("로그인한 유저가 참여한 댓글방 목록을 조회할 수 있다") @@ -40,20 +53,32 @@ void should_getAllCommentRoom_when_givenLoginMember() { CommentRoomAllResponse response = commentService.getAllCommentRoom(member); // then - assertEquals(response.offerings().size(), 1); + assertEquals(response.offerings().size(), 4); + } + + @DisplayName("최근 댓글이 작성된 순으로 정렬해 댓글방 목록을 조회할 수 있다") + @Test + void should_getAllCommentRoomWithOrder_when_givenLoginMember() { + // when + CommentRoomAllResponse response = commentService.getAllCommentRoom(member); + + // then + assertThat(response.offerings()) + .extracting(CommentRoomAllResponseItem::offeringId) + .containsExactly(2L, 1L, 3L, 4L); } @DisplayName("댓글방 목록 조회 시 삭제된 공모에 대한 댓글방은 제목에 삭제되었다고 명시되어 있다") @Test void should_getAllCommentRoomWithDeletedCommentRoom_when_giveLoginMember() { // given - offeringFixture.deleteOffering(offering); + offeringFixture.deleteOffering(firstOffering); // when CommentRoomAllResponse response = commentService.getAllCommentRoom(member); // then - assertEquals(response.offerings().get(0).offeringTitle(), "삭제된 공동구매입니다."); + assertEquals(response.offerings().get(1).offeringTitle(), "삭제된 공동구매입니다."); } } diff --git a/backend/src/test/java/com/zzang/chongdae/global/service/ServiceTest.java b/backend/src/test/java/com/zzang/chongdae/global/service/ServiceTest.java index 1dc08d28c..0d5973e33 100644 --- a/backend/src/test/java/com/zzang/chongdae/global/service/ServiceTest.java +++ b/backend/src/test/java/com/zzang/chongdae/global/service/ServiceTest.java @@ -4,6 +4,7 @@ import com.zzang.chongdae.global.domain.DomainSupplier; import com.zzang.chongdae.global.helper.CookieProvider; import com.zzang.chongdae.global.helper.DatabaseCleaner; +import java.time.Clock; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -20,6 +21,9 @@ public abstract class ServiceTest extends DomainSupplier { @Autowired protected CookieProvider cookieProvider; + @Autowired + protected Clock clock; + @BeforeEach protected void setUp() { databaseCleaner.execute(); diff --git a/backend/src/test/java/com/zzang/chongdae/offering/integration/OfferingIntegrationTest.java b/backend/src/test/java/com/zzang/chongdae/offering/integration/OfferingIntegrationTest.java index d660abd9f..10c377e8b 100644 --- a/backend/src/test/java/com/zzang/chongdae/offering/integration/OfferingIntegrationTest.java +++ b/backend/src/test/java/com/zzang/chongdae/offering/integration/OfferingIntegrationTest.java @@ -513,7 +513,7 @@ void should_createOffering_when_givenOfferingCreateRequest() { "서울특별시 광진구 구의강변로 3길 11", "상세주소아파트", "구의동", - LocalDateTime.now().plusDays(1), + LocalDateTime.now(clock).plusDays(1), "내용입니다." ); @@ -540,7 +540,7 @@ void should_createOffering_when_givenOfferingWithoutOriginPriceCreateRequest() { "서울특별시 광진구 구의강변로 3길 11", "상세주소아파트", "구의동", - LocalDateTime.now().plusDays(1), + LocalDateTime.now(clock).plusDays(1), "내용입니다." ); @@ -635,7 +635,7 @@ void should_throwException_when_overMaximumTotalCount() { .statusCode(400); } - @DisplayName("거래 날짜를 내일보다 과거로 설정하는 경우 예외가 발생한다.") + @DisplayName("거래 날짜를 오늘보다 과거로 설정하는 경우 예외가 발생한다.") @Test void should_throwException_when_meetingDateBeforeTomorrow() { OfferingSaveRequest request = new OfferingSaveRequest( @@ -648,7 +648,7 @@ void should_throwException_when_meetingDateBeforeTomorrow() { "서울특별시 광진구 구의강변로 3길 11", "상세주소아파트", "구의동", - LocalDateTime.now(), + LocalDateTime.now(clock).minusDays(1), "내용입니다." ); @@ -946,7 +946,7 @@ void should_throwException_when_updateTotalCountLessEqualThanCurrentCount() { .statusCode(400); } - @DisplayName("모집 날짜가 현재와 같거나 지날 경우 수정할 수 없다.") + @DisplayName("모집 날짜가 지날 경우 수정할 수 없다.") @Test void should_throwException_when_modifyMeetingDateBeforeNowToday() { OfferingUpdateRequest request = new OfferingUpdateRequest( @@ -959,7 +959,7 @@ void should_throwException_when_modifyMeetingDateBeforeNowToday() { "수정할 모집 장소 주소", "수정할 모집 상세 주소", "수정된동", - LocalDateTime.now(), + LocalDateTime.now().minusDays(1), "수정할 공모 상세 내용" ); diff --git a/backend/src/test/java/com/zzang/chongdae/offering/service/OfferingServiceTest.java b/backend/src/test/java/com/zzang/chongdae/offering/service/OfferingServiceTest.java index b776e9a34..98c472ec2 100644 --- a/backend/src/test/java/com/zzang/chongdae/offering/service/OfferingServiceTest.java +++ b/backend/src/test/java/com/zzang/chongdae/offering/service/OfferingServiceTest.java @@ -336,7 +336,7 @@ void should_createOffering_when_givenOfferingWithoutOriginPriceCreateRequest() { "서울특별시 광진구 구의강변로 3길 11", "상세주소아파트", "구의동", - LocalDateTime.now().plusDays(1), + LocalDateTime.now(clock).plusDays(1), "내용입니다." ); Long expected = 1L;