From 17b4bc1284aca88699824351d3e8240979062e43 Mon Sep 17 00:00:00 2001 From: linirini <101927543+linirini@users.noreply.github.com> Date: Thu, 12 Sep 2024 14:36:38 +0900 Subject: [PATCH] deploy: v1.0.2 (#369) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: PR 템플릿 파일명 및 경로 수정 * refactor: pr 템플릿 경로 수정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * docs: 서비스 소개글 작성 (#127) * docs: PR 템플릿 오타 수정 (#154) - 오타 수정 및 개행 조정 - Issue Number 태그 형식 추가 * deploy: 스타카토 v1.0.0 #312 (#313) * init: 프로젝트 세팅 * refactor: PR 템플릿 파일명 및 경로 수정 * refactor: pr 템플릿 경로 수정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * build: develop-be 브랜치의 CI 설정 #6 (#7) * build: 초기 ci 템플릿 생성 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * build: ci 초기 트리거 설정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * fix: 권한 수정 설정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * fix: working directory 설정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * fix: 권한 재설정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo --------- Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * feat: Entity 구성 #2 (#17) * chore: 데이터 베이스 설정 * feat: Base Entity 구성 * feat: Pin Entity 구성 * feat: Travel Entity 구성 * feat: Member Entity 구성 * feat: Mate Entity 구성 * feat: Visit Entity 구성 * feat: Visit Image Entity 구성 * feat: Visit Log Entity 구성 * refactor: Table 애노테이션 삭제 * refactor: Soft Delete 적용 * feat: ControllerAdvice 생성 #29 (#34) * feat: Visit domain skeleton 구현 #31 (#37) Co-authored-by: linirini <2001yerin@naver.com> * feat: Travel Domain Skeleton Code 작성 #32 (#36) * feat: travel skeleton code 작성 * feat: travel 생성, 수정 dto 작성 및 예외 핸들링 * feat: Mate 도메인 빌더 추가 * style: 코드 컨벤션 준수를 위한 공백 제거 * build: Docker Compose Setting #27 (#40) * chore: gitignore 파일 추가 * chore: mysql 디펜던시 추가 * chore: Profile 분리 * feat: Docker 파일 설정 * feat: 여행 상세 생성 API 구현 #18 (#43) * build: RestAssured 의존성 추가 * test: 여행 상세 생성 인수 테스트 작성 * feat: 임시 MemberIdArgumentResolver 구현 * feat: Lombok 추가 * feat: Database 초기화 구현 * feat: 여행 상세 성공 서비스 구현 * fix: resolveArgument 반환 타입 오류 수정 * feat: 여행 상세 생성 성공 컨트롤러 구현 * feat: 여행 상세 생성 시 필수값 누락 검증 구현 * test: 글자 수 제한 검증 인수 테스트 추가 * refactor: 생성자에 builder 지정 * feat: 시작 날짜와 끝 날짜 도메인 검증 구현 * feat: 시작 날짜와 끝 날짜 예외 처리 테스트 및 구현 * style: 코드 컨벤션 적용 * refactor: parameter명 변경 * feat: transactional 적용 * style: paremeter 형식 통일 * style: parameter 형식 통일 * refactor: display name 오류 수정 * refactor: 불필요한 상수 제거 * refactor: paramterized test로 리팩터링 * style: 개행 제거 * refactor: 인자 변경 * refactor: 공통 예외 클래스명 변경 * feat: 범위 예외 핸들러 추가 * refactor: 서비스, 통합 테스트 보일러 플레이트 코드 제거 * refactor: builder 사용 시 필수 값 누락 제약 추가 * refactor: 도메인으로 변환하는 메서드를 dto에 추가 * build: CD yml 파일 구성 #28 (#53) * feat: CI/CD 설정 * feat: CI/CD 검증용 트리거 설정 * fix: CI/CD workflow 수정 * fix: CI/CD workflow 재수정 * fix: CI/CD workflow 절대 경로 수정 * chore: DDL 생성 전략 변경 * chore: dev 환경 DDL 생성 전략 변경 * refactor: 검증용 트리거 제거 * fix: 도커 이미지 기반 컨테이너 생성으로 변경 * refactor: 중간 테이블 엔티티 수정 #56 (#57) * refactor: 중간 테이블명 TravelMember로 변경 * refactor: 중간 테이블 OneToMany 필드 추가 * refactor: Member OneToMany 제거 * refactor: OneToMany List 초기화 * refactor: 연관관계 편의 메서드 사용 * chore: ddl 전략 임시 변경 * chore: ddl 전략 변경 * feat: 특정 방문 기록 삭제 API 구현 #26 (#42) * feat: 특정 방문 기록 삭제 API 구현 * feat: 양수가 아닌 id로 특정 방문 기록 삭제를 시도할 때 예외 처리 기능 구현 * feat: 방문 기록 삭제 시 방문 로그도 함께 삭제되는 기능 구현 * refactor: 커스텀 예외를 제거하는 방향으로 변경 * fix: 예외를 못 잡던 문제 해결 * refactor: 메서드명 적절하게 변경 * build: Docker Compose Setting #27 (#40) * chore: gitignore 파일 추가 * chore: mysql 디펜던시 추가 * chore: Profile 분리 * feat: Docker 파일 설정 * feat: 여행 상세 생성 API 구현 #18 (#43) * build: RestAssured 의존성 추가 * test: 여행 상세 생성 인수 테스트 작성 * feat: 임시 MemberIdArgumentResolver 구현 * feat: Lombok 추가 * feat: Database 초기화 구현 * feat: 여행 상세 성공 서비스 구현 * fix: resolveArgument 반환 타입 오류 수정 * feat: 여행 상세 생성 성공 컨트롤러 구현 * feat: 여행 상세 생성 시 필수값 누락 검증 구현 * test: 글자 수 제한 검증 인수 테스트 추가 * refactor: 생성자에 builder 지정 * feat: 시작 날짜와 끝 날짜 도메인 검증 구현 * feat: 시작 날짜와 끝 날짜 예외 처리 테스트 및 구현 * style: 코드 컨벤션 적용 * refactor: parameter명 변경 * feat: transactional 적용 * style: paremeter 형식 통일 * style: parameter 형식 통일 * refactor: display name 오류 수정 * refactor: 불필요한 상수 제거 * refactor: paramterized test로 리팩터링 * style: 개행 제거 * refactor: 인자 변경 * refactor: 공통 예외 클래스명 변경 * feat: 범위 예외 핸들러 추가 * refactor: 서비스, 통합 테스트 보일러 플레이트 코드 제거 * refactor: builder 사용 시 필수 값 누락 제약 추가 * refactor: 도메인으로 변환하는 메서드를 dto에 추가 * build: CD yml 파일 구성 #28 (#53) * feat: CI/CD 설정 * feat: CI/CD 검증용 트리거 설정 * fix: CI/CD workflow 수정 * fix: CI/CD workflow 재수정 * fix: CI/CD workflow 절대 경로 수정 * chore: DDL 생성 전략 변경 * chore: dev 환경 DDL 생성 전략 변경 * refactor: 검증용 트리거 제거 * fix: 도커 이미지 기반 컨테이너 생성으로 변경 * fix: rebase 과정에서 파일이 꼬인 문제 해결 * test: HttpHeaders.AUTHORIZATION 사용 * refactor: 중간 테이블 엔티티 수정 #56 (#57) * refactor: 중간 테이블명 TravelMember로 변경 * refactor: 중간 테이블 OneToMany 필드 추가 * refactor: Member OneToMany 제거 * refactor: OneToMany List 초기화 * refactor: 연관관계 편의 메서드 사용 * chore: ddl 전략 임시 변경 * chore: ddl 전략 변경 * feat: Pin, Visit, VisitLog 생성자에 builder 추가 * feat: Pin repository 추가 * refactor: visit이 삭제되기 전에 visit에 의존하는 visitLog들이 먼저 삭제되도록 순서 변경 * test: 방문 기록 삭제에 대한 서비스 슬라이스 테스트 추가 * test: 방문 기록이 갖는 모든 방문 로그 삭제 메서드 테스트 * fix: Modifying을 사용할 때 영속성컨텍스트와 관련하여 발생하던 문제 해결 * refactor: visitLog의 content를 필수값으로 변경 * test: 컨벤션에 맞게 Controller 테스트 클래스 변경 * fix: ConstraintViolationException의 예외 메시지를 정해둔 형식에 맞게 변경 --------- Co-authored-by: YoonJuHo Co-authored-by: linirini <101927543+linirini@users.noreply.github.com> * refactor: 여행 상세 생성 서비스 반환 타입 변경 (#63) * feat: 여행 상세 목록 조회 API 구현 #19 (#60) * test: 여행 상세 목록 조회 통합 테스트 작성 * feat: 여행 상세 목록 조회 DTO 구현 * feat: 모든 여행 상세 목록 조회 서비스 구현 * refactor: 미사용 반환값 제거 * feat: 년도 조건에 따른 여행 상세 조회 서비스 구현 * test: import 수정 * test: 년도와 사용자 식별자로 여행 목록 조회하는 JPQL 테스트 추가 * style: 코드 컨벤션 적용 * test: 여행 상세 목록 조회 컨트롤러 구현 * test: disabled 제거 및 테스트 오류 수정 * refactor: 불필요한 변수 분리 제거 * refactor: Optional로 분기 처리 * test: DisplayName 수정 * refactor: DTO 이름 변경 * feat: 방문 기록 생성 API 구현 #21 (#64) * feat: 방문 기록 생성 기능 구현 * feat: getter 및 builder 추가 * feat: VisitService에 Transactional 적용 * test: 방문 기록 생성 테스트 * fix: 오타 수정 * style: 코드 컨벤션 적용 * fix: deleteById에 Transactional annotation 추가 * refactor: builder 파라미터 NonNull 설정 추가 * refactor: 데이터 개수 감소 * refactor: 예외 메시지 구체화 및 상태 코드 변경 * feat: 특정 여행 상세 수정 API 구현 #22 (#62) * build: Docker Compose Setting #27 (#40) * chore: gitignore 파일 추가 * chore: mysql 디펜던시 추가 * chore: Profile 분리 * feat: Docker 파일 설정 * feat: 여행 상세 생성 API 구현 #18 (#43) * build: RestAssured 의존성 추가 * test: 여행 상세 생성 인수 테스트 작성 * feat: 임시 MemberIdArgumentResolver 구현 * feat: Lombok 추가 * feat: Database 초기화 구현 * feat: 여행 상세 성공 서비스 구현 * fix: resolveArgument 반환 타입 오류 수정 * feat: 여행 상세 생성 성공 컨트롤러 구현 * feat: 여행 상세 생성 시 필수값 누락 검증 구현 * test: 글자 수 제한 검증 인수 테스트 추가 * refactor: 생성자에 builder 지정 * feat: 시작 날짜와 끝 날짜 도메인 검증 구현 * feat: 시작 날짜와 끝 날짜 예외 처리 테스트 및 구현 * style: 코드 컨벤션 적용 * refactor: parameter명 변경 * feat: transactional 적용 * style: paremeter 형식 통일 * style: parameter 형식 통일 * refactor: display name 오류 수정 * refactor: 불필요한 상수 제거 * refactor: paramterized test로 리팩터링 * style: 개행 제거 * refactor: 인자 변경 * refactor: 공통 예외 클래스명 변경 * feat: 범위 예외 핸들러 추가 * refactor: 서비스, 통합 테스트 보일러 플레이트 코드 제거 * refactor: builder 사용 시 필수 값 누락 제약 추가 * refactor: 도메인으로 변환하는 메서드를 dto에 추가 * build: CD yml 파일 구성 #28 (#53) * feat: CI/CD 설정 * feat: CI/CD 검증용 트리거 설정 * fix: CI/CD workflow 수정 * fix: CI/CD workflow 재수정 * fix: CI/CD workflow 절대 경로 수정 * chore: DDL 생성 전략 변경 * chore: dev 환경 DDL 생성 전략 변경 * refactor: 검증용 트리거 제거 * fix: 도커 이미지 기반 컨테이너 생성으로 변경 * refactor: 중간 테이블 엔티티 수정 #56 (#57) * refactor: 중간 테이블명 TravelMember로 변경 * refactor: 중간 테이블 OneToMany 필드 추가 * refactor: Member OneToMany 제거 * refactor: OneToMany List 초기화 * refactor: 연관관계 편의 메서드 사용 * chore: ddl 전략 임시 변경 * chore: ddl 전략 변경 * feat: 비어있는 요청 에러 핸들링 추가 * feat: 특정 여행 상세 수정 서비스 구현 * feat: 특정 여행 상세 수정 컨트롤러 구현 * feat: 비어있는 요청 에러 핸들링 추가 * feat: 특정 여행 상세 수정 서비스 구현 * feat: 특정 여행 상세 수정 컨트롤러 구현 * refactor: DirtiesContext 삭제 * refactor: Transactional 읽기 전용 옵션 구성 * feat: 방문 기록 날짜 검증 로직 추가 * refactor: 메서드 체이닝 적용 * refactor: 수정 작업 테스트 환경 동일하게 유지 --------- Co-authored-by: linirini <101927543+linirini@users.noreply.github.com> Co-authored-by: devhoya97 <146502065+devhoya97@users.noreply.github.com> * fix: 논리적 삭제 데이터는 조회에서 제외 #66 (#68) * test: 쿼리 메서드 사용 * fix: sqlDelete문에 테이블명 변경사항 반영 * fix: 삭제된 데이터 제외하고 조회하도록 조건 추가 * fix: 삭제된 데이터 제외하고 조회하도록 조건 추가 * fix: 특정 방문 기록 삭제 API 호출 시 관련된 VisitImage를 모두 삭제하도록 수정 #65 (#67) * feat: visitId에 맞는 visitImage들을 모두 삭제하는 기능 구현 * fix: visit을 삭제해도 visit에 포함된 모든 visitImage들이 삭제되지 않던 문제 해결 * test: 엔티티 생성시 가독성을 위한 개행 삭제 * refactor: JPQL에서 VisitLog를 vl로 축약 * fix: 충돌해결 * test: 경계값에 포함되지 않는 변수 제거 * feat: 특정 여행 상세 조회 API 구현 #20 (#73) * test: 특정 여행 상세 조회 통합 테스트 작성 * feat: 특정 여행 상세 조회 DTO 구현 * fix: 삭제되지 않은 데이터만 찾도록 쿼리 메서드 수정 * feat: 특정 여행 상세 조회 서비스 구현 * feat: 특정 여행 상세 조회 컨트롤러 구현 * test: 존재하지 않는 특정 여행 상세 조회 테스트 * feat: null 필드 응답에 미포함 구현 * style: 코드 컨벤션 적용 * fix: 응답 형식 오류 수정 * feat: 특정 여행 상세 삭제 API 구현 #24 (#72) * style: 코드 컨벤션 적용 * feat: 특정 여행 상세 삭제 서비스 구현 * feat: 특정 여행 상세 삭제 컨트롤러 구현 * refactor: 검증 메서드 분리 * refactor: Visit 논리적 삭제 전파 순서 수정 * feat: 특정 방문 기록 조회 API 구현 #25 (#76) * feat: 특정 방문 기록 조회 API 기능 구현 * fix: Repository 조회시 논리적 삭제가 되지 않은 엔티티들만 가져오도록 변경 * test: System.out 메서드 제거 * refactor: 메서드명 통일 및 CRUD 순서로 배치 * refactor: 사용하지 않는 DTO 제거 * test: 서비스 메서드명 변경에 따른 테스트 메서드명 변경 * fix: 특정 방문 기록이 몇 번째 방문인지 계산할 때, 더 늦게 방문한 기록까지 세던 문제 해결 * test: 몇 번째 방문인지 계산할 때, 이전의 방문만 셀 수 있는지 테스트 * feat: Pin 연관관계 추가 #80 (#83) * feat: Pin에 Member 연관관계 추가 * refactor: private 보조 메서드 순서 변경 * feat: logging 추가 #86 (#89) * feat: 간단한 Error Logging 추가 * refactor: Logging Level 변경 * feat: VisitLog, VisitImage 양방향 관계 설정 및 논리적 삭제 제거 #87 (#88) * feat: visitLog, visitImage 논리적 삭제 제거 * feat: visitLog, visitImage 양방향 설정 및 양방향 관계 설정에 따른 여행, 방문기록 삭제 로직 변경 * fix: 여행 상세 수정 날짜 필터링 오류와 썸네일 저장 오류 수정 #90 (#91) * fix: 여행 상세 수정 날짜 필터링 오류 수정 * fix: 여행 상세 생성 시 썸네일을 저장하지 않는 오류 수정 * refactor: dto 필드 수정 (#95) * feat: 여행 상세 목록 조회 시 최신순 정렬 #96 (#100) * feat: 여행 상세 목록 최신순으로 조회 * refactor: JPQL 메서드명 변경 * feat: 특정 여행 상세 조회 API에서 방문 기록 오래된 순 정렬 #101 (#102) * refactor: 반환값 제거 및 미사용 Param 제거 * feat: 특정 여행 상세 조회 시 방문 기록 오래된 순 조회 구현 * fix: Travel 삭제시 발생하는 오류 수정 #103 (#105) * fix: 여행에 포함된 방문 기록의 존재 여부를 검사할 때 논리적으로 삭제되지 않은 방문 기록만 고려하도록 수정 * fix: 여행을 삭제하면 연관된 TravelMember에 논리적 삭제가 전파되도록 수정 * refactor: JPQL에서 쿼리메서드로 변경 * refactor: @SQLRestriction으로 soft-delete하도록 변경 #106 (#107) * refactor: @SQLRestriction으로 soft-delete하도록 변경 * fix: 정렬 조건 누락 추가 * test: displayName 변경 * docs: swagger 컨벤션 설정 및 적용 (#116) * build: 중복 의존성 정의 제거 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * build: OpenApi 의존성 추가 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * chore: 전역적인 media type 설정 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * chore: open api skeleton code 작성 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * fix: constraint redefine 불가로 인한 오류 수정 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * style: 의미없는 개행 제거 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * docs: 누락된 설명 추가 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls --------- Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * feat: Entity 수정 (#119) * feat: 엔티티 구조 변경 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * style: 불필요한 개행 제거 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls --------- Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * build: 사용하지 않는 도커 이미지 삭제 workflow 구성 #84 (#120) * build: CD 작업 시 기존 도커 이미지 삭제 * build: CD 작업 시 기존 도커 이미지 삭제 순서 변경 * build: CD 트리거 수정 * refactor: 엔티티 수정 #125 (#126) * refactor: base entity 필드명 수정 * refactor: visitLog에 base Entity 추가 및 논리적 삭제 구현 * feat: 로그인 API 구현 #123 (#128) * build: jwt 의존성 추가 * chore: jwt 관련 환경 설정 추가 * test: 회원 생성 및 토큰 발급 성공 테스트 & 닉네임 중복 테스트 추가 * feat: 토큰 발급 구현 * feat: 로그인 서비스 구현 * feat: 로그인 컨트롤러 구현 * feat: 닉네임 VO 분리 및 예외 처리 구현 * refactor: getter 재정의 제거 * test: 닉네임 형식 예외 처리에 따른 테스트 수정 * feat: 필수값 누락 예외 처리 구현 * style: 코드 컨벤션 적용 * refactor: 누락된 dto 패키지 추가 * refactor: 애너테이션명 변경 * feat: 토큰 파싱해서 member 찾도록 resolver 구현 * fix: @MemberId -> @LoginMember로 변경되며 long에서 member로 타입 변경에 따른 테스트 실패 수정 * style: 코드 컨벤션 적용 * feat: 401 예외 핸들러 구현 * docs: swagger 명세 추가 * feat: 인가 관련 예외 & 핸들러 추가 * test: authorization 헤더 로직 구현에 따른 테스트 수정 * chore: CI run 임시 수정 * refactor: 필드 접근 제어자 수정 * refactor: 변수 분리 * test: 테스트명 수정 * refactor: handler 메서드명 변경 * docs: 예외 설명 추가 * refactor: 상수 재활용 * docs: schema description 수정 * refactor: 불필요한 개행 제거 * docs: 예외 발생 상황 설명 수정 * test: 토큰 생성 검증 추가 * chore: CI run 이전 상태로 수정 * docs: 응답 명세 작성 * feat: transactional 적용 * chore: CI run을 self hosted로 임시 변경 * fix: CD 실패로 인한 workflow 수정 (#135) * build: jwt 의존성 추가 * chore: jwt 관련 환경 설정 추가 * test: 회원 생성 및 토큰 발급 성공 테스트 & 닉네임 중복 테스트 추가 * feat: 토큰 발급 구현 * feat: 로그인 서비스 구현 * feat: 로그인 컨트롤러 구현 * feat: 닉네임 VO 분리 및 예외 처리 구현 * refactor: getter 재정의 제거 * test: 닉네임 형식 예외 처리에 따른 테스트 수정 * feat: 필수값 누락 예외 처리 구현 * style: 코드 컨벤션 적용 * refactor: 누락된 dto 패키지 추가 * refactor: 애너테이션명 변경 * feat: 토큰 파싱해서 member 찾도록 resolver 구현 * fix: @MemberId -> @LoginMember로 변경되며 long에서 member로 타입 변경에 따른 테스트 실패 수정 * style: 코드 컨벤션 적용 * feat: 401 예외 핸들러 구현 * docs: swagger 명세 추가 * feat: 인가 관련 예외 & 핸들러 추가 * test: authorization 헤더 로직 구현에 따른 테스트 수정 * chore: CI run 임시 수정 * refactor: 필드 접근 제어자 수정 * refactor: 변수 분리 * test: 테스트명 수정 * refactor: handler 메서드명 변경 * docs: 예외 설명 추가 * refactor: 상수 재활용 * docs: schema description 수정 * refactor: 불필요한 개행 제거 * docs: 예외 발생 상황 설명 수정 * test: 토큰 생성 검증 추가 * chore: CI run 이전 상태로 수정 * docs: 응답 명세 작성 * feat: transactional 적용 * chore: CI run을 self hosted로 임시 변경 * chore: CI run을 self hosted로 권한 부여 * chore: CI/CD workflow 트리거 임시 설정 * chore: CI/CD runs on 재설정 * chore: CI/CD workflow 권한 재설정 * chore: CI/CD workflow 권한 재설정 * chore: CI/CD workflow 임시용 트리거 제거 * fix: TravelResponses 필드 wrapping 오류 수정 (#145) * refactor: 방문기록 조회/수정 도메인 변경으로 인한 수정 #121 (#131) * feat: 특정 방문 기록 조회 API 문서화 * test: Test Fixture 생성 * refactor: 특정 방문 기록 조회 서비스 수정 * test: 특정 방문 기록 조회 컨트롤러 단위 테스트 추가 * refactor: API 명세에 맞게 변수명 변경 * feat: 일급컬렉션 구성 및 연관관계 편의 메서드 위치 변경 * feat: 특정 방문 기록 수정 서비스 구현 * feat: 특정 방문 기록 수정 컨트롤러 구현 * fix: ci 환경 변경 * feat: Multipart 문서화 및 검증 로직 추가 * refactor: 검증하고자 하는 부분을 명시적으로 표현 * refactor: 상수 접근제어자 변경 * refactor: NoArgsConstructor 접근 제어자 변경 * refactor: 생성자 Builder로 표현 * refactor: 부정으로만 사용되는 메서드 명 변경 * refactor: 메서드 명 변경 * refactor: 테스트 검증 방법 변경 * fix: 수정 요청 값 필수 * feat: 메시지 검증 로직 추가 * refactor: 불필요한 Content 애노테이션 제거 * refactor: API 명세 요청 변수 명 변경으로 인한 필드 명 수정 * refactor: 메서드 분리 * fix: AuthService Mocking * refactor: 명세에 맞게 닉네임 필드 명 변경 * refactor: 방문 기록 생성/삭제 도메인 변경으로 인한 수정 #122 (#129) * refactor: api명세에 맞게 필드명 변경 * test: TDD를 위한 컨트롤러 테스트코드 작성 * refactor: 방문 상세 생성 컨트롤러 api명세에 맞게 리팩토링 * refactor: 코드 컨벤션에 맞게 필드와 어노테이션을 다른 줄로 구분 * fix: 여행 식별자가 양수인지 검증하는 코드 추가 * test: 방문 기록을 생성할 수 없는 케이스 테스트 * feat: 사진이 5장을 초과하면 예외처리 기능 구현 * refactor: API 명세의 이름과 변수명 통일 * test: 방문 기록 생성 테스트 추가 * test: 메서드 명을 명확하게 변경 * fix: visitImagesUrl이 null일 때 NPE가 발생하는 문제 수정 * test: 양수가 아닌 식별자로 방문 기록 삭제시 예외 발생 테스트 * refactor: 코드 컨벤션에 맞게 컨트롤러 코드 수정 * test: Visit을 삭제하면 VisitImage도 삭제되는지 테스트 * refactor: 방문 기록 생성시 경계값을 테스트하면서 필요없어지는 메서드 제거 * refactor: 방문 기록 삭제 시 visitId는 null일 수 없으므로 long 타입으로 변경 * test: 방문 기록과 관련된 통합테스트 제거 * test: invalidVisitRequestProvider의 위치를 맨 위로 이동 * fix: 여행 기간에 포함되지 않는 방문 기록은 생성하지 못하도록 수정 * refactor: 가독성을 위한 예외 메시지 수정 * refactor: 불필요한 개행 제거 * refactor: 컨벤션에 맞게 메서드 위치 변경 * test: 가독성을 위한 개행 추가 * refactor: 검증 메서드명을 더 명확하게 수정 * feat: 방문 기록 생성에 Swagger 적용 * fix: visitImageFile이 필수 값으로 설정되어 있던 버그 수정 * refactor: 패키지 위치 적절하게 변경 * feat: 방문 기록 생성 DTO에 Swagger 적용 * feat: 방문 기록 삭제 Swagger 적용 * test: 방문 기록 생성시 경계값 성공 테스트 추가 * refactor: dto에 Schema 설명 추가 * refactor: 방문 사진이 없는 경우 null이 아닌 빈 리스트로 오므로 null 체크 제거 * test: mockMvc 검증에서 content 활용 * test: 가독성을 위한 변경 * refactor: 추후 ExceptionHandler에서 처리할 상황 제거 * refactor: RequestPart value와 dto 변수명을 명세에 맞게 변경 * refactor: null 값을 다룰 가능성이 없는 필드에 Long이 아닌 long을 사용 * test: DisplayName을 더 명확하게 수정 * refactor: 코드 컨벤션에 맞게 개행 제거 * test: 상수 활용 * refacotr: VisitControllerDocs에 @Parameter 추가 * refacotr: 컨트롤러 메서드 순서를 CRUD순으로 정렬 * refactor: 방문기록 생성 시 이미지가 없어도 빈 리스트가 오므로 required=false 제거 * test: 자동정렬로 인한 의도치 않은 개행 제거 * feat: 여행 상세 생성 API 수정 #141 (#147) * refactor: where 검증절 이동 * feat: 여행 상세 생성 서비스에서 multipart 처리 위한 기반 코드 구현 * feat: 여행 상세 생성 컨트롤러에서 multipartFile 받도록 구현 * docs: 여행 상세 생성 명세서 작성 * docs: 여행 상세 생성 명세서 상 key 오류 수정 * docs: 여행 상세 생성 명세서 상 설명 오타 수정 * refactor: cascadeType 변경 및 부모 엔티티가 관리하도록 수정 * test: 모호한 displayName 수정 * refactor: persist 전파 위해 순서 변경 * feat: 여행 상세 목록 조회, 특정 여행 상세 조회, 특정 여행 상세 삭제 API 수정 #148 (#149) * docs: 여행 상세 목록 조회 API 문서화 * docs: 특정 여행 상세 조회 API 문서화 * docs: 공통 예외 문서화 * docs: 특정 여행 상세 삭제 API 문서화 * refactor: 응답 변수 분리 * feat: 특정 여행 상세 조회 시 권한 예외 처리 구현 * feat: 특정 여행 상세 삭제 시 권한 예외 처리 구현 * refactor: 메서드 순서 조정 (CRUD 순서) * fix: dto 필드 오류 수정 * test: 여행 상세 목록 조회 테스트 작성 * test: 특정 여행 상세 조회 테스트 작성 * test: 특정 여행 상세 삭제 컨트롤러 테스트 작성 * test: 여행 상세 목록 조회 JPQL 테스트 수정 * docs: example 제거 * fix: 동일성 비교 * test: 가독성있게 pathVariable 분리 * refactor: 방문기록 썸네일 메서드 분리 * fix: 삭제하려는 여행 상세 없을 시 예외 발생하지 않도록 수정 * refactor: member entity 외 논리적 삭제 제거 #132 (#156) * refactor: member 외 soft delete 제거 * chore: ddl 교체 위한 환경 임시 변경 * fix: 닉네임 형식 수정 #157 (#158) * fix: 닉네임 형식 수정 * chore: ddl 변경 위한 환경 임시변경 * feat: AWS S3 SDK 구현 (#137) * build: aws sdk 의존성 추가 * chore: application-secrets 반영하도록 변경 * chore: multipart 최대파일크기와 최대요청크기를 10MB로 확장 * feat: S3Client 설정 커스텀 * feat: S3Exception 에러 핸들러 추가 * feat: s3Client를 사용하는 CloudStorageClient 생성 * feat: 이미지를 S3에 올리고 URL을 받아오는 비즈니스 로직 작성 * feat: file upload API 구현 * chore: pull_request에도 CD가 적용되도록 임시 변경 * chore: secret 변수들을 env로 관리하도록 변경 * chore: dev 서버도 멀티파트 용량 확장 * chore: application.yml 파일에 cloud 관련 재설정 * chore: cd 과정에서 환경 변수 설정하기 * fix: env 파일 인식하도록 수정 * fix: CI/CD에서 env를 읽을 수 있도록 수정 * chore: pull_request 시 CD 돌아가지 않도록 수정 * chore: pull_request 시 CD 돌아가도록 임시 수정 * fix: dev에 빠진 security 설정 추가 * chore: dev에도 cloud 관련 설정 추가 * chore: yml 파일 롤백 * chore: ci/cd workflow 롤백 * chore: cloud 관련 설정 추가 * chore: 이미지 용량 제한 늘리는 설정 추가 * chore: yml에 실제 값 대입 * chore: pull_request에도 CD가 적용되도록 임시 수정 * fix: s3Client build를 CLoudStorageClient에서 수행 * chore: cloud 관련 설정 값 대입 * refactor: s3Client build를 S3ClientConfig에서 수행 * refactor: s3Client build를 CloudStorageClient에서 수행 * fix: 파일 경로 오류 수정 * fix: 파일 경로 오류 수정 * fix: 파일 경로 오류 수정 * fix: 파일 경로 오류 수정 * fix: 파일 경로 오류 수정 * fix: 파일 경로가 버킷을 포함하지 않도록 수정 * feat: file 이름이 겹치는 경우, UUID를 뒤에 붙이는 기능 구현 * chore: push에만 cd가 적용되도록 다시 변경 * refactor: 에러 메시지 변경 * refactor: MultipartFile 여러 개 받을 수 있도록 수정 * feat: S3 객체 삭제하는 API 구현 * chore: pull_request에도 cd가 적용되도록 다시 변경 * chore: push에만 cd가 적용되도록 다시 변경 * style: ci/cd workflow endline 롤백 * feat: 방문 기록 관련 인가 구현 #140 (#161) * feature: 특정 방문기록 조회시 인가 처리 * feature: 특정 방문기록 수정, 삭제시 인가 처리 * style: 미사용 import 제거 * feat: 방문 기록 생성 시 여행 상세의 주인인지 인가 추가 * refactor: 불필요한 개행 제거 * test: 테스트 실패 지점을 하나로 수정 * chore: 서버 DDL 생성 전략 변경 * feat: 여행 상세 수정 API 수정 #142 (#159) * refactor: 썸네일이 없는 경우 기존 썸네일 유지 * feat: 여행 수정 서비스 multipart와 인가 기능 추가 * feat: 여행 수정 컨트롤러 multipart와 인가 기능 추가 * fix: 여행 썸네일 추출 임시 로직 구성 * refactor: 400 에러 메세지 응답 API 문서에 추가 * docs: id 예시 값 추가 * chore: 개발 서버 DDL 생성 전략 변경 * refactor: 이미지 수정 요청 분기 처리 위치 변경 및 테스트 작성 * feat: 이미지가 필요한 API에 S3 적용 #166 (#168) * test: S3 테스트를 위해 fake 객체 생성 * feat: 여행 상세 생성 시 S3에 썸네일 저장 * feat: 여행 상세 수정 시 S3에 썸네일 대치 * feat: 방문 기록 생성 시 S3에 이미지 저장 * feat: 방문 기록 수정 시 S3에 이미지 대치 * chore: pull request에도 CD가 돌아가도록 임시 설정 * chore: pull request에도 CD가 돌아가도록 임시 설정한 것 원상복구 * refactor: Objects.isNull 활용 및 메서드 위치 변경 * feat: 로깅 프레임워크 적용 #134 (#171) * feat: 로거 환경 설정 * feat: 로거 형식 정의 * feat: 요청/응답 로깅 구현 * feat: 예외에 대한 로거 형식 적용 * feat: token 유무 식별 로그 추가 * refactor: thread 식별명 추가 * refactor: 예외 발생 구체 클래스/메서드 로깅 * chore: CD 트리거 수정 * chore: CD 트리거 복원 * chore: 임시 예외 케이스 생성 및 로그 테스트 * chore: 임시 예외 케이스 수정 및 로그 테스트 * chore: 임시 예외 케이스 재수정 및 로그 테스트 * chore: 임시 예외 케이스 삭제 * chore: CD 트리거 복원 * fix: Logging 데이터 변경 * chore: CD 트리거 복원 * fix: Logging 데이터 오류 수정 * chore: CD 트리거 복원 * feat: 로깅 White List 추가 * feat: 방문 기록 목록 조회시 시간 순으로도 정렬되는 기능 구현 (#175) * feat: 방문 기록의 방문 날짜 저장 시, 시간까지 저장하도록 변경 * fix: request dto에서 LocalDateTime에 대한 패턴이 시간까지 포함하도록 변경 * refactor: 여행에 포함된 날짜인지 비교시 LocalDateTime을 넘겨주도록 변경 * refactor: 사진 url 관련 dto 필드명 끝에 url 추가 * refactor: 기대한대로 작동하지 않는 ExceptionHandler 메서드 주석 처리 * refactor: 파일 이름 및 형식 오류 수정 #176 (#177) * refactor: 파일 이름을 UUID로만 구성하도록 수정 * refactor: content-type을 multipart/formed-data로 고정 * feat: swagger https 적용하기 #184 (#185) * feat: swagger가 https 접근 가능하도록 하는 기능 구현 * chore: pull_request에도 CD가 적용되도록 임시 변경 * style: push에만 CD가 적용되도록 롤백 * feat: 빈/공백 문자열 예외 처리 #186 (#187) * fix: 여행 제목은 공백 문자열 불가, 1자 이상 30자 이하로 설정할 수 있도록 예외 처리 * fix: 방문 기록의 이름은 공백 문자열 불가, 1자 이상 30자 이하로 설정할 수 있도록 예외 처리 * fix: 닉네임의 이름은 공백 문자열 불가, 1자 이상 20자 이하로 설정할 수 있도록 예외 처리 * test: displayName 변경 * fix: Swagger 인증 헤더 형식 변경 #188 (#189) * fix: Swagger 인증 헤더 수정 * refactor: 로깅 정보 수정 * chore: stage/dev 서버 분리 #192 (#197) * fix: 포트 수정 * refactor: 설정 파일 profile 별로 분리 * fix: timezone 설정 * refactor: ci-cd 파일명 변경 * refactor: ci-cd 분리 * test: 경계값 테스트로 수정 * test: 경계값 테스트로 수정 및 발생하는 오류 수정 * chore: back-end 개발용 CD 트리거 변경 * fix: 불필요한 파일 삭제 * refactor: stage용 환경 파일 분리 * refactor: DockerFile 분리 * refactor: 태그 설정 * refactor: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 수정 * refactor: CI runs-on 변경 * refactor: dev용 CICD trigger 변경 * refactor: dev용 CICD runs on 변경 * refactor: dev용 CICD trigger 변경 * refactor: runner 재설치로 인해 임시로 변경했던 dev용 CICD runs-on & trigger 복구 * refactor: hub push 시 로그인 재수행 * fix: 명령어 오류 수정 * feat: 단체 계정으로 dockerhub 변경 * refactor: 정상 작동 확인 후 트리거 복구 * fix: image push 시 권한 오류 수정 (#200) * feat:admin용 계정 로직 추가 (#201) * fix: add stage logging (#204) * feat: 이미지 확장자와 content-type 설정 #196 (#202) * feat: content-type을 확장자로 분석하는 기능 구현 * chore: PR CD 임시 적용 * chore: PR CD 해제 * refactor: dev, stage, local 환경의 swagger url 설정 (#208) * refactor: 이미지 용량 제한 확장 (한 이미지: 20MB, 한 요청: 100MB) (#206) * fix: 이미지 전송 안되는 에러 수정 #209 (#210) * chore: PR CD 임시 적용 * fix: 파일 형식에 .추가 및 디폴트 형식 변경 * temp: 확인용 에러 * temp: 롤백 * refactor: 디폴트 mime type 변경 * temp: 일단 image의 내부 메서드 사용 * fix: file-extension 지정 롤백 * fix: content-type 지정 * temp: 에러 체크를 위해 메시지 임시 변경 * temp: 에러 메시지 롤백 * feat: content-type 확장자로부터 추출 * chore: PR CD 해제 * refactor: API명세 변경에 따른 URI, DTO 변수명 변경 #211 (#212) * refactor: URI, DTO 변수명 변경 * refactor: DTO 클래스명을 API명세에 맞게 변경 * refactor: imageFile 변수명 변경 * test: pathVariable명을 클래스명을 고려하여 변경 * refactor: 엔티티, 메서드명 API 명세에 맞게 변경 * refactor: 여행을 추억으로, 방문을 순간으로 네이밍 변경 * feat: 추억 목록 조회 API 수정 #215 (#216) * feat: startAt, endAt 필드 nullable하게 변경 * feat: memory의 createdAt 기준 최신순 정렬로 변경 * style: code convention 적용 * style: 응답 형식 변경 (mates 제거 및 기간 미필수 응답 필드로 변경) * feat: 올바르지 않은 년도 형식 예외 처리 * refactor: 추억 상세 -> 추억 * test: 메세지 오류 수정 * test: 저장 순서 오류 수정 * refactor: fixture 패키지 이동 * refactor: fixture 분리 * test: 경계값 검증으로 수정 * feat: 사용자 로깅, Nginx 로깅, DB 로깅 #190 (#224) * feat: MDC 적용 * refactor: 중복 예외 제거 * feat: 사용자 식별 로깅 추가 * refactor: 예외 메세지 형식 json으로 변경 * feat: 추억 삭제 API 수정 #221 (#222) * feat: 변경사항 docs 반영 * feat: 순간이 존재하는 경우 추억을 삭제할 수 없었던 예외 제거 * style: code convention 적용 * feat: 추억 삭제 시 속한 순간도 함께 삭제되도록 서비스 구현 * refactor: 불필요한 개행 제거 * feat: 추억 조회 API 수정 #227 (#228) * feat: 기간 필수 여부 변경에 따른 어노테이션 추가 * docs: 도메인명 변경에 따른 명세서 수정 * build: stage 서버 CICD 임시 비활성화 #234 (#235) * chore: stage 비활성화 적용 전 dev에서 시범 적용 * chore: dev 서버 cicd 비활성화 해제 * chore: dev 서버 cicd 트리거 복구 * chore: stage 서버 cicd 임시 비활성화 * feat: 댓글 생성, 조회 API 구현 #214 (#225) * refactor: 댓글과 관련된 클래스를 별도의 패키지로 분리 * test: tdd를 위한 댓글 생성 서비스 테스트 추가 * feat: 댓글 생성 서비스 메서드 구현 * test: 댓글 생성 관련 컨트롤러 테스트 코드 작성 * feat: 댓글 생성 기능 구현 * feat: 댓글 조회 서비스 메서드를 위한 tdd 틀 작성 * feat: 댓글 조회 서비스 메서드 구현 * test: 댓글 컨트롤러 테스트 클래스 패키지 위치 변경 * refactor: 댓글 읽기 메서드명을 더 명확하게 변경 * test: 댓글 읽기 테스트 코드 추가 * feat: 댓글 읽기 컨트롤러 메서드 구현 * feat: 댓글 생성, 조회 API에 swagger 적용 및 순간 기록을 순간으로 변경 * fix: Swagger 적용으로 인한 문제 해결 * test: 순간 기록이라는 말을 순간으로 변경 * refactor: 댓글의 글자수로 인한 예외 메시지에 '1자 이상'이라는 말을 제거 * fix: 댓글 생성 메서드에 Transactional 적용 * chore: stage 서버 CI/CD 활성화 * feat: 감정 선택 API 구현 #230 (#236) * feat: 기분 유형 생성 * feat: Moment 비즈니스 로직에 기분 표현 적용 * feat: 기분 표현 컨트롤러 구현 * feat: default 기분 생성 * style: 코드 컨벤션 적용 * refactor: 예외 메세지 변경 * feat: 순간 생성 API 구현 #226 (#229) * refactor: 기한이 없는 memory 구현 * test: 기한없는 Memory에 Moment 생성 테스트 * feat: Moment 생성 서비스 구현 * feat: Moment 생성 컨트롤러 구현 * refactor: builder 선택 필드 제외 * style: 잘못된 네이밍 수정 * refactor: MomentImages 생성 책임 Moment로 위임 * feat: 하나의 사진 업로드 API 생성 #256 (#258) * feat: api 이름 captures로 변경 * feat: RequestBody imageFiles로 이름 변경 * refactor: 변수명 iamge -> file로 통합 * refactor: requestparam -> requestpart로 변경 * feat: 다섯 장을 넘기지 않도록 예외 추가 * feat: 빈 배열을 받는 경우 로직을 수행하지 않도록 변경 * style: CamelCase 적용 * refactor: 에러 메시지 수정 * feat: 특정 content-type을 처리하도록 명시 * feat: validated 어노테이션 추가해서 유효성 검사 수행 * test: 사진 개수에 따른 성공/실패 테스트 수행 * test: 빈 멀티파일 리스트가 들어올 시, 빈 url 리스트가 들어오는 테스트 수행 * refactor: byte 처리에서 나는 오류를 StaccatoException으로 처리 * chore: dev 서버 PR CD 임시 적용 * refactor: API명 captures -> images로 변경 * chore: dev 서버 PR CD 해제 * fix: test에도 변경된 api명 적용 * feat: 파일을 한 장만 업로드하도록 변경 * feat: dto를 반환하는 새로운 메서드 생성 * test: 테스트 Disabled * refactor: CloudStorage -> Image로 이름 단순화 * feat: S3 객체 삭제 로직 삭제 * refactor: 미사용 import 삭제 * refactor: 전체 경로를 yml에서 지정 * refactor: getFileExtension 메서드 리팩터링 * feat: ImageUrlResponse 생성 * refactor: file을 전부 image로 변경 * refactor: S3Client를 S3ObjectClient로 변경 * refactor: S3Exception 로깅에 EXCEPTION_LOGGING_FORM 적용 * feat: 로그인한 사용자만 images API를 사용가능하게 함 * refactor: ImageExtension을 사용하는 Service 폴더로 이동 * feat: yml에서 설정한 파일 용량 제한 예외를 잡는 MultipartExceptionHandler 구현 * refactor: 충돌방지 이름변경 * refactor: @Size 사라지면서 Validated 삭제 * test: 컨트롤러 단위 테스트 수행 * refactor: 미사용 import문 삭제 * style: /images API swagger 적용 * refactor: file -> image * refactor: uploadImages -> uploadImage * refactor: 미사용 import문 삭제 * chore: PR CD를 수동으로 실행 가능하게 설정 * refactor: 기존 테스트 삭제 * fix: 반영되지 않은 수정사항 관련 테스트 disabled * chore: dev 서버 PR CD 임시 해제 * fix: 이미지 저장 폴더 재지정 * refactor: 테스트 메서드 네이밍 수정 * refactor: 폴더명 수정 * refactor: 닫는 괄호 추가 * refactor: S3ObjectClient를 infrastructure 패키지로 이동 * refactor: 컨벤션에 맞추어 줄바꿈 * refactor: infra 패키지를 image 패키지 내부로 이동 * feat: 추억 생성 API 수정 #238 (#260) * feat: multipartFile 제거 및 contentType을 application/json으로 변경 * refactor: term(startAt, endAt) 객체 분리 * feat: startAt, endAt 중 누락 예외 처리 * fix: 기간이 없을 경우 순간 날짜 포함 여부 예외 처리 오류 수정 * test: 기간 포함 날짜 검증 테스트 추가 * refactor: 가독성 있게 로직 수정 * docs: 요청 형식 설명 수정 * feat: 댓글 수정 API 구현 #245 (#254) * test: Fixture를 활용하도록 기존 테스트 변경 * feat: 댓글을 생성하는 기능 해피케이스 구현 * feat: 댓글을 찾을 수 없는 경우 예외 발생 테스트 * feat: 본인이 달지 않은 댓글에 대해 수정을 시도하면 예외 발생 기능 구현 * test: 조회 권한이 없는 순간에 달린 댓글들 조회를 시도했을 때 예외 발생 테스트 추가 * feat: 댓글 수정 컨트롤러 메서드 구현 * test: 양수가 아닌 댓글 식별자로 댓글 수정 시 예외 발생 테스트 * feat: 댓글 내용을 입력하지 않거나 빈 문자열로 입력 후 댓글 수정 시 예외처리 * refactor: 댓글 생성 시 최소 글자수 조건이 NotBlank에 의해 필요 없으므로 삭제 * refactor: 순서가 불필요하므로 GroupSequence 설정 제거 * feat: updateDTO에 Swagger 적용 * test: 실수로 빠뜨린 when & then 적용 * feat: 댓글 삭제 API 구현 #255 (#257) * test: Fixture를 활용하도록 기존 테스트 변경 * feat: 댓글을 생성하는 기능 해피케이스 구현 * feat: 댓글을 찾을 수 없는 경우 예외 발생 테스트 * feat: 본인이 달지 않은 댓글에 대해 수정을 시도하면 예외 발생 기능 구현 * test: 조회 권한이 없는 순간에 달린 댓글들 조회를 시도했을 때 예외 발생 테스트 추가 * feat: 댓글 수정 컨트롤러 메서드 구현 * test: 양수가 아닌 댓글 식별자로 댓글 수정 시 예외 발생 테스트 * feat: 댓글 내용을 입력하지 않거나 빈 문자열로 입력 후 댓글 수정 시 예외처리 * refactor: 댓글 생성 시 최소 글자수 조건이 NotBlank에 의해 필요 없으므로 삭제 * refactor: 순서가 불필요하므로 GroupSequence 설정 제거 * feat: updateDTO에 Swagger 적용 * feat: 댓글 삭제 API 해피케이스 구현 * feat: 본인이 쓴 댓글이 아닌데 삭제를 시도하면 예외 처리 기능 구현 * feat: 댓글 삭제 컨트롤러 메서드 구현 * test: 댓글 식별자가 양수가 아닐 경우 댓글 삭제 실패 테스트 * feat: 댓글 삭제 API에 Swagger 적용 * feat: 추억 수정 API 수정 #261 (#262) * feat: 이미지 컨트롤러 분리로 변경된 사항 반영 * refactor: 미사용 메서드 제거 * test: 인증 관련 테스트 추가 * docs: 명세서 누락 및 오류 수정 * test: aaa 주석 수정 * chore: dev 서버 push 트리거 제거 * feat: 순간 수정 API 구현 #244 (#248) * refactor: Moment 수정 서비스 로직 수정 * refactor: Moment 수정 컨트롤러 로직 수정 * refactor: 레거시 코드 변경 및 예외 메세지 변경 * docs: 누락 DTO 명세 추가 * docs: 명세 수정 * feat: 순간 삭제 API 구현 #243 (#250) * style: 네이밍 컨벤션 적용 * docs: 명세 수정 * feat: 순간 조회/목록 조회 API 구현 #251 (#253) * feat: 순간 조회/목록 조회 서비스 로직 구현 * feat: 순간 조회/목록 조회 컨트롤러 로직 구현 * test: 메서드 쿼리 검증 테스트 추가 * refactor: 클래스 명 수정 * test: 불필요한 테스트 데이터 삭제 * feat: image upload 예외 처리 추가 #268 (#269) * feat: MissingServletRequestPartException 에러 핸들링 * chore: dev 서버 PR CD 임시 해제 * chore: dev 서버 push cd 삭제 * refactor: 같은 메시지 주는 예외 동일한 exceptionHandler로 묶기 * refactor: 예외 핸들러를 다시 분리 * refactor: 에러 메시지 적절하게 변경 * feat: 서버 별로 이미지 저장 경로 설정 (#272) * refactor: S3 로직 리팩터링 #274 (#275) * refactor: 미사용 메서드 삭제 * refactor: 미사용 import 삭제 * refactor: 명세 변경에 따른 swagger 메시지 변경 * refactor: 요청 크기 제한 100->20으로 변경 * refactor: 메서드 순서 변경 * refactor: 개행 삭제 * chore: 운영 서버 구축 #264 (#270) * chore: prod 서버 환경설정 * feat: prod 환경 로깅 설정 * chore: prod 환경 테스트를 위한 CD 트리거 변경 * fix: env 파일 경로 수정 * chore: 로그 파일 저장 위치 지정 * chore: 로그 폴더 생성 명령 삭제 * chore: 로그 생성 위치 변경 * chore: 도커 이미지 재실행 코드 추가 * chore: 도커 이미지 재실행 코드 수정 * chore: 로그 콘솔 출력 * chore: 로그 저장 위치 수정 * feat: 운영 환경에서 어드민 로직 비활성화 * refactor: main에 push시에만 prod cd trigger 실행하도록 workflow 변경 --------- Co-authored-by: yoonjuho * fix: 닉네임 앞뒤 공백 제거 #277 (#278) * fix: 닉네임 앞뒤 공백 제거 * fix: 닉네임 요청 형식에서 앞뒤 공백 제거 NPE 해결 * fix: 순간 조회 응답 형식 수정 (#276) * fix: 순간 조회 응답 형식 수정 * fix: 순간 목록 응답 인자 명 수정 * feat: 추억 이름 중복 불가 예외 처리 #280 (#282) * feat: 추억 제목 중복 검사 구현 * docs: 예외 발생 케이스 문서화 * test: 픽스처 활용 * feat: 추억 수정 시 이미 존재하는 타 추억 이름으로 변경 불가능 예외 처리 * test: 주석 오타 수정 * fix: 순간 날짜 반환 형식 변경 #283 (#286) * fix: 순간 날짜 응답 형식 수정 * refactor: 메서드 분리 로직 삭제 * fix: 날짜 ms 제거 * feat: 현재 날짜를 포함하고 있는 추억 목록 조회 구현 #281 (#285) * feat: 특정 날짜를 포함하는 모든 추억 조회 기능 구현 * feat: 특정 날짜를 포함하는 모든 추억 조회 기능 구현 * test: 메시지 변경으로 인한 테스트코드 수정 * feat: 날짜로 추억 목록 조회 컨트롤러 분리 * style: 미사용 import 제거 * feat: 날짜를 포함하는 모든 추억을 조회시 기간이 없는 추억도 함께 조회 * refactor: 순간 수정 이미지 순서 적용 #287 (#288) * refactor: 순간 수정 이미지 순서 적용 * test: 순간 수정 이미지 순서 검증 테스트 추가 * refactor: 순간 수정 이미지 순서 중복 로직 삭제 * refactor: 사용되지 않는 메서드 삭제 * fix: 순간 조회 응답 필드 추가 #292 (#293) * fix: 순간 응답 필드에 추억 관련 필드 추가 * test: 픽스쳐 사용 * refactor: 예외 메시지 수정 #294 (#298) * refactor: 예외 메시지의 순간을 스타카토로 변경 Co-authored-by: devhoya97 * refactor: 예외 메시지 수정 Co-authored-by: devhoya97 * refactor: 순간 -> 스타카토 Co-authored-by: devhoya97 * docs: 문서 수정 Co-authored-by: devhoya97 --------- Co-authored-by: devhoya97 * chore: 운영 서버에서 명세서 비활성화 #302 (#303) * feat : 스타카토 제목, 추억 제목에 trim 적용 #305 (#307) * refactor: 예외 메시지의 순간을 스타카토로 변경 Co-authored-by: devhoya97 * refactor: 예외 메시지 수정 Co-authored-by: devhoya97 * refactor: 순간 -> 스타카토 Co-authored-by: devhoya97 * refactor: 추억 생성 시 title에 trim 적용 * refactor: 스타카토 생성 시 placeName에 trim 적용 * fix: dto에서 size 검증 시 min 조건 제거 --------- Co-authored-by: linirini <2001yerin@naver.com> * chore: ci에 jacoco 추가 (#309) * chore: ci에 jacoco 추가 * chore: ci에 jacoco 위한 권한 변경 * chore: ci에 jacoco 위한 권한 변경 * chore: test report 경로 오류 수정 * build: jacoco 빌드 설정 * build: jacoco 대상에서 builder 제외 * build: jacoco 제한 제거 * build: jacocoCoverageVerification 제거 * chore: 단위 테스트 결과 가져오기 적용 * build: CI/CD 트리거 수정 --------- Co-authored-by: devhoya97 Co-authored-by: somin Co-authored-by: BurningFalls Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: linirini <101927543+linirini@users.noreply.github.com> Co-authored-by: devhoya97 <146502065+devhoya97@users.noreply.github.com> * build: CI 적용 브랜치 추가 * hotfix: QA #322 (#323) * init: 프로젝트 세팅 * refactor: PR 템플릿 파일명 및 경로 수정 * refactor: pr 템플릿 경로 수정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * build: develop-be 브랜치의 CI 설정 #6 (#7) * build: 초기 ci 템플릿 생성 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * build: ci 초기 트리거 설정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * fix: 권한 수정 설정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * fix: working directory 설정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * fix: 권한 재설정 Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo --------- Co-authored-by: linirini <2001yerin@naver.com> Co-authored-by: devhoya97 Co-authored-by: YoonJuHo * feat: Entity 구성 #2 (#17) * chore: 데이터 베이스 설정 * feat: Base Entity 구성 * feat: Pin Entity 구성 * feat: Travel Entity 구성 * feat: Member Entity 구성 * feat: Mate Entity 구성 * feat: Visit Entity 구성 * feat: Visit Image Entity 구성 * feat: Visit Log Entity 구성 * refactor: Table 애노테이션 삭제 * refactor: Soft Delete 적용 * feat: ControllerAdvice 생성 #29 (#34) * feat: Visit domain skeleton 구현 #31 (#37) Co-authored-by: linirini <2001yerin@naver.com> * feat: Travel Domain Skeleton Code 작성 #32 (#36) * feat: travel skeleton code 작성 * feat: travel 생성, 수정 dto 작성 및 예외 핸들링 * feat: Mate 도메인 빌더 추가 * style: 코드 컨벤션 준수를 위한 공백 제거 * build: Docker Compose Setting #27 (#40) * chore: gitignore 파일 추가 * chore: mysql 디펜던시 추가 * chore: Profile 분리 * feat: Docker 파일 설정 * feat: 여행 상세 생성 API 구현 #18 (#43) * build: RestAssured 의존성 추가 * test: 여행 상세 생성 인수 테스트 작성 * feat: 임시 MemberIdArgumentResolver 구현 * feat: Lombok 추가 * feat: Database 초기화 구현 * feat: 여행 상세 성공 서비스 구현 * fix: resolveArgument 반환 타입 오류 수정 * feat: 여행 상세 생성 성공 컨트롤러 구현 * feat: 여행 상세 생성 시 필수값 누락 검증 구현 * test: 글자 수 제한 검증 인수 테스트 추가 * refactor: 생성자에 builder 지정 * feat: 시작 날짜와 끝 날짜 도메인 검증 구현 * feat: 시작 날짜와 끝 날짜 예외 처리 테스트 및 구현 * style: 코드 컨벤션 적용 * refactor: parameter명 변경 * feat: transactional 적용 * style: paremeter 형식 통일 * style: parameter 형식 통일 * refactor: display name 오류 수정 * refactor: 불필요한 상수 제거 * refactor: paramterized test로 리팩터링 * style: 개행 제거 * refactor: 인자 변경 * refactor: 공통 예외 클래스명 변경 * feat: 범위 예외 핸들러 추가 * refactor: 서비스, 통합 테스트 보일러 플레이트 코드 제거 * refactor: builder 사용 시 필수 값 누락 제약 추가 * refactor: 도메인으로 변환하는 메서드를 dto에 추가 * build: CD yml 파일 구성 #28 (#53) * feat: CI/CD 설정 * feat: CI/CD 검증용 트리거 설정 * fix: CI/CD workflow 수정 * fix: CI/CD workflow 재수정 * fix: CI/CD workflow 절대 경로 수정 * chore: DDL 생성 전략 변경 * chore: dev 환경 DDL 생성 전략 변경 * refactor: 검증용 트리거 제거 * fix: 도커 이미지 기반 컨테이너 생성으로 변경 * refactor: 중간 테이블 엔티티 수정 #56 (#57) * refactor: 중간 테이블명 TravelMember로 변경 * refactor: 중간 테이블 OneToMany 필드 추가 * refactor: Member OneToMany 제거 * refactor: OneToMany List 초기화 * refactor: 연관관계 편의 메서드 사용 * chore: ddl 전략 임시 변경 * chore: ddl 전략 변경 * feat: 특정 방문 기록 삭제 API 구현 #26 (#42) * feat: 특정 방문 기록 삭제 API 구현 * feat: 양수가 아닌 id로 특정 방문 기록 삭제를 시도할 때 예외 처리 기능 구현 * feat: 방문 기록 삭제 시 방문 로그도 함께 삭제되는 기능 구현 * refactor: 커스텀 예외를 제거하는 방향으로 변경 * fix: 예외를 못 잡던 문제 해결 * refactor: 메서드명 적절하게 변경 * build: Docker Compose Setting #27 (#40) * chore: gitignore 파일 추가 * chore: mysql 디펜던시 추가 * chore: Profile 분리 * feat: Docker 파일 설정 * feat: 여행 상세 생성 API 구현 #18 (#43) * build: RestAssured 의존성 추가 * test: 여행 상세 생성 인수 테스트 작성 * feat: 임시 MemberIdArgumentResolver 구현 * feat: Lombok 추가 * feat: Database 초기화 구현 * feat: 여행 상세 성공 서비스 구현 * fix: resolveArgument 반환 타입 오류 수정 * feat: 여행 상세 생성 성공 컨트롤러 구현 * feat: 여행 상세 생성 시 필수값 누락 검증 구현 * test: 글자 수 제한 검증 인수 테스트 추가 * refactor: 생성자에 builder 지정 * feat: 시작 날짜와 끝 날짜 도메인 검증 구현 * feat: 시작 날짜와 끝 날짜 예외 처리 테스트 및 구현 * style: 코드 컨벤션 적용 * refactor: parameter명 변경 * feat: transactional 적용 * style: paremeter 형식 통일 * style: parameter 형식 통일 * refactor: display name 오류 수정 * refactor: 불필요한 상수 제거 * refactor: paramterized test로 리팩터링 * style: 개행 제거 * refactor: 인자 변경 * refactor: 공통 예외 클래스명 변경 * feat: 범위 예외 핸들러 추가 * refactor: 서비스, 통합 테스트 보일러 플레이트 코드 제거 * refactor: builder 사용 시 필수 값 누락 제약 추가 * refactor: 도메인으로 변환하는 메서드를 dto에 추가 * build: CD yml 파일 구성 #28 (#53) * feat: CI/CD 설정 * feat: CI/CD 검증용 트리거 설정 * fix: CI/CD workflow 수정 * fix: CI/CD workflow 재수정 * fix: CI/CD workflow 절대 경로 수정 * chore: DDL 생성 전략 변경 * chore: dev 환경 DDL 생성 전략 변경 * refactor: 검증용 트리거 제거 * fix: 도커 이미지 기반 컨테이너 생성으로 변경 * fix: rebase 과정에서 파일이 꼬인 문제 해결 * test: HttpHeaders.AUTHORIZATION 사용 * refactor: 중간 테이블 엔티티 수정 #56 (#57) * refactor: 중간 테이블명 TravelMember로 변경 * refactor: 중간 테이블 OneToMany 필드 추가 * refactor: Member OneToMany 제거 * refactor: OneToMany List 초기화 * refactor: 연관관계 편의 메서드 사용 * chore: ddl 전략 임시 변경 * chore: ddl 전략 변경 * feat: Pin, Visit, VisitLog 생성자에 builder 추가 * feat: Pin repository 추가 * refactor: visit이 삭제되기 전에 visit에 의존하는 visitLog들이 먼저 삭제되도록 순서 변경 * test: 방문 기록 삭제에 대한 서비스 슬라이스 테스트 추가 * test: 방문 기록이 갖는 모든 방문 로그 삭제 메서드 테스트 * fix: Modifying을 사용할 때 영속성컨텍스트와 관련하여 발생하던 문제 해결 * refactor: visitLog의 content를 필수값으로 변경 * test: 컨벤션에 맞게 Controller 테스트 클래스 변경 * fix: ConstraintViolationException의 예외 메시지를 정해둔 형식에 맞게 변경 --------- Co-authored-by: YoonJuHo Co-authored-by: linirini <101927543+linirini@users.noreply.github.com> * refactor: 여행 상세 생성 서비스 반환 타입 변경 (#63) * feat: 여행 상세 목록 조회 API 구현 #19 (#60) * test: 여행 상세 목록 조회 통합 테스트 작성 * feat: 여행 상세 목록 조회 DTO 구현 * feat: 모든 여행 상세 목록 조회 서비스 구현 * refactor: 미사용 반환값 제거 * feat: 년도 조건에 따른 여행 상세 조회 서비스 구현 * test: import 수정 * test: 년도와 사용자 식별자로 여행 목록 조회하는 JPQL 테스트 추가 * style: 코드 컨벤션 적용 * test: 여행 상세 목록 조회 컨트롤러 구현 * test: disabled 제거 및 테스트 오류 수정 * refactor: 불필요한 변수 분리 제거 * refactor: Optional로 분기 처리 * test: DisplayName 수정 * refactor: DTO 이름 변경 * feat: 방문 기록 생성 API 구현 #21 (#64) * feat: 방문 기록 생성 기능 구현 * feat: getter 및 builder 추가 * feat: VisitService에 Transactional 적용 * test: 방문 기록 생성 테스트 * fix: 오타 수정 * style: 코드 컨벤션 적용 * fix: deleteById에 Transactional annotation 추가 * refactor: builder 파라미터 NonNull 설정 추가 * refactor: 데이터 개수 감소 * refactor: 예외 메시지 구체화 및 상태 코드 변경 * feat: 특정 여행 상세 수정 API 구현 #22 (#62) * build: Docker Compose Setting #27 (#40) * chore: gitignore 파일 추가 * chore: mysql 디펜던시 추가 * chore: Profile 분리 * feat: Docker 파일 설정 * feat: 여행 상세 생성 API 구현 #18 (#43) * build: RestAssured 의존성 추가 * test: 여행 상세 생성 인수 테스트 작성 * feat: 임시 MemberIdArgumentResolver 구현 * feat: Lombok 추가 * feat: Database 초기화 구현 * feat: 여행 상세 성공 서비스 구현 * fix: resolveArgument 반환 타입 오류 수정 * feat: 여행 상세 생성 성공 컨트롤러 구현 * feat: 여행 상세 생성 시 필수값 누락 검증 구현 * test: 글자 수 제한 검증 인수 테스트 추가 * refactor: 생성자에 builder 지정 * feat: 시작 날짜와 끝 날짜 도메인 검증 구현 * feat: 시작 날짜와 끝 날짜 예외 처리 테스트 및 구현 * style: 코드 컨벤션 적용 * refactor: parameter명 변경 * feat: transactional 적용 * style: paremeter 형식 통일 * style: parameter 형식 통일 * refactor: display name 오류 수정 * refactor: 불필요한 상수 제거 * refactor: paramterized test로 리팩터링 * style: 개행 제거 * refactor: 인자 변경 * refactor: 공통 예외 클래스명 변경 * feat: 범위 예외 핸들러 추가 * refactor: 서비스, 통합 테스트 보일러 플레이트 코드 제거 * refactor: builder 사용 시 필수 값 누락 제약 추가 * refactor: 도메인으로 변환하는 메서드를 dto에 추가 * build: CD yml 파일 구성 #28 (#53) * feat: CI/CD 설정 * feat: CI/CD 검증용 트리거 설정 * fix: CI/CD workflow 수정 * fix: CI/CD workflow 재수정 * fix: CI/CD workflow 절대 경로 수정 * chore: DDL 생성 전략 변경 * chore: dev 환경 DDL 생성 전략 변경 * refactor: 검증용 트리거 제거 * fix: 도커 이미지 기반 컨테이너 생성으로 변경 * refactor: 중간 테이블 엔티티 수정 #56 (#57) * refactor: 중간 테이블명 TravelMember로 변경 * refactor: 중간 테이블 OneToMany 필드 추가 * refactor: Member OneToMany 제거 * refactor: OneToMany List 초기화 * refactor: 연관관계 편의 메서드 사용 * chore: ddl 전략 임시 변경 * chore: ddl 전략 변경 * feat: 비어있는 요청 에러 핸들링 추가 * feat: 특정 여행 상세 수정 서비스 구현 * feat: 특정 여행 상세 수정 컨트롤러 구현 * feat: 비어있는 요청 에러 핸들링 추가 * feat: 특정 여행 상세 수정 서비스 구현 * feat: 특정 여행 상세 수정 컨트롤러 구현 * refactor: DirtiesContext 삭제 * refactor: Transactional 읽기 전용 옵션 구성 * feat: 방문 기록 날짜 검증 로직 추가 * refactor: 메서드 체이닝 적용 * refactor: 수정 작업 테스트 환경 동일하게 유지 --------- Co-authored-by: linirini <101927543+linirini@users.noreply.github.com> Co-authored-by: devhoya97 <146502065+devhoya97@users.noreply.github.com> * fix: 논리적 삭제 데이터는 조회에서 제외 #66 (#68) * test: 쿼리 메서드 사용 * fix: sqlDelete문에 테이블명 변경사항 반영 * fix: 삭제된 데이터 제외하고 조회하도록 조건 추가 * fix: 삭제된 데이터 제외하고 조회하도록 조건 추가 * fix: 특정 방문 기록 삭제 API 호출 시 관련된 VisitImage를 모두 삭제하도록 수정 #65 (#67) * feat: visitId에 맞는 visitImage들을 모두 삭제하는 기능 구현 * fix: visit을 삭제해도 visit에 포함된 모든 visitImage들이 삭제되지 않던 문제 해결 * test: 엔티티 생성시 가독성을 위한 개행 삭제 * refactor: JPQL에서 VisitLog를 vl로 축약 * fix: 충돌해결 * test: 경계값에 포함되지 않는 변수 제거 * feat: 특정 여행 상세 조회 API 구현 #20 (#73) * test: 특정 여행 상세 조회 통합 테스트 작성 * feat: 특정 여행 상세 조회 DTO 구현 * fix: 삭제되지 않은 데이터만 찾도록 쿼리 메서드 수정 * feat: 특정 여행 상세 조회 서비스 구현 * feat: 특정 여행 상세 조회 컨트롤러 구현 * test: 존재하지 않는 특정 여행 상세 조회 테스트 * feat: null 필드 응답에 미포함 구현 * style: 코드 컨벤션 적용 * fix: 응답 형식 오류 수정 * feat: 특정 여행 상세 삭제 API 구현 #24 (#72) * style: 코드 컨벤션 적용 * feat: 특정 여행 상세 삭제 서비스 구현 * feat: 특정 여행 상세 삭제 컨트롤러 구현 * refactor: 검증 메서드 분리 * refactor: Visit 논리적 삭제 전파 순서 수정 * feat: 특정 방문 기록 조회 API 구현 #25 (#76) * feat: 특정 방문 기록 조회 API 기능 구현 * fix: Repository 조회시 논리적 삭제가 되지 않은 엔티티들만 가져오도록 변경 * test: System.out 메서드 제거 * refactor: 메서드명 통일 및 CRUD 순서로 배치 * refactor: 사용하지 않는 DTO 제거 * test: 서비스 메서드명 변경에 따른 테스트 메서드명 변경 * fix: 특정 방문 기록이 몇 번째 방문인지 계산할 때, 더 늦게 방문한 기록까지 세던 문제 해결 * test: 몇 번째 방문인지 계산할 때, 이전의 방문만 셀 수 있는지 테스트 * feat: Pin 연관관계 추가 #80 (#83) * feat: Pin에 Member 연관관계 추가 * refactor: private 보조 메서드 순서 변경 * feat: logging 추가 #86 (#89) * feat: 간단한 Error Logging 추가 * refactor: Logging Level 변경 * feat: VisitLog, VisitImage 양방향 관계 설정 및 논리적 삭제 제거 #87 (#88) * feat: visitLog, visitImage 논리적 삭제 제거 * feat: visitLog, visitImage 양방향 설정 및 양방향 관계 설정에 따른 여행, 방문기록 삭제 로직 변경 * fix: 여행 상세 수정 날짜 필터링 오류와 썸네일 저장 오류 수정 #90 (#91) * fix: 여행 상세 수정 날짜 필터링 오류 수정 * fix: 여행 상세 생성 시 썸네일을 저장하지 않는 오류 수정 * refactor: dto 필드 수정 (#95) * feat: 여행 상세 목록 조회 시 최신순 정렬 #96 (#100) * feat: 여행 상세 목록 최신순으로 조회 * refactor: JPQL 메서드명 변경 * feat: 특정 여행 상세 조회 API에서 방문 기록 오래된 순 정렬 #101 (#102) * refactor: 반환값 제거 및 미사용 Param 제거 * feat: 특정 여행 상세 조회 시 방문 기록 오래된 순 조회 구현 * fix: Travel 삭제시 발생하는 오류 수정 #103 (#105) * fix: 여행에 포함된 방문 기록의 존재 여부를 검사할 때 논리적으로 삭제되지 않은 방문 기록만 고려하도록 수정 * fix: 여행을 삭제하면 연관된 TravelMember에 논리적 삭제가 전파되도록 수정 * refactor: JPQL에서 쿼리메서드로 변경 * refactor: @SQLRestriction으로 soft-delete하도록 변경 #106 (#107) * refactor: @SQLRestriction으로 soft-delete하도록 변경 * fix: 정렬 조건 누락 추가 * test: displayName 변경 * docs: swagger 컨벤션 설정 및 적용 (#116) * build: 중복 의존성 정의 제거 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * build: OpenApi 의존성 추가 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * chore: 전역적인 media type 설정 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * chore: open api skeleton code 작성 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * fix: constraint redefine 불가로 인한 오류 수정 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * style: 의미없는 개행 제거 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * docs: 누락된 설명 추가 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls --------- Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * feat: Entity 수정 (#119) * feat: 엔티티 구조 변경 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * style: 불필요한 개행 제거 Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls --------- Co-authored-by: YoonJuHo Co-authored-by: devhoya97 Co-authored-by: BurningFalls * build: 사용하지 않는 도커 이미지 삭제 workflow 구성 #84 (#120) * build: CD 작업 시 기존 도커 이미지 삭제 * build: CD 작업 시 기존 도커 이미지 삭제 순서 변경 * build: CD 트리거 수정 * refactor: 엔티티 수정 #125 (#126) * refactor: base entity 필드명 수정 * refactor: visitLog에 base Entity 추가 및 논리적 삭제 구현 * feat: 로그인 API 구현 #123 (#128) * build: jwt 의존성 추가 * chore: jwt 관련 환경 설정 추가 * test: 회원 생성 및 토큰 발급 성공 테스트 & 닉네임 중복 테스트 추가 * feat: 토큰 발급 구현 * feat: 로그인 서비스 구현 * feat: 로그인 컨트롤러 구현 * feat: 닉네임 VO 분리 및 예외 처리 구현 * refactor: getter 재정의 제거 * test: 닉네임 형식 예외 처리에 따른 테스트 수정 * feat: 필수값 누락 예외 처리 구현 * style: 코드 컨벤션 적용 * refactor: 누락된 dto 패키지 추가 * refactor: 애너테이션명 변경 * feat: 토큰 파싱해서 member 찾도록 resolver 구현 * fix: @MemberId -> @LoginMember로 변경되며 long에서 member로 타입 변경에 따른 테스트 실패 수정 * style: 코드 컨벤션 적용 * feat: 401 예외 핸들러 구현 * docs: swagger 명세 추가 * feat: 인가 관련 예외 & 핸들러 추가 * test: authorization 헤더 로직 구현에 따른 테스트 수정 * chore: CI run 임시 수정 * refactor: 필드 접근 제어자 수정 * refactor: 변수 분리 * test: 테스트명 수정 * refactor: handler 메서드명 변경 * docs: 예외 설명 추가 * refactor: 상수 재활용 * docs: schema description 수정 * refactor: 불필요한 개행 제거 * docs: 예외 발생 상황 설명 수정 * test: 토큰 생성 검증 추가 * chore: CI run 이전 상태로 수정 * docs: 응답 명세 작성 * feat: transactional 적용 * chore: CI run을 self hosted로 임시 변경 * fix: CD 실패로 인한 workflow 수정 (#135) * build: jwt 의존성 추가 * chore: jwt 관련 환경 설정 추가 * test: 회원 생성 및 토큰 발급 성공 테스트 & 닉네임 중복 테스트 추가 * feat: 토큰 발급 구현 * feat: 로그인 서비스 구현 * feat: 로그인 컨트롤러 구현 * feat: 닉네임 VO 분리 및 예외 처리 구현 * refactor: getter 재정의 제거 * test: 닉네임 형식 예외 처리에 따른 테스트 수정 * feat: 필수값 누락 예외 처리 구현 * style: 코드 컨벤션 적용 * refactor: 누락된 dto 패키지 추가 * refactor: 애너테이션명 변경 * feat: 토큰 파싱해서 member 찾도록 resolver 구현 * fix: @MemberId -> @LoginMember로 변경되며 long에서 member로 타입 변경에 따른 테스트 실패 수정 * style: 코드 컨벤션 적용 * feat: 401 예외 핸들러 구현 * docs: swagger 명세 추가 * feat: 인가 관련 예외 & 핸들러 추가 * test: authorization 헤더 로직 구현에 따른 테스트 수정 * chore: CI run 임시 수정 * refactor: 필드 접근 제어자 수정 * refactor: 변수 분리 * test: 테스트명 수정 * refactor: handler 메서드명 변경 * docs: 예외 설명 추가 * refactor: 상수 재활용 * docs: schema description 수정 * refactor: 불필요한 개행 제거 * docs: 예외 발생 상황 설명 수정 * test: 토큰 생성 검증 추가 * chore: CI run 이전 상태로 수정 * docs: 응답 명세 작성 * feat: transactional 적용 * chore: CI run을 self hosted로 임시 변경 * chore: CI run을 self hosted로 권한 부여 * chore: CI/CD workflow 트리거 임시 설정 * chore: CI/CD runs on 재설정 * chore: CI/CD workflow 권한 재설정 * chore: CI/CD workflow 권한 재설정 * chore: CI/CD workflow 임시용 트리거 제거 * fix: TravelResponses 필드 wrapping 오류 수정 (#145) * refactor: 방문기록 조회/수정 도메인 변경으로 인한 수정 #121 (#131) * feat: 특정 방문 기록 조회 API 문서화 * test: Test Fixture 생성 * refactor: 특정 방문 기록 조회 서비스 수정 * test: 특정 방문 기록 조회 컨트롤러 단위 테스트 추가 * refactor: API 명세에 맞게 변수명 변경 * feat: 일급컬렉션 구성 및 연관관계 편의 메서드 위치 변경 * feat: 특정 방문 기록 수정 서비스 구현 * feat: 특정 방문 기록 수정 컨트롤러 구현 * fix: ci 환경 변경 * feat: Multipart 문서화 및 검증 로직 추가 * refactor: 검증하고자 하는 부분을 명시적으로 표현 * refactor: 상수 접근제어자 변경 * refactor: NoArgsConstructor 접근 제어자 변경 * refactor: 생성자 Builder로 표현 * refactor: 부정으로만 사용되는 메서드 명 변경 * refactor: 메서드 명 변경 * refactor: 테스트 검증 방법 변경 * fix: 수정 요청 값 필수 * feat: 메시지 검증 로직 추가 * refactor: 불필요한 Content 애노테이션 제거 * refactor: API 명세 요청 변수 명 변경으로 인한 필드 명 수정 * refactor: 메서드 분리 * fix: AuthService Mocking * refactor: 명세에 맞게 닉네임 필드 명 변경 * refactor: 방문 기록 생성/삭제 도메인 변경으로 인한 수정 #122 (#129) * refactor: api명세에 맞게 필드명 변경 * test: TDD를 위한 컨트롤러 테스트코드 작성 * refactor: 방문 상세 생성 컨트롤러 api명세에 맞게 리팩토링 * refactor: 코드 컨벤션에 맞게 필드와 어노테이션을 다른 줄로 구분 * fix: 여행 식별자가 양수인지 검증하는 코드 추가 * test: 방문 기록을 생성할 수 없는 케이스 테스트 * feat: 사진이 5장을 초과하면 예외처리 기능 구현 * refactor: API 명세의 이름과 변수명 통일 * test: 방문 기록 생성 테스트 추가 * test: 메서드 명을 명확하게 변경 * fix: visitImagesUrl이 null일 때 NPE가 발생하는 문제 수정 * test: 양수가 아닌 식별자로 방문 기록 삭제시 예외 발생 테스트 * refactor: 코드 컨벤션에 맞게 컨트롤러 코드 수정 * test: Visit을 삭제하면 VisitImage도 삭제되는지 테스트 * refactor: 방문 기록 생성시 경계값을 테스트하면서 필요없어지는 메서드 제거 * refactor: 방문 기록 삭제 시 visitId는 null일 수 없으므로 long 타입으로 변경 * test: 방문 기록과 관련된 통합테스트 제거 * test: invalidVisitRequestProvider의 위치를 맨 위로 이동 * fix: 여행 기간에 포함되지 않는 방문 기록은 생성하지 못하도록 수정 * refactor: 가독성을 위한 예외 메시지 수정 * refactor: 불필요한 개행 제거 * refactor: 컨벤션에 맞게 메서드 위치 변경 * test: 가독성을 위한 개행 추가 * refactor: 검증 메서드명을 더 명확하게 수정 * feat: 방문 기록 생성에 Swagger 적용 * fix: visitImageFile이 필수 값으로 설정되어 있던 버그 수정 * refactor: 패키지 위치 적절하게 변경 * feat: 방문 기록 생성 DTO에 Swagger 적용 * feat: 방문 기록 삭제 Swagger 적용 * test: 방문 기록 생성시 경계값 성공 테스트 추가 * refactor: dto에 Schema 설명 추가 * refactor: 방문 사진이 없는 경우 null이 아닌 빈 리스트로 오므로 null 체크 제거 * test: mockMvc 검증에서 content 활용 * test: 가독성을 위한 변경 * refactor: 추후 ExceptionHandler에서 처리할 상황 제거 * refactor: RequestPart value와 dto 변수명을 명세에 맞게 변경 * refactor: null 값을 다룰 가능성이 없는 필드에 Long이 아닌 long을 사용 * test: DisplayName을 더 명확하게 수정 * refactor: 코드 컨벤션에 맞게 개행 제거 * test: 상수 활용 * refacotr: VisitControllerDocs에 @Parameter 추가 * refacotr: 컨트롤러 메서드 순서를 CRUD순으로 정렬 * refactor: 방문기록 생성 시 이미지가 없어도 빈 리스트가 오므로 required=false 제거 * test: 자동정렬로 인한 의도치 않은 개행 제거 * feat: 여행 상세 생성 API 수정 #141 (#147) * refactor: where 검증절 이동 * feat: 여행 상세 생성 서비스에서 multipart 처리 위한 기반 코드 구현 * feat: 여행 상세 생성 컨트롤러에서 multipartFile 받도록 구현 * docs: 여행 상세 생성 명세서 작성 * docs: 여행 상세 생성 명세서 상 key 오류 수정 * docs: 여행 상세 생성 명세서 상 설명 오타 수정 * refactor: cascadeType 변경 및 부모 엔티티가 관리하도록 수정 * test: 모호한 displayName 수정 * refactor: persist 전파 위해 순서 변경 * feat: 여행 상세 목록 조회, 특정 여행 상세 조회, 특정 여행 상세 삭제 API 수정 #148 (#149) * docs: 여행 상세 목록 조회 API 문서화 * docs: 특정 여행 상세 조회 API 문서화 * docs: 공통 예외 문서화 * docs: 특정 여행 상세 삭제 API 문서화 * refactor: 응답 변수 분리 * feat: 특정 여행 상세 조회 시 권한 예외 처리 구현 * feat: 특정 여행 상세 삭제 시 권한 예외 처리 구현 * refactor: 메서드 순서 조정 (CRUD 순서) * fix: dto 필드 오류 수정 * test: 여행 상세 목록 조회 테스트 작성 * test: 특정 여행 상세 조회 테스트 작성 * test: 특정 여행 상세 삭제 컨트롤러 테스트 작성 * test: 여행 상세 목록 조회 JPQL 테스트 수정 * docs: example 제거 * fix: 동일성 비교 * test: 가독성있게 pathVariable 분리 * refactor: 방문기록 썸네일 메서드 분리 * fix: 삭제하려는 여행 상세 없을 시 예외 발생하지 않도록 수정 * refactor: member entity 외 논리적 삭제 제거 #132 (#156) * refactor: member 외 soft delete 제거 * chore: ddl 교체 위한 환경 임시 변경 * fix: 닉네임 형식 수정 #157 (#158) * fix: 닉네임 형식 수정 * chore: ddl 변경 위한 환경 임시변경 * feat: AWS S3 SDK 구현 (#137) * build: aws sdk 의존성 추가 * chore: application-secrets 반영하도록 변경 * chore: multipart 최대파일크기와 최대요청크기를 10MB로 확장 * feat: S3Client 설정 커스텀 * feat: S3Exception 에러 핸들러 추가 * feat: s3Client를 사용하는 CloudStorageClient 생성 * feat: 이미지를 S3에 올리고 URL을 받아오는 비즈니스 로직 작성 * feat: file upload API 구현 * chore: pull_request에도 CD가 적용되도록 임시 변경 * chore: secret 변수들을 env로 관리하도록 변경 * chore: dev 서버도 멀티파트 용량 확장 * chore: application.yml 파일에 cloud 관련 재설정 * chore: cd 과정에서 환경 변수 설정하기 * fix: env 파일 인식하도록 수정 * fix: CI/CD에서 env를 읽을 수 있도록 수정 * chore: pull_request 시 CD 돌아가지 않도록 수정 * chore: pull_request 시 CD 돌아가도록 임시 수정 * fix: dev에 빠진 security 설정 추가 * chore: dev에도 cloud 관련 설정 추가 * chore: yml 파일 롤백 * chore: ci/cd workflow 롤백 * chore: cloud 관련 설정 추가 * chore: 이미지 용량 제한 늘리는 설정 추가 * chore: yml에 실제 값 대입 * chore: pull_request에도 CD가 적용되도록 임시 수정 * fix: s3Client build를 CLoudStorageClient에서 수행 * chore: cloud 관련 설정 값 대입 * refactor: s3Client build를 S3ClientConfig에서 수행 * refactor: s3Client build를 CloudStorageClient에서 수행 * fix: 파일 경로 오류 수정 * fix: 파일 경로 오류 수정 * fix: 파일 경로 오류 수정 * fix: 파일 경로 오류 수정 * fix: 파일 경로 오류 수정 * fix: 파일 경로가 버킷을 포함하지 않도록 수정 * feat: file 이름이 겹치는 경우, UUID를 뒤에 붙이는 기능 구현 * chore: push에만 cd가 적용되도록 다시 변경 * refactor: 에러 메시지 변경 * refactor: MultipartFile 여러 개 받을 수 있도록 수정 * feat: S3 객체 삭제하는 API 구현 * chore: pull_request에도 cd가 적용되도록 다시 변경 * chore: push에만 cd가 적용되도록 다시 변경 * style: ci/cd workflow endline 롤백 * feat: 방문 기록 관련 인가 구현 #140 (#161) * feature: 특정 방문기록 조회시 인가 처리 * feature: 특정 방문기록 수정, 삭제시 인가 처리 * style: 미사용 import 제거 * feat: 방문 기록 생성 시 여행 상세의 주인인지 인가 추가 * refactor: 불필요한 개행 제거 * test: 테스트 실패 지점을 하나로 수정 * chore: 서버 DDL 생성 전략 변경 * feat: 여행 상세 수정 API 수정 #142 (#159) * refactor: 썸네일이 없는 경우 기존 썸네일 유지 * feat: 여행 수정 서비스 multipart와 인가 기능 추가 * feat: 여행 수정 컨트롤러 multipart와 인가 기능 추가 * fix: 여행 썸네일 추출 임시 로직 구성 * refactor: 400 에러 메세지 응답 API 문서에 추가 * docs: id 예시 값 추가 * chore: 개발 서버 DDL 생성 전략 변경 * refactor: 이미지 수정 요청 분기 처리 위치 변경 및 테스트 작성 * feat: 이미지가 필요한 API에 S3 적용 #166 (#168) * test: S3 테스트를 위해 fake 객체 생성 * feat: 여행 상세 생성 시 S3에 썸네일 저장 * feat: 여행 상세 수정 시 S3에 썸네일 대치 * feat: 방문 기록 생성 시 S3에 이미지 저장 * feat: 방문 기록 수정 시 S3에 이미지 대치 * chore: pull request에도 CD가 돌아가도록 임시 설정 * chore: pull request에도 CD가 돌아가도록 임시 설정한 것 원상복구 * refactor: Objects.isNull 활용 및 메서드 위치 변경 * feat: 로깅 프레임워크 적용 #134 (#171) * feat: 로거 환경 설정 * feat: 로거 형식 정의 * feat: 요청/응답 로깅 구현 * feat: 예외에 대한 로거 형식 적용 * feat: token 유무 식별 로그 추가 * refactor: thread 식별명 추가 * refactor: 예외 발생 구체 클래스/메서드 로깅 * chore: CD 트리거 수정 * chore: CD 트리거 복원 * chore: 임시 예외 케이스 생성 및 로그 테스트 * chore: 임시 예외 케이스 수정 및 로그 테스트 * chore: 임시 예외 케이스 재수정 및 로그 테스트 * chore: 임시 예외 케이스 삭제 * chore: CD 트리거 복원 * fix: Logging 데이터 변경 * chore: CD 트리거 복원 * fix: Logging 데이터 오류 수정 * chore: CD 트리거 복원 * feat: 로깅 White List 추가 * feat: 방문 기록 목록 조회시 시간 순으로도 정렬되는 기능 구현 (#175) * feat: 방문 기록의 방문 날짜 저장 시, 시간까지 저장하도록 변경 * fix: request dto에서 LocalDateTime에 대한 패턴이 시간까지 포함하도록 변경 * refactor: 여행에 포함된 날짜인지 비교시 LocalDateTime을 넘겨주도록 변경 * refactor: 사진 url 관련 dto 필드명 끝에 url 추가 * refactor: 기대한대로 작동하지 않는 ExceptionHandler 메서드 주석 처리 * refactor: 파일 이름 및 형식 오류 수정 #176 (#177) * refactor: 파일 이름을 UUID로만 구성하도록 수정 * refactor: content-type을 multipart/formed-data로 고정 * feat: swagger https 적용하기 #184 (#185) * feat: swagger가 https 접근 가능하도록 하는 기능 구현 * chore: pull_request에도 CD가 적용되도록 임시 변경 * style: push에만 CD가 적용되도록 롤백 * feat: 빈/공백 문자열 예외 처리 #186 (#187) * fix: 여행 제목은 공백 문자열 불가, 1자 이상 30자 이하로 설정할 수 있도록 예외 처리 * fix: 방문 기록의 이름은 공백 문자열 불가, 1자 이상 30자 이하로 설정할 수 있도록 예외 처리 * fix: 닉네임의 이름은 공백 문자열 불가, 1자 이상 20자 이하로 설정할 수 있도록 예외 처리 * test: displayName 변경 * fix: Swagger 인증 헤더 형식 변경 #188 (#189) * fix: Swagger 인증 헤더 수정 * refactor: 로깅 정보 수정 * chore: stage/dev 서버 분리 #192 (#197) * fix: 포트 수정 * refactor: 설정 파일 profile 별로 분리 * fix: timezone 설정 * refactor: ci-cd 파일명 변경 * refactor: ci-cd 분리 * test: 경계값 테스트로 수정 * test: 경계값 테스트로 수정 및 발생하는 오류 수정 * chore: back-end 개발용 CD 트리거 변경 * fix: 불필요한 파일 삭제 * refactor: stage용 환경 파일 분리 * refactor: DockerFile 분리 * refactor: 태그 설정 * refactor: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 * fix: 태그 설정 수정 * refactor: CI runs-on 변경 * refactor: dev용 CICD trigger 변경 * refactor: dev용 CICD runs on 변경 * refactor: dev용 CICD trigger 변경 * refactor: runner 재설치로 인해 임시로 변경했던 dev용 CICD runs-on & trigger 복구 * refactor: hub push 시 로그인 재수행 * fix: 명령어 오류 수정 * feat: 단체 계정으로 dockerhub 변경 * refactor: 정상 작동 확인 후 트리거 복구 * fix: image push 시 권한 오류 수정 (#200) * feat:admin용 계정 로직 추가 (#201) * fix: add stage logging (#204) * feat: 이미지 확장자와 content-type 설정 #196 (#202) * feat: content-type을 확장자로 분석하는 기능 구현 * chore: PR CD 임시 적용 * chore: PR CD 해제 * refactor: dev, stage, local 환경의 swagger url 설정 (#208) * refactor: 이미지 용량 제한 확장 (한 이미지: 20MB, 한 요청: 100MB) (#206) * fix: 이미지 전송 안되는 에러 수정 #209 (#210) * chore: PR CD 임시 적용 * fix: 파일 형식에 .추가 및 디폴트 형식 변경 * temp: 확인용 에러 * temp: 롤백 * refactor: 디폴트 mime type 변경 * temp: 일단 image의 내부 메서드 사용 * fix: file-extension 지정 롤백 * fix: content-type 지정 * temp: 에러 체크를 위해 메시지 임시 변경 * temp: 에러 메시지 롤백 * feat: content-type 확장자로부터 추출 * chore: PR CD 해제 * refactor: API명세 변경에 따른 URI, DTO 변수명 변경 #211 (#212) * refactor: URI, DTO 변수명 변경 * refactor: DTO 클래스명을 API명세에 맞게 변경 * refactor: imageFile 변수명 변경 * test: pathVariable명을 클래스명을 고려하여 변경 * refactor: 엔티티, 메서드명 API 명세에 맞게 변경 * refactor: 여행을 추억으로, 방문을 순간으로 네이밍 변경 * feat: 추억 목록 조회 API 수정 #215 (#216) * feat: startAt, endAt 필드 nullable하게 변경 * feat: memory의 createdAt 기준 최신순 정렬로 변경 * style: code convention 적용 * style: 응답 형식 변경 (mates 제거 및 기간 미필수 응답 필드로 변경) * feat: 올바르지 않은 년도 형식 예외 처리 * refactor: 추억 상세 -> 추억 * test: 메세지 오류 수정 * test: 저장 순서 오류 수정 * refactor: fixture 패키지 이동 * refactor: fixture 분리 * test: 경계값 검증으로 수정 * feat: 사용자 로깅, Nginx 로깅, DB 로깅 #190 (#224) * feat: MDC 적용 * refactor: 중복 예외 제거 * feat: 사용자 식별 로깅 추가 * refactor: 예외 메세지 형식 json으로 변경 * feat: 추억 삭제 API 수정 #221 (#222) * feat: 변경사항 docs 반영 * feat: 순간이 존재하는 경우 추억을 삭제할 수 없었던 예외 제거 * style: code convention 적용 * feat: 추억 삭제 시 속한 순간도 함께 삭제되도록 서비스 구현 * refactor: 불필요한 개행 제거 * feat: 추억 조회 API 수정 #227 (#228) * feat: 기간 필수 여부 변경에 따른 어노테이션 추가 * docs: 도메인명 변경에 따른 명세서 수정 * build: stage 서버 CICD 임시 비활성화 #234 (#235) * chore: stage 비활성화 적용 전 dev에서 시범 적용 * chore: dev 서버 cicd 비활성화 해제 * chore: dev 서버 cicd 트리거 복구 * chore: stage 서버 cicd 임시 비활성화 * feat: 댓글 생성, 조회 API 구현 #214 (#225) * refactor: 댓글과 관련된 클래스를 별도의 패키지로 분리 * test: tdd를 위한 댓글 생성 서비스 테스트 추가 * feat: 댓글 생성 서비스 메서드 구현 * test: 댓글 생성 관련 컨트롤러 테스트 코드 작성 * feat: 댓글 생성 기능 구현 * feat: 댓글 조회 서비스 메서드를 위한 tdd 틀 작성 * feat: 댓글 조회 서비스 메서드 구현 * test: 댓글 컨트롤러 테스트 클래스 패키지 위치 변경 * refactor: 댓글 읽기 메서드명을 더 명확하게 변경 * test: 댓글 읽기 테스트 코드 추가 * feat: 댓글 읽기 컨트롤러 메서드 구현 * feat: 댓글 생성, 조회 API에 swagger 적용 및 순간 기록을 순간으로 변경 * fix: Swagger 적용으로 인한 문제 해결 * test: 순간 기록이라는 말을 순간으로 변경 * refactor: 댓글의 글자수로 인한 예외 메시지에 '1자 이상'이라는 말을 제거 * fix: 댓글 생성 메서드에 Transactional 적용 * chore: stage 서버 CI/CD 활성화 * feat: 감정 선택 API 구현 #230 (#236) * feat: 기분 유형 생성 * feat: Moment 비즈니스 로직에 기분 표현 적용 * feat: 기분 표현 컨트롤러 구현 * feat: default 기분 생성 * style: 코드 컨벤션 적용 * refactor: 예외 메세지 변경 * feat: 순간 생성 API 구현 #226 (#229) * refactor: 기한이 없는 memory 구현 * test: 기한없는 Memory에 Moment 생성 테스트 * feat: Moment 생성 서비스 구현 * feat: Moment 생성 컨트롤러 구현 * refactor: builder 선택 필드 제외 * style: 잘못된 네이밍 수정 * refactor: MomentImages 생성 책임 Moment로 위임 * feat: 하나의 사진 업로드 API 생성 #256 (#258) * feat: api 이름 captures로 변경 * feat: RequestBody imageFiles로 이름 변경 * refactor: 변수명 iamge -> file로 통합 * refactor: requestparam -> requestpart로 변경 * feat: 다섯 장을 넘기지 않도록 예외 추가 * feat: 빈 배열을 받는 경우 로직을 수행하지 않도록 변경 * style: CamelCase 적용 * refactor: 에러 메시지 수정 * feat: 특정 content-type을 처리하도록 명시 * feat: validated 어노테이션 추가해서 유효성 검사 수행 * test: 사진 개수에 따른 성공/실패 테스트 수행 * test: 빈 멀티파일 리스트가 들어올 시, 빈 url 리스트가 들어오는 테스트 수행 * refactor: byte 처리에서 나는 오류를 StaccatoException으로 처리 * chore: dev 서버 PR CD 임시 적용 * refactor: API명 captures -> images로 변경 * chore: dev 서버 PR CD 해제 * fix: test에도 변경된 api명 적용 * feat: 파일을 한 장만 업로드하도록 변경 * feat: dto를 반환하는 새로운 메서드 생성 * test: 테스트 Disabled * refactor: CloudStorage -> Image로 이름 단순화 * feat: S3 객체 삭제 로직 삭제 * refactor: 미사용 import 삭제 * refactor: 전체 경로를 yml에서 지정 * refactor: getFileExtension 메서드 리팩터링 * feat: ImageUrlResponse 생성 * refactor: file을 전부 image로 변경 * refactor: S3Client를 S3ObjectClient로 변경 * refactor: S3Exception 로깅에 EXCEPTION_LOGGING_FORM 적용 * feat: 로그인한 사용자만 images API를 사용가능하게 함 * refactor: ImageExtension을 사용하는 Service 폴더로 이동 * feat: yml에서 설정한 파일 용량 제한 예외를 잡는 MultipartExceptionHandler 구현 * refactor: 충돌방지 이름변경 * refactor: @Size 사라지면서 Validated 삭제 * test: 컨트롤러 단위 테스트 수행 * refactor: 미사용 import문 삭제 * style: /images API swagger 적용 * refactor: file -> image * refactor: uploadImages -> uploadImage * refactor: 미사용 import문 삭제 * chore: PR CD를 수동으로 실행 가능하게 설정 * refactor: 기존 테스트 삭제 * fix: 반영되지 않은 수정사항 관련 테스트 disabled * chore: dev 서버 PR CD 임시 해제 * fix: 이미지 저장 폴더 재지정 * refactor: 테스트 메서드 네이밍 수정 * refactor: 폴더명 수정 * refactor: 닫는 괄호 추가 * refactor: S3ObjectClient를 infrastructure 패키지로 이동 * refactor: 컨벤션에 맞추어 줄바꿈 * refactor: infra 패키지를 image 패키지 내부로 이동 * feat: 추억 생성 API 수정 #238 (#260) * feat: multipartFile 제거 및 contentType을 application/json으로 변경 * refactor: term(startAt, endAt) 객체 분리 * feat: startAt, endAt 중 누락 예외 처리 * fix: 기간이 없을 경우 순간 날짜 포함 여부 예외 처리 오류 수정 * test: 기간 포함 날짜 검증 테스트 추가 * refactor: 가독성 있게 로직 수정 * docs: 요청 형식 설명 수정 * feat: 댓글 수정 API 구현 #245 (#254) * test: Fixture를 활용하도록 기존 테스트 변경 * feat: 댓글을 생성하는 기능 해피케이스 구현 * feat: 댓글을 찾을 수 없는 경우 예외 발생 테스트 * feat: 본인이 달지 않은 댓글에 대해 수정을 시도하면 예외 발생 기능 구현 * test: 조회 권한이 없는 순간에 달린 댓글들 조회를 시도했을 때 예외 발생 테스트 추가 * feat: 댓글 수정 컨트롤러 메서드 구현 * test: 양수가 아닌 댓글 식별자로 댓글 수정 시 예외 발생 테스트 * feat: 댓글 내용을 입력하지 않거나 빈 문자열로 입력 후 댓글 수정 시 예외처리 * refactor: 댓글 생성 시 최소 글자수 조건이 NotBlank에 의해 필요 없으므로 삭제 * refactor: 순서가 불필요하므로 GroupSequence 설정 제거 * feat: updateDTO에 Swagger 적용 * test: 실수로 빠뜨린 when & then 적용 * feat: 댓글 삭제 API 구현 #255 (#257) * test: Fixture를 활용하도록 기존 테스트 변경 * feat: 댓글을 생성하는 기능 해피케이스 구현 * feat: 댓글을 찾을 수 없는 경우 예외 발생 테스트 * feat: 본인이 달지 않은 댓글에 대해 수정을 시도하면 예외 발생 기능 구현 * test: 조회 권한이 없는 순간에 달린 댓글들 조회를 시도했을 때 예외 발생 테스트 추가 * feat: 댓글 수정 컨트롤러 메서드 구현 * test: 양수가 아닌 댓글 식별자로 댓글 수정 시 예외 발생 테스트 * feat: 댓글 내용을 입력하지 않거나 빈 문자열로 입력 후 댓글 수정 시 예외처리 * refactor: 댓글 생성 시 최소 글자수 조건이 NotBlank에 의해 필요 없으므로 삭제 * refactor: 순서가 불필요하므로 GroupSequence 설정 제거 * feat: updateDTO에 Swagger 적용 * feat: 댓글 삭제 API 해피케이스 구현 * feat: 본인이 쓴 댓글이 아닌데 삭제를 시도하면 예외 처리 기능 구현 * feat: 댓글 삭제 컨트롤러 메서드 구현 * test: 댓글 식별자가 양수가 아닐 경우 댓글 삭제 실패 테스트 * feat: 댓글 삭제 API에 Swagger 적용 * feat: 추억 수정 API 수정 #261 (#262) * feat: 이미지 컨트롤러 분리로 변경된 사항 반영 * refactor: 미사용 메서드 제거 * test: 인증 관련 테스트 추가 * docs: 명세서 누락 및 오류 수정 * test: aaa 주석 수정 * chore: dev 서버 push 트리거 제거 * feat: 순간 수정 API 구현 #244 (#248) * refactor: Moment 수정 서비스 로직 수정 * refactor: Moment 수정 컨트롤러 로직 수정 * refactor: 레거시 코드 변경 및 예외 메세지 변경 * docs: 누락 DTO 명세 추가 * docs: 명세 수정 * feat: 순간 삭제 API 구현 #243 (#250) * style: 네이밍 컨벤션 적용 * docs: 명세 수정 * feat: 순간 조회/목록 조회 API 구현 #251 (#253) * feat: 순간 조회/목록 조회 서비스 로직 구현 * feat: 순간 조회/목록 조회 컨트롤러 로직 구현 * test: 메서드 쿼리 검증 테스트 추가 * refactor: 클래스 명 수정 * test: 불필요한 테스트 데이터 삭제 * feat: image upload 예외 처리 추가 #268 (#269) * feat: MissingServletRequestPartException 에러 핸들링 * chore: dev 서버 PR CD 임시 해제 * chore: dev 서버 push cd 삭제 * refactor: 같은 메시지 주는 예외 동일한 exceptionHandler로 묶기 * refactor: 예외 핸들러를 다시 분리 * refactor: 에러 메시지 적절하게 변경 * feat: 서버 별로 이미지 저장 경로 설정 (#272) * refactor: S3 로직 리팩터링 #274 (#275) * refactor: 미사용 메서드 삭제 * refactor: 미사용 import 삭제 * refactor: 명세 변경에 따른 swagger 메시지 변경 * refactor: 요청 크기 제한 100->20으로 변경 * refactor: 메서드 순서 변경 * refactor: 개행 삭제 * chore: 운영 서버 구축 #264 (#270) * chore: prod 서버 환경설정 * feat: prod 환경 로깅 설정 * chore: prod 환경 테스트를 위한 CD 트리거 변경 * fix: env 파일 경로 수정 * chore: 로그 파일 저장 위치 지정 * chore: 로그 폴더 생성 명령 삭제 * chore: 로그 생성 위치 변경 * chore: 도커 이미지 재실행 코드 추가 * chore: 도커 이미지 재실행 코드 수정 * chore: 로그 콘솔 출력 * chore: 로그 저장 위치 수정 * feat: 운영 환경에서 어드민 로직 비활성화 * refactor: main에 push시에만 prod cd trigger 실행하도록 workflow 변경 --------- Co-authored-by: yoonjuho * fix: 닉네임 앞뒤 공백 제거 #277 (#278) * fix: 닉네임 앞뒤 공백 제거 * fix: 닉네임 요청 형식에서 앞뒤 공백 제거 NPE 해결 * fix: 순간 조회 응답 형식 수정 (#276) * fix: 순간 조회 응답 형식 수정 * fix: 순간 목록 응답 인자 명 수정 * feat: 추억 이름 중복 불가 예외 처리 #280 (#282) * feat: 추억 제목 중복 검사 구현 * docs: 예외 발생 케이스 문서화 * test: 픽스처 활용 * feat: 추억 수정 시 이미 존재하는 타 추억 이름으로 변경 불가능 예외 처리 * test: 주석 오타 수정 * fix: 순간 날짜 반환 형식 변경 #283 (#286) * fix: 순간 날짜 응답 형식 수정 * refactor: 메서드 분리 로직 삭제 * fix: 날짜 ms 제거 * feat: 현재 날짜를 포함하고 있는 추억 목록 조회 구현 #281 (#285) * feat: 특정 날짜를 포함하는 모든 추억 조회 기능 구현 * feat: 특정 날짜를 포함하는 모든 추억 조회 기능 구현 * test: 메시지 변경으로 인한 테스트코드 수정 * feat: 날짜로 추억 목록 조회 컨트롤러 분리 * style: 미사용 import 제거 * feat: 날짜를 포함하는 모든 추억을 조회시 기간이 없는 추억도 함께 조회 * refactor: 순간 수정 이미지 순서 적용 #287 (#288) * refactor: 순간 수정 이미지 순서 적용 * test: 순간 수정 이미지 순서 검증 테스트 추가 * refactor: 순간 수정 이미지 순서 중복 로직 삭제 * refactor: 사용되지 않는 메서드 삭제 * fix: 순간 조회 응답 필드 추가 #292 (#293) * fix: 순간 응답 필드에 추억 관련 필드 추가 * test: 픽스쳐 사용 * refactor: 예외 메시지 수정 #294 (#298) * refactor: 예외 메시지의 순간을 스타카토로 변경 Co-authored-by: devhoya97 * refactor: 예외 메시지 수정 Co-authored-by: devhoya97 * refactor: 순간 -> 스타카토 Co-authored-by: devhoya97 * docs: 문서 수정 Co-authored-by: devhoya97 --------- Co-authored-by: devhoya97 * chore: 운영 서버에서 명세서 비활성화 #302 (#303) * feat : 스타카토 제목, 추억 제목에 trim 적용 #305 (#307) * refactor: 예외 메시지의 순간을 스타카토로 변경 Co-authored-by: devhoya97 * refactor: 예외 메시지 수정 Co-authored-by: devhoya97 * refactor: 순간 -> 스타카토 Co-authored-by: devhoya97 * refactor: 추억 생성 시 title에 trim 적용 * refactor: 스타카토 생성 시 placeName에 trim 적용 * fix: dto에서 size 검증 시 min 조건 제거 --------- Co-authored-by: linirini <2001yerin@naver.com> * chore: ci에 jacoco 추가 (#309) * chore: ci에 jacoco 추가 * chore: ci에 jacoco 위한 권한 변경 * chore: ci에 jacoco 위한 권한 변경 * chore: test report 경로 오류 수정 * build: jacoco 빌드 설정 * build: jacoco 대상에서 builder 제외 * build: jacoco 제한 제거 * build: jacocoCoverageVerification 제거 * chore: 단위 테스트 결과 가져오기 적용 * build: CI/CD 트리거 수정 * chore: QA 위한 트리거 수정 * chore: 배포 트리거 세팅 * docs: pr 템플릿 수정 --------- Co-authored-by: devhoya97 Co-authored-by: somin Co-authored-by: BurningFalls Co-authored-by: YoonJuHo Co-authored-by: devhoya97 <146502065+devhoya97@users.noreply.github.com> * deploy: 스타카토 v1.0.0 #310 (#311) * build: 프로젝트 생성 및 의존성 추가 * chore: 사용자 기능 및 권한 추가 * chore: gitignore 재설정 * chore: gitigonre .idea/ 추가 * build: develop-an 브랜치의 CI 설정 #3 (#10) * build: android-ci.yml 파일 생성 * chore: 오타 및 개행 수정 * chore: working-directory 수정 * build: ktLint 적용 및 format * ui: 디자인 시스템 구현 #11 (#44) * ui: color 정의 * ui: shape, selector 추가 * ui: icon 추가 * ui: font family 추가 - pretendard regular, medium, semibold, bold 추가 * ui: typography 정의 * ui: strings 정의 * ui: bottom sheet drag handle drawable 추가 * ui: styles 정의 * ui: detail toolbar 구현 - 상세 화면에서 사용 * ui: dialog, bottom sheet 구현 - 여행 및 방문 기록 삭제 dialog - 사진 등록 bottom sheet * ui: 사진 첨부 layout 구현 * feat: 삭제 다이얼로그, 사진 첨부 바텀 시트 fragment 추가 * ui: 세로모드로 고정 * build: data binding 의존성 추가 * style: strings resource 순서 정렬 * style: formatting * ui: plus icon 추가 * feat: jetpack navigation 및 바텀시트 프래그먼트 추가 #12 (#15) * build: androidx.navigation 및 dataBinding 의존성 추가 * feat: Binding 화면 클래스 및 bottomSheetNavigation 추가 * feat: TimelineFragment 임시 화면 추가 * feat: TravelFragment 임시 화면 추가 * feat: TravelCreationFragment 임시 화면 추가 * feat: VisitFragment 임시 화면 추가 * feat: VisitCreationFragment 임시 화면 추가 * feat: (여행, 방문 기록) 수정 화면 추가 * feat: (여행, 방문 기록) 생성 화면 이동 구현 * feat: BottomSheetController 설정 및 Navigation 이동 구현 * feat: 뒤로가기 버튼 클릭 시 BottomSheet, Toast 작동 구현 * feat: 여행, 방문 기록 생성을 위한 액티비티 추가 및 이동 구현 * feat: 여행, 방문 기록 수정을 위한 액티비티 추가 및 이동 구현 * build: 중복된 dataBinding 제거 * feat: 공통 이미지 로딩 BindingAdapter 설정 #33 (#41) * build: dataBinding 사용 설정 * feat: 이미지 로딩 바인딩 어댑터 설정 - Glide, Coil 바인딩 어댑터를 각각 작성 - placeholder 설정 * style: ktlint check - import 순서 조정 * fix: attribute 개수에 맞추어 BindingAdapter의 value 재설정 * style: 마지막 줄 개행 추가 * feat: placeHolder를 필수 속성으로 변경 및 coil 이미지 로딩 코드 수정 - placeHolder를 ImageView의 필수 속성으로 지정 - Coil BindingAdapter에서 url이 null인 경우에도 이미지를 로드하는 동작이 수행되도록 수정 * ui: 상단바 색상 변경 * build: develop-an의 CI 설정 수정 #38 (#39) - Git Action에 Secret으로 저장된 LOCAL_PROPERTIES_API_KEY를 변수로 가져온다. - 가져온 변수를 echo를 활용하여 local.properties에 설정한다. * build: develop-an 브랜치의 CI 파일 문법 오류 수정 #45 (#46) * fix: android-ci.yml 파일의 명령어 수정 LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: android-ci.yml 파일의 명령어 수정 #47 (#48) LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: 파이프라인 제거하여 명령어 수정 * fix: develop-an 브랜치의 CI 파일 명령어 재수정 #47 (#49) * fix: android-ci.yml 파일의 명령어 수정 LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: 파이프라인 제거하여 명령어 수정 --------- Co-authored-by: Somin Lee <46596035+s6m1n@users.noreply.github.com> * fix: 문자열 임을 명시하고 환경변수 설정 위치 조정 * fix: local.properties 생성 시점 수정 * feat: 데이터 패키지 설정 #13 (#35) * build: 서버 base url의 local.properties 사용 설정 및 BuildConfig 설정 * feat: Retrofit Client 작성 * fix: Merge Conflict 해결 - build.gradle.kts(project, app)의 ktlint 의존성 충돌 해결 - 버전 카탈로그 플러그인 충돌 해결 * feat: DTO 클래스 작성 * style: ktlint check - 불필요한 import 제거 - 개행 조정 - 콤마 추가 * feat: SerialName 어노테이션의 값을 camelCase로 수정 * refactor: DTO 클래스의 이름 수정 - API 요청으로 직접 보내거나 들어오는 JSON의 경우 DTO 클래스명 뒤에 Request/Response 를 붙이도록 설정 - JSON 안에 속성 값으로 들어가는 JSON은 DTO 클래스명 뒤에 Dto를 붙이도록 설정 * feat: 누락된 Dto 클래스 추가 TimelineResponse.kt - 타임라인 조회 시 여행 상세 목록을 불러올 때 사용되는 DTO 클래스 - TimelineTravelDto 리스트를 갖는다 * style: ktlint check * fix: const 키워드 제거 --------- Co-authored-by: hxeyexn * feat: 둥근 모서리의 이미지를 로드하는 BindingAdapters 추가 #58 (#59) * feat: 둥근 모서리로 이미지를 로딩하는 Glide 바인딩 어댑터 작성 - 세 속성이 모두 필요하다. - glideRoundedCornerImageUrl: 출력하고자 하는 이미지 url - glidePlaceHolder: placeHolder의 url - glideRoundingRadius: 모서리의 둥근 정도를 Int로 설정 * feat: 둥근 모서리로 이미지를 로딩하는 Coil 바인딩 어댑터 작성 - 세 속성이 모두 필요하다. - coilRoundedCornerImageUrl: 출력하고자 하는 이미지 url - coilPlaceHolder: placeHolder의 url - coilRoundingRadius: 모서리의 둥근 정도를 Float으로 설정 * fix: centerCrop 설정을 BindingAdapter 에 위임 - xml 속성으로 centerCrop을 주게 되면 Round Corner가 제대로 적용되지 않는 현상 발생 - Glide의 api로 제공되는 centerCrop() 메서드를 활용 * ui: 타임라인 프래그먼트(BottomSheet) 구현 #55 (#71) * ui: 타임라인 View xml 파일 작성 - 타임라인에 나타날 여행 상세 아이템 xml 작성 - 썸네일 사진 유무에 따라 뷰를 구분 - 타임라인이 나타날 fragment xml 작성 * feat: 타임라인 여행 상세 아이템 UI 모델 생성 * ui: 썸네일이 없는 여행상세 아이템의 margin 조정 * ui: Timeline RecyclerView의 layoutManager 설정 * ui: xml에서의 UiModel 데이터 바인딩 설정 * feat: ViewHolder 작성 - 썸네일 사진 유무에 따라 다른 ViewHolder로 구분 - 공통된 속성을 정의한 TimelineViewHolder 추상클래스 생성 * feat: TimelineRepository Interface 생성 * feat: 임시 TimelineRepository 구현체 생성 * feat: TimelineViewModel 및 Factory 생성 * feat: TimelineViewType 작성 * feat: TimelineAdapter 작성 * feat: TimelineFragment에 ViewModel과 Adapter 구현 * feat: 이미지 로딩 PlaceHolder drawable 추가 및 적용 * feat: 임시 데이터 연결 * ui: Timeline fragment 의 세부 설정 조정 * ui: Timeline의 Item xml 변경 - 뷰 타입을 3개로 분할: 첫 번째 아이템, 중간 아이템, 마지막 아이템 - 이에 따라 xml 파일 추가 및 view 수정 * feat: ViewType 변경에 따른 Adapter 및 ViewHolder 수정 * refactor: 불필요한 View 및 ViewHolder 제거 * feat: 여행 click 에 대한 event handler 생성 및 설정 * refactor: drawable 이름을 네이밍 컨벤션에 맞게 수정 * ui: RecyclerView의 마진 속성을 패딩 속성으로 변경 * feat: 바텀 시트 디자인 변경 및 툴바와의 상호작용 구현 * ui: 타임라인 글귀 추가 * style: ktlint check * ui: 둥근 모서리의 이미지로 변경 * ui: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 구현 #52 (#74) * ui: typography.body textSize 1sp 씩 증가 * feat: DeleteDialogFragment에 Handler 추가 * feat: 툴바의 수정, 삭제 버튼 제어를 위한 ToolbarHandler 추가 * feat: 방문 상세 화면을 위한 VisitDetailUiModel 추가 * ui: PlaceHolder를 위한 xml 파일 추가 * feat: 방문 기록 상세 화면을 위한 VisitAdapter 및 VisitViewHolder 구현 * feat: 임시 VisitViewModel와 VisitViewModelFactory 추가 * feat: VisitFragment 화면 구현 * feat: 방문 기록에 해당하는 여행 선택을 위한 TravelSelectionFragment 구현 * feat: 방문 기록에 해당하는 날짜 선택을 위한 VisitedAtSelectionFragment 구현 * feat: 방문 기록 생성을 위한 VisitCreationActivity 구현 * feat: 방문 기록 수정을 위한 VisitUpdateActivity 구현 * refactor: DialogHandler를 DeleteDialogFragment의 생성자에서 받도록 수정 * refactor: initVisitUpdateDoneButton 중복 로직 제거 * refactor: VisitViewHolderType 메서드 명 변경 of -> from * refactor: tv_place_name_title을 xml id convention에 맞게 수정 * ui: 여행 화면 구현 #51 (#75) * ui: 함께 간 사람들 item 구현 * ui: 방문 기록 item 구현 * ui: 여행 상세 화면 구현 * ui: 여행 생성 화면 구현 * ui: 여행 수정 화면 구현 * ui: placeholder에 사용할 drawable 추가 * ui: 여행 삭제 완료 string 추가 * feat: 둥근 모서리 이미지 BindingAdapter 구현 * feat: 함께 간 사람들 adapter 구현 * ui: 여행 상세 화면 NestedScrollView로 변경 - 이전: ScrollView - 이후: NestedScrollView * feat: 방문 기록 adapter 구현 * feat: 여행 상세 view 연결 * feat: 함께 간 사람들, 방문 기록 adapter 연결 * feat: 삭제 다이얼로그 handler 구현 * feat: 여행 상세 화면 toolbar handler 구현 - 뒤로가기 - 여행 수정 화면으로 이동 - 삭제 다이얼로그 show * feat: 여행 -> 방문 기록 화면 이동 구현 * ui: DatePickerStyle 추가 - DatePickerStyle, CustomMaterialCalendarStyle 추가 - staccato_blue 투명도 30 추가 * feat: 여행 저장 버튼, 여행 기간 BindingAdapter 추가 * feat: 여행 생성 view 연결 * feat: 여행 수정 view 연결 * style: formatting - Exceeded max line length 해결 - 임시 이미지 URL 변경 * refactor: 기간 선택 로직 메서드 분리 * feat: 타임라인의 API 적용 및 MainActivity의 Toolbar 제거 #81 (#93) * refactor: UI Model의 패키지 경로 변경 * refactor: API 명세 변경에 따른 TimelineTravelDto 수정 * refactor: repository 메서드 수정 - 서버 요청을 비동기적으로 처리하기 위해 suspend 키워드 삽입 - 기존의 임시 데이터 요청 코드를 위해 load 메서드 분리 * feat: Timeline의 API Service 작성 * feat: DataSource 인터페이스 작성 * feat: TimelineDataSource 구현체 생성 * refactor: 년도에 대한 default parameter 설정 * refactor: DataSource의 요청 메서드 네이밍 수정 * feat: http 통신이 가능하도록 Cleartext Traffic 허용 설정 * feat: Authorization Header를 삽입하기 위한 Interceptor 생성 * feat: Client에 HeaderInterceptor 추가 * refactor: errorBody의 message 속성 이름 변경 * feat: 도메인 모델 작성 * feat: Response(dto)에서 도메인 모델로 변환하는 확장함수 구현 * feat: 도메인 모델에서 UI 모델로 변환하는 확장함수 구현 * feat: Repository 수정 및 ViewModel 데이터 연결 * ui: MainActivity의 상단 툴바 제거 * refactor: ViewType에 viewType 속성 추가 및 when에서의 enum 활용 * refactor: Timeline의 공통 ViewHolder를 sealed class로 변경 * style: ktlint check 수행 * fix: Response 데이터의 nullable 속성에 맞추어 DTO 수정 및 누락된 DTO 추가 * fix: 데이터가 비어있는 경우(초기)에만 새로운 여행상세 목록을 받도록 수정 * refactor: lazy 로 지연 초기화 및 timelineService가 하나의 인스턴스로 관리되도록 수정 * fix: Travel의 description에 nullable 속성 추가 API 명세서 잘 좀 보자 제발 * refactor: create 메서드를 private으로 변경 Client 클래스에서 Service를 create 하여 제공 및 캐싱하기 때문에, 불필요한 인스턴스를 생성하지 않도록 create를 public으로 두지 않는 것이 좋다. * refactor: LocalDateConverters의 패키지 경로 수정 * refactor: 파일의 이름 수정 * style: ktlint check * refactor: 에러 메시지 상수화 * feat: 특정 여행 상세 조회 api 연결 #82 (#97) * feat: 특정 여행 상세 조회 api service 구현 * feat: 썸네일, 소개 타입 변경 및 기본 인자 설정 - 변경 data class : TravelResponse, TravelUiModel - 이전: String - 이후: String? * refactor: MatesUiModel 네이밍 변경 MatesUiModel이 공통적으로 사용될 예정이므로 MemberUiModel로 변경 - 이전: MatesUiModel - 이후: MemberUiModel * refactor: VisitUiModel 네이밍 변경 - 여행 상세 방문 기록에 사용되는 UiModel 이름을 명시적으로 변경 - 이전: VisitUiModel - 이후: TravelVisitUiModel * feat: 특정 여행 상세 조회에 사용할 domain model 추가 * feat: Api 응답 핸들링 로직 구현 * feat: 특정 여행 상세 조회 data source 구현 * feat: 특정 여행 상세 조회 repository 구현 * feat: 특정 여행 상세 조회 api 연결 * feat: 특정 여행 상세 조회 로직 매개변수 추가 - 타임라인에서 선택된 여행 id를 매개변수로 받도록 변경 * refactor: ApiResponseHandler 이름 오타 수정 * refactor: 에러 메세지 상수화 * feat: 특정 여행 상세 조회 시그니처 변경 - HeaderInterceptor 적용으로 authorization 매개변수 제거 * style: formatting * feat: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 API 연결 #79 (#99) * feat: VisitApiService 인터페이스 및 관련 data class 추가 * feat: VisitRepository, RemoteVisitDataSource 및 관련 class 추가 * feat: 각 Visit 화면들의 ViewModelFactory 구현 * feat: 각 Visit 화면들의 UiModel 클래스 및 Mapper 추가 * feat: 여행 선택 및 방문 날짜 선택을 위한 BottomSheetDialogFragment 수정 * feat: VisitFragment API 연결 * feat: VisitCreationActivity API 연결 * feat: VisitUpdateActivity API 연결 준비 * refactor: visitApiService를 StaccatoClient object로 이동 * refactor: TravelVisit 클래스의 visitImage 변수 nullable하게 수정 * refactor: VisitApiService의 중복된 @Header 제거 * refactor: 방문 생성 성공 시 created id를 가져오도록 리팩터링 * chore: 변수명 visitImage로 수정 및 ktLint 적용 * refactor: 여행 수정 완료 동작 구현 및 VisitUpdateActivity 함수 분리 * feat: 여행 생성 api 연결 #98 (#104) * feat: 여행 생성 api service 구현 * feat: 여행 생성 data source 구현 * feat: 방문 기록 썸네일 타입 변경 및 기본 인자 설정 - 변경 data class :  TravelVisitDto, TravelVisit, TravelVisitUiModel - 이전: String - 이후: String? * build: converter scalars 의존성 추가 * feat: 여행 생성 ApiService 반환값 및 DataSource 시그니처 변경 - 여행 생성 ApiService 반환값 변경 - DataSource 시그니처 변경 - TravelCreation DomainModel 구현 - TravelCreation Dto 변환 Mapper 구현 * feat: Client에 ScalarsConvert 추가 - Header 값을 읽어오기 위해 ScalarsConvert 추가 * feat: 여행 생성 repository 구현 * feat: 여행 생성 api 연결 * feat: TravelViewModel 생성자 변경 - 이전: travelId를 TravelViewModel 생성자로 넣어줌 - 이후: travelId를 loadTravel()의 매개변수로 넣어줌 * ui: map 화면 변경 * refactor: 컨벤션 통일 및 패키지 정리 #112 (#118) * refactor: bind 네임스페이스 적용 * refactor: BindingAdapters 메서드명 변경 * refactor: 컨벤션 맞게 xml 파일 이름 변경 * refactor: data 패키지 구조 정리 * refactor: RemoteVisitDataSource 컨벤션 따라 네이밍 변경 * refactor: 네트워킹 관련 메서드 이름 변경 - api service, data source, repository * refactor: presentation 패키지 구조 정리 * refactor: message utils 생성 및 적용 Co-authored-by: s6m1n Co-authored-by: Junyoung-WON * build: develop-an의 CI 테스트 자동화 추가 및 데모 APK 추출 #78 (#92) * build: test 자동화 Job 추가 * build: local.properties 생성 시점 변경 * build: 디버그 APK를 빌드하여 업로드하는 workflow 작성 * fix: test Job과 APK build Job에 local.properties 생성 동작 추가 * build: read 전용 권한 제거 * build: Firebase Analytics, Crashlytics 설정 #136 (#143) * build: Firebase Analytics, Crashlytics 의존성 추가 * chore: google-service.json ignore * feat: 특정 여행 상세 수정 api 연결 #109 (#146) * feat: 여행 수정 api service 구현 * feat: 여행 수정 data source 구현 * feat: 여행 수정 repository 구현 * feat: 여행 수정 화면 현재 데이터 로딩 기능 구현 * refactor: 컨벤션 따라 여행 api service의 수정 메서드명 변경 - 이전: updateTravel - 이후: putTravel * feat: 특정 여행 상세 수정 api 연결 * refactor: memberImage 타입 변경 및 기본 인자 설정 * refactor: MembersDto 삭제 * refactor: TravelCreationUiModel.kt 삭제 * refactor: TravelCreation 이름 변경 - 이전: TravelCreation - 이후: NewTravel * refactor: api 명세서 변경에 따른 도메인 모델 수정 및 여행 코드 리팩터링 #151 (#152) * refactor: nickName 변수명 변경 - 이전: nickName - 이후: nickname * ui: 여행 수정 화면 이미지 속성 수정 - glide -> coil 이용 - scaleType : fitXY -> centerCrop * style: import 정렬 * feat: 여행 상세 -> 방문 상세로 이동 시 여행 id 전달 * feat: 방문기록 조회 dto 수정 - 방문기록 조회 도메인 변경으로 인해 방문 기록이 조회되지 않음 - 따라서 api 명세서와 일치하도록 dto 수정하여 오류 해결 * refactor: 여행 생성을 위한 viewModel 메서드 분리 * refactor: 여행 조회를 위한 viewModel 메서드 분리 * feat: 여행 수정 handler 구현 * refactor: 여행 default id 변경 - 이전: -1L - 이후: 0L * refactor: TravelHandler 구현 위치 변경 - 이전: TravelViewModel - 이후: TravelFragment * style: 컨벤션에 맞게 TravelFragment의 메서드 순서 수정 * refactor: TravelFragment의 travelId 초기화 방식 변경 * feat: 여행 생성 및 수정 error toast 구현 * feat: 방문 생성 화면, 방문 수정 화면에서 갤러리 사진 불러오기 구현 #150 (#155) * feat: PhotoAttachFragment에 PhotoAttachHandler 연결 * feat: PhotoAttachFragment 앨범 접근 권한 관련 로직 구현 - API level 33 이상 : READ_MEDIA_IMAGES - API level 33 이하 : READ_EXTERNAL_STORAGE - ActivityResultLauncher를 이용한 권한 요청 - 권한 거부 시, 설정으로 이동하는 스낵바 띄우기 * feat: PhotoAttachFragment 앨범에서 불러온 이미지의 URI 추출하기 * feat: 불러온 이미지의 URI를 호스트 Activity로 전달 - OnUrisSelectedListener 인터페이스 추가 * feat: Uri를 File로 변환하는 메서드 파일 추가 * refactor: pr 리뷰 반영 * refactor: pr 리뷰 반영2 * build: develop-an의 android-ci 수정 #115 (#160) - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: android-ci 환경변수 생성 위치 조정 (#164) * build: local.properties 와 google-services.json 설정 - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: 환경 변수 설정 위치 변경 * build: bash 쉘에 맞는 명령어 활용 #115 (#165) * build: local.properties 와 google-services.json 설정 - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: 환경 변수 설정 위치 변경 * fix: bash 쉘에 적합한 명령어 형식으로 변경 * feat: 특정 여행 상세 삭제 api 연결 #153 (#167) * feat: 특정 여행 삭제 api service 구현 * feat: 특정 여행 삭제 data source 구현 * feat: 특정 여행 삭제 repository 구현 * feat: 특정 여행 삭제 기능 api 연결 * feat: error handling 방식 수정 - 서버에서 들어오는 error body의 status와 message를 활용하는 방식으로 변경 * refactor: DialogHandler를 독립적으로 관리 * refactor: api path 상수 활용 * refactor: BuildConfig에 token 정의 * refactor: DEFAULT_VALUE 상수 제거 * feat: 여행 생성 기능 api 수정 #169 (#178) * feat: onUrisSelected 매개변수 가변인자로 변경 * feat: 여행 생성 화면 갤러리 이미지 로딩 기능 구현 * refactor: 이미지 선택 리스너 초기화 메서드명 오타 수정 * refactor: 스낵바 액션 설정 코드 간소화 * feat: TravelRequest 의 여행 썸네일 필드 제거 * refactor: 여행 썸네일 이미지 변수명 수정 * feat: 이미지 전송 기능 구현 * refactor: image url 변수명 변경 - 변수 끝에 url이 오도록 * feat: 여행 생성 progressBar 구현 * ui: 사진 첨부 아이콘 가시성 설정 * feat: 여행 상세 수정 기능 api 변경 및 여행 리팩터링 #180 (#181) * feat: 여행 수정 화면 갤러리 이미지 로딩 기능 구현 * feat: URL 및 URI 기반 이미지 로딩 BindingAdapter 구현 * feat: 이미지 전송 기능 구현 * feat: 여행 수정 progressBar 구현 * fix: 삭제 불가능한 여행 삭제 시도 관련 에러 토스트 문제 해결 삭제 불가능한 여행을 삭제하려고 시도 -> 방문 조회 -> 뒤로 가기 버튼 클릭 -> 삭제 불가능 에러 토스트가 다시 뜨는 문제가 발생해 이를 해결 * refactor: TravelCreationViewModel의 imageUrl 변수 제거 * ui: 여행 상세 내 방문 기록 이미지 scaleType 속성 설정 * ui: 여행 생성 썸네일 이미지 scaleType 속성 설정 * fix: 여행 소개 미입력 시 여행이 생성 되지 않는 오류 해결 * refactor: 타임라인 화면 리팩터링 #162 (#179) * ui: 타임라인 RecyclerView의 크기 조정 및 여백 수정 * feat: Activity와 Fragment 간 데이터를 공유하는 공유 ViewModel 생성 * feat: 공유 ViewModel을 이용하여 타임라인 업데이트 여부를 공유 * refactor: RecyclerView.Adapter에서 ListAdapter로 변환 * refactor: 처음 타임라인을 불러오는 동작을 ViewModel 초기화 시에 수행 * fix: ListAdapter 수정 - 불필요한 travels 프로퍼티와 getItemCounts 메서드 제거 - currentList를 사용하는 것으로 변경 * refactor: 에러 핸들링 방식 수정 및 ViewModel 수정 - TimelineDefaultRepository로 네이밍 변경 - ApiResponseHandler와 ResponseResult를 이용하여 에러 핸들링 처리 - TimelineViewModel 에러 메시지 LiveData 사용 - 그 외 repository, dataSource 프로퍼티 이름 수정하여 통일 * refactor: MutableLiveData의 값 업데이트를 setValue로 변경 및 메서드 분리 * style: ktlint 적용 * feat: 3차 스프린트에서 수정된 방문 기록 상세 API 연결 #163 (#183) * feat: 방문 상세 생성 API 연결 * feat: 방문 상세 수정, 삭제 API 연결 * feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용 * feat: 방문 기록 생성 화면 사진 다중 선택 구현 * feat: 방문 기록 생성 이미지 업로드 구현 * feat: 방문 기록 생성 및 수정 시 로딩과 토스트 추가 * feat: 닉네임을 활용한 로그인 기능 구현 #124 (#172) * ui: 로그인 화면 구성 - 로그인 화면에서 사용되는 텍스트를 strings에 추가 - 로그인 버튼 스타일에 대한 style 생성 - xml 임시로 작성 * ui: 앱 로고 삽입 및 margin 조정 - 임시 로고 이미지 저장 - 로고 크기 및 마진 조정 * feat: 로그인 API Service 작성 및 Retrofit 객체 생성 * feat: 로그인 DataSource 작성 * feat: 로그인 Repository 생성 * feat: 사용자 정보를 저장하는 SharedPreferences Manager 생성 - 토큰 값 불러오기 및 저장 - 추후 사용자 닉네임, 사용자 프로필 이미지 등의 정보 저장 가능 * feat: Application 생성 및 사용자 정보 Preferences Manager 캐싱 * ui: Splash Screen 화면 구성을 위한 테마 생성 * feat: Preferences 로부터 사용자 토큰 값을 가져와 헤더에 추가하도록 변경 * refactor: Repository 네이밍 통일 * refactor: DataSource 기본 인자 추가 * feat: LoginViewModel 및 Handler 작성 * feat: LoginViewModel 을 생성하는 ViewModel Factory 작성 * feat: LoginActivity 작성 및 양방향 데이터 바인딩 적용 * feat: StaccatoApplication과 LoginActivity 설정 및 LoginActivity를 시작 화면으로 변경 * style: 불필요한 namespace 제거 및 lint 확인 * refactor: LoginViewModel과 Factory를 viewmodel 패키지로 분리 * refactor: TimelineViewModel과 Factory를 viewmodel 패키지로 분리 * style: ktlint 적용 * fix: 불필요한 ConverterFactory 제거 - 더 이상 사용하지 않는 text/plain 변환용 ScalarsConverterFactory 제거 * feat: 닉네임 로그인 요청 및 응답에 대한 DTO 작성 * refactor: 로그인 요청, 응답 시 DTO 활용 * fix: 토큰 값을 불러오고 및 저장하는 동작의 비동기 처리 및 화면 전환 개선 * refactor: 토큰 값을 캐싱하여 저장하는 TokenManager 생성 및 적용 - 매번 runBlocking을 통해 Preference에 저장된 토큰 값을 불러오는 것은 네트워크 성능을 저하시킨다. - 따라서, token 값을 캐싱하여 저장하는 TokenManager를 활용한다. - 첫 네트워크 요청 시에만 토큰을 불러오는 작업을 동기적으로 처리하기 위해 Main Thread가 Blocking 된다. - TokenManager가 Preference로부터 가져온 토큰을 캐싱하여 저장한다. - 이후 요청부터는 캐시된 토큰을 가져오므로 Main Thread가 Blocking 되지 않는다. * style: ktlint 적용 * feat: Night 모드 비활성화 * refactor: 여행 기간 날짜 형식 변환을 BindingAdapter에서 수행 - TimelineTravelUiModel 프로퍼티 수정 - UiModel의 여행기간 날짜를 LocalDate로 갖도록 통일 - 추후 날짜 관련 UI가 변경되었을 때 확장성 고려 - BindingAdapters에 날짜 형식 변환해주는 메서드 작성 * chore: 주석 처리된 Log 코드 삭제 * style: xml View의 ID 네이밍 컨벤션 적용 * ui: 앱 심볼 로고 추가 및 스플래시 스크린에 적용 * feat: 방문 상세 생성 API 연결 * ui: 배경 색을 흰 색으로 지정 * feat: 키보드 활성화 상태에서 화면 터치 시 키보드를 내리는 기능 추가 * style: ktlint 적용 * feat: 방문 상세 수정, 삭제 API 연결 * feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용 * fix: merge 과정에서 발생한 id값 네이밍 충돌 해결 * build: 앱 version code와 version name 수정 * feat: 방문 기록 생성 화면 사진 다중 선택 구현 * feat: 방문 기록 생성 이미지 업로드 구현 * feat: 스플래시 스크린 시간 조정 및 데모 시연용 토큰 활성화 * fix: 동일한 사진이 여러 장 업로드되는 버그 수정 * feat: 기존 로그인 기능으로 롤백 --------- Co-authored-by: somin * fix: 테스트 배포를 위한 버그 수정 #198 (#219) * style: formatting * fix: 무한 로딩 오류 수정 * fix: 여행 생성 오류 수정 * add: 앱 아이콘 변경 * ui: timeline empty view 추가 * feat: timeline empty view 가시성 설정 * ui: 여행 내 방문 기록 empty view 추가 및 가시성 설정 * ui: 방문 기록 내 로그 미지원 기능 view 추가 * feat: 사진 첨부 카메라 미지원 기능 알림 추가 * ui: 필수값 표기 style 정의 * ui: 여행 생성 및 수정 필수값 표기 추가 * ui: 방문 기록 생성 및 수정 필수값 표기 추가 * feat: 생성, 수정, 로그인 시 다중 요청 전송을 막기 위한 화면 터치 제한 * feat: 장소 생성의 사진 첨부 리사이클러뷰 구현 - 사진 추가 & 삭제 구현 - GridLayout으로 변경 - 사진 중복 없이 최대 5장으로 제한 - 새로 추가된 사진이 기존 사진 뒤에 더해지도록 구현 * chore: 방문 생성 화면 rv_photo_attach로 xml id 수정 * ui: app icon 및 splash icon 변경 * refactor: xml ID 네이밍 컨벤션 적용 --------- Co-authored-by: somin Co-authored-by: Junyoung-WON * refactor: 도메인명 변경에 따라 travel을 memory로 수정 #217 (#231) * refactor: 패키지명 travel -> memory로 수정 * refactor: dto의 TravelMapper 를 MemoryMapper 로 네이밍 변경 * refactor: 여행(현 추억) 생성 response dto 네이밍 변경 - TravelCreationResponse -> MemoryCreationResponse * refactor: 여행(현 추억) request dto 네이밍 변경 - TravelRequest -> MemoryRequest * refactor: 여행(현 추억) 조회 response dto 네이밍 변경 - TravelResponse -> MemoryResponse * refactor: 여행(현 추억) 수정 request dto 네이밍 변경 - TravelUpdateRequest -> MemoryUpdateRequest * refactor: 여행(현 추억) 내 방문 dto 네이밍 변경 - TravelVisitDto -> MemoryVisitDto * refactor: 타임라인 여행(현 추억) item의 dto 네이밍 변경 - TimelineTravelDto -> TimelineMemoryDto * refactor: 여행(현 추억) ApiService 네이밍 변경 - TravelApiService -> MemoryApiService * refactor: 여행(현 추억) DataSource 네이밍 변경 - TravelDataSource -> MemoryDataSource - TravelRemoteDataSource -> MemoryRemoteDataSource * refactor: 여행(현 추억) Repository 네이밍 변경 - TravelRepository -> MemoryRepository - TravelDefaultRepository -> MemoryDefaultRepository * style: TimelineMapper import 재정렬 * refactor: NewTravel 도메인명을 NewMemory로 변경 * refactor: Travel 도메인명을 Memory로 변경 * refactor: TravelVisit 도메인명을 MemoryVisit으로 변경 * refactor: presentation의 TravelMapper 명 변경 - TravelMapper -> MemoryMapper * refactor: 여행(현 추억) ui 모델명 변경 - TravelUiModel -> MemoryUiModel - TravelVisitUiModel -> MemoryVisitUiModel * refactor: 여행(현 추억) view model 명 변경 - TravelViewModel -> MemoryViewModel - TravelViewModelFactory -> MemoryViewModelFactory * refactor: MemoryApiService의 Path 변경 - travel을 memory로 변경 - travels을 memories로 변경 * refactor: Memory 관련 dto 변수명 변경 - travel을 memory로 변경 * refactor: Timeline Dto의 Memory 관련 변수명 변경 - travel을 memory로 변경 - travels를 memories로 변경 * refactor: Memory 관련 도메인 모델의 변수명 변경 - travel을 memory로 변경 * refactor: Memory 관련 ui 모델의 변수명 변경 - travel을 memory로 변경 * refactor: data layer의 Memory 관련 함수 및 변수명 변경 - travel을 memory로 변경 * refactor: 방문 생성 request dto의 travelId 변수명 변경 - travelId -> memoryId * refactor: 여행(현 추억) 조회 view model 및 fragment의 네이밍 변경 - travel -> memory * refactor: fragment_travel 의 리소스 네이밍 변경 - travel -> memory - strings.xml의 리소스명 변경 * refactor: TravelCreationActivity 네이밍 변경 - TravelCreationActivity -> MemoryCreationActivity * refactor: 여행(현 추억) 생성의 ViewModel 관련 네이밍 변경 - TravelCreationViewModel -> MemoryCreationViewModel - TravelCreationViewModelFactory -> MemoryCreationViewModelFactory - 관련 함수 및 변수명 변경 - travel -> memory * refactor: 여행(현 추억) 생성, 수정에 관한 xml 리소스 명 변경 - travel -> memory - strings.xml 의 관련 리소스 수정 * refactor: 여행(현 추억) 수정 Activity, Handler 의 네이밍 변경 - travel -> memory * refactor: 여행(현 추억) 수정 ViewModel 의 네이밍 변경 - 관련 함수 및 변수 명 변경 - travel -> memory - Factory 클래스명 변경 * refactor: 여행(현 추억) 생성, 수정에서의 파일 변환 메서드명 변경 - travel -> memory - 자식 파일 명 상수화 * refactor: Timeline 의 UI 모델 및 Travel ID Key 의 리네이밍 - travel -> memory 로 일괄 변경 * refactor: presentation/timeline 내 travel 도메인명 변경 - travel -> memory - TimelineMapper 내 domain model -> ui model 변환 메서드명 변경 * refactor: dto/MemoryMapper 내 domain 변환 메서드명 변경 - dto/MemoryMapper 내 domain model을 dto로 변환하는 메서드명 변경 - travel -> memory * refactor: dummyTravel 을 dummyMemory 로 변경 * refactor: MainActivity 내 travel을 memory로 변경 * refactor: activity_main 내 travel을 memory로 변경 * refactor: TimeLineApiService 내 GET 메서드 path 수정 - travels -> memories * refactor: MemoryFragment 내 travel 을 memory 로 변경 - MemoryFragment, fragment_memory 내 travel 을 memory 로 변경 * refactor: MemoryViewModel 내 error message 변수명 변경 - TRAVEL_ERROR_MESSAGE -> MEMORY_ERROR_MESSAGE * refactor: navigation graph 내 travel을 memory로 변경 * refactor: VisitUpdateActivity 내 extra 키 값 수정 - TRAVEL_ID_KEY -> MEMORY_ID_KEY - TRAVEL_TITLE_KEY -> MEMORY_TITLE_KEY * refactor: VisitFragment 내 travel을 memory로 변경 * refactor: VisitUpdateActivity 내 travel을 memory로 변경 * refactor: VisitUpdateViewModel 내 travel을 memory로 변경 * refactor: VisitTravelUiModel을 VisitMemoryUiModel로 변경 * refactor: 방문 수정 xml의 travel을 memory로 변경 * refactor: 여행(현 추억) 선택 xml 내 travel을 memory로 변경 * refactor: 여행 선택 바텀 시트 내 travel을 memory로 변경 - TravelSelectionFragment -> MemorySelectionFragment 로 수정 - TravelSelectionHandler -> MemorySelectionHandler 로 수정 - TravelSelectionFragment 내 메서드명 수정 - TravelSelectionHandler 내 매개변수명 수정 * refactor: VisitRepository와 구현체의 메서드 내 매개변수명 통일 * refactor: VisitsViewHolder 내 travel을 memory로 변경 * refactor: VisitCreationActivity 내 travel을 memory로 변경 * refactor: VisitCreationViewModel 내 travel을 memory로 변경 * refactor: 방문 생성 xml 내 travel을 memory로 변경 * refactor: BindingAdapters 내 travel을 memory로 변경 * refactor: strings 내 travel을 memory로 변경 - strings 내 '여행'을 '추억'으로 수정 Co-authored-by: Junyoung-WON Co-authored-by: s6m1n * refactor: visit, visit log 도메인명 수정 #218 (#237) * refactor: VisitApiService 내 visit을 moment 로 변경 - 파일명 수정 - path 수정 - 메서드명 수정 - 매개변수명 수정 * refactor: data/visit 패키지명을 moment로 변경 * refactor: data/dto/visit 패키지명을 moment로 변경 * refactor: VisitCreationRequest 네이밍 변경 - 이전: VisitCreationRequest - 이후: MomentCreationRequest * style: StaccatoClient import 재정렬 * refactor: VisitCreationResponse 네이밍 변경 - 이전: VisitCreationResponse - 이후: MomentCreationResponse - 필드명 변경 : visitId -> momentId * refactor: VisitResponse 네이밍 변경 - 이전: VisitResponse - 이후: MomentResponse - VisitResponse 필드 내 visit을 moment로 변경 - VisitResponse 필드 내 visitLogs SerialName을 comments로 변경 * refactor: VisitUpdateRequest 네이밍 변경 - 이전: VisitUpdateRequest - 이후: MomentUpdateRequest - VisitUpdateRequest 필드 내 visit을 moment로 변경 * refactor: VisitLogDto 내 SerialName 변경 - visitLogId를 commentId로 변경 * refactor: MemoryResponse 내 visits SerialName 변경 - visits를 moments로 변경 * refactor: VisitCreationViewModel 내 FORM_DATA_NAME 변경 - 이전: visitImageFiles - 이후: momentImageFiles * refactor: MemoryVisitDto 내 visit를 moment로 변경 - MemoryVisitDto -> MemoryMomentDto로 변경 - visitId -> momentId로 변경 - visitImageUrl -> momentImageUrl로 변경 * refactor: VisitRemoteDataSource 내 visit을 moment로 변경 - VisitRemoteDataSource -> MomentRemoteDataSource로 변경 - 메서드명 변경 - 매개변수명 변경 * refactor: MomentRepository 및 구현체 내 visit을 moment로 변경 - VisitRepository -> MomentRepository로 변경 - VisitDefaultRepository -> MomentDefaultRepository로 변경 - 메서드명 변경 - 매개변수명 변경 * refactor: Visit 도메인 모델명 및 변수명 변경 - Visit -> Moment로 변경 - visitLogs -> comments로 변경 * refactor: Memory 도에인 모델의 visits을 moments로 변경 * refactor: MemoryVisit 도메인 모델 내 visit을 moment로 변경 * refactor: MemoryResponse의 visits 필드명을 moments로 변경 * refactor: dto/mapper/VisitMapper를 MomentMapper로 변경 * refactor: presentation/visit 패키지명을 moment로 변경 * refactor: VisitViewHolderType 네이밍 변경 - VisitViewHolderType -> MomentViewHolderType - enum 상수명 변경 - VISIT_DEFAULT -> MOMENT_DEFAULT - MY_VISIT_LOG -> MY_COMMENTS * refactor: VisitViewHolder 네이밍 변경 - VisitViewHolder -> MomentViewHolder - VisitDefaultViewHolder -> MomentDefaultViewHolder - MyVisitLogViewHolder -> MyCommentViewHolder * refactor: VisitAdapter 내 visit을 moment로 변경 - VisitAdapter -> MomentAdapter 로 변경 - visit -> moment 로 변경 * refactor: MomentAdapter 내 visit log를 comments로 변경 * refactor: VisitDetailUiModel 내 visit을 moment로 변경 - VisitDetailUiModel -> MomentDetailUiModel - VisitDefaultUiModel -> MomentDefaultUiModel - visitImageUrls -> momentImageUrls * refactor: VisitLogUiModel을 CommentsUiModel로 변경 * refactor: VISIT_ID_KEY extra key id 네이밍 변경 - VISIT_ID_KEY -> MOMENT_ID_KEY * refactor: VisitFragment 내 visit을 moment로 변경 * refactor: VisitViewModel 내 visit을 moment로 변경 - VisitViewModel -> MomentViewModel로 변경 - VisitViewModelFactory -> MomentViewModelFactory로 변경 * refactor: VisitMemoryUiModel 네이밍 변경 - VisitMemoryUiModel -> MomentMemoryUiModel로 변경 * refactor: presentation/visitcreation 패키지명 momentcreation으로 변경 * refactor: VisitCreationActivity 내 visit을 moment로 변경 - VisitCreationActivity -> MomentCreationActivity로 변경 * refactor: VisitCreationHandler 네이밍 변경 - VisitCreationHandler -> MomentCreationHandler로 변경 * refactor: VisitCreationViewModel 내 visit을 moment로 변경 - VisitCreationViewModel -> MomentCreationViewModel로 변경 - 메서드 및 변수명 변경 * refactor: 여행 -> 추억, 방문 기록 -> 스타카토로 도메인명 변경 * feat: s3 api 연결 #239 (#241) * feat: ImageResponse, ImageApiService 구현 * feat: ImageRepository 및 구현체 구현 Co-authored-by: s6m1n * fix: 추억 기능 버그 수정 #246 (#252) * fix: 일부 EditText 개행 불가 처리 및 키보드 숨김 처리 #247 (#249) * ui: 닉네임과 추억 생성, 수정 제목 입력 시 줄바꿈 제한 * fix: 키보드 활성화 상태에서 빈 화면 터치로 키보드 숨김 처리 - 메서드 명 변경: setHideKeyboardAction -> setHidingKeyboardAction * style: 클래스 내 override 메서드의 순서 변경 - 팀 코드 컨벤션에 맞게 순서 재정렬 - override 메서드를 상단에 둔다. * style: ktlint 적용 * fix: root뷰 터치 시 클릭 이벤트가 발생하지 않는 오류 수정 - 원인 분석: ConstraintLayout 내부 Toolbar 및 ScrollView, 그리고 그 자식 View들이 클릭 이벤트를 가로채기 때문에, 바인딩 된 최상단 root 뷰인 ConstraintLayout의 클릭 이벤트가 동작하지 않는다. - 해결 방법: 여러 클릭 이벤트를 가로채는 dispatchTouchEvent 메서드를 오버라이드하여, 터치된 부분이 현재 포커스가 되지 않은 View(키보드 바깥 화면) 범위라면, 키보드를 숨기는 동작을 추가하였다. * refactor: 키보드 숨김 동작을 handler 바인딩으로 적용 - LoginHandler 에 화면 터치에 대한 동작을 추가, 화면 터치 시 키보드를 숨김 처리하는 동작을 바인딩으로 설정 - InputMethodManager 인스턴스를 지연초기화하여 저장 * refactor: InputMethodManager 인스턴스를 lazy로 지연 초기화 * fix: 닉네임, 제목 입력 칸의 키보드 액션 버튼 변경 - 키보드의 액션 타입을 Search에서 Done으로 변경 * style: ktlint 적용 * refactor: 타임라인 리팩터링 #232 (#263) * refactor: TimelineViewModelFactory의 생성자 파라미터 추가 - 내부 프로퍼티에 속해있던 TimelineRepository를 생성자 프로퍼티로 변경 * fix: 추억 목록 아이템이 하나일 때의 View 수정 - 아이템 개수가 하나일 때는 타임라인의 선이 나타나지 않도록 변경 * chore: 코루틴 예외 처리 로그에context 출력 * refactor: 메서드 분리 및 순서 재정렬 - 코드 컨벤션: override 메서드는 상단에 위치한다 * refactor: TimelineViewModel 생성 팩토리 메서드 활용 * style: ktlint 적용 * ui: 화면 전환에 사용될 twin animation 효과 생성 * ui: animation 효과 활용하여 화면 전환 애니메이션 적용 * ui: Main 화면의 배경 색을 하얀색(#FFFFFF)으로 지정 * style: ktlint 적용 * feat: 기분 선택 기능 구현 및 스타카토 조회 화면 구조 변경 #191 (#289) * feat: 기분 수정 요청을 보내는 Request Dto 작성 * feat: MomentApiService 에 기분 수정 요청에 대한 API 작성 * feat: 기분 수정 요청에 대한 DataSource 메서드 작성 * feat: 기분 도메인 모델 생성 * feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성 * ui: 기분 아이콘 이미지 리소스 추가 * ui: 기분 아이콘의 테두리를 selector로 생성 - 선택/미선택에 따라 다른 ui를 나타낸다 * ui: 기분 아이콘에 사용할 style 지정 * fix: API 변경에 따라 DTO 및 Mapper 변경 - 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경 * fix: 순간 DTO에 기분 필드 추가 - 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정 * feat: 기분 선택 api에 필요한 repository 메서드 작성 * feat: 기분 uiModel 생성 * feat: 댓글에 대한 UI 모델 생성 * feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성 * feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성 * feat: 댓글 화면 구성 및 Adapter, Fragment 작성 * feat: 순간(현 스타카토)의 Ui Model Mapper 변경 MomentDetailUiModel.CommentsUiModel -> CommentUiModel MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel Feeling을 Ui Model로 변환하는 Mapper 추가 * feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성 * feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성 * fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정 * fix: 누락된 ViewModel 데이터 바인딩 설정 * feat: 순간 조회 화면 재구성 * refactor: 네비게이션 action 및 id 네이밍 수정 visit -> moment로 수정 * refactor: 방문 -> 순간 으로 키워드 변경 * refactor: 불필요한 클래스 및 xml 파일 제거 * style: ktlint 적용 * feat: 추억 API 변경사항 반영 및 리팩터링 #259 (#265) * ui: 추억 생성 화면 사진 로드 시 coil 라이브러리 사용 * ui: 삭제 버튼 아이콘 추가 * ui: 추억 생성 화면 사진 삭제 버튼 추가 * feat: 추억 생성 view model의 imageUri 설정 매개변수 타입 변경 * feat: 추억 생성 화면 사진 삭제 구현 * feat: 추억 수정 화면 사진 첨부 icon 가시성 설정 * ui: 추억 수정 화면 사진 삭제 버튼 추가 * feat: 추억 수정 화면 사진 삭제 버튼 가시성 설정 * feat: 추억 수정 view model의 imageUri 설정 매개변수 타입 변경 * feat: 추억 수정 화면 사진 삭제 구현 * fix: 추억 생성 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정 * fix: 추억 수정 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정 * feat: MemoryRequest dto에 썸네일 사진 url 필드 추가 * feat: 추억 생성 메서드의 시그니처 변경 - MemoryApiService 내 추억 생성 메서드의 시그니처 변경 - 위 변경에 따른 DataSource, Repository, ViewModel의 추억 생성 관련 메서드 시그니처 변경 * feat: 추억 생성 view model 주 생성자로 ImageRepository 주입 * feat: 추억 생성 화면의 썸네일 사진 저장 기능 구현 * feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 생성 화면) - 추억 생성 화면에서 서버에 저장된 사진을 로드하는 기능 구현 - UI에 불러온 사진을 표시하는 로직 수정 * feat: 추억 생성 시 썸네일 사진 url 추가 * refactor: MemoryRequest의 추억 썸네일 사진 기본 인자 값 null로 설정 * feat: 추억 수정 메서드의 시그니처 변경 * feat: 추억 수정 view model 주 생성자로 ImageRepository 주입 * feat: 추억 수정 화면의 썸네일 사진 저장 기능 구현 * feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 수정 화면) - 추억 수정 화면에서 서버에 저장된 사진을 로드하는 기능 구현 - UI에 불러온 사진을 표시하는 로직 수정 * feat: 추억 수정 시 썸네일 사진 url 추가 * refactor: 불필요한 MemoryUpdateRequest 제거 * ui: empty view 캐릭터 이미지 추가 * ui: 추억 설명글 유무에 따른 가시성 설정 * ui: 함께 한 사람들 가시성 gone 으로 설정 - 4차 스프린트 범위에서 제외됨 * feat: 이미지 선택 옵션 추가 (단일 선택 및 다중 선택 지원) * ui: TextInputLayout, TextInputEditText Style 정의 * ui: 추억 생성 화면 입력란 TextInputLayout으로 변경 - counter 속성 사용을 위해 TextInputLayout으로 변경함 * ui: 추억 수정 화면 입력란 TextInputLayout으로 변경 - counter 속성 사용을 위해 TextInputLayout으로 변경함 * ui: 추억 조회 화면 썸네일 사진 유무에 따른 가시성 설정 * ui: empty view 캐릭터 이미지 크기 변경 * ui: 앱 이름 Staccato_AN -> Staccato 로 수정 * refactor: 추억 생성 및 수정 화면 메서드 순서 정리 * ui: 제목용 TextInputEditTextStyle 정의 및 적용 * ui: 추억 생성 및 수정 화면 썸네일 coilPlaceHolder 변경 - 이전: shape_place_holder_rectangle - 이후: shape_all_gray1_8dp * refactor: 삭제 다이얼로그 show 메서드 호출 방식 변경 - apply를 사용하지 않는 방식으로 변경 * ui: 코멘트 미지원 안내 view 추가 * feat: 스타카토 생성, 수정 화면 사진 및 완료 버튼 개선 #242 (#291) * feat: (스타카토 생성 화면) 사진 드래그로 순서 변경 기능 구현 * refactor: data 패키지에 S3 이미지 API 분리 적용 * refactor: AttachedPhotoUiModel 및 프로그래스바 추가 * feat: recyclerView에서 지워진 사진의 job cancel 처리 * refactor: editText를 TextInputLayout로 수정 * feat: (스타카토 수정 화면) 사진 드래그로 순서 변경 / 로딩 구현 * refactor: 프로퍼티 네임 변경 및 visitedAt LocalDateTime으로 수정 * style: ktlint 적용 * build: 구글 맵 API 사용에 따른 CI 수정 #296 (#297) * build: 구글 맵 api key를 저장하는 파일을 설정하는 명령어 작성 * refactor: defaults 에 설정된 shell 설정에 따라 추가적인 shell 설정 삭제 * feat: Google Map 연결, 스타카토 목록 조회 API 연결 #54 (#295) * build: google map 의존성 추가 * build: 구글맵 관련 properties ignore 추가 * build: 구글맵 api key 설정 * feat: Google Map 연결 * feat: MainActivity Handler 구현 * ui: 추억 및 스타카토 생성 메뉴 추가 * ui: popup menu style 정의 * feat: 추억 생성 및 수정 menu 연결 - handler 연결 - 메서드 분리 * feat: 위치 권한 요청 구현 - ACCESS_FINE_LOCATION 권한 요청 - ACCESS_COARSE_LOCATION 권한 요청 * feat: 현 위치 표시 * style: MainActivity formatting * feat: locationPermissions 타입 변경 - 이전: List - 이후: Array * feat: MomentLocationDto, MomentLocationResponse 추가 * feat: 스타카토 목록 조회 api service 구현 * feat: 스타카토 목록 조회 data source 구현 * feat: MomentLocation 도메인 모델 구현 * feat: MomentLocationDto를 도메인 모델로 변환하는 mapper 구현 * feat: 스타카토 목록 조회 repository 구현 * feat: 스타카토 목록 조회 view model 구현 * feat: 스타카토 목록을 marker로 표시 * refactor: home 패키지명을 maps로 변경 * feat: 마커 클릭 시 스타카토 상세로 이동 기능 구현 * feat: 스타카토 조회 추억 id, 제목 필드 추가 * feat: 마지막 위치 위경도 찾기 * refactor: 안드로이드 1차 QA 반영 #299 (#301) * refactor: 안드로이드 1차 QA 반영 * refactor: 안드로이드 1차 QA 반영2 * refactor: 안드로이드 1차 QA 반영3 * refactor: 삭제 메시지 변경 * fix: 스타카토 조회 화면 스택 관리 및 ui 수정 #304 (#306) * feat: 지도 화면에서 스타카토 조회 화면으로 이동 시 스택 관리 * feat: 타임라인 화면에서 추억이 존재하지 않을 때 추억 생성 버튼 추가 * ui: 스타카토 조회 화면 툴바 위치 고정 * build: Android CD 적용 #300 (#308) * build: CD 워크플로우 yml 파일 작성 * build: keystore 접근을 위한 build.gradle.kts 파일 설정 * build: 기존 apk 추출 ci 파일 수정 - demo 버전의 apk를 추출 및 배포하는 목적에 맞게 파일 명 수정 - apk 빌드 후 테스트를 수행하는 job 추가 - firebase 앱 배포에 아티팩트 업로드하는 job 추가 * fix: ci 파일에도 keystore 생성 job 추가 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 수정 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정 * fix: ci 파일에 키스토어 관련 설정 적용 * fix: 키스토어 관련 명령어 일부 수정 * fix: build.gradle.kts 불필요한 괄호 제거 * fix: keystore.properties 로 부터 프로퍼티를 가져오는 형식 변경 * fix: upload-artifact step에서 빌드 파일의 upload 경로 수정 (#316) upload-artifact 는 defaults 설정의 working-directory 경로가 적용되지 않음 * fix: android cd 재수정 (2차) #317 (#319) * fix: upload-artifact 빌드 파일의 upload 경로 3차 수정 * fix: 배포 시 빌드 파일의 경로 수정 * fix: 빌드 파일의 upload 경로 수정 및 파일이 없는 경우 에러 처리 * fix: 빌드 파일의 upload 경로 4차 수정 * fix: 빌드 파일의 upload 경로 5차 수정 * fix: 빌드 파일의 upload 경로 6차 수정 - 디렉터리 경로 생성 후 upload 실행 * fix: 빌드 파일의 upload 경로 7차 수정 github의 workspace 환경변수(절대경로) 활용 * fix: clean test 제거 및 디버그용 파일 경로 탐색 명령어 추가 * fix: 디버그용 파일 경로 검색 명령어 수정 * fix: 디버그용 파일 경로 검색 명령어 삭제 * fix: 디버그용 파일 검색 명령어 삭제 및 업로드 파일 경로명 수정 * feat: 스타카토 생성 시 현 위치의 주소를 가져오는 기능 구현 #314 (#324) * feat: MainActivity에서 주소를 가져오는 로직 삭제 * feat: 스타카토 생성 시 현 위치의 주소를 가져오는 로직 구현 * refactor: 메서드 순서 정렬 * refactor: 스타카토 조회 화면 ViewPager2 적용 및 UI 아이콘 개선 #318 (#320) * refactor: 아이콘 추가 및 UI 개선 * feat: 스타카토 상세 사진 Viewpager 적용 * feat: 스타카토 상세 사진 Viewpager에 dot indicator 추가 * style: ktLint Format * feat: 메인 지도 화면에서 스타카토 생성하는 플로우 구현 #321 (#327) * feat: 날짜로 추억 목록 불러오는 getMemories API 추가 * feat: 메인에서 스타카토 생성 시 추억 목록 선택 가능 * feat: 스타카토 생성 시 역지오코딩과 추억 선택 연동 * build: debug와 release로 buildTypes 분리 (#329) - appName, appId, baseUrl 분리 - release에 난독화 적용 * build: debug 와 release 배포 분기에 따른 CD 수정 - CD에 대한 트리거 재설정 : main 브랜치에 대한 push 및 pr * fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 #326 (#330) * refactor: 지도 화면 onResume에서 스타카토 목록 load * refactor: 스타카토 목록 로드 메서드명 변경 - 이전: loadMoments - 이후: loadStaccatos * feat: 공유 view model에 스타카토 목록 업데이트 상태 추가 * fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 * feat: 지도 로드 시 현위치로 이동하도록 구현 * build: ci 및 cd 파일 수정 ci - 불필요한 gradle 빌드 및 테스트 제거 cd - 타겟 브랜치 develop 제거 * feat: 댓글 조회, 생성, 삭제 기능 구현 #290 (#331) * feat: 기분 수정 요청을 보내는 Request Dto 작성 * feat: MomentApiService 에 기분 수정 요청에 대한 API 작성 * feat: 기분 수정 요청에 대한 DataSource 메서드 작성 * feat: 기분 도메인 모델 생성 * feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성 * ui: 기분 아이콘 이미지 리소스 추가 * ui: 기분 아이콘의 테두리를 selector로 생성 - 선택/미선택에 따라 다른 ui를 나타낸다 * ui: 기분 아이콘에 사용할 style 지정 * fix: API 변경에 따라 DTO 및 Mapper 변경 - 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경 * fix: 순간 DTO에 기분 필드 추가 - 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정 * feat: 기분 선택 api에 필요한 repository 메서드 작성 * feat: 기분 uiModel 생성 * feat: 댓글에 대한 UI 모델 생성 * feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성 * feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성 * feat: 댓글 화면 구성 및 Adapter, Fragment 작성 * feat: 순간(현 스타카토)의 Ui Model Mapper 변경 MomentDetailUiModel.CommentsUiModel -> CommentUiModel MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel Feeling을 Ui Model로 변환하는 Mapper 추가 * feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성 * feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성 * fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정 * fix: 누락된 ViewModel 데이터 바인딩 설정 * feat: 순간 조회 화면 재구성 * refactor: 네비게이션 action 및 id 네이밍 수정 visit -> moment로 수정 * refactor: 방문 -> 순간 으로 키워드 변경 * refactor: 불필요한 클래스 및 xml 파일 제거 * ui: xml 컨벤션에 맞추어진 타 사용자의 댓글 ui 구성 * feat: 댓글 API의 DTO 작성 * feat: 댓글 API Service 작성 * feat: 댓글 CRUD DataSource 작성 * refactor: CommentApiService 각 메서드의 반환 값을 Response로 변경 * feat: CommentApiService 를 create * feat: CommentDataSource 구현체 생성 * refactor: 댓글 Dto 클래스 네이밍 변경 - VisitLogDto -> CommentDto * refactor: CommentDto 의 ID 프로퍼티 네이밍 변경 - visitLogId -> commentId * refactor: VisitLog 도메인 모델 클래스의 네이밍 변경 - VisitLog -> Comment * refactor: Comment 도메인 모델의 ID 프로퍼티 네이밍 변경 - visitLogId -> commentId * feat: 새로운 댓글 도메인 모델 생성 * feat: CommentRepository 작성 * feat: Domain 모델과 DTO 모델을 변환해주는 Mapper 작성 - CommentDto를 Comment로 변환하는 메서드를 CommentMapper.kt로 이동 * feat: CommentRepository의 기본 구현체 작성 * feat: 댓글 ViewModel, Factory 작성 및 Comment 불러오기 구현 * ui: ViewModel 데이터바인딩 및 빈 댓글 문구에 대한 strings 설정 * feat: CommentsViewModel 활용 및 옵저빙 * feat: 댓글 조회, 생성, 삭제 기능 구현 * chore: ktlint 적용 * feat: 추억 생성 및 수정 이미지 로딩 중 표시 및 저장 버튼 비활성화 #332 (#334) * feat: 추억 생성 이미지 로딩 중 표시 * feat: 추억 수정 이미지 로딩 중 표시 * feat: 추억 생성 및 수정 이미지 로딩 중 저장 버튼 비활성화 * style: formatting --------- Co-authored-by: Somin Lee <46596035+s6m1n@users.noreply.github.com> Co-authored-by: hodu <92203597+Junyoung-WON@users.noreply.github.com> Co-authored-by: Junyoung-WON Co-authored-by: s6m1n * fix: 특정 기기에서 location이 null 되는 오류 수정 * deploy: 스타카토 v1.0.0 #333 (#336) * build: 프로젝트 생성 및 의존성 추가 * chore: 사용자 기능 및 권한 추가 * chore: gitignore 재설정 * chore: gitigonre .idea/ 추가 * build: develop-an 브랜치의 CI 설정 #3 (#10) * build: android-ci.yml 파일 생성 * chore: 오타 및 개행 수정 * chore: working-directory 수정 * build: ktLint 적용 및 format * ui: 디자인 시스템 구현 #11 (#44) * ui: color 정의 * ui: shape, selector 추가 * ui: icon 추가 * ui: font family 추가 - pretendard regular, medium, semibold, bold 추가 * ui: typography 정의 * ui: strings 정의 * ui: bottom sheet drag handle drawable 추가 * ui: styles 정의 * ui: detail toolbar 구현 - 상세 화면에서 사용 * ui: dialog, bottom sheet 구현 - 여행 및 방문 기록 삭제 dialog - 사진 등록 bottom sheet * ui: 사진 첨부 layout 구현 * feat: 삭제 다이얼로그, 사진 첨부 바텀 시트 fragment 추가 * ui: 세로모드로 고정 * build: data binding 의존성 추가 * style: strings resource 순서 정렬 * style: formatting * ui: plus icon 추가 * feat: jetpack navigation 및 바텀시트 프래그먼트 추가 #12 (#15) * build: androidx.navigation 및 dataBinding 의존성 추가 * feat: Binding 화면 클래스 및 bottomSheetNavigation 추가 * feat: TimelineFragment 임시 화면 추가 * feat: TravelFragment 임시 화면 추가 * feat: TravelCreationFragment 임시 화면 추가 * feat: VisitFragment 임시 화면 추가 * feat: VisitCreationFragment 임시 화면 추가 * feat: (여행, 방문 기록) 수정 화면 추가 * feat: (여행, 방문 기록) 생성 화면 이동 구현 * feat: BottomSheetController 설정 및 Navigation 이동 구현 * feat: 뒤로가기 버튼 클릭 시 BottomSheet, Toast 작동 구현 * feat: 여행, 방문 기록 생성을 위한 액티비티 추가 및 이동 구현 * feat: 여행, 방문 기록 수정을 위한 액티비티 추가 및 이동 구현 * build: 중복된 dataBinding 제거 * feat: 공통 이미지 로딩 BindingAdapter 설정 #33 (#41) * build: dataBinding 사용 설정 * feat: 이미지 로딩 바인딩 어댑터 설정 - Glide, Coil 바인딩 어댑터를 각각 작성 - placeholder 설정 * style: ktlint check - import 순서 조정 * fix: attribute 개수에 맞추어 BindingAdapter의 value 재설정 * style: 마지막 줄 개행 추가 * feat: placeHolder를 필수 속성으로 변경 및 coil 이미지 로딩 코드 수정 - placeHolder를 ImageView의 필수 속성으로 지정 - Coil BindingAdapter에서 url이 null인 경우에도 이미지를 로드하는 동작이 수행되도록 수정 * ui: 상단바 색상 변경 * build: develop-an의 CI 설정 수정 #38 (#39) - Git Action에 Secret으로 저장된 LOCAL_PROPERTIES_API_KEY를 변수로 가져온다. - 가져온 변수를 echo를 활용하여 local.properties에 설정한다. * build: develop-an 브랜치의 CI 파일 문법 오류 수정 #45 (#46) * fix: android-ci.yml 파일의 명령어 수정 LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: android-ci.yml 파일의 명령어 수정 #47 (#48) LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: 파이프라인 제거하여 명령어 수정 * fix: develop-an 브랜치의 CI 파일 명령어 재수정 #47 (#49) * fix: android-ci.yml 파일의 명령어 수정 LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: 파이프라인 제거하여 명령어 수정 --------- Co-authored-by: Somin Lee <46596035+s6m1n@users.noreply.github.com> * fix: 문자열 임을 명시하고 환경변수 설정 위치 조정 * fix: local.properties 생성 시점 수정 * feat: 데이터 패키지 설정 #13 (#35) * build: 서버 base url의 local.properties 사용 설정 및 BuildConfig 설정 * feat: Retrofit Client 작성 * fix: Merge Conflict 해결 - build.gradle.kts(project, app)의 ktlint 의존성 충돌 해결 - 버전 카탈로그 플러그인 충돌 해결 * feat: DTO 클래스 작성 * style: ktlint check - 불필요한 import 제거 - 개행 조정 - 콤마 추가 * feat: SerialName 어노테이션의 값을 camelCase로 수정 * refactor: DTO 클래스의 이름 수정 - API 요청으로 직접 보내거나 들어오는 JSON의 경우 DTO 클래스명 뒤에 Request/Response 를 붙이도록 설정 - JSON 안에 속성 값으로 들어가는 JSON은 DTO 클래스명 뒤에 Dto를 붙이도록 설정 * feat: 누락된 Dto 클래스 추가 TimelineResponse.kt - 타임라인 조회 시 여행 상세 목록을 불러올 때 사용되는 DTO 클래스 - TimelineTravelDto 리스트를 갖는다 * style: ktlint check * fix: const 키워드 제거 --------- Co-authored-by: hxeyexn * feat: 둥근 모서리의 이미지를 로드하는 BindingAdapters 추가 #58 (#59) * feat: 둥근 모서리로 이미지를 로딩하는 Glide 바인딩 어댑터 작성 - 세 속성이 모두 필요하다. - glideRoundedCornerImageUrl: 출력하고자 하는 이미지 url - glidePlaceHolder: placeHolder의 url - glideRoundingRadius: 모서리의 둥근 정도를 Int로 설정 * feat: 둥근 모서리로 이미지를 로딩하는 Coil 바인딩 어댑터 작성 - 세 속성이 모두 필요하다. - coilRoundedCornerImageUrl: 출력하고자 하는 이미지 url - coilPlaceHolder: placeHolder의 url - coilRoundingRadius: 모서리의 둥근 정도를 Float으로 설정 * fix: centerCrop 설정을 BindingAdapter 에 위임 - xml 속성으로 centerCrop을 주게 되면 Round Corner가 제대로 적용되지 않는 현상 발생 - Glide의 api로 제공되는 centerCrop() 메서드를 활용 * ui: 타임라인 프래그먼트(BottomSheet) 구현 #55 (#71) * ui: 타임라인 View xml 파일 작성 - 타임라인에 나타날 여행 상세 아이템 xml 작성 - 썸네일 사진 유무에 따라 뷰를 구분 - 타임라인이 나타날 fragment xml 작성 * feat: 타임라인 여행 상세 아이템 UI 모델 생성 * ui: 썸네일이 없는 여행상세 아이템의 margin 조정 * ui: Timeline RecyclerView의 layoutManager 설정 * ui: xml에서의 UiModel 데이터 바인딩 설정 * feat: ViewHolder 작성 - 썸네일 사진 유무에 따라 다른 ViewHolder로 구분 - 공통된 속성을 정의한 TimelineViewHolder 추상클래스 생성 * feat: TimelineRepository Interface 생성 * feat: 임시 TimelineRepository 구현체 생성 * feat: TimelineViewModel 및 Factory 생성 * feat: TimelineViewType 작성 * feat: TimelineAdapter 작성 * feat: TimelineFragment에 ViewModel과 Adapter 구현 * feat: 이미지 로딩 PlaceHolder drawable 추가 및 적용 * feat: 임시 데이터 연결 * ui: Timeline fragment 의 세부 설정 조정 * ui: Timeline의 Item xml 변경 - 뷰 타입을 3개로 분할: 첫 번째 아이템, 중간 아이템, 마지막 아이템 - 이에 따라 xml 파일 추가 및 view 수정 * feat: ViewType 변경에 따른 Adapter 및 ViewHolder 수정 * refactor: 불필요한 View 및 ViewHolder 제거 * feat: 여행 click 에 대한 event handler 생성 및 설정 * refactor: drawable 이름을 네이밍 컨벤션에 맞게 수정 * ui: RecyclerView의 마진 속성을 패딩 속성으로 변경 * feat: 바텀 시트 디자인 변경 및 툴바와의 상호작용 구현 * ui: 타임라인 글귀 추가 * style: ktlint check * ui: 둥근 모서리의 이미지로 변경 * ui: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 구현 #52 (#74) * ui: typography.body textSize 1sp 씩 증가 * feat: DeleteDialogFragment에 Handler 추가 * feat: 툴바의 수정, 삭제 버튼 제어를 위한 ToolbarHandler 추가 * feat: 방문 상세 화면을 위한 VisitDetailUiModel 추가 * ui: PlaceHolder를 위한 xml 파일 추가 * feat: 방문 기록 상세 화면을 위한 VisitAdapter 및 VisitViewHolder 구현 * feat: 임시 VisitViewModel와 VisitViewModelFactory 추가 * feat: VisitFragment 화면 구현 * feat: 방문 기록에 해당하는 여행 선택을 위한 TravelSelectionFragment 구현 * feat: 방문 기록에 해당하는 날짜 선택을 위한 VisitedAtSelectionFragment 구현 * feat: 방문 기록 생성을 위한 VisitCreationActivity 구현 * feat: 방문 기록 수정을 위한 VisitUpdateActivity 구현 * refactor: DialogHandler를 DeleteDialogFragment의 생성자에서 받도록 수정 * refactor: initVisitUpdateDoneButton 중복 로직 제거 * refactor: VisitViewHolderType 메서드 명 변경 of -> from * refactor: tv_place_name_title을 xml id convention에 맞게 수정 * ui: 여행 화면 구현 #51 (#75) * ui: 함께 간 사람들 item 구현 * ui: 방문 기록 item 구현 * ui: 여행 상세 화면 구현 * ui: 여행 생성 화면 구현 * ui: 여행 수정 화면 구현 * ui: placeholder에 사용할 drawable 추가 * ui: 여행 삭제 완료 string 추가 * feat: 둥근 모서리 이미지 BindingAdapter 구현 * feat: 함께 간 사람들 adapter 구현 * ui: 여행 상세 화면 NestedScrollView로 변경 - 이전: ScrollView - 이후: NestedScrollView * feat: 방문 기록 adapter 구현 * feat: 여행 상세 view 연결 * feat: 함께 간 사람들, 방문 기록 adapter 연결 * feat: 삭제 다이얼로그 handler 구현 * feat: 여행 상세 화면 toolbar handler 구현 - 뒤로가기 - 여행 수정 화면으로 이동 - 삭제 다이얼로그 show * feat: 여행 -> 방문 기록 화면 이동 구현 * ui: DatePickerStyle 추가 - DatePickerStyle, CustomMaterialCalendarStyle 추가 - staccato_blue 투명도 30 추가 * feat: 여행 저장 버튼, 여행 기간 BindingAdapter 추가 * feat: 여행 생성 view 연결 * feat: 여행 수정 view 연결 * style: formatting - Exceeded max line length 해결 - 임시 이미지 URL 변경 * refactor: 기간 선택 로직 메서드 분리 * feat: 타임라인의 API 적용 및 MainActivity의 Toolbar 제거 #81 (#93) * refactor: UI Model의 패키지 경로 변경 * refactor: API 명세 변경에 따른 TimelineTravelDto 수정 * refactor: repository 메서드 수정 - 서버 요청을 비동기적으로 처리하기 위해 suspend 키워드 삽입 - 기존의 임시 데이터 요청 코드를 위해 load 메서드 분리 * feat: Timeline의 API Service 작성 * feat: DataSource 인터페이스 작성 * feat: TimelineDataSource 구현체 생성 * refactor: 년도에 대한 default parameter 설정 * refactor: DataSource의 요청 메서드 네이밍 수정 * feat: http 통신이 가능하도록 Cleartext Traffic 허용 설정 * feat: Authorization Header를 삽입하기 위한 Interceptor 생성 * feat: Client에 HeaderInterceptor 추가 * refactor: errorBody의 message 속성 이름 변경 * feat: 도메인 모델 작성 * feat: Response(dto)에서 도메인 모델로 변환하는 확장함수 구현 * feat: 도메인 모델에서 UI 모델로 변환하는 확장함수 구현 * feat: Repository 수정 및 ViewModel 데이터 연결 * ui: MainActivity의 상단 툴바 제거 * refactor: ViewType에 viewType 속성 추가 및 when에서의 enum 활용 * refactor: Timeline의 공통 ViewHolder를 sealed class로 변경 * style: ktlint check 수행 * fix: Response 데이터의 nullable 속성에 맞추어 DTO 수정 및 누락된 DTO 추가 * fix: 데이터가 비어있는 경우(초기)에만 새로운 여행상세 목록을 받도록 수정 * refactor: lazy 로 지연 초기화 및 timelineService가 하나의 인스턴스로 관리되도록 수정 * fix: Travel의 description에 nullable 속성 추가 API 명세서 잘 좀 보자 제발 * refactor: create 메서드를 private으로 변경 Client 클래스에서 Service를 create 하여 제공 및 캐싱하기 때문에, 불필요한 인스턴스를 생성하지 않도록 create를 public으로 두지 않는 것이 좋다. * refactor: LocalDateConverters의 패키지 경로 수정 * refactor: 파일의 이름 수정 * style: ktlint check * refactor: 에러 메시지 상수화 * feat: 특정 여행 상세 조회 api 연결 #82 (#97) * feat: 특정 여행 상세 조회 api service 구현 * feat: 썸네일, 소개 타입 변경 및 기본 인자 설정 - 변경 data class : TravelResponse, TravelUiModel - 이전: String - 이후: String? * refactor: MatesUiModel 네이밍 변경 MatesUiModel이 공통적으로 사용될 예정이므로 MemberUiModel로 변경 - 이전: MatesUiModel - 이후: MemberUiModel * refactor: VisitUiModel 네이밍 변경 - 여행 상세 방문 기록에 사용되는 UiModel 이름을 명시적으로 변경 - 이전: VisitUiModel - 이후: TravelVisitUiModel * feat: 특정 여행 상세 조회에 사용할 domain model 추가 * feat: Api 응답 핸들링 로직 구현 * feat: 특정 여행 상세 조회 data source 구현 * feat: 특정 여행 상세 조회 repository 구현 * feat: 특정 여행 상세 조회 api 연결 * feat: 특정 여행 상세 조회 로직 매개변수 추가 - 타임라인에서 선택된 여행 id를 매개변수로 받도록 변경 * refactor: ApiResponseHandler 이름 오타 수정 * refactor: 에러 메세지 상수화 * feat: 특정 여행 상세 조회 시그니처 변경 - HeaderInterceptor 적용으로 authorization 매개변수 제거 * style: formatting * feat: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 API 연결 #79 (#99) * feat: VisitApiService 인터페이스 및 관련 data class 추가 * feat: VisitRepository, RemoteVisitDataSource 및 관련 class 추가 * feat: 각 Visit 화면들의 ViewModelFactory 구현 * feat: 각 Visit 화면들의 UiModel 클래스 및 Mapper 추가 * feat: 여행 선택 및 방문 날짜 선택을 위한 BottomSheetDialogFragment 수정 * feat: VisitFragment API 연결 * feat: VisitCreationActivity API 연결 * feat: VisitUpdateActivity API 연결 준비 * refactor: visitApiService를 StaccatoClient object로 이동 * refactor: TravelVisit 클래스의 visitImage 변수 nullable하게 수정 * refactor: VisitApiService의 중복된 @Header 제거 * refactor: 방문 생성 성공 시 created id를 가져오도록 리팩터링 * chore: 변수명 visitImage로 수정 및 ktLint 적용 * refactor: 여행 수정 완료 동작 구현 및 VisitUpdateActivity 함수 분리 * feat: 여행 생성 api 연결 #98 (#104) * feat: 여행 생성 api service 구현 * feat: 여행 생성 data source 구현 * feat: 방문 기록 썸네일 타입 변경 및 기본 인자 설정 - 변경 data class :  TravelVisitDto, TravelVisit, TravelVisitUiModel - 이전: String - 이후: String? * build: converter scalars 의존성 추가 * feat: 여행 생성 ApiService 반환값 및 DataSource 시그니처 변경 - 여행 생성 ApiService 반환값 변경 - DataSource 시그니처 변경 - TravelCreation DomainModel 구현 - TravelCreation Dto 변환 Mapper 구현 * feat: Client에 ScalarsConvert 추가 - Header 값을 읽어오기 위해 ScalarsConvert 추가 * feat: 여행 생성 repository 구현 * feat: 여행 생성 api 연결 * feat: TravelViewModel 생성자 변경 - 이전: travelId를 TravelViewModel 생성자로 넣어줌 - 이후: travelId를 loadTravel()의 매개변수로 넣어줌 * ui: map 화면 변경 * refactor: 컨벤션 통일 및 패키지 정리 #112 (#118) * refactor: bind 네임스페이스 적용 * refactor: BindingAdapters 메서드명 변경 * refactor: 컨벤션 맞게 xml 파일 이름 변경 * refactor: data 패키지 구조 정리 * refactor: RemoteVisitDataSource 컨벤션 따라 네이밍 변경 * refactor: 네트워킹 관련 메서드 이름 변경 - api service, data source, repository * refactor: presentation 패키지 구조 정리 * refactor: message utils 생성 및 적용 Co-authored-by: s6m1n Co-authored-by: Junyoung-WON * build: develop-an의 CI 테스트 자동화 추가 및 데모 APK 추출 #78 (#92) * build: test 자동화 Job 추가 * build: local.properties 생성 시점 변경 * build: 디버그 APK를 빌드하여 업로드하는 workflow 작성 * fix: test Job과 APK build Job에 local.properties 생성 동작 추가 * build: read 전용 권한 제거 * build: Firebase Analytics, Crashlytics 설정 #136 (#143) * build: Firebase Analytics, Crashlytics 의존성 추가 * chore: google-service.json ignore * feat: 특정 여행 상세 수정 api 연결 #109 (#146) * feat: 여행 수정 api service 구현 * feat: 여행 수정 data source 구현 * feat: 여행 수정 repository 구현 * feat: 여행 수정 화면 현재 데이터 로딩 기능 구현 * refactor: 컨벤션 따라 여행 api service의 수정 메서드명 변경 - 이전: updateTravel - 이후: putTravel * feat: 특정 여행 상세 수정 api 연결 * refactor: memberImage 타입 변경 및 기본 인자 설정 * refactor: MembersDto 삭제 * refactor: TravelCreationUiModel.kt 삭제 * refactor: TravelCreation 이름 변경 - 이전: TravelCreation - 이후: NewTravel * refactor: api 명세서 변경에 따른 도메인 모델 수정 및 여행 코드 리팩터링 #151 (#152) * refactor: nickName 변수명 변경 - 이전: nickName - 이후: nickname * ui: 여행 수정 화면 이미지 속성 수정 - glide -> coil 이용 - scaleType : fitXY -> centerCrop * style: import 정렬 * feat: 여행 상세 -> 방문 상세로 이동 시 여행 id 전달 * feat: 방문기록 조회 dto 수정 - 방문기록 조회 도메인 변경으로 인해 방문 기록이 조회되지 않음 - 따라서 api 명세서와 일치하도록 dto 수정하여 오류 해결 * refactor: 여행 생성을 위한 viewModel 메서드 분리 * refactor: 여행 조회를 위한 viewModel 메서드 분리 * feat: 여행 수정 handler 구현 * refactor: 여행 default id 변경 - 이전: -1L - 이후: 0L * refactor: TravelHandler 구현 위치 변경 - 이전: TravelViewModel - 이후: TravelFragment * style: 컨벤션에 맞게 TravelFragment의 메서드 순서 수정 * refactor: TravelFragment의 travelId 초기화 방식 변경 * feat: 여행 생성 및 수정 error toast 구현 * feat: 방문 생성 화면, 방문 수정 화면에서 갤러리 사진 불러오기 구현 #150 (#155) * feat: PhotoAttachFragment에 PhotoAttachHandler 연결 * feat: PhotoAttachFragment 앨범 접근 권한 관련 로직 구현 - API level 33 이상 : READ_MEDIA_IMAGES - API level 33 이하 : READ_EXTERNAL_STORAGE - ActivityResultLauncher를 이용한 권한 요청 - 권한 거부 시, 설정으로 이동하는 스낵바 띄우기 * feat: PhotoAttachFragment 앨범에서 불러온 이미지의 URI 추출하기 * feat: 불러온 이미지의 URI를 호스트 Activity로 전달 - OnUrisSelectedListener 인터페이스 추가 * feat: Uri를 File로 변환하는 메서드 파일 추가 * refactor: pr 리뷰 반영 * refactor: pr 리뷰 반영2 * build: develop-an의 android-ci 수정 #115 (#160) - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: android-ci 환경변수 생성 위치 조정 (#164) * build: local.properties 와 google-services.json 설정 - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: 환경 변수 설정 위치 변경 * build: bash 쉘에 맞는 명령어 활용 #115 (#165) * build: local.properties 와 google-services.json 설정 - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: 환경 변수 설정 위치 변경 * fix: bash 쉘에 적합한 명령어 형식으로 변경 * feat: 특정 여행 상세 삭제 api 연결 #153 (#167) * feat: 특정 여행 삭제 api service 구현 * feat: 특정 여행 삭제 data source 구현 * feat: 특정 여행 삭제 repository 구현 * feat: 특정 여행 삭제 기능 api 연결 * feat: error handling 방식 수정 - 서버에서 들어오는 error body의 status와 message를 활용하는 방식으로 변경 * refactor: DialogHandler를 독립적으로 관리 * refactor: api path 상수 활용 * refactor: BuildConfig에 token 정의 * refactor: DEFAULT_VALUE 상수 제거 * feat: 여행 생성 기능 api 수정 #169 (#178) * feat: onUrisSelected 매개변수 가변인자로 변경 * feat: 여행 생성 화면 갤러리 이미지 로딩 기능 구현 * refactor: 이미지 선택 리스너 초기화 메서드명 오타 수정 * refactor: 스낵바 액션 설정 코드 간소화 * feat: TravelRequest 의 여행 썸네일 필드 제거 * refactor: 여행 썸네일 이미지 변수명 수정 * feat: 이미지 전송 기능 구현 * refactor: image url 변수명 변경 - 변수 끝에 url이 오도록 * feat: 여행 생성 progressBar 구현 * ui: 사진 첨부 아이콘 가시성 설정 * feat: 여행 상세 수정 기능 api 변경 및 여행 리팩터링 #180 (#181) * feat: 여행 수정 화면 갤러리 이미지 로딩 기능 구현 * feat: URL 및 URI 기반 이미지 로딩 BindingAdapter 구현 * feat: 이미지 전송 기능 구현 * feat: 여행 수정 progressBar 구현 * fix: 삭제 불가능한 여행 삭제 시도 관련 에러 토스트 문제 해결 삭제 불가능한 여행을 삭제하려고 시도 -> 방문 조회 -> 뒤로 가기 버튼 클릭 -> 삭제 불가능 에러 토스트가 다시 뜨는 문제가 발생해 이를 해결 * refactor: TravelCreationViewModel의 imageUrl 변수 제거 * ui: 여행 상세 내 방문 기록 이미지 scaleType 속성 설정 * ui: 여행 생성 썸네일 이미지 scaleType 속성 설정 * fix: 여행 소개 미입력 시 여행이 생성 되지 않는 오류 해결 * refactor: 타임라인 화면 리팩터링 #162 (#179) * ui: 타임라인 RecyclerView의 크기 조정 및 여백 수정 * feat: Activity와 Fragment 간 데이터를 공유하는 공유 ViewModel 생성 * feat: 공유 ViewModel을 이용하여 타임라인 업데이트 여부를 공유 * refactor: RecyclerView.Adapter에서 ListAdapter로 변환 * refactor: 처음 타임라인을 불러오는 동작을 ViewModel 초기화 시에 수행 * fix: ListAdapter 수정 - 불필요한 travels 프로퍼티와 getItemCounts 메서드 제거 - currentList를 사용하는 것으로 변경 * refactor: 에러 핸들링 방식 수정 및 ViewModel 수정 - TimelineDefaultRepository로 네이밍 변경 - ApiResponseHandler와 ResponseResult를 이용하여 에러 핸들링 처리 - TimelineViewModel 에러 메시지 LiveData 사용 - 그 외 repository, dataSource 프로퍼티 이름 수정하여 통일 * refactor: MutableLiveData의 값 업데이트를 setValue로 변경 및 메서드 분리 * style: ktlint 적용 * feat: 3차 스프린트에서 수정된 방문 기록 상세 API 연결 #163 (#183) * feat: 방문 상세 생성 API 연결 * feat: 방문 상세 수정, 삭제 API 연결 * feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용 * feat: 방문 기록 생성 화면 사진 다중 선택 구현 * feat: 방문 기록 생성 이미지 업로드 구현 * feat: 방문 기록 생성 및 수정 시 로딩과 토스트 추가 * feat: 닉네임을 활용한 로그인 기능 구현 #124 (#172) * ui: 로그인 화면 구성 - 로그인 화면에서 사용되는 텍스트를 strings에 추가 - 로그인 버튼 스타일에 대한 style 생성 - xml 임시로 작성 * ui: 앱 로고 삽입 및 margin 조정 - 임시 로고 이미지 저장 - 로고 크기 및 마진 조정 * feat: 로그인 API Service 작성 및 Retrofit 객체 생성 * feat: 로그인 DataSource 작성 * feat: 로그인 Repository 생성 * feat: 사용자 정보를 저장하는 SharedPreferences Manager 생성 - 토큰 값 불러오기 및 저장 - 추후 사용자 닉네임, 사용자 프로필 이미지 등의 정보 저장 가능 * feat: Application 생성 및 사용자 정보 Preferences Manager 캐싱 * ui: Splash Screen 화면 구성을 위한 테마 생성 * feat: Preferences 로부터 사용자 토큰 값을 가져와 헤더에 추가하도록 변경 * refactor: Repository 네이밍 통일 * refactor: DataSource 기본 인자 추가 * feat: LoginViewModel 및 Handler 작성 * feat: LoginViewModel 을 생성하는 ViewModel Factory 작성 * feat: LoginActivity 작성 및 양방향 데이터 바인딩 적용 * feat: StaccatoApplication과 LoginActivity 설정 및 LoginActivity를 시작 화면으로 변경 * style: 불필요한 namespace 제거 및 lint 확인 * refactor: LoginViewModel과 Factory를 viewmodel 패키지로 분리 * refactor: TimelineViewModel과 Factory를 viewmodel 패키지로 분리 * style: ktlint 적용 * fix: 불필요한 ConverterFactory 제거 - 더 이상 사용하지 않는 text/plain 변환용 ScalarsConverterFactory 제거 * feat: 닉네임 로그인 요청 및 응답에 대한 DTO 작성 * refactor: 로그인 요청, 응답 시 DTO 활용 * fix: 토큰 값을 불러오고 및 저장하는 동작의 비동기 처리 및 화면 전환 개선 * refactor: 토큰 값을 캐싱하여 저장하는 TokenManager 생성 및 적용 - 매번 runBlocking을 통해 Preference에 저장된 토큰 값을 불러오는 것은 네트워크 성능을 저하시킨다. - 따라서, token 값을 캐싱하여 저장하는 TokenManager를 활용한다. - 첫 네트워크 요청 시에만 토큰을 불러오는 작업을 동기적으로 처리하기 위해 Main Thread가 Blocking 된다. - TokenManager가 Preference로부터 가져온 토큰을 캐싱하여 저장한다. - 이후 요청부터는 캐시된 토큰을 가져오므로 Main Thread가 Blocking 되지 않는다. * style: ktlint 적용 * feat: Night 모드 비활성화 * refactor: 여행 기간 날짜 형식 변환을 BindingAdapter에서 수행 - TimelineTravelUiModel 프로퍼티 수정 - UiModel의 여행기간 날짜를 LocalDate로 갖도록 통일 - 추후 날짜 관련 UI가 변경되었을 때 확장성 고려 - BindingAdapters에 날짜 형식 변환해주는 메서드 작성 * chore: 주석 처리된 Log 코드 삭제 * style: xml View의 ID 네이밍 컨벤션 적용 * ui: 앱 심볼 로고 추가 및 스플래시 스크린에 적용 * feat: 방문 상세 생성 API 연결 * ui: 배경 색을 흰 색으로 지정 * feat: 키보드 활성화 상태에서 화면 터치 시 키보드를 내리는 기능 추가 * style: ktlint 적용 * feat: 방문 상세 수정, 삭제 API 연결 * feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용 * fix: merge 과정에서 발생한 id값 네이밍 충돌 해결 * build: 앱 version code와 version name 수정 * feat: 방문 기록 생성 화면 사진 다중 선택 구현 * feat: 방문 기록 생성 이미지 업로드 구현 * feat: 스플래시 스크린 시간 조정 및 데모 시연용 토큰 활성화 * fix: 동일한 사진이 여러 장 업로드되는 버그 수정 * feat: 기존 로그인 기능으로 롤백 --------- Co-authored-by: somin * fix: 테스트 배포를 위한 버그 수정 #198 (#219) * style: formatting * fix: 무한 로딩 오류 수정 * fix: 여행 생성 오류 수정 * add: 앱 아이콘 변경 * ui: timeline empty view 추가 * feat: timeline empty view 가시성 설정 * ui: 여행 내 방문 기록 empty view 추가 및 가시성 설정 * ui: 방문 기록 내 로그 미지원 기능 view 추가 * feat: 사진 첨부 카메라 미지원 기능 알림 추가 * ui: 필수값 표기 style 정의 * ui: 여행 생성 및 수정 필수값 표기 추가 * ui: 방문 기록 생성 및 수정 필수값 표기 추가 * feat: 생성, 수정, 로그인 시 다중 요청 전송을 막기 위한 화면 터치 제한 * feat: 장소 생성의 사진 첨부 리사이클러뷰 구현 - 사진 추가 & 삭제 구현 - GridLayout으로 변경 - 사진 중복 없이 최대 5장으로 제한 - 새로 추가된 사진이 기존 사진 뒤에 더해지도록 구현 * chore: 방문 생성 화면 rv_photo_attach로 xml id 수정 * ui: app icon 및 splash icon 변경 * refactor: xml ID 네이밍 컨벤션 적용 --------- Co-authored-by: somin Co-authored-by: Junyoung-WON * refactor: 도메인명 변경에 따라 travel을 memory로 수정 #217 (#231) * refactor: 패키지명 travel -> memory로 수정 * refactor: dto의 TravelMapper 를 MemoryMapper 로 네이밍 변경 * refactor: 여행(현 추억) 생성 response dto 네이밍 변경 - TravelCreationResponse -> MemoryCreationResponse * refactor: 여행(현 추억) request dto 네이밍 변경 - TravelRequest -> MemoryRequest * refactor: 여행(현 추억) 조회 response dto 네이밍 변경 - TravelResponse -> MemoryResponse * refactor: 여행(현 추억) 수정 request dto 네이밍 변경 - TravelUpdateRequest -> MemoryUpdateRequest * refactor: 여행(현 추억) 내 방문 dto 네이밍 변경 - TravelVisitDto -> MemoryVisitDto * refactor: 타임라인 여행(현 추억) item의 dto 네이밍 변경 - TimelineTravelDto -> TimelineMemoryDto * refactor: 여행(현 추억) ApiService 네이밍 변경 - TravelApiService -> MemoryApiService * refactor: 여행(현 추억) DataSource 네이밍 변경 - TravelDataSource -> MemoryDataSource - TravelRemoteDataSource -> MemoryRemoteDataSource * refactor: 여행(현 추억) Repository 네이밍 변경 - TravelRepository -> MemoryRepository - TravelDefaultRepository -> MemoryDefaultRepository * style: TimelineMapper import 재정렬 * refactor: NewTravel 도메인명을 NewMemory로 변경 * refactor: Travel 도메인명을 Memory로 변경 * refactor: TravelVisit 도메인명을 MemoryVisit으로 변경 * refactor: presentation의 TravelMapper 명 변경 - TravelMapper -> MemoryMapper * refactor: 여행(현 추억) ui 모델명 변경 - TravelUiModel -> MemoryUiModel - TravelVisitUiModel -> MemoryVisitUiModel * refactor: 여행(현 추억) view model 명 변경 - TravelViewModel -> MemoryViewModel - TravelViewModelFactory -> MemoryViewModelFactory * refactor: MemoryApiService의 Path 변경 - travel을 memory로 변경 - travels을 memories로 변경 * refactor: Memory 관련 dto 변수명 변경 - travel을 memory로 변경 * refactor: Timeline Dto의 Memory 관련 변수명 변경 - travel을 memory로 변경 - travels를 memories로 변경 * refactor: Memory 관련 도메인 모델의 변수명 변경 - travel을 memory로 변경 * refactor: Memory 관련 ui 모델의 변수명 변경 - travel을 memory로 변경 * refactor: data layer의 Memory 관련 함수 및 변수명 변경 - travel을 memory로 변경 * refactor: 방문 생성 request dto의 travelId 변수명 변경 - travelId -> memoryId * refactor: 여행(현 추억) 조회 view model 및 fragment의 네이밍 변경 - travel -> memory * refactor: fragment_travel 의 리소스 네이밍 변경 - travel -> memory - strings.xml의 리소스명 변경 * refactor: TravelCreationActivity 네이밍 변경 - TravelCreationActivity -> MemoryCreationActivity * refactor: 여행(현 추억) 생성의 ViewModel 관련 네이밍 변경 - TravelCreationViewModel -> MemoryCreationViewModel - TravelCreationViewModelFactory -> MemoryCreationViewModelFactory - 관련 함수 및 변수명 변경 - travel -> memory * refactor: 여행(현 추억) 생성, 수정에 관한 xml 리소스 명 변경 - travel -> memory - strings.xml 의 관련 리소스 수정 * refactor: 여행(현 추억) 수정 Activity, Handler 의 네이밍 변경 - travel -> memory * refactor: 여행(현 추억) 수정 ViewModel 의 네이밍 변경 - 관련 함수 및 변수 명 변경 - travel -> memory - Factory 클래스명 변경 * refactor: 여행(현 추억) 생성, 수정에서의 파일 변환 메서드명 변경 - travel -> memory - 자식 파일 명 상수화 * refactor: Timeline 의 UI 모델 및 Travel ID Key 의 리네이밍 - travel -> memory 로 일괄 변경 * refactor: presentation/timeline 내 travel 도메인명 변경 - travel -> memory - TimelineMapper 내 domain model -> ui model 변환 메서드명 변경 * refactor: dto/MemoryMapper 내 domain 변환 메서드명 변경 - dto/MemoryMapper 내 domain model을 dto로 변환하는 메서드명 변경 - travel -> memory * refactor: dummyTravel 을 dummyMemory 로 변경 * refactor: MainActivity 내 travel을 memory로 변경 * refactor: activity_main 내 travel을 memory로 변경 * refactor: TimeLineApiService 내 GET 메서드 path 수정 - travels -> memories * refactor: MemoryFragment 내 travel 을 memory 로 변경 - MemoryFragment, fragment_memory 내 travel 을 memory 로 변경 * refactor: MemoryViewModel 내 error message 변수명 변경 - TRAVEL_ERROR_MESSAGE -> MEMORY_ERROR_MESSAGE * refactor: navigation graph 내 travel을 memory로 변경 * refactor: VisitUpdateActivity 내 extra 키 값 수정 - TRAVEL_ID_KEY -> MEMORY_ID_KEY - TRAVEL_TITLE_KEY -> MEMORY_TITLE_KEY * refactor: VisitFragment 내 travel을 memory로 변경 * refactor: VisitUpdateActivity 내 travel을 memory로 변경 * refactor: VisitUpdateViewModel 내 travel을 memory로 변경 * refactor: VisitTravelUiModel을 VisitMemoryUiModel로 변경 * refactor: 방문 수정 xml의 travel을 memory로 변경 * refactor: 여행(현 추억) 선택 xml 내 travel을 memory로 변경 * refactor: 여행 선택 바텀 시트 내 travel을 memory로 변경 - TravelSelectionFragment -> MemorySelectionFragment 로 수정 - TravelSelectionHandler -> MemorySelectionHandler 로 수정 - TravelSelectionFragment 내 메서드명 수정 - TravelSelectionHandler 내 매개변수명 수정 * refactor: VisitRepository와 구현체의 메서드 내 매개변수명 통일 * refactor: VisitsViewHolder 내 travel을 memory로 변경 * refactor: VisitCreationActivity 내 travel을 memory로 변경 * refactor: VisitCreationViewModel 내 travel을 memory로 변경 * refactor: 방문 생성 xml 내 travel을 memory로 변경 * refactor: BindingAdapters 내 travel을 memory로 변경 * refactor: strings 내 travel을 memory로 변경 - strings 내 '여행'을 '추억'으로 수정 Co-authored-by: Junyoung-WON Co-authored-by: s6m1n * refactor: visit, visit log 도메인명 수정 #218 (#237) * refactor: VisitApiService 내 visit을 moment 로 변경 - 파일명 수정 - path 수정 - 메서드명 수정 - 매개변수명 수정 * refactor: data/visit 패키지명을 moment로 변경 * refactor: data/dto/visit 패키지명을 moment로 변경 * refactor: VisitCreationRequest 네이밍 변경 - 이전: VisitCreationRequest - 이후: MomentCreationRequest * style: StaccatoClient import 재정렬 * refactor: VisitCreationResponse 네이밍 변경 - 이전: VisitCreationResponse - 이후: MomentCreationResponse - 필드명 변경 : visitId -> momentId * refactor: VisitResponse 네이밍 변경 - 이전: VisitResponse - 이후: MomentResponse - VisitResponse 필드 내 visit을 moment로 변경 - VisitResponse 필드 내 visitLogs SerialName을 comments로 변경 * refactor: VisitUpdateRequest 네이밍 변경 - 이전: VisitUpdateRequest - 이후: MomentUpdateRequest - VisitUpdateRequest 필드 내 visit을 moment로 변경 * refactor: VisitLogDto 내 SerialName 변경 - visitLogId를 commentId로 변경 * refactor: MemoryResponse 내 visits SerialName 변경 - visits를 moments로 변경 * refactor: VisitCreationViewModel 내 FORM_DATA_NAME 변경 - 이전: visitImageFiles - 이후: momentImageFiles * refactor: MemoryVisitDto 내 visit를 moment로 변경 - MemoryVisitDto -> MemoryMomentDto로 변경 - visitId -> momentId로 변경 - visitImageUrl -> momentImageUrl로 변경 * refactor: VisitRemoteDataSource 내 visit을 moment로 변경 - VisitRemoteDataSource -> MomentRemoteDataSource로 변경 - 메서드명 변경 - 매개변수명 변경 * refactor: MomentRepository 및 구현체 내 visit을 moment로 변경 - VisitRepository -> MomentRepository로 변경 - VisitDefaultRepository -> MomentDefaultRepository로 변경 - 메서드명 변경 - 매개변수명 변경 * refactor: Visit 도메인 모델명 및 변수명 변경 - Visit -> Moment로 변경 - visitLogs -> comments로 변경 * refactor: Memory 도에인 모델의 visits을 moments로 변경 * refactor: MemoryVisit 도메인 모델 내 visit을 moment로 변경 * refactor: MemoryResponse의 visits 필드명을 moments로 변경 * refactor: dto/mapper/VisitMapper를 MomentMapper로 변경 * refactor: presentation/visit 패키지명을 moment로 변경 * refactor: VisitViewHolderType 네이밍 변경 - VisitViewHolderType -> MomentViewHolderType - enum 상수명 변경 - VISIT_DEFAULT -> MOMENT_DEFAULT - MY_VISIT_LOG -> MY_COMMENTS * refactor: VisitViewHolder 네이밍 변경 - VisitViewHolder -> MomentViewHolder - VisitDefaultViewHolder -> MomentDefaultViewHolder - MyVisitLogViewHolder -> MyCommentViewHolder * refactor: VisitAdapter 내 visit을 moment로 변경 - VisitAdapter -> MomentAdapter 로 변경 - visit -> moment 로 변경 * refactor: MomentAdapter 내 visit log를 comments로 변경 * refactor: VisitDetailUiModel 내 visit을 moment로 변경 - VisitDetailUiModel -> MomentDetailUiModel - VisitDefaultUiModel -> MomentDefaultUiModel - visitImageUrls -> momentImageUrls * refactor: VisitLogUiModel을 CommentsUiModel로 변경 * refactor: VISIT_ID_KEY extra key id 네이밍 변경 - VISIT_ID_KEY -> MOMENT_ID_KEY * refactor: VisitFragment 내 visit을 moment로 변경 * refactor: VisitViewModel 내 visit을 moment로 변경 - VisitViewModel -> MomentViewModel로 변경 - VisitViewModelFactory -> MomentViewModelFactory로 변경 * refactor: VisitMemoryUiModel 네이밍 변경 - VisitMemoryUiModel -> MomentMemoryUiModel로 변경 * refactor: presentation/visitcreation 패키지명 momentcreation으로 변경 * refactor: VisitCreationActivity 내 visit을 moment로 변경 - VisitCreationActivity -> MomentCreationActivity로 변경 * refactor: VisitCreationHandler 네이밍 변경 - VisitCreationHandler -> MomentCreationHandler로 변경 * refactor: VisitCreationViewModel 내 visit을 moment로 변경 - VisitCreationViewModel -> MomentCreationViewModel로 변경 - 메서드 및 변수명 변경 * refactor: 여행 -> 추억, 방문 기록 -> 스타카토로 도메인명 변경 * feat: s3 api 연결 #239 (#241) * feat: ImageResponse, ImageApiService 구현 * feat: ImageRepository 및 구현체 구현 Co-authored-by: s6m1n * fix: 추억 기능 버그 수정 #246 (#252) * fix: 일부 EditText 개행 불가 처리 및 키보드 숨김 처리 #247 (#249) * ui: 닉네임과 추억 생성, 수정 제목 입력 시 줄바꿈 제한 * fix: 키보드 활성화 상태에서 빈 화면 터치로 키보드 숨김 처리 - 메서드 명 변경: setHideKeyboardAction -> setHidingKeyboardAction * style: 클래스 내 override 메서드의 순서 변경 - 팀 코드 컨벤션에 맞게 순서 재정렬 - override 메서드를 상단에 둔다. * style: ktlint 적용 * fix: root뷰 터치 시 클릭 이벤트가 발생하지 않는 오류 수정 - 원인 분석: ConstraintLayout 내부 Toolbar 및 ScrollView, 그리고 그 자식 View들이 클릭 이벤트를 가로채기 때문에, 바인딩 된 최상단 root 뷰인 ConstraintLayout의 클릭 이벤트가 동작하지 않는다. - 해결 방법: 여러 클릭 이벤트를 가로채는 dispatchTouchEvent 메서드를 오버라이드하여, 터치된 부분이 현재 포커스가 되지 않은 View(키보드 바깥 화면) 범위라면, 키보드를 숨기는 동작을 추가하였다. * refactor: 키보드 숨김 동작을 handler 바인딩으로 적용 - LoginHandler 에 화면 터치에 대한 동작을 추가, 화면 터치 시 키보드를 숨김 처리하는 동작을 바인딩으로 설정 - InputMethodManager 인스턴스를 지연초기화하여 저장 * refactor: InputMethodManager 인스턴스를 lazy로 지연 초기화 * fix: 닉네임, 제목 입력 칸의 키보드 액션 버튼 변경 - 키보드의 액션 타입을 Search에서 Done으로 변경 * style: ktlint 적용 * refactor: 타임라인 리팩터링 #232 (#263) * refactor: TimelineViewModelFactory의 생성자 파라미터 추가 - 내부 프로퍼티에 속해있던 TimelineRepository를 생성자 프로퍼티로 변경 * fix: 추억 목록 아이템이 하나일 때의 View 수정 - 아이템 개수가 하나일 때는 타임라인의 선이 나타나지 않도록 변경 * chore: 코루틴 예외 처리 로그에context 출력 * refactor: 메서드 분리 및 순서 재정렬 - 코드 컨벤션: override 메서드는 상단에 위치한다 * refactor: TimelineViewModel 생성 팩토리 메서드 활용 * style: ktlint 적용 * ui: 화면 전환에 사용될 twin animation 효과 생성 * ui: animation 효과 활용하여 화면 전환 애니메이션 적용 * ui: Main 화면의 배경 색을 하얀색(#FFFFFF)으로 지정 * style: ktlint 적용 * feat: 기분 선택 기능 구현 및 스타카토 조회 화면 구조 변경 #191 (#289) * feat: 기분 수정 요청을 보내는 Request Dto 작성 * feat: MomentApiService 에 기분 수정 요청에 대한 API 작성 * feat: 기분 수정 요청에 대한 DataSource 메서드 작성 * feat: 기분 도메인 모델 생성 * feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성 * ui: 기분 아이콘 이미지 리소스 추가 * ui: 기분 아이콘의 테두리를 selector로 생성 - 선택/미선택에 따라 다른 ui를 나타낸다 * ui: 기분 아이콘에 사용할 style 지정 * fix: API 변경에 따라 DTO 및 Mapper 변경 - 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경 * fix: 순간 DTO에 기분 필드 추가 - 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정 * feat: 기분 선택 api에 필요한 repository 메서드 작성 * feat: 기분 uiModel 생성 * feat: 댓글에 대한 UI 모델 생성 * feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성 * feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성 * feat: 댓글 화면 구성 및 Adapter, Fragment 작성 * feat: 순간(현 스타카토)의 Ui Model Mapper 변경 MomentDetailUiModel.CommentsUiModel -> CommentUiModel MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel Feeling을 Ui Model로 변환하는 Mapper 추가 * feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성 * feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성 * fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정 * fix: 누락된 ViewModel 데이터 바인딩 설정 * feat: 순간 조회 화면 재구성 * refactor: 네비게이션 action 및 id 네이밍 수정 visit -> moment로 수정 * refactor: 방문 -> 순간 으로 키워드 변경 * refactor: 불필요한 클래스 및 xml 파일 제거 * style: ktlint 적용 * feat: 추억 API 변경사항 반영 및 리팩터링 #259 (#265) * ui: 추억 생성 화면 사진 로드 시 coil 라이브러리 사용 * ui: 삭제 버튼 아이콘 추가 * ui: 추억 생성 화면 사진 삭제 버튼 추가 * feat: 추억 생성 view model의 imageUri 설정 매개변수 타입 변경 * feat: 추억 생성 화면 사진 삭제 구현 * feat: 추억 수정 화면 사진 첨부 icon 가시성 설정 * ui: 추억 수정 화면 사진 삭제 버튼 추가 * feat: 추억 수정 화면 사진 삭제 버튼 가시성 설정 * feat: 추억 수정 view model의 imageUri 설정 매개변수 타입 변경 * feat: 추억 수정 화면 사진 삭제 구현 * fix: 추억 생성 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정 * fix: 추억 수정 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정 * feat: MemoryRequest dto에 썸네일 사진 url 필드 추가 * feat: 추억 생성 메서드의 시그니처 변경 - MemoryApiService 내 추억 생성 메서드의 시그니처 변경 - 위 변경에 따른 DataSource, Repository, ViewModel의 추억 생성 관련 메서드 시그니처 변경 * feat: 추억 생성 view model 주 생성자로 ImageRepository 주입 * feat: 추억 생성 화면의 썸네일 사진 저장 기능 구현 * feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 생성 화면) - 추억 생성 화면에서 서버에 저장된 사진을 로드하는 기능 구현 - UI에 불러온 사진을 표시하는 로직 수정 * feat: 추억 생성 시 썸네일 사진 url 추가 * refactor: MemoryRequest의 추억 썸네일 사진 기본 인자 값 null로 설정 * feat: 추억 수정 메서드의 시그니처 변경 * feat: 추억 수정 view model 주 생성자로 ImageRepository 주입 * feat: 추억 수정 화면의 썸네일 사진 저장 기능 구현 * feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 수정 화면) - 추억 수정 화면에서 서버에 저장된 사진을 로드하는 기능 구현 - UI에 불러온 사진을 표시하는 로직 수정 * feat: 추억 수정 시 썸네일 사진 url 추가 * refactor: 불필요한 MemoryUpdateRequest 제거 * ui: empty view 캐릭터 이미지 추가 * ui: 추억 설명글 유무에 따른 가시성 설정 * ui: 함께 한 사람들 가시성 gone 으로 설정 - 4차 스프린트 범위에서 제외됨 * feat: 이미지 선택 옵션 추가 (단일 선택 및 다중 선택 지원) * ui: TextInputLayout, TextInputEditText Style 정의 * ui: 추억 생성 화면 입력란 TextInputLayout으로 변경 - counter 속성 사용을 위해 TextInputLayout으로 변경함 * ui: 추억 수정 화면 입력란 TextInputLayout으로 변경 - counter 속성 사용을 위해 TextInputLayout으로 변경함 * ui: 추억 조회 화면 썸네일 사진 유무에 따른 가시성 설정 * ui: empty view 캐릭터 이미지 크기 변경 * ui: 앱 이름 Staccato_AN -> Staccato 로 수정 * refactor: 추억 생성 및 수정 화면 메서드 순서 정리 * ui: 제목용 TextInputEditTextStyle 정의 및 적용 * ui: 추억 생성 및 수정 화면 썸네일 coilPlaceHolder 변경 - 이전: shape_place_holder_rectangle - 이후: shape_all_gray1_8dp * refactor: 삭제 다이얼로그 show 메서드 호출 방식 변경 - apply를 사용하지 않는 방식으로 변경 * ui: 코멘트 미지원 안내 view 추가 * feat: 스타카토 생성, 수정 화면 사진 및 완료 버튼 개선 #242 (#291) * feat: (스타카토 생성 화면) 사진 드래그로 순서 변경 기능 구현 * refactor: data 패키지에 S3 이미지 API 분리 적용 * refactor: AttachedPhotoUiModel 및 프로그래스바 추가 * feat: recyclerView에서 지워진 사진의 job cancel 처리 * refactor: editText를 TextInputLayout로 수정 * feat: (스타카토 수정 화면) 사진 드래그로 순서 변경 / 로딩 구현 * refactor: 프로퍼티 네임 변경 및 visitedAt LocalDateTime으로 수정 * style: ktlint 적용 * build: 구글 맵 API 사용에 따른 CI 수정 #296 (#297) * build: 구글 맵 api key를 저장하는 파일을 설정하는 명령어 작성 * refactor: defaults 에 설정된 shell 설정에 따라 추가적인 shell 설정 삭제 * feat: Google Map 연결, 스타카토 목록 조회 API 연결 #54 (#295) * build: google map 의존성 추가 * build: 구글맵 관련 properties ignore 추가 * build: 구글맵 api key 설정 * feat: Google Map 연결 * feat: MainActivity Handler 구현 * ui: 추억 및 스타카토 생성 메뉴 추가 * ui: popup menu style 정의 * feat: 추억 생성 및 수정 menu 연결 - handler 연결 - 메서드 분리 * feat: 위치 권한 요청 구현 - ACCESS_FINE_LOCATION 권한 요청 - ACCESS_COARSE_LOCATION 권한 요청 * feat: 현 위치 표시 * style: MainActivity formatting * feat: locationPermissions 타입 변경 - 이전: List - 이후: Array * feat: MomentLocationDto, MomentLocationResponse 추가 * feat: 스타카토 목록 조회 api service 구현 * feat: 스타카토 목록 조회 data source 구현 * feat: MomentLocation 도메인 모델 구현 * feat: MomentLocationDto를 도메인 모델로 변환하는 mapper 구현 * feat: 스타카토 목록 조회 repository 구현 * feat: 스타카토 목록 조회 view model 구현 * feat: 스타카토 목록을 marker로 표시 * refactor: home 패키지명을 maps로 변경 * feat: 마커 클릭 시 스타카토 상세로 이동 기능 구현 * feat: 스타카토 조회 추억 id, 제목 필드 추가 * feat: 마지막 위치 위경도 찾기 * refactor: 안드로이드 1차 QA 반영 #299 (#301) * refactor: 안드로이드 1차 QA 반영 * refactor: 안드로이드 1차 QA 반영2 * refactor: 안드로이드 1차 QA 반영3 * refactor: 삭제 메시지 변경 * fix: 스타카토 조회 화면 스택 관리 및 ui 수정 #304 (#306) * feat: 지도 화면에서 스타카토 조회 화면으로 이동 시 스택 관리 * feat: 타임라인 화면에서 추억이 존재하지 않을 때 추억 생성 버튼 추가 * ui: 스타카토 조회 화면 툴바 위치 고정 * build: Android CD 적용 #300 (#308) * build: CD 워크플로우 yml 파일 작성 * build: keystore 접근을 위한 build.gradle.kts 파일 설정 * build: 기존 apk 추출 ci 파일 수정 - demo 버전의 apk를 추출 및 배포하는 목적에 맞게 파일 명 수정 - apk 빌드 후 테스트를 수행하는 job 추가 - firebase 앱 배포에 아티팩트 업로드하는 job 추가 * fix: ci 파일에도 keystore 생성 job 추가 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 수정 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정 * fix: ci 파일에 키스토어 관련 설정 적용 * fix: 키스토어 관련 명령어 일부 수정 * fix: build.gradle.kts 불필요한 괄호 제거 * fix: keystore.properties 로 부터 프로퍼티를 가져오는 형식 변경 * fix: upload-artifact step에서 빌드 파일의 upload 경로 수정 (#316) upload-artifact 는 defaults 설정의 working-directory 경로가 적용되지 않음 * fix: android cd 재수정 (2차) #317 (#319) * fix: upload-artifact 빌드 파일의 upload 경로 3차 수정 * fix: 배포 시 빌드 파일의 경로 수정 * fix: 빌드 파일의 upload 경로 수정 및 파일이 없는 경우 에러 처리 * fix: 빌드 파일의 upload 경로 4차 수정 * fix: 빌드 파일의 upload 경로 5차 수정 * fix: 빌드 파일의 upload 경로 6차 수정 - 디렉터리 경로 생성 후 upload 실행 * fix: 빌드 파일의 upload 경로 7차 수정 github의 workspace 환경변수(절대경로) 활용 * fix: clean test 제거 및 디버그용 파일 경로 탐색 명령어 추가 * fix: 디버그용 파일 경로 검색 명령어 수정 * fix: 디버그용 파일 경로 검색 명령어 삭제 * fix: 디버그용 파일 검색 명령어 삭제 및 업로드 파일 경로명 수정 * feat: 스타카토 생성 시 현 위치의 주소를 가져오는 기능 구현 #314 (#324) * feat: MainActivity에서 주소를 가져오는 로직 삭제 * feat: 스타카토 생성 시 현 위치의 주소를 가져오는 로직 구현 * refactor: 메서드 순서 정렬 * refactor: 스타카토 조회 화면 ViewPager2 적용 및 UI 아이콘 개선 #318 (#320) * refactor: 아이콘 추가 및 UI 개선 * feat: 스타카토 상세 사진 Viewpager 적용 * feat: 스타카토 상세 사진 Viewpager에 dot indicator 추가 * style: ktLint Format * feat: 메인 지도 화면에서 스타카토 생성하는 플로우 구현 #321 (#327) * feat: 날짜로 추억 목록 불러오는 getMemories API 추가 * feat: 메인에서 스타카토 생성 시 추억 목록 선택 가능 * feat: 스타카토 생성 시 역지오코딩과 추억 선택 연동 * build: debug와 release로 buildTypes 분리 (#329) - appName, appId, baseUrl 분리 - release에 난독화 적용 * build: debug 와 release 배포 분기에 따른 CD 수정 - CD에 대한 트리거 재설정 : main 브랜치에 대한 push 및 pr * fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 #326 (#330) * refactor: 지도 화면 onResume에서 스타카토 목록 load * refactor: 스타카토 목록 로드 메서드명 변경 - 이전: loadMoments - 이후: loadStaccatos * feat: 공유 view model에 스타카토 목록 업데이트 상태 추가 * fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 * feat: 지도 로드 시 현위치로 이동하도록 구현 * build: ci 및 cd 파일 수정 ci - 불필요한 gradle 빌드 및 테스트 제거 cd - 타겟 브랜치 develop 제거 * feat: 댓글 조회, 생성, 삭제 기능 구현 #290 (#331) * feat: 기분 수정 요청을 보내는 Request Dto 작성 * feat: MomentApiService 에 기분 수정 요청에 대한 API 작성 * feat: 기분 수정 요청에 대한 DataSource 메서드 작성 * feat: 기분 도메인 모델 생성 * feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성 * ui: 기분 아이콘 이미지 리소스 추가 * ui: 기분 아이콘의 테두리를 selector로 생성 - 선택/미선택에 따라 다른 ui를 나타낸다 * ui: 기분 아이콘에 사용할 style 지정 * fix: API 변경에 따라 DTO 및 Mapper 변경 - 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경 * fix: 순간 DTO에 기분 필드 추가 - 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정 * feat: 기분 선택 api에 필요한 repository 메서드 작성 * feat: 기분 uiModel 생성 * feat: 댓글에 대한 UI 모델 생성 * feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성 * feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성 * feat: 댓글 화면 구성 및 Adapter, Fragment 작성 * feat: 순간(현 스타카토)의 Ui Model Mapper 변경 MomentDetailUiModel.CommentsUiModel -> CommentUiModel MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel Feeling을 Ui Model로 변환하는 Mapper 추가 * feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성 * feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성 * fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정 * fix: 누락된 ViewModel 데이터 바인딩 설정 * feat: 순간 조회 화면 재구성 * refactor: 네비게이션 action 및 id 네이밍 수정 visit -> moment로 수정 * refactor: 방문 -> 순간 으로 키워드 변경 * refactor: 불필요한 클래스 및 xml 파일 제거 * ui: xml 컨벤션에 맞추어진 타 사용자의 댓글 ui 구성 * feat: 댓글 API의 DTO 작성 * feat: 댓글 API Service 작성 * feat: 댓글 CRUD DataSource 작성 * refactor: CommentApiService 각 메서드의 반환 값을 Response로 변경 * feat: CommentApiService 를 create * feat: CommentDataSource 구현체 생성 * refactor: 댓글 Dto 클래스 네이밍 변경 - VisitLogDto -> CommentDto * refactor: CommentDto 의 ID 프로퍼티 네이밍 변경 - visitLogId -> commentId * refactor: VisitLog 도메인 모델 클래스의 네이밍 변경 - VisitLog -> Comment * refactor: Comment 도메인 모델의 ID 프로퍼티 네이밍 변경 - visitLogId -> commentId * feat: 새로운 댓글 도메인 모델 생성 * feat: CommentRepository 작성 * feat: Domain 모델과 DTO 모델을 변환해주는 Mapper 작성 - CommentDto를 Comment로 변환하는 메서드를 CommentMapper.kt로 이동 * feat: CommentRepository의 기본 구현체 작성 * feat: 댓글 ViewModel, Factory 작성 및 Comment 불러오기 구현 * ui: ViewModel 데이터바인딩 및 빈 댓글 문구에 대한 strings 설정 * feat: CommentsViewModel 활용 및 옵저빙 * feat: 댓글 조회, 생성, 삭제 기능 구현 * chore: ktlint 적용 * feat: 추억 생성 및 수정 이미지 로딩 중 표시 및 저장 버튼 비활성화 #332 (#334) * feat: 추억 생성 이미지 로딩 중 표시 * feat: 추억 수정 이미지 로딩 중 표시 * feat: 추억 생성 및 수정 이미지 로딩 중 저장 버튼 비활성화 * style: formatting * refactor: 댓글 화면 개선 및 리팩터링 #333 (#335) * fix: merge conflicts 해결 * fix: 글자 수 제한 500자로 수정 * style: ktlint 체크 * build: CD 수정 - 구글 플레이스토어 업로드 스텝 추가 --------- Co-authored-by: hxeyexn Co-authored-by: Somin Lee <46596035+s6m1n@users.noreply.github.com> Co-authored-by: Hyeyeon Gong <103019852+hxeyexn@users.noreply.github.com> Co-authored-by: s6m1n * docs: 서비스 소개 수정 * chore: main ci 트리거 수정 * fix: 구글 플레이 스토어 자동 배포 비활성화 * build: Android Config의 버전 코드 및 이름 변경 #338 (#339) * build: 프로젝트 생성 및 의존성 추가 * chore: 사용자 기능 및 권한 추가 * chore: gitignore 재설정 * chore: gitigonre .idea/ 추가 * build: develop-an 브랜치의 CI 설정 #3 (#10) * build: android-ci.yml 파일 생성 * chore: 오타 및 개행 수정 * chore: working-directory 수정 * build: ktLint 적용 및 format * ui: 디자인 시스템 구현 #11 (#44) * ui: color 정의 * ui: shape, selector 추가 * ui: icon 추가 * ui: font family 추가 - pretendard regular, medium, semibold, bold 추가 * ui: typography 정의 * ui: strings 정의 * ui: bottom sheet drag handle drawable 추가 * ui: styles 정의 * ui: detail toolbar 구현 - 상세 화면에서 사용 * ui: dialog, bottom sheet 구현 - 여행 및 방문 기록 삭제 dialog - 사진 등록 bottom sheet * ui: 사진 첨부 layout 구현 * feat: 삭제 다이얼로그, 사진 첨부 바텀 시트 fragment 추가 * ui: 세로모드로 고정 * build: data binding 의존성 추가 * style: strings resource 순서 정렬 * style: formatting * ui: plus icon 추가 * feat: jetpack navigation 및 바텀시트 프래그먼트 추가 #12 (#15) * build: androidx.navigation 및 dataBinding 의존성 추가 * feat: Binding 화면 클래스 및 bottomSheetNavigation 추가 * feat: TimelineFragment 임시 화면 추가 * feat: TravelFragment 임시 화면 추가 * feat: TravelCreationFragment 임시 화면 추가 * feat: VisitFragment 임시 화면 추가 * feat: VisitCreationFragment 임시 화면 추가 * feat: (여행, 방문 기록) 수정 화면 추가 * feat: (여행, 방문 기록) 생성 화면 이동 구현 * feat: BottomSheetController 설정 및 Navigation 이동 구현 * feat: 뒤로가기 버튼 클릭 시 BottomSheet, Toast 작동 구현 * feat: 여행, 방문 기록 생성을 위한 액티비티 추가 및 이동 구현 * feat: 여행, 방문 기록 수정을 위한 액티비티 추가 및 이동 구현 * build: 중복된 dataBinding 제거 * feat: 공통 이미지 로딩 BindingAdapter 설정 #33 (#41) * build: dataBinding 사용 설정 * feat: 이미지 로딩 바인딩 어댑터 설정 - Glide, Coil 바인딩 어댑터를 각각 작성 - placeholder 설정 * style: ktlint check - import 순서 조정 * fix: attribute 개수에 맞추어 BindingAdapter의 value 재설정 * style: 마지막 줄 개행 추가 * feat: placeHolder를 필수 속성으로 변경 및 coil 이미지 로딩 코드 수정 - placeHolder를 ImageView의 필수 속성으로 지정 - Coil BindingAdapter에서 url이 null인 경우에도 이미지를 로드하는 동작이 수행되도록 수정 * ui: 상단바 색상 변경 * build: develop-an의 CI 설정 수정 #38 (#39) - Git Action에 Secret으로 저장된 LOCAL_PROPERTIES_API_KEY를 변수로 가져온다. - 가져온 변수를 echo를 활용하여 local.properties에 설정한다. * build: develop-an 브랜치의 CI 파일 문법 오류 수정 #45 (#46) * fix: android-ci.yml 파일의 명령어 수정 LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: android-ci.yml 파일의 명령어 수정 #47 (#48) LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: 파이프라인 제거하여 명령어 수정 * fix: develop-an 브랜치의 CI 파일 명령어 재수정 #47 (#49) * fix: android-ci.yml 파일의 명령어 수정 LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: 파이프라인 제거하여 명령어 수정 --------- Co-authored-by: Somin Lee <46596035+s6m1n@users.noreply.github.com> * fix: 문자열 임을 명시하고 환경변수 설정 위치 조정 * fix: local.properties 생성 시점 수정 * feat: 데이터 패키지 설정 #13 (#35) * build: 서버 base url의 local.properties 사용 설정 및 BuildConfig 설정 * feat: Retrofit Client 작성 * fix: Merge Conflict 해결 - build.gradle.kts(project, app)의 ktlint 의존성 충돌 해결 - 버전 카탈로그 플러그인 충돌 해결 * feat: DTO 클래스 작성 * style: ktlint check - 불필요한 import 제거 - 개행 조정 - 콤마 추가 * feat: SerialName 어노테이션의 값을 camelCase로 수정 * refactor: DTO 클래스의 이름 수정 - API 요청으로 직접 보내거나 들어오는 JSON의 경우 DTO 클래스명 뒤에 Request/Response 를 붙이도록 설정 - JSON 안에 속성 값으로 들어가는 JSON은 DTO 클래스명 뒤에 Dto를 붙이도록 설정 * feat: 누락된 Dto 클래스 추가 TimelineResponse.kt - 타임라인 조회 시 여행 상세 목록을 불러올 때 사용되는 DTO 클래스 - TimelineTravelDto 리스트를 갖는다 * style: ktlint check * fix: const 키워드 제거 --------- Co-authored-by: hxeyexn * feat: 둥근 모서리의 이미지를 로드하는 BindingAdapters 추가 #58 (#59) * feat: 둥근 모서리로 이미지를 로딩하는 Glide 바인딩 어댑터 작성 - 세 속성이 모두 필요하다. - glideRoundedCornerImageUrl: 출력하고자 하는 이미지 url - glidePlaceHolder: placeHolder의 url - glideRoundingRadius: 모서리의 둥근 정도를 Int로 설정 * feat: 둥근 모서리로 이미지를 로딩하는 Coil 바인딩 어댑터 작성 - 세 속성이 모두 필요하다. - coilRoundedCornerImageUrl: 출력하고자 하는 이미지 url - coilPlaceHolder: placeHolder의 url - coilRoundingRadius: 모서리의 둥근 정도를 Float으로 설정 * fix: centerCrop 설정을 BindingAdapter 에 위임 - xml 속성으로 centerCrop을 주게 되면 Round Corner가 제대로 적용되지 않는 현상 발생 - Glide의 api로 제공되는 centerCrop() 메서드를 활용 * ui: 타임라인 프래그먼트(BottomSheet) 구현 #55 (#71) * ui: 타임라인 View xml 파일 작성 - 타임라인에 나타날 여행 상세 아이템 xml 작성 - 썸네일 사진 유무에 따라 뷰를 구분 - 타임라인이 나타날 fragment xml 작성 * feat: 타임라인 여행 상세 아이템 UI 모델 생성 * ui: 썸네일이 없는 여행상세 아이템의 margin 조정 * ui: Timeline RecyclerView의 layoutManager 설정 * ui: xml에서의 UiModel 데이터 바인딩 설정 * feat: ViewHolder 작성 - 썸네일 사진 유무에 따라 다른 ViewHolder로 구분 - 공통된 속성을 정의한 TimelineViewHolder 추상클래스 생성 * feat: TimelineRepository Interface 생성 * feat: 임시 TimelineRepository 구현체 생성 * feat: TimelineViewModel 및 Factory 생성 * feat: TimelineViewType 작성 * feat: TimelineAdapter 작성 * feat: TimelineFragment에 ViewModel과 Adapter 구현 * feat: 이미지 로딩 PlaceHolder drawable 추가 및 적용 * feat: 임시 데이터 연결 * ui: Timeline fragment 의 세부 설정 조정 * ui: Timeline의 Item xml 변경 - 뷰 타입을 3개로 분할: 첫 번째 아이템, 중간 아이템, 마지막 아이템 - 이에 따라 xml 파일 추가 및 view 수정 * feat: ViewType 변경에 따른 Adapter 및 ViewHolder 수정 * refactor: 불필요한 View 및 ViewHolder 제거 * feat: 여행 click 에 대한 event handler 생성 및 설정 * refactor: drawable 이름을 네이밍 컨벤션에 맞게 수정 * ui: RecyclerView의 마진 속성을 패딩 속성으로 변경 * feat: 바텀 시트 디자인 변경 및 툴바와의 상호작용 구현 * ui: 타임라인 글귀 추가 * style: ktlint check * ui: 둥근 모서리의 이미지로 변경 * ui: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 구현 #52 (#74) * ui: typography.body textSize 1sp 씩 증가 * feat: DeleteDialogFragment에 Handler 추가 * feat: 툴바의 수정, 삭제 버튼 제어를 위한 ToolbarHandler 추가 * feat: 방문 상세 화면을 위한 VisitDetailUiModel 추가 * ui: PlaceHolder를 위한 xml 파일 추가 * feat: 방문 기록 상세 화면을 위한 VisitAdapter 및 VisitViewHolder 구현 * feat: 임시 VisitViewModel와 VisitViewModelFactory 추가 * feat: VisitFragment 화면 구현 * feat: 방문 기록에 해당하는 여행 선택을 위한 TravelSelectionFragment 구현 * feat: 방문 기록에 해당하는 날짜 선택을 위한 VisitedAtSelectionFragment 구현 * feat: 방문 기록 생성을 위한 VisitCreationActivity 구현 * feat: 방문 기록 수정을 위한 VisitUpdateActivity 구현 * refactor: DialogHandler를 DeleteDialogFragment의 생성자에서 받도록 수정 * refactor: initVisitUpdateDoneButton 중복 로직 제거 * refactor: VisitViewHolderType 메서드 명 변경 of -> from * refactor: tv_place_name_title을 xml id convention에 맞게 수정 * ui: 여행 화면 구현 #51 (#75) * ui: 함께 간 사람들 item 구현 * ui: 방문 기록 item 구현 * ui: 여행 상세 화면 구현 * ui: 여행 생성 화면 구현 * ui: 여행 수정 화면 구현 * ui: placeholder에 사용할 drawable 추가 * ui: 여행 삭제 완료 string 추가 * feat: 둥근 모서리 이미지 BindingAdapter 구현 * feat: 함께 간 사람들 adapter 구현 * ui: 여행 상세 화면 NestedScrollView로 변경 - 이전: ScrollView - 이후: NestedScrollView * feat: 방문 기록 adapter 구현 * feat: 여행 상세 view 연결 * feat: 함께 간 사람들, 방문 기록 adapter 연결 * feat: 삭제 다이얼로그 handler 구현 * feat: 여행 상세 화면 toolbar handler 구현 - 뒤로가기 - 여행 수정 화면으로 이동 - 삭제 다이얼로그 show * feat: 여행 -> 방문 기록 화면 이동 구현 * ui: DatePickerStyle 추가 - DatePickerStyle, CustomMaterialCalendarStyle 추가 - staccato_blue 투명도 30 추가 * feat: 여행 저장 버튼, 여행 기간 BindingAdapter 추가 * feat: 여행 생성 view 연결 * feat: 여행 수정 view 연결 * style: formatting - Exceeded max line length 해결 - 임시 이미지 URL 변경 * refactor: 기간 선택 로직 메서드 분리 * feat: 타임라인의 API 적용 및 MainActivity의 Toolbar 제거 #81 (#93) * refactor: UI Model의 패키지 경로 변경 * refactor: API 명세 변경에 따른 TimelineTravelDto 수정 * refactor: repository 메서드 수정 - 서버 요청을 비동기적으로 처리하기 위해 suspend 키워드 삽입 - 기존의 임시 데이터 요청 코드를 위해 load 메서드 분리 * feat: Timeline의 API Service 작성 * feat: DataSource 인터페이스 작성 * feat: TimelineDataSource 구현체 생성 * refactor: 년도에 대한 default parameter 설정 * refactor: DataSource의 요청 메서드 네이밍 수정 * feat: http 통신이 가능하도록 Cleartext Traffic 허용 설정 * feat: Authorization Header를 삽입하기 위한 Interceptor 생성 * feat: Client에 HeaderInterceptor 추가 * refactor: errorBody의 message 속성 이름 변경 * feat: 도메인 모델 작성 * feat: Response(dto)에서 도메인 모델로 변환하는 확장함수 구현 * feat: 도메인 모델에서 UI 모델로 변환하는 확장함수 구현 * feat: Repository 수정 및 ViewModel 데이터 연결 * ui: MainActivity의 상단 툴바 제거 * refactor: ViewType에 viewType 속성 추가 및 when에서의 enum 활용 * refactor: Timeline의 공통 ViewHolder를 sealed class로 변경 * style: ktlint check 수행 * fix: Response 데이터의 nullable 속성에 맞추어 DTO 수정 및 누락된 DTO 추가 * fix: 데이터가 비어있는 경우(초기)에만 새로운 여행상세 목록을 받도록 수정 * refactor: lazy 로 지연 초기화 및 timelineService가 하나의 인스턴스로 관리되도록 수정 * fix: Travel의 description에 nullable 속성 추가 API 명세서 잘 좀 보자 제발 * refactor: create 메서드를 private으로 변경 Client 클래스에서 Service를 create 하여 제공 및 캐싱하기 때문에, 불필요한 인스턴스를 생성하지 않도록 create를 public으로 두지 않는 것이 좋다. * refactor: LocalDateConverters의 패키지 경로 수정 * refactor: 파일의 이름 수정 * style: ktlint check * refactor: 에러 메시지 상수화 * feat: 특정 여행 상세 조회 api 연결 #82 (#97) * feat: 특정 여행 상세 조회 api service 구현 * feat: 썸네일, 소개 타입 변경 및 기본 인자 설정 - 변경 data class : TravelResponse, TravelUiModel - 이전: String - 이후: String? * refactor: MatesUiModel 네이밍 변경 MatesUiModel이 공통적으로 사용될 예정이므로 MemberUiModel로 변경 - 이전: MatesUiModel - 이후: MemberUiModel * refactor: VisitUiModel 네이밍 변경 - 여행 상세 방문 기록에 사용되는 UiModel 이름을 명시적으로 변경 - 이전: VisitUiModel - 이후: TravelVisitUiModel * feat: 특정 여행 상세 조회에 사용할 domain model 추가 * feat: Api 응답 핸들링 로직 구현 * feat: 특정 여행 상세 조회 data source 구현 * feat: 특정 여행 상세 조회 repository 구현 * feat: 특정 여행 상세 조회 api 연결 * feat: 특정 여행 상세 조회 로직 매개변수 추가 - 타임라인에서 선택된 여행 id를 매개변수로 받도록 변경 * refactor: ApiResponseHandler 이름 오타 수정 * refactor: 에러 메세지 상수화 * feat: 특정 여행 상세 조회 시그니처 변경 - HeaderInterceptor 적용으로 authorization 매개변수 제거 * style: formatting * feat: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 API 연결 #79 (#99) * feat: VisitApiService 인터페이스 및 관련 data class 추가 * feat: VisitRepository, RemoteVisitDataSource 및 관련 class 추가 * feat: 각 Visit 화면들의 ViewModelFactory 구현 * feat: 각 Visit 화면들의 UiModel 클래스 및 Mapper 추가 * feat: 여행 선택 및 방문 날짜 선택을 위한 BottomSheetDialogFragment 수정 * feat: VisitFragment API 연결 * feat: VisitCreationActivity API 연결 * feat: VisitUpdateActivity API 연결 준비 * refactor: visitApiService를 StaccatoClient object로 이동 * refactor: TravelVisit 클래스의 visitImage 변수 nullable하게 수정 * refactor: VisitApiService의 중복된 @Header 제거 * refactor: 방문 생성 성공 시 created id를 가져오도록 리팩터링 * chore: 변수명 visitImage로 수정 및 ktLint 적용 * refactor: 여행 수정 완료 동작 구현 및 VisitUpdateActivity 함수 분리 * feat: 여행 생성 api 연결 #98 (#104) * feat: 여행 생성 api service 구현 * feat: 여행 생성 data source 구현 * feat: 방문 기록 썸네일 타입 변경 및 기본 인자 설정 - 변경 data class :  TravelVisitDto, TravelVisit, TravelVisitUiModel - 이전: String - 이후: String? * build: converter scalars 의존성 추가 * feat: 여행 생성 ApiService 반환값 및 DataSource 시그니처 변경 - 여행 생성 ApiService 반환값 변경 - DataSource 시그니처 변경 - TravelCreation DomainModel 구현 - TravelCreation Dto 변환 Mapper 구현 * feat: Client에 ScalarsConvert 추가 - Header 값을 읽어오기 위해 ScalarsConvert 추가 * feat: 여행 생성 repository 구현 * feat: 여행 생성 api 연결 * feat: TravelViewModel 생성자 변경 - 이전: travelId를 TravelViewModel 생성자로 넣어줌 - 이후: travelId를 loadTravel()의 매개변수로 넣어줌 * ui: map 화면 변경 * refactor: 컨벤션 통일 및 패키지 정리 #112 (#118) * refactor: bind 네임스페이스 적용 * refactor: BindingAdapters 메서드명 변경 * refactor: 컨벤션 맞게 xml 파일 이름 변경 * refactor: data 패키지 구조 정리 * refactor: RemoteVisitDataSource 컨벤션 따라 네이밍 변경 * refactor: 네트워킹 관련 메서드 이름 변경 - api service, data source, repository * refactor: presentation 패키지 구조 정리 * refactor: message utils 생성 및 적용 Co-authored-by: s6m1n Co-authored-by: Junyoung-WON * build: develop-an의 CI 테스트 자동화 추가 및 데모 APK 추출 #78 (#92) * build: test 자동화 Job 추가 * build: local.properties 생성 시점 변경 * build: 디버그 APK를 빌드하여 업로드하는 workflow 작성 * fix: test Job과 APK build Job에 local.properties 생성 동작 추가 * build: read 전용 권한 제거 * build: Firebase Analytics, Crashlytics 설정 #136 (#143) * build: Firebase Analytics, Crashlytics 의존성 추가 * chore: google-service.json ignore * feat: 특정 여행 상세 수정 api 연결 #109 (#146) * feat: 여행 수정 api service 구현 * feat: 여행 수정 data source 구현 * feat: 여행 수정 repository 구현 * feat: 여행 수정 화면 현재 데이터 로딩 기능 구현 * refactor: 컨벤션 따라 여행 api service의 수정 메서드명 변경 - 이전: updateTravel - 이후: putTravel * feat: 특정 여행 상세 수정 api 연결 * refactor: memberImage 타입 변경 및 기본 인자 설정 * refactor: MembersDto 삭제 * refactor: TravelCreationUiModel.kt 삭제 * refactor: TravelCreation 이름 변경 - 이전: TravelCreation - 이후: NewTravel * refactor: api 명세서 변경에 따른 도메인 모델 수정 및 여행 코드 리팩터링 #151 (#152) * refactor: nickName 변수명 변경 - 이전: nickName - 이후: nickname * ui: 여행 수정 화면 이미지 속성 수정 - glide -> coil 이용 - scaleType : fitXY -> centerCrop * style: import 정렬 * feat: 여행 상세 -> 방문 상세로 이동 시 여행 id 전달 * feat: 방문기록 조회 dto 수정 - 방문기록 조회 도메인 변경으로 인해 방문 기록이 조회되지 않음 - 따라서 api 명세서와 일치하도록 dto 수정하여 오류 해결 * refactor: 여행 생성을 위한 viewModel 메서드 분리 * refactor: 여행 조회를 위한 viewModel 메서드 분리 * feat: 여행 수정 handler 구현 * refactor: 여행 default id 변경 - 이전: -1L - 이후: 0L * refactor: TravelHandler 구현 위치 변경 - 이전: TravelViewModel - 이후: TravelFragment * style: 컨벤션에 맞게 TravelFragment의 메서드 순서 수정 * refactor: TravelFragment의 travelId 초기화 방식 변경 * feat: 여행 생성 및 수정 error toast 구현 * feat: 방문 생성 화면, 방문 수정 화면에서 갤러리 사진 불러오기 구현 #150 (#155) * feat: PhotoAttachFragment에 PhotoAttachHandler 연결 * feat: PhotoAttachFragment 앨범 접근 권한 관련 로직 구현 - API level 33 이상 : READ_MEDIA_IMAGES - API level 33 이하 : READ_EXTERNAL_STORAGE - ActivityResultLauncher를 이용한 권한 요청 - 권한 거부 시, 설정으로 이동하는 스낵바 띄우기 * feat: PhotoAttachFragment 앨범에서 불러온 이미지의 URI 추출하기 * feat: 불러온 이미지의 URI를 호스트 Activity로 전달 - OnUrisSelectedListener 인터페이스 추가 * feat: Uri를 File로 변환하는 메서드 파일 추가 * refactor: pr 리뷰 반영 * refactor: pr 리뷰 반영2 * build: develop-an의 android-ci 수정 #115 (#160) - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: android-ci 환경변수 생성 위치 조정 (#164) * build: local.properties 와 google-services.json 설정 - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: 환경 변수 설정 위치 변경 * build: bash 쉘에 맞는 명령어 활용 #115 (#165) * build: local.properties 와 google-services.json 설정 - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: 환경 변수 설정 위치 변경 * fix: bash 쉘에 적합한 명령어 형식으로 변경 * feat: 특정 여행 상세 삭제 api 연결 #153 (#167) * feat: 특정 여행 삭제 api service 구현 * feat: 특정 여행 삭제 data source 구현 * feat: 특정 여행 삭제 repository 구현 * feat: 특정 여행 삭제 기능 api 연결 * feat: error handling 방식 수정 - 서버에서 들어오는 error body의 status와 message를 활용하는 방식으로 변경 * refactor: DialogHandler를 독립적으로 관리 * refactor: api path 상수 활용 * refactor: BuildConfig에 token 정의 * refactor: DEFAULT_VALUE 상수 제거 * feat: 여행 생성 기능 api 수정 #169 (#178) * feat: onUrisSelected 매개변수 가변인자로 변경 * feat: 여행 생성 화면 갤러리 이미지 로딩 기능 구현 * refactor: 이미지 선택 리스너 초기화 메서드명 오타 수정 * refactor: 스낵바 액션 설정 코드 간소화 * feat: TravelRequest 의 여행 썸네일 필드 제거 * refactor: 여행 썸네일 이미지 변수명 수정 * feat: 이미지 전송 기능 구현 * refactor: image url 변수명 변경 - 변수 끝에 url이 오도록 * feat: 여행 생성 progressBar 구현 * ui: 사진 첨부 아이콘 가시성 설정 * feat: 여행 상세 수정 기능 api 변경 및 여행 리팩터링 #180 (#181) * feat: 여행 수정 화면 갤러리 이미지 로딩 기능 구현 * feat: URL 및 URI 기반 이미지 로딩 BindingAdapter 구현 * feat: 이미지 전송 기능 구현 * feat: 여행 수정 progressBar 구현 * fix: 삭제 불가능한 여행 삭제 시도 관련 에러 토스트 문제 해결 삭제 불가능한 여행을 삭제하려고 시도 -> 방문 조회 -> 뒤로 가기 버튼 클릭 -> 삭제 불가능 에러 토스트가 다시 뜨는 문제가 발생해 이를 해결 * refactor: TravelCreationViewModel의 imageUrl 변수 제거 * ui: 여행 상세 내 방문 기록 이미지 scaleType 속성 설정 * ui: 여행 생성 썸네일 이미지 scaleType 속성 설정 * fix: 여행 소개 미입력 시 여행이 생성 되지 않는 오류 해결 * refactor: 타임라인 화면 리팩터링 #162 (#179) * ui: 타임라인 RecyclerView의 크기 조정 및 여백 수정 * feat: Activity와 Fragment 간 데이터를 공유하는 공유 ViewModel 생성 * feat: 공유 ViewModel을 이용하여 타임라인 업데이트 여부를 공유 * refactor: RecyclerView.Adapter에서 ListAdapter로 변환 * refactor: 처음 타임라인을 불러오는 동작을 ViewModel 초기화 시에 수행 * fix: ListAdapter 수정 - 불필요한 travels 프로퍼티와 getItemCounts 메서드 제거 - currentList를 사용하는 것으로 변경 * refactor: 에러 핸들링 방식 수정 및 ViewModel 수정 - TimelineDefaultRepository로 네이밍 변경 - ApiResponseHandler와 ResponseResult를 이용하여 에러 핸들링 처리 - TimelineViewModel 에러 메시지 LiveData 사용 - 그 외 repository, dataSource 프로퍼티 이름 수정하여 통일 * refactor: MutableLiveData의 값 업데이트를 setValue로 변경 및 메서드 분리 * style: ktlint 적용 * feat: 3차 스프린트에서 수정된 방문 기록 상세 API 연결 #163 (#183) * feat: 방문 상세 생성 API 연결 * feat: 방문 상세 수정, 삭제 API 연결 * feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용 * feat: 방문 기록 생성 화면 사진 다중 선택 구현 * feat: 방문 기록 생성 이미지 업로드 구현 * feat: 방문 기록 생성 및 수정 시 로딩과 토스트 추가 * feat: 닉네임을 활용한 로그인 기능 구현 #124 (#172) * ui: 로그인 화면 구성 - 로그인 화면에서 사용되는 텍스트를 strings에 추가 - 로그인 버튼 스타일에 대한 style 생성 - xml 임시로 작성 * ui: 앱 로고 삽입 및 margin 조정 - 임시 로고 이미지 저장 - 로고 크기 및 마진 조정 * feat: 로그인 API Service 작성 및 Retrofit 객체 생성 * feat: 로그인 DataSource 작성 * feat: 로그인 Repository 생성 * feat: 사용자 정보를 저장하는 SharedPreferences Manager 생성 - 토큰 값 불러오기 및 저장 - 추후 사용자 닉네임, 사용자 프로필 이미지 등의 정보 저장 가능 * feat: Application 생성 및 사용자 정보 Preferences Manager 캐싱 * ui: Splash Screen 화면 구성을 위한 테마 생성 * feat: Preferences 로부터 사용자 토큰 값을 가져와 헤더에 추가하도록 변경 * refactor: Repository 네이밍 통일 * refactor: DataSource 기본 인자 추가 * feat: LoginViewModel 및 Handler 작성 * feat: LoginViewModel 을 생성하는 ViewModel Factory 작성 * feat: LoginActivity 작성 및 양방향 데이터 바인딩 적용 * feat: StaccatoApplication과 LoginActivity 설정 및 LoginActivity를 시작 화면으로 변경 * style: 불필요한 namespace 제거 및 lint 확인 * refactor: LoginViewModel과 Factory를 viewmodel 패키지로 분리 * refactor: TimelineViewModel과 Factory를 viewmodel 패키지로 분리 * style: ktlint 적용 * fix: 불필요한 ConverterFactory 제거 - 더 이상 사용하지 않는 text/plain 변환용 ScalarsConverterFactory 제거 * feat: 닉네임 로그인 요청 및 응답에 대한 DTO 작성 * refactor: 로그인 요청, 응답 시 DTO 활용 * fix: 토큰 값을 불러오고 및 저장하는 동작의 비동기 처리 및 화면 전환 개선 * refactor: 토큰 값을 캐싱하여 저장하는 TokenManager 생성 및 적용 - 매번 runBlocking을 통해 Preference에 저장된 토큰 값을 불러오는 것은 네트워크 성능을 저하시킨다. - 따라서, token 값을 캐싱하여 저장하는 TokenManager를 활용한다. - 첫 네트워크 요청 시에만 토큰을 불러오는 작업을 동기적으로 처리하기 위해 Main Thread가 Blocking 된다. - TokenManager가 Preference로부터 가져온 토큰을 캐싱하여 저장한다. - 이후 요청부터는 캐시된 토큰을 가져오므로 Main Thread가 Blocking 되지 않는다. * style: ktlint 적용 * feat: Night 모드 비활성화 * refactor: 여행 기간 날짜 형식 변환을 BindingAdapter에서 수행 - TimelineTravelUiModel 프로퍼티 수정 - UiModel의 여행기간 날짜를 LocalDate로 갖도록 통일 - 추후 날짜 관련 UI가 변경되었을 때 확장성 고려 - BindingAdapters에 날짜 형식 변환해주는 메서드 작성 * chore: 주석 처리된 Log 코드 삭제 * style: xml View의 ID 네이밍 컨벤션 적용 * ui: 앱 심볼 로고 추가 및 스플래시 스크린에 적용 * feat: 방문 상세 생성 API 연결 * ui: 배경 색을 흰 색으로 지정 * feat: 키보드 활성화 상태에서 화면 터치 시 키보드를 내리는 기능 추가 * style: ktlint 적용 * feat: 방문 상세 수정, 삭제 API 연결 * feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용 * fix: merge 과정에서 발생한 id값 네이밍 충돌 해결 * build: 앱 version code와 version name 수정 * feat: 방문 기록 생성 화면 사진 다중 선택 구현 * feat: 방문 기록 생성 이미지 업로드 구현 * feat: 스플래시 스크린 시간 조정 및 데모 시연용 토큰 활성화 * fix: 동일한 사진이 여러 장 업로드되는 버그 수정 * feat: 기존 로그인 기능으로 롤백 --------- Co-authored-by: somin * fix: 테스트 배포를 위한 버그 수정 #198 (#219) * style: formatting * fix: 무한 로딩 오류 수정 * fix: 여행 생성 오류 수정 * add: 앱 아이콘 변경 * ui: timeline empty view 추가 * feat: timeline empty view 가시성 설정 * ui: 여행 내 방문 기록 empty view 추가 및 가시성 설정 * ui: 방문 기록 내 로그 미지원 기능 view 추가 * feat: 사진 첨부 카메라 미지원 기능 알림 추가 * ui: 필수값 표기 style 정의 * ui: 여행 생성 및 수정 필수값 표기 추가 * ui: 방문 기록 생성 및 수정 필수값 표기 추가 * feat: 생성, 수정, 로그인 시 다중 요청 전송을 막기 위한 화면 터치 제한 * feat: 장소 생성의 사진 첨부 리사이클러뷰 구현 - 사진 추가 & 삭제 구현 - GridLayout으로 변경 - 사진 중복 없이 최대 5장으로 제한 - 새로 추가된 사진이 기존 사진 뒤에 더해지도록 구현 * chore: 방문 생성 화면 rv_photo_attach로 xml id 수정 * ui: app icon 및 splash icon 변경 * refactor: xml ID 네이밍 컨벤션 적용 --------- Co-authored-by: somin Co-authored-by: Junyoung-WON * refactor: 도메인명 변경에 따라 travel을 memory로 수정 #217 (#231) * refactor: 패키지명 travel -> memory로 수정 * refactor: dto의 TravelMapper 를 MemoryMapper 로 네이밍 변경 * refactor: 여행(현 추억) 생성 response dto 네이밍 변경 - TravelCreationResponse -> MemoryCreationResponse * refactor: 여행(현 추억) request dto 네이밍 변경 - TravelRequest -> MemoryRequest * refactor: 여행(현 추억) 조회 response dto 네이밍 변경 - TravelResponse -> MemoryResponse * refactor: 여행(현 추억) 수정 request dto 네이밍 변경 - TravelUpdateRequest -> MemoryUpdateRequest * refactor: 여행(현 추억) 내 방문 dto 네이밍 변경 - TravelVisitDto -> MemoryVisitDto * refactor: 타임라인 여행(현 추억) item의 dto 네이밍 변경 - TimelineTravelDto -> TimelineMemoryDto * refactor: 여행(현 추억) ApiService 네이밍 변경 - TravelApiService -> MemoryApiService * refactor: 여행(현 추억) DataSource 네이밍 변경 - TravelDataSource -> MemoryDataSource - TravelRemoteDataSource -> MemoryRemoteDataSource * refactor: 여행(현 추억) Repository 네이밍 변경 - TravelRepository -> MemoryRepository - TravelDefaultRepository -> MemoryDefaultRepository * style: TimelineMapper import 재정렬 * refactor: NewTravel 도메인명을 NewMemory로 변경 * refactor: Travel 도메인명을 Memory로 변경 * refactor: TravelVisit 도메인명을 MemoryVisit으로 변경 * refactor: presentation의 TravelMapper 명 변경 - TravelMapper -> MemoryMapper * refactor: 여행(현 추억) ui 모델명 변경 - TravelUiModel -> MemoryUiModel - TravelVisitUiModel -> MemoryVisitUiModel * refactor: 여행(현 추억) view model 명 변경 - TravelViewModel -> MemoryViewModel - TravelViewModelFactory -> MemoryViewModelFactory * refactor: MemoryApiService의 Path 변경 - travel을 memory로 변경 - travels을 memories로 변경 * refactor: Memory 관련 dto 변수명 변경 - travel을 memory로 변경 * refactor: Timeline Dto의 Memory 관련 변수명 변경 - travel을 memory로 변경 - travels를 memories로 변경 * refactor: Memory 관련 도메인 모델의 변수명 변경 - travel을 memory로 변경 * refactor: Memory 관련 ui 모델의 변수명 변경 - travel을 memory로 변경 * refactor: data layer의 Memory 관련 함수 및 변수명 변경 - travel을 memory로 변경 * refactor: 방문 생성 request dto의 travelId 변수명 변경 - travelId -> memoryId * refactor: 여행(현 추억) 조회 view model 및 fragment의 네이밍 변경 - travel -> memory * refactor: fragment_travel 의 리소스 네이밍 변경 - travel -> memory - strings.xml의 리소스명 변경 * refactor: TravelCreationActivity 네이밍 변경 - TravelCreationActivity -> MemoryCreationActivity * refactor: 여행(현 추억) 생성의 ViewModel 관련 네이밍 변경 - TravelCreationViewModel -> MemoryCreationViewModel - TravelCreationViewModelFactory -> MemoryCreationViewModelFactory - 관련 함수 및 변수명 변경 - travel -> memory * refactor: 여행(현 추억) 생성, 수정에 관한 xml 리소스 명 변경 - travel -> memory - strings.xml 의 관련 리소스 수정 * refactor: 여행(현 추억) 수정 Activity, Handler 의 네이밍 변경 - travel -> memory * refactor: 여행(현 추억) 수정 ViewModel 의 네이밍 변경 - 관련 함수 및 변수 명 변경 - travel -> memory - Factory 클래스명 변경 * refactor: 여행(현 추억) 생성, 수정에서의 파일 변환 메서드명 변경 - travel -> memory - 자식 파일 명 상수화 * refactor: Timeline 의 UI 모델 및 Travel ID Key 의 리네이밍 - travel -> memory 로 일괄 변경 * refactor: presentation/timeline 내 travel 도메인명 변경 - travel -> memory - TimelineMapper 내 domain model -> ui model 변환 메서드명 변경 * refactor: dto/MemoryMapper 내 domain 변환 메서드명 변경 - dto/MemoryMapper 내 domain model을 dto로 변환하는 메서드명 변경 - travel -> memory * refactor: dummyTravel 을 dummyMemory 로 변경 * refactor: MainActivity 내 travel을 memory로 변경 * refactor: activity_main 내 travel을 memory로 변경 * refactor: TimeLineApiService 내 GET 메서드 path 수정 - travels -> memories * refactor: MemoryFragment 내 travel 을 memory 로 변경 - MemoryFragment, fragment_memory 내 travel 을 memory 로 변경 * refactor: MemoryViewModel 내 error message 변수명 변경 - TRAVEL_ERROR_MESSAGE -> MEMORY_ERROR_MESSAGE * refactor: navigation graph 내 travel을 memory로 변경 * refactor: VisitUpdateActivity 내 extra 키 값 수정 - TRAVEL_ID_KEY -> MEMORY_ID_KEY - TRAVEL_TITLE_KEY -> MEMORY_TITLE_KEY * refactor: VisitFragment 내 travel을 memory로 변경 * refactor: VisitUpdateActivity 내 travel을 memory로 변경 * refactor: VisitUpdateViewModel 내 travel을 memory로 변경 * refactor: VisitTravelUiModel을 VisitMemoryUiModel로 변경 * refactor: 방문 수정 xml의 travel을 memory로 변경 * refactor: 여행(현 추억) 선택 xml 내 travel을 memory로 변경 * refactor: 여행 선택 바텀 시트 내 travel을 memory로 변경 - TravelSelectionFragment -> MemorySelectionFragment 로 수정 - TravelSelectionHandler -> MemorySelectionHandler 로 수정 - TravelSelectionFragment 내 메서드명 수정 - TravelSelectionHandler 내 매개변수명 수정 * refactor: VisitRepository와 구현체의 메서드 내 매개변수명 통일 * refactor: VisitsViewHolder 내 travel을 memory로 변경 * refactor: VisitCreationActivity 내 travel을 memory로 변경 * refactor: VisitCreationViewModel 내 travel을 memory로 변경 * refactor: 방문 생성 xml 내 travel을 memory로 변경 * refactor: BindingAdapters 내 travel을 memory로 변경 * refactor: strings 내 travel을 memory로 변경 - strings 내 '여행'을 '추억'으로 수정 Co-authored-by: Junyoung-WON Co-authored-by: s6m1n * refactor: visit, visit log 도메인명 수정 #218 (#237) * refactor: VisitApiService 내 visit을 moment 로 변경 - 파일명 수정 - path 수정 - 메서드명 수정 - 매개변수명 수정 * refactor: data/visit 패키지명을 moment로 변경 * refactor: data/dto/visit 패키지명을 moment로 변경 * refactor: VisitCreationRequest 네이밍 변경 - 이전: VisitCreationRequest - 이후: MomentCreationRequest * style: StaccatoClient import 재정렬 * refactor: VisitCreationResponse 네이밍 변경 - 이전: VisitCreationResponse - 이후: MomentCreationResponse - 필드명 변경 : visitId -> momentId * refactor: VisitResponse 네이밍 변경 - 이전: VisitResponse - 이후: MomentResponse - VisitResponse 필드 내 visit을 moment로 변경 - VisitResponse 필드 내 visitLogs SerialName을 comments로 변경 * refactor: VisitUpdateRequest 네이밍 변경 - 이전: VisitUpdateRequest - 이후: MomentUpdateRequest - VisitUpdateRequest 필드 내 visit을 moment로 변경 * refactor: VisitLogDto 내 SerialName 변경 - visitLogId를 commentId로 변경 * refactor: MemoryResponse 내 visits SerialName 변경 - visits를 moments로 변경 * refactor: VisitCreationViewModel 내 FORM_DATA_NAME 변경 - 이전: visitImageFiles - 이후: momentImageFiles * refactor: MemoryVisitDto 내 visit를 moment로 변경 - MemoryVisitDto -> MemoryMomentDto로 변경 - visitId -> momentId로 변경 - visitImageUrl -> momentImageUrl로 변경 * refactor: VisitRemoteDataSource 내 visit을 moment로 변경 - VisitRemoteDataSource -> MomentRemoteDataSource로 변경 - 메서드명 변경 - 매개변수명 변경 * refactor: MomentRepository 및 구현체 내 visit을 moment로 변경 - VisitRepository -> MomentRepository로 변경 - VisitDefaultRepository -> MomentDefaultRepository로 변경 - 메서드명 변경 - 매개변수명 변경 * refactor: Visit 도메인 모델명 및 변수명 변경 - Visit -> Moment로 변경 - visitLogs -> comments로 변경 * refactor: Memory 도에인 모델의 visits을 moments로 변경 * refactor: MemoryVisit 도메인 모델 내 visit을 moment로 변경 * refactor: MemoryResponse의 visits 필드명을 moments로 변경 * refactor: dto/mapper/VisitMapper를 MomentMapper로 변경 * refactor: presentation/visit 패키지명을 moment로 변경 * refactor: VisitViewHolderType 네이밍 변경 - VisitViewHolderType -> MomentViewHolderType - enum 상수명 변경 - VISIT_DEFAULT -> MOMENT_DEFAULT - MY_VISIT_LOG -> MY_COMMENTS * refactor: VisitViewHolder 네이밍 변경 - VisitViewHolder -> MomentViewHolder - VisitDefaultViewHolder -> MomentDefaultViewHolder - MyVisitLogViewHolder -> MyCommentViewHolder * refactor: VisitAdapter 내 visit을 moment로 변경 - VisitAdapter -> MomentAdapter 로 변경 - visit -> moment 로 변경 * refactor: MomentAdapter 내 visit log를 comments로 변경 * refactor: VisitDetailUiModel 내 visit을 moment로 변경 - VisitDetailUiModel -> MomentDetailUiModel - VisitDefaultUiModel -> MomentDefaultUiModel - visitImageUrls -> momentImageUrls * refactor: VisitLogUiModel을 CommentsUiModel로 변경 * refactor: VISIT_ID_KEY extra key id 네이밍 변경 - VISIT_ID_KEY -> MOMENT_ID_KEY * refactor: VisitFragment 내 visit을 moment로 변경 * refactor: VisitViewModel 내 visit을 moment로 변경 - VisitViewModel -> MomentViewModel로 변경 - VisitViewModelFactory -> MomentViewModelFactory로 변경 * refactor: VisitMemoryUiModel 네이밍 변경 - VisitMemoryUiModel -> MomentMemoryUiModel로 변경 * refactor: presentation/visitcreation 패키지명 momentcreation으로 변경 * refactor: VisitCreationActivity 내 visit을 moment로 변경 - VisitCreationActivity -> MomentCreationActivity로 변경 * refactor: VisitCreationHandler 네이밍 변경 - VisitCreationHandler -> MomentCreationHandler로 변경 * refactor: VisitCreationViewModel 내 visit을 moment로 변경 - VisitCreationViewModel -> MomentCreationViewModel로 변경 - 메서드 및 변수명 변경 * refactor: 여행 -> 추억, 방문 기록 -> 스타카토로 도메인명 변경 * feat: s3 api 연결 #239 (#241) * feat: ImageResponse, ImageApiService 구현 * feat: ImageRepository 및 구현체 구현 Co-authored-by: s6m1n * fix: 추억 기능 버그 수정 #246 (#252) * fix: 일부 EditText 개행 불가 처리 및 키보드 숨김 처리 #247 (#249) * ui: 닉네임과 추억 생성, 수정 제목 입력 시 줄바꿈 제한 * fix: 키보드 활성화 상태에서 빈 화면 터치로 키보드 숨김 처리 - 메서드 명 변경: setHideKeyboardAction -> setHidingKeyboardAction * style: 클래스 내 override 메서드의 순서 변경 - 팀 코드 컨벤션에 맞게 순서 재정렬 - override 메서드를 상단에 둔다. * style: ktlint 적용 * fix: root뷰 터치 시 클릭 이벤트가 발생하지 않는 오류 수정 - 원인 분석: ConstraintLayout 내부 Toolbar 및 ScrollView, 그리고 그 자식 View들이 클릭 이벤트를 가로채기 때문에, 바인딩 된 최상단 root 뷰인 ConstraintLayout의 클릭 이벤트가 동작하지 않는다. - 해결 방법: 여러 클릭 이벤트를 가로채는 dispatchTouchEvent 메서드를 오버라이드하여, 터치된 부분이 현재 포커스가 되지 않은 View(키보드 바깥 화면) 범위라면, 키보드를 숨기는 동작을 추가하였다. * refactor: 키보드 숨김 동작을 handler 바인딩으로 적용 - LoginHandler 에 화면 터치에 대한 동작을 추가, 화면 터치 시 키보드를 숨김 처리하는 동작을 바인딩으로 설정 - InputMethodManager 인스턴스를 지연초기화하여 저장 * refactor: InputMethodManager 인스턴스를 lazy로 지연 초기화 * fix: 닉네임, 제목 입력 칸의 키보드 액션 버튼 변경 - 키보드의 액션 타입을 Search에서 Done으로 변경 * style: ktlint 적용 * refactor: 타임라인 리팩터링 #232 (#263) * refactor: TimelineViewModelFactory의 생성자 파라미터 추가 - 내부 프로퍼티에 속해있던 TimelineRepository를 생성자 프로퍼티로 변경 * fix: 추억 목록 아이템이 하나일 때의 View 수정 - 아이템 개수가 하나일 때는 타임라인의 선이 나타나지 않도록 변경 * chore: 코루틴 예외 처리 로그에context 출력 * refactor: 메서드 분리 및 순서 재정렬 - 코드 컨벤션: override 메서드는 상단에 위치한다 * refactor: TimelineViewModel 생성 팩토리 메서드 활용 * style: ktlint 적용 * ui: 화면 전환에 사용될 twin animation 효과 생성 * ui: animation 효과 활용하여 화면 전환 애니메이션 적용 * ui: Main 화면의 배경 색을 하얀색(#FFFFFF)으로 지정 * style: ktlint 적용 * feat: 기분 선택 기능 구현 및 스타카토 조회 화면 구조 변경 #191 (#289) * feat: 기분 수정 요청을 보내는 Request Dto 작성 * feat: MomentApiService 에 기분 수정 요청에 대한 API 작성 * feat: 기분 수정 요청에 대한 DataSource 메서드 작성 * feat: 기분 도메인 모델 생성 * feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성 * ui: 기분 아이콘 이미지 리소스 추가 * ui: 기분 아이콘의 테두리를 selector로 생성 - 선택/미선택에 따라 다른 ui를 나타낸다 * ui: 기분 아이콘에 사용할 style 지정 * fix: API 변경에 따라 DTO 및 Mapper 변경 - 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경 * fix: 순간 DTO에 기분 필드 추가 - 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정 * feat: 기분 선택 api에 필요한 repository 메서드 작성 * feat: 기분 uiModel 생성 * feat: 댓글에 대한 UI 모델 생성 * feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성 * feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성 * feat: 댓글 화면 구성 및 Adapter, Fragment 작성 * feat: 순간(현 스타카토)의 Ui Model Mapper 변경 MomentDetailUiModel.CommentsUiModel -> CommentUiModel MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel Feeling을 Ui Model로 변환하는 Mapper 추가 * feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성 * feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성 * fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정 * fix: 누락된 ViewModel 데이터 바인딩 설정 * feat: 순간 조회 화면 재구성 * refactor: 네비게이션 action 및 id 네이밍 수정 visit -> moment로 수정 * refactor: 방문 -> 순간 으로 키워드 변경 * refactor: 불필요한 클래스 및 xml 파일 제거 * style: ktlint 적용 * feat: 추억 API 변경사항 반영 및 리팩터링 #259 (#265) * ui: 추억 생성 화면 사진 로드 시 coil 라이브러리 사용 * ui: 삭제 버튼 아이콘 추가 * ui: 추억 생성 화면 사진 삭제 버튼 추가 * feat: 추억 생성 view model의 imageUri 설정 매개변수 타입 변경 * feat: 추억 생성 화면 사진 삭제 구현 * feat: 추억 수정 화면 사진 첨부 icon 가시성 설정 * ui: 추억 수정 화면 사진 삭제 버튼 추가 * feat: 추억 수정 화면 사진 삭제 버튼 가시성 설정 * feat: 추억 수정 view model의 imageUri 설정 매개변수 타입 변경 * feat: 추억 수정 화면 사진 삭제 구현 * fix: 추억 생성 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정 * fix: 추억 수정 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정 * feat: MemoryRequest dto에 썸네일 사진 url 필드 추가 * feat: 추억 생성 메서드의 시그니처 변경 - MemoryApiService 내 추억 생성 메서드의 시그니처 변경 - 위 변경에 따른 DataSource, Repository, ViewModel의 추억 생성 관련 메서드 시그니처 변경 * feat: 추억 생성 view model 주 생성자로 ImageRepository 주입 * feat: 추억 생성 화면의 썸네일 사진 저장 기능 구현 * feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 생성 화면) - 추억 생성 화면에서 서버에 저장된 사진을 로드하는 기능 구현 - UI에 불러온 사진을 표시하는 로직 수정 * feat: 추억 생성 시 썸네일 사진 url 추가 * refactor: MemoryRequest의 추억 썸네일 사진 기본 인자 값 null로 설정 * feat: 추억 수정 메서드의 시그니처 변경 * feat: 추억 수정 view model 주 생성자로 ImageRepository 주입 * feat: 추억 수정 화면의 썸네일 사진 저장 기능 구현 * feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 수정 화면) - 추억 수정 화면에서 서버에 저장된 사진을 로드하는 기능 구현 - UI에 불러온 사진을 표시하는 로직 수정 * feat: 추억 수정 시 썸네일 사진 url 추가 * refactor: 불필요한 MemoryUpdateRequest 제거 * ui: empty view 캐릭터 이미지 추가 * ui: 추억 설명글 유무에 따른 가시성 설정 * ui: 함께 한 사람들 가시성 gone 으로 설정 - 4차 스프린트 범위에서 제외됨 * feat: 이미지 선택 옵션 추가 (단일 선택 및 다중 선택 지원) * ui: TextInputLayout, TextInputEditText Style 정의 * ui: 추억 생성 화면 입력란 TextInputLayout으로 변경 - counter 속성 사용을 위해 TextInputLayout으로 변경함 * ui: 추억 수정 화면 입력란 TextInputLayout으로 변경 - counter 속성 사용을 위해 TextInputLayout으로 변경함 * ui: 추억 조회 화면 썸네일 사진 유무에 따른 가시성 설정 * ui: empty view 캐릭터 이미지 크기 변경 * ui: 앱 이름 Staccato_AN -> Staccato 로 수정 * refactor: 추억 생성 및 수정 화면 메서드 순서 정리 * ui: 제목용 TextInputEditTextStyle 정의 및 적용 * ui: 추억 생성 및 수정 화면 썸네일 coilPlaceHolder 변경 - 이전: shape_place_holder_rectangle - 이후: shape_all_gray1_8dp * refactor: 삭제 다이얼로그 show 메서드 호출 방식 변경 - apply를 사용하지 않는 방식으로 변경 * ui: 코멘트 미지원 안내 view 추가 * feat: 스타카토 생성, 수정 화면 사진 및 완료 버튼 개선 #242 (#291) * feat: (스타카토 생성 화면) 사진 드래그로 순서 변경 기능 구현 * refactor: data 패키지에 S3 이미지 API 분리 적용 * refactor: AttachedPhotoUiModel 및 프로그래스바 추가 * feat: recyclerView에서 지워진 사진의 job cancel 처리 * refactor: editText를 TextInputLayout로 수정 * feat: (스타카토 수정 화면) 사진 드래그로 순서 변경 / 로딩 구현 * refactor: 프로퍼티 네임 변경 및 visitedAt LocalDateTime으로 수정 * style: ktlint 적용 * build: 구글 맵 API 사용에 따른 CI 수정 #296 (#297) * build: 구글 맵 api key를 저장하는 파일을 설정하는 명령어 작성 * refactor: defaults 에 설정된 shell 설정에 따라 추가적인 shell 설정 삭제 * feat: Google Map 연결, 스타카토 목록 조회 API 연결 #54 (#295) * build: google map 의존성 추가 * build: 구글맵 관련 properties ignore 추가 * build: 구글맵 api key 설정 * feat: Google Map 연결 * feat: MainActivity Handler 구현 * ui: 추억 및 스타카토 생성 메뉴 추가 * ui: popup menu style 정의 * feat: 추억 생성 및 수정 menu 연결 - handler 연결 - 메서드 분리 * feat: 위치 권한 요청 구현 - ACCESS_FINE_LOCATION 권한 요청 - ACCESS_COARSE_LOCATION 권한 요청 * feat: 현 위치 표시 * style: MainActivity formatting * feat: locationPermissions 타입 변경 - 이전: List - 이후: Array * feat: MomentLocationDto, MomentLocationResponse 추가 * feat: 스타카토 목록 조회 api service 구현 * feat: 스타카토 목록 조회 data source 구현 * feat: MomentLocation 도메인 모델 구현 * feat: MomentLocationDto를 도메인 모델로 변환하는 mapper 구현 * feat: 스타카토 목록 조회 repository 구현 * feat: 스타카토 목록 조회 view model 구현 * feat: 스타카토 목록을 marker로 표시 * refactor: home 패키지명을 maps로 변경 * feat: 마커 클릭 시 스타카토 상세로 이동 기능 구현 * feat: 스타카토 조회 추억 id, 제목 필드 추가 * feat: 마지막 위치 위경도 찾기 * refactor: 안드로이드 1차 QA 반영 #299 (#301) * refactor: 안드로이드 1차 QA 반영 * refactor: 안드로이드 1차 QA 반영2 * refactor: 안드로이드 1차 QA 반영3 * refactor: 삭제 메시지 변경 * fix: 스타카토 조회 화면 스택 관리 및 ui 수정 #304 (#306) * feat: 지도 화면에서 스타카토 조회 화면으로 이동 시 스택 관리 * feat: 타임라인 화면에서 추억이 존재하지 않을 때 추억 생성 버튼 추가 * ui: 스타카토 조회 화면 툴바 위치 고정 * build: Android CD 적용 #300 (#308) * build: CD 워크플로우 yml 파일 작성 * build: keystore 접근을 위한 build.gradle.kts 파일 설정 * build: 기존 apk 추출 ci 파일 수정 - demo 버전의 apk를 추출 및 배포하는 목적에 맞게 파일 명 수정 - apk 빌드 후 테스트를 수행하는 job 추가 - firebase 앱 배포에 아티팩트 업로드하는 job 추가 * fix: ci 파일에도 keystore 생성 job 추가 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 수정 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정 * fix: ci 파일에 키스토어 관련 설정 적용 * fix: 키스토어 관련 명령어 일부 수정 * fix: build.gradle.kts 불필요한 괄호 제거 * fix: keystore.properties 로 부터 프로퍼티를 가져오는 형식 변경 * fix: upload-artifact step에서 빌드 파일의 upload 경로 수정 (#316) upload-artifact 는 defaults 설정의 working-directory 경로가 적용되지 않음 * fix: android cd 재수정 (2차) #317 (#319) * fix: upload-artifact 빌드 파일의 upload 경로 3차 수정 * fix: 배포 시 빌드 파일의 경로 수정 * fix: 빌드 파일의 upload 경로 수정 및 파일이 없는 경우 에러 처리 * fix: 빌드 파일의 upload 경로 4차 수정 * fix: 빌드 파일의 upload 경로 5차 수정 * fix: 빌드 파일의 upload 경로 6차 수정 - 디렉터리 경로 생성 후 upload 실행 * fix: 빌드 파일의 upload 경로 7차 수정 github의 workspace 환경변수(절대경로) 활용 * fix: clean test 제거 및 디버그용 파일 경로 탐색 명령어 추가 * fix: 디버그용 파일 경로 검색 명령어 수정 * fix: 디버그용 파일 경로 검색 명령어 삭제 * fix: 디버그용 파일 검색 명령어 삭제 및 업로드 파일 경로명 수정 * feat: 스타카토 생성 시 현 위치의 주소를 가져오는 기능 구현 #314 (#324) * feat: MainActivity에서 주소를 가져오는 로직 삭제 * feat: 스타카토 생성 시 현 위치의 주소를 가져오는 로직 구현 * refactor: 메서드 순서 정렬 * refactor: 스타카토 조회 화면 ViewPager2 적용 및 UI 아이콘 개선 #318 (#320) * refactor: 아이콘 추가 및 UI 개선 * feat: 스타카토 상세 사진 Viewpager 적용 * feat: 스타카토 상세 사진 Viewpager에 dot indicator 추가 * style: ktLint Format * feat: 메인 지도 화면에서 스타카토 생성하는 플로우 구현 #321 (#327) * feat: 날짜로 추억 목록 불러오는 getMemories API 추가 * feat: 메인에서 스타카토 생성 시 추억 목록 선택 가능 * feat: 스타카토 생성 시 역지오코딩과 추억 선택 연동 * build: debug와 release로 buildTypes 분리 (#329) - appName, appId, baseUrl 분리 - release에 난독화 적용 * build: debug 와 release 배포 분기에 따른 CD 수정 - CD에 대한 트리거 재설정 : main 브랜치에 대한 push 및 pr * fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 #326 (#330) * refactor: 지도 화면 onResume에서 스타카토 목록 load * refactor: 스타카토 목록 로드 메서드명 변경 - 이전: loadMoments - 이후: loadStaccatos * feat: 공유 view model에 스타카토 목록 업데이트 상태 추가 * fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 * feat: 지도 로드 시 현위치로 이동하도록 구현 * build: ci 및 cd 파일 수정 ci - 불필요한 gradle 빌드 및 테스트 제거 cd - 타겟 브랜치 develop 제거 * feat: 댓글 조회, 생성, 삭제 기능 구현 #290 (#331) * feat: 기분 수정 요청을 보내는 Request Dto 작성 * feat: MomentApiService 에 기분 수정 요청에 대한 API 작성 * feat: 기분 수정 요청에 대한 DataSource 메서드 작성 * feat: 기분 도메인 모델 생성 * feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성 * ui: 기분 아이콘 이미지 리소스 추가 * ui: 기분 아이콘의 테두리를 selector로 생성 - 선택/미선택에 따라 다른 ui를 나타낸다 * ui: 기분 아이콘에 사용할 style 지정 * fix: API 변경에 따라 DTO 및 Mapper 변경 - 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경 * fix: 순간 DTO에 기분 필드 추가 - 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정 * feat: 기분 선택 api에 필요한 repository 메서드 작성 * feat: 기분 uiModel 생성 * feat: 댓글에 대한 UI 모델 생성 * feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성 * feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성 * feat: 댓글 화면 구성 및 Adapter, Fragment 작성 * feat: 순간(현 스타카토)의 Ui Model Mapper 변경 MomentDetailUiModel.CommentsUiModel -> CommentUiModel MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel Feeling을 Ui Model로 변환하는 Mapper 추가 * feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성 * feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성 * fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정 * fix: 누락된 ViewModel 데이터 바인딩 설정 * feat: 순간 조회 화면 재구성 * refactor: 네비게이션 action 및 id 네이밍 수정 visit -> moment로 수정 * refactor: 방문 -> 순간 으로 키워드 변경 * refactor: 불필요한 클래스 및 xml 파일 제거 * ui: xml 컨벤션에 맞추어진 타 사용자의 댓글 ui 구성 * feat: 댓글 API의 DTO 작성 * feat: 댓글 API Service 작성 * feat: 댓글 CRUD DataSource 작성 * refactor: CommentApiService 각 메서드의 반환 값을 Response로 변경 * feat: CommentApiService 를 create * feat: CommentDataSource 구현체 생성 * refactor: 댓글 Dto 클래스 네이밍 변경 - VisitLogDto -> CommentDto * refactor: CommentDto 의 ID 프로퍼티 네이밍 변경 - visitLogId -> commentId * refactor: VisitLog 도메인 모델 클래스의 네이밍 변경 - VisitLog -> Comment * refactor: Comment 도메인 모델의 ID 프로퍼티 네이밍 변경 - visitLogId -> commentId * feat: 새로운 댓글 도메인 모델 생성 * feat: CommentRepository 작성 * feat: Domain 모델과 DTO 모델을 변환해주는 Mapper 작성 - CommentDto를 Comment로 변환하는 메서드를 CommentMapper.kt로 이동 * feat: CommentRepository의 기본 구현체 작성 * feat: 댓글 ViewModel, Factory 작성 및 Comment 불러오기 구현 * ui: ViewModel 데이터바인딩 및 빈 댓글 문구에 대한 strings 설정 * feat: CommentsViewModel 활용 및 옵저빙 * feat: 댓글 조회, 생성, 삭제 기능 구현 * chore: ktlint 적용 * feat: 추억 생성 및 수정 이미지 로딩 중 표시 및 저장 버튼 비활성화 #332 (#334) * feat: 추억 생성 이미지 로딩 중 표시 * feat: 추억 수정 이미지 로딩 중 표시 * feat: 추억 생성 및 수정 이미지 로딩 중 저장 버튼 비활성화 * style: formatting * refactor: 댓글 화면 개선 및 리팩터링 #333 (#335) * fix: merge conflicts 해결 * fix: 글자 수 제한 500자로 수정 * style: ktlint 체크 * build: CD 수정 - 구글 플레이스토어 업로드 스텝 추가 * build: defaultConfig의 버전 코드와 이름 수정 versionCode : 2 -> 3 versionName : 1.1 -> 1.0.0 (배포 버전과 동일) --------- Co-authored-by: hxeyexn Co-authored-by: s6m1n * deploy: v1.0.1 (#356) * build: 프로젝트 생성 및 의존성 추가 * chore: 사용자 기능 및 권한 추가 * chore: gitignore 재설정 * chore: gitigonre .idea/ 추가 * build: develop-an 브랜치의 CI 설정 #3 (#10) * build: android-ci.yml 파일 생성 * chore: 오타 및 개행 수정 * chore: working-directory 수정 * build: ktLint 적용 및 format * ui: 디자인 시스템 구현 #11 (#44) * ui: color 정의 * ui: shape, selector 추가 * ui: icon 추가 * ui: font family 추가 - pretendard regular, medium, semibold, bold 추가 * ui: typography 정의 * ui: strings 정의 * ui: bottom sheet drag handle drawable 추가 * ui: styles 정의 * ui: detail toolbar 구현 - 상세 화면에서 사용 * ui: dialog, bottom sheet 구현 - 여행 및 방문 기록 삭제 dialog - 사진 등록 bottom sheet * ui: 사진 첨부 layout 구현 * feat: 삭제 다이얼로그, 사진 첨부 바텀 시트 fragment 추가 * ui: 세로모드로 고정 * build: data binding 의존성 추가 * style: strings resource 순서 정렬 * style: formatting * ui: plus icon 추가 * feat: jetpack navigation 및 바텀시트 프래그먼트 추가 #12 (#15) * build: androidx.navigation 및 dataBinding 의존성 추가 * feat: Binding 화면 클래스 및 bottomSheetNavigation 추가 * feat: TimelineFragment 임시 화면 추가 * feat: TravelFragment 임시 화면 추가 * feat: TravelCreationFragment 임시 화면 추가 * feat: VisitFragment 임시 화면 추가 * feat: VisitCreationFragment 임시 화면 추가 * feat: (여행, 방문 기록) 수정 화면 추가 * feat: (여행, 방문 기록) 생성 화면 이동 구현 * feat: BottomSheetController 설정 및 Navigation 이동 구현 * feat: 뒤로가기 버튼 클릭 시 BottomSheet, Toast 작동 구현 * feat: 여행, 방문 기록 생성을 위한 액티비티 추가 및 이동 구현 * feat: 여행, 방문 기록 수정을 위한 액티비티 추가 및 이동 구현 * build: 중복된 dataBinding 제거 * feat: 공통 이미지 로딩 BindingAdapter 설정 #33 (#41) * build: dataBinding 사용 설정 * feat: 이미지 로딩 바인딩 어댑터 설정 - Glide, Coil 바인딩 어댑터를 각각 작성 - placeholder 설정 * style: ktlint check - import 순서 조정 * fix: attribute 개수에 맞추어 BindingAdapter의 value 재설정 * style: 마지막 줄 개행 추가 * feat: placeHolder를 필수 속성으로 변경 및 coil 이미지 로딩 코드 수정 - placeHolder를 ImageView의 필수 속성으로 지정 - Coil BindingAdapter에서 url이 null인 경우에도 이미지를 로드하는 동작이 수행되도록 수정 * ui: 상단바 색상 변경 * build: develop-an의 CI 설정 수정 #38 (#39) - Git Action에 Secret으로 저장된 LOCAL_PROPERTIES_API_KEY를 변수로 가져온다. - 가져온 변수를 echo를 활용하여 local.properties에 설정한다. * build: develop-an 브랜치의 CI 파일 문법 오류 수정 #45 (#46) * fix: android-ci.yml 파일의 명령어 수정 LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: android-ci.yml 파일의 명령어 수정 #47 (#48) LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: 파이프라인 제거하여 명령어 수정 * fix: develop-an 브랜치의 CI 파일 명령어 재수정 #47 (#49) * fix: android-ci.yml 파일의 명령어 수정 LOCAL_PROPERTIES_API_KEY에 접근하는 명령어 수정 * fix: 파이프라인 제거하여 명령어 수정 --------- Co-authored-by: Somin Lee <46596035+s6m1n@users.noreply.github.com> * fix: 문자열 임을 명시하고 환경변수 설정 위치 조정 * fix: local.properties 생성 시점 수정 * feat: 데이터 패키지 설정 #13 (#35) * build: 서버 base url의 local.properties 사용 설정 및 BuildConfig 설정 * feat: Retrofit Client 작성 * fix: Merge Conflict 해결 - build.gradle.kts(project, app)의 ktlint 의존성 충돌 해결 - 버전 카탈로그 플러그인 충돌 해결 * feat: DTO 클래스 작성 * style: ktlint check - 불필요한 import 제거 - 개행 조정 - 콤마 추가 * feat: SerialName 어노테이션의 값을 camelCase로 수정 * refactor: DTO 클래스의 이름 수정 - API 요청으로 직접 보내거나 들어오는 JSON의 경우 DTO 클래스명 뒤에 Request/Response 를 붙이도록 설정 - JSON 안에 속성 값으로 들어가는 JSON은 DTO 클래스명 뒤에 Dto를 붙이도록 설정 * feat: 누락된 Dto 클래스 추가 TimelineResponse.kt - 타임라인 조회 시 여행 상세 목록을 불러올 때 사용되는 DTO 클래스 - TimelineTravelDto 리스트를 갖는다 * style: ktlint check * fix: const 키워드 제거 --------- Co-authored-by: hxeyexn * feat: 둥근 모서리의 이미지를 로드하는 BindingAdapters 추가 #58 (#59) * feat: 둥근 모서리로 이미지를 로딩하는 Glide 바인딩 어댑터 작성 - 세 속성이 모두 필요하다. - glideRoundedCornerImageUrl: 출력하고자 하는 이미지 url - glidePlaceHolder: placeHolder의 url - glideRoundingRadius: 모서리의 둥근 정도를 Int로 설정 * feat: 둥근 모서리로 이미지를 로딩하는 Coil 바인딩 어댑터 작성 - 세 속성이 모두 필요하다. - coilRoundedCornerImageUrl: 출력하고자 하는 이미지 url - coilPlaceHolder: placeHolder의 url - coilRoundingRadius: 모서리의 둥근 정도를 Float으로 설정 * fix: centerCrop 설정을 BindingAdapter 에 위임 - xml 속성으로 centerCrop을 주게 되면 Round Corner가 제대로 적용되지 않는 현상 발생 - Glide의 api로 제공되는 centerCrop() 메서드를 활용 * ui: 타임라인 프래그먼트(BottomSheet) 구현 #55 (#71) * ui: 타임라인 View xml 파일 작성 - 타임라인에 나타날 여행 상세 아이템 xml 작성 - 썸네일 사진 유무에 따라 뷰를 구분 - 타임라인이 나타날 fragment xml 작성 * feat: 타임라인 여행 상세 아이템 UI 모델 생성 * ui: 썸네일이 없는 여행상세 아이템의 margin 조정 * ui: Timeline RecyclerView의 layoutManager 설정 * ui: xml에서의 UiModel 데이터 바인딩 설정 * feat: ViewHolder 작성 - 썸네일 사진 유무에 따라 다른 ViewHolder로 구분 - 공통된 속성을 정의한 TimelineViewHolder 추상클래스 생성 * feat: TimelineRepository Interface 생성 * feat: 임시 TimelineRepository 구현체 생성 * feat: TimelineViewModel 및 Factory 생성 * feat: TimelineViewType 작성 * feat: TimelineAdapter 작성 * feat: TimelineFragment에 ViewModel과 Adapter 구현 * feat: 이미지 로딩 PlaceHolder drawable 추가 및 적용 * feat: 임시 데이터 연결 * ui: Timeline fragment 의 세부 설정 조정 * ui: Timeline의 Item xml 변경 - 뷰 타입을 3개로 분할: 첫 번째 아이템, 중간 아이템, 마지막 아이템 - 이에 따라 xml 파일 추가 및 view 수정 * feat: ViewType 변경에 따른 Adapter 및 ViewHolder 수정 * refactor: 불필요한 View 및 ViewHolder 제거 * feat: 여행 click 에 대한 event handler 생성 및 설정 * refactor: drawable 이름을 네이밍 컨벤션에 맞게 수정 * ui: RecyclerView의 마진 속성을 패딩 속성으로 변경 * feat: 바텀 시트 디자인 변경 및 툴바와의 상호작용 구현 * ui: 타임라인 글귀 추가 * style: ktlint check * ui: 둥근 모서리의 이미지로 변경 * ui: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 구현 #52 (#74) * ui: typography.body textSize 1sp 씩 증가 * feat: DeleteDialogFragment에 Handler 추가 * feat: 툴바의 수정, 삭제 버튼 제어를 위한 ToolbarHandler 추가 * feat: 방문 상세 화면을 위한 VisitDetailUiModel 추가 * ui: PlaceHolder를 위한 xml 파일 추가 * feat: 방문 기록 상세 화면을 위한 VisitAdapter 및 VisitViewHolder 구현 * feat: 임시 VisitViewModel와 VisitViewModelFactory 추가 * feat: VisitFragment 화면 구현 * feat: 방문 기록에 해당하는 여행 선택을 위한 TravelSelectionFragment 구현 * feat: 방문 기록에 해당하는 날짜 선택을 위한 VisitedAtSelectionFragment 구현 * feat: 방문 기록 생성을 위한 VisitCreationActivity 구현 * feat: 방문 기록 수정을 위한 VisitUpdateActivity 구현 * refactor: DialogHandler를 DeleteDialogFragment의 생성자에서 받도록 수정 * refactor: initVisitUpdateDoneButton 중복 로직 제거 * refactor: VisitViewHolderType 메서드 명 변경 of -> from * refactor: tv_place_name_title을 xml id convention에 맞게 수정 * ui: 여행 화면 구현 #51 (#75) * ui: 함께 간 사람들 item 구현 * ui: 방문 기록 item 구현 * ui: 여행 상세 화면 구현 * ui: 여행 생성 화면 구현 * ui: 여행 수정 화면 구현 * ui: placeholder에 사용할 drawable 추가 * ui: 여행 삭제 완료 string 추가 * feat: 둥근 모서리 이미지 BindingAdapter 구현 * feat: 함께 간 사람들 adapter 구현 * ui: 여행 상세 화면 NestedScrollView로 변경 - 이전: ScrollView - 이후: NestedScrollView * feat: 방문 기록 adapter 구현 * feat: 여행 상세 view 연결 * feat: 함께 간 사람들, 방문 기록 adapter 연결 * feat: 삭제 다이얼로그 handler 구현 * feat: 여행 상세 화면 toolbar handler 구현 - 뒤로가기 - 여행 수정 화면으로 이동 - 삭제 다이얼로그 show * feat: 여행 -> 방문 기록 화면 이동 구현 * ui: DatePickerStyle 추가 - DatePickerStyle, CustomMaterialCalendarStyle 추가 - staccato_blue 투명도 30 추가 * feat: 여행 저장 버튼, 여행 기간 BindingAdapter 추가 * feat: 여행 생성 view 연결 * feat: 여행 수정 view 연결 * style: formatting - Exceeded max line length 해결 - 임시 이미지 URL 변경 * refactor: 기간 선택 로직 메서드 분리 * feat: 타임라인의 API 적용 및 MainActivity의 Toolbar 제거 #81 (#93) * refactor: UI Model의 패키지 경로 변경 * refactor: API 명세 변경에 따른 TimelineTravelDto 수정 * refactor: repository 메서드 수정 - 서버 요청을 비동기적으로 처리하기 위해 suspend 키워드 삽입 - 기존의 임시 데이터 요청 코드를 위해 load 메서드 분리 * feat: Timeline의 API Service 작성 * feat: DataSource 인터페이스 작성 * feat: TimelineDataSource 구현체 생성 * refactor: 년도에 대한 default parameter 설정 * refactor: DataSource의 요청 메서드 네이밍 수정 * feat: http 통신이 가능하도록 Cleartext Traffic 허용 설정 * feat: Authorization Header를 삽입하기 위한 Interceptor 생성 * feat: Client에 HeaderInterceptor 추가 * refactor: errorBody의 message 속성 이름 변경 * feat: 도메인 모델 작성 * feat: Response(dto)에서 도메인 모델로 변환하는 확장함수 구현 * feat: 도메인 모델에서 UI 모델로 변환하는 확장함수 구현 * feat: Repository 수정 및 ViewModel 데이터 연결 * ui: MainActivity의 상단 툴바 제거 * refactor: ViewType에 viewType 속성 추가 및 when에서의 enum 활용 * refactor: Timeline의 공통 ViewHolder를 sealed class로 변경 * style: ktlint check 수행 * fix: Response 데이터의 nullable 속성에 맞추어 DTO 수정 및 누락된 DTO 추가 * fix: 데이터가 비어있는 경우(초기)에만 새로운 여행상세 목록을 받도록 수정 * refactor: lazy 로 지연 초기화 및 timelineService가 하나의 인스턴스로 관리되도록 수정 * fix: Travel의 description에 nullable 속성 추가 API 명세서 잘 좀 보자 제발 * refactor: create 메서드를 private으로 변경 Client 클래스에서 Service를 create 하여 제공 및 캐싱하기 때문에, 불필요한 인스턴스를 생성하지 않도록 create를 public으로 두지 않는 것이 좋다. * refactor: LocalDateConverters의 패키지 경로 수정 * refactor: 파일의 이름 수정 * style: ktlint check * refactor: 에러 메시지 상수화 * feat: 특정 여행 상세 조회 api 연결 #82 (#97) * feat: 특정 여행 상세 조회 api service 구현 * feat: 썸네일, 소개 타입 변경 및 기본 인자 설정 - 변경 data class : TravelResponse, TravelUiModel - 이전: String - 이후: String? * refactor: MatesUiModel 네이밍 변경 MatesUiModel이 공통적으로 사용될 예정이므로 MemberUiModel로 변경 - 이전: MatesUiModel - 이후: MemberUiModel * refactor: VisitUiModel 네이밍 변경 - 여행 상세 방문 기록에 사용되는 UiModel 이름을 명시적으로 변경 - 이전: VisitUiModel - 이후: TravelVisitUiModel * feat: 특정 여행 상세 조회에 사용할 domain model 추가 * feat: Api 응답 핸들링 로직 구현 * feat: 특정 여행 상세 조회 data source 구현 * feat: 특정 여행 상세 조회 repository 구현 * feat: 특정 여행 상세 조회 api 연결 * feat: 특정 여행 상세 조회 로직 매개변수 추가 - 타임라인에서 선택된 여행 id를 매개변수로 받도록 변경 * refactor: ApiResponseHandler 이름 오타 수정 * refactor: 에러 메세지 상수화 * feat: 특정 여행 상세 조회 시그니처 변경 - HeaderInterceptor 적용으로 authorization 매개변수 제거 * style: formatting * feat: 방문 기록, 방문 기록 생성, 방문 기록 수정 화면 API 연결 #79 (#99) * feat: VisitApiService 인터페이스 및 관련 data class 추가 * feat: VisitRepository, RemoteVisitDataSource 및 관련 class 추가 * feat: 각 Visit 화면들의 ViewModelFactory 구현 * feat: 각 Visit 화면들의 UiModel 클래스 및 Mapper 추가 * feat: 여행 선택 및 방문 날짜 선택을 위한 BottomSheetDialogFragment 수정 * feat: VisitFragment API 연결 * feat: VisitCreationActivity API 연결 * feat: VisitUpdateActivity API 연결 준비 * refactor: visitApiService를 StaccatoClient object로 이동 * refactor: TravelVisit 클래스의 visitImage 변수 nullable하게 수정 * refactor: VisitApiService의 중복된 @Header 제거 * refactor: 방문 생성 성공 시 created id를 가져오도록 리팩터링 * chore: 변수명 visitImage로 수정 및 ktLint 적용 * refactor: 여행 수정 완료 동작 구현 및 VisitUpdateActivity 함수 분리 * feat: 여행 생성 api 연결 #98 (#104) * feat: 여행 생성 api service 구현 * feat: 여행 생성 data source 구현 * feat: 방문 기록 썸네일 타입 변경 및 기본 인자 설정 - 변경 data class :  TravelVisitDto, TravelVisit, TravelVisitUiModel - 이전: String - 이후: String? * build: converter scalars 의존성 추가 * feat: 여행 생성 ApiService 반환값 및 DataSource 시그니처 변경 - 여행 생성 ApiService 반환값 변경 - DataSource 시그니처 변경 - TravelCreation DomainModel 구현 - TravelCreation Dto 변환 Mapper 구현 * feat: Client에 ScalarsConvert 추가 - Header 값을 읽어오기 위해 ScalarsConvert 추가 * feat: 여행 생성 repository 구현 * feat: 여행 생성 api 연결 * feat: TravelViewModel 생성자 변경 - 이전: travelId를 TravelViewModel 생성자로 넣어줌 - 이후: travelId를 loadTravel()의 매개변수로 넣어줌 * ui: map 화면 변경 * refactor: 컨벤션 통일 및 패키지 정리 #112 (#118) * refactor: bind 네임스페이스 적용 * refactor: BindingAdapters 메서드명 변경 * refactor: 컨벤션 맞게 xml 파일 이름 변경 * refactor: data 패키지 구조 정리 * refactor: RemoteVisitDataSource 컨벤션 따라 네이밍 변경 * refactor: 네트워킹 관련 메서드 이름 변경 - api service, data source, repository * refactor: presentation 패키지 구조 정리 * refactor: message utils 생성 및 적용 Co-authored-by: s6m1n Co-authored-by: Junyoung-WON * build: develop-an의 CI 테스트 자동화 추가 및 데모 APK 추출 #78 (#92) * build: test 자동화 Job 추가 * build: local.properties 생성 시점 변경 * build: 디버그 APK를 빌드하여 업로드하는 workflow 작성 * fix: test Job과 APK build Job에 local.properties 생성 동작 추가 * build: read 전용 권한 제거 * build: Firebase Analytics, Crashlytics 설정 #136 (#143) * build: Firebase Analytics, Crashlytics 의존성 추가 * chore: google-service.json ignore * feat: 특정 여행 상세 수정 api 연결 #109 (#146) * feat: 여행 수정 api service 구현 * feat: 여행 수정 data source 구현 * feat: 여행 수정 repository 구현 * feat: 여행 수정 화면 현재 데이터 로딩 기능 구현 * refactor: 컨벤션 따라 여행 api service의 수정 메서드명 변경 - 이전: updateTravel - 이후: putTravel * feat: 특정 여행 상세 수정 api 연결 * refactor: memberImage 타입 변경 및 기본 인자 설정 * refactor: MembersDto 삭제 * refactor: TravelCreationUiModel.kt 삭제 * refactor: TravelCreation 이름 변경 - 이전: TravelCreation - 이후: NewTravel * refactor: api 명세서 변경에 따른 도메인 모델 수정 및 여행 코드 리팩터링 #151 (#152) * refactor: nickName 변수명 변경 - 이전: nickName - 이후: nickname * ui: 여행 수정 화면 이미지 속성 수정 - glide -> coil 이용 - scaleType : fitXY -> centerCrop * style: import 정렬 * feat: 여행 상세 -> 방문 상세로 이동 시 여행 id 전달 * feat: 방문기록 조회 dto 수정 - 방문기록 조회 도메인 변경으로 인해 방문 기록이 조회되지 않음 - 따라서 api 명세서와 일치하도록 dto 수정하여 오류 해결 * refactor: 여행 생성을 위한 viewModel 메서드 분리 * refactor: 여행 조회를 위한 viewModel 메서드 분리 * feat: 여행 수정 handler 구현 * refactor: 여행 default id 변경 - 이전: -1L - 이후: 0L * refactor: TravelHandler 구현 위치 변경 - 이전: TravelViewModel - 이후: TravelFragment * style: 컨벤션에 맞게 TravelFragment의 메서드 순서 수정 * refactor: TravelFragment의 travelId 초기화 방식 변경 * feat: 여행 생성 및 수정 error toast 구현 * feat: 방문 생성 화면, 방문 수정 화면에서 갤러리 사진 불러오기 구현 #150 (#155) * feat: PhotoAttachFragment에 PhotoAttachHandler 연결 * feat: PhotoAttachFragment 앨범 접근 권한 관련 로직 구현 - API level 33 이상 : READ_MEDIA_IMAGES - API level 33 이하 : READ_EXTERNAL_STORAGE - ActivityResultLauncher를 이용한 권한 요청 - 권한 거부 시, 설정으로 이동하는 스낵바 띄우기 * feat: PhotoAttachFragment 앨범에서 불러온 이미지의 URI 추출하기 * feat: 불러온 이미지의 URI를 호스트 Activity로 전달 - OnUrisSelectedListener 인터페이스 추가 * feat: Uri를 File로 변환하는 메서드 파일 추가 * refactor: pr 리뷰 반영 * refactor: pr 리뷰 반영2 * build: develop-an의 android-ci 수정 #115 (#160) - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: android-ci 환경변수 생성 위치 조정 (#164) * build: local.properties 와 google-services.json 설정 - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: 환경 변수 설정 위치 변경 * build: bash 쉘에 맞는 명령어 활용 #115 (#165) * build: local.properties 와 google-services.json 설정 - local.properties: 파일 생성 후 secrets로부터 base_url 설정 - google-services.json: firebase android 구성파일 설정을 위해 secrets로부터 생성 * fix: 환경 변수 설정 위치 변경 * fix: bash 쉘에 적합한 명령어 형식으로 변경 * feat: 특정 여행 상세 삭제 api 연결 #153 (#167) * feat: 특정 여행 삭제 api service 구현 * feat: 특정 여행 삭제 data source 구현 * feat: 특정 여행 삭제 repository 구현 * feat: 특정 여행 삭제 기능 api 연결 * feat: error handling 방식 수정 - 서버에서 들어오는 error body의 status와 message를 활용하는 방식으로 변경 * refactor: DialogHandler를 독립적으로 관리 * refactor: api path 상수 활용 * refactor: BuildConfig에 token 정의 * refactor: DEFAULT_VALUE 상수 제거 * feat: 여행 생성 기능 api 수정 #169 (#178) * feat: onUrisSelected 매개변수 가변인자로 변경 * feat: 여행 생성 화면 갤러리 이미지 로딩 기능 구현 * refactor: 이미지 선택 리스너 초기화 메서드명 오타 수정 * refactor: 스낵바 액션 설정 코드 간소화 * feat: TravelRequest 의 여행 썸네일 필드 제거 * refactor: 여행 썸네일 이미지 변수명 수정 * feat: 이미지 전송 기능 구현 * refactor: image url 변수명 변경 - 변수 끝에 url이 오도록 * feat: 여행 생성 progressBar 구현 * ui: 사진 첨부 아이콘 가시성 설정 * feat: 여행 상세 수정 기능 api 변경 및 여행 리팩터링 #180 (#181) * feat: 여행 수정 화면 갤러리 이미지 로딩 기능 구현 * feat: URL 및 URI 기반 이미지 로딩 BindingAdapter 구현 * feat: 이미지 전송 기능 구현 * feat: 여행 수정 progressBar 구현 * fix: 삭제 불가능한 여행 삭제 시도 관련 에러 토스트 문제 해결 삭제 불가능한 여행을 삭제하려고 시도 -> 방문 조회 -> 뒤로 가기 버튼 클릭 -> 삭제 불가능 에러 토스트가 다시 뜨는 문제가 발생해 이를 해결 * refactor: TravelCreationViewModel의 imageUrl 변수 제거 * ui: 여행 상세 내 방문 기록 이미지 scaleType 속성 설정 * ui: 여행 생성 썸네일 이미지 scaleType 속성 설정 * fix: 여행 소개 미입력 시 여행이 생성 되지 않는 오류 해결 * refactor: 타임라인 화면 리팩터링 #162 (#179) * ui: 타임라인 RecyclerView의 크기 조정 및 여백 수정 * feat: Activity와 Fragment 간 데이터를 공유하는 공유 ViewModel 생성 * feat: 공유 ViewModel을 이용하여 타임라인 업데이트 여부를 공유 * refactor: RecyclerView.Adapter에서 ListAdapter로 변환 * refactor: 처음 타임라인을 불러오는 동작을 ViewModel 초기화 시에 수행 * fix: ListAdapter 수정 - 불필요한 travels 프로퍼티와 getItemCounts 메서드 제거 - currentList를 사용하는 것으로 변경 * refactor: 에러 핸들링 방식 수정 및 ViewModel 수정 - TimelineDefaultRepository로 네이밍 변경 - ApiResponseHandler와 ResponseResult를 이용하여 에러 핸들링 처리 - TimelineViewModel 에러 메시지 LiveData 사용 - 그 외 repository, dataSource 프로퍼티 이름 수정하여 통일 * refactor: MutableLiveData의 값 업데이트를 setValue로 변경 및 메서드 분리 * style: ktlint 적용 * feat: 3차 스프린트에서 수정된 방문 기록 상세 API 연결 #163 (#183) * feat: 방문 상세 생성 API 연결 * feat: 방문 상세 수정, 삭제 API 연결 * feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용 * feat: 방문 기록 생성 화면 사진 다중 선택 구현 * feat: 방문 기록 생성 이미지 업로드 구현 * feat: 방문 기록 생성 및 수정 시 로딩과 토스트 추가 * feat: 닉네임을 활용한 로그인 기능 구현 #124 (#172) * ui: 로그인 화면 구성 - 로그인 화면에서 사용되는 텍스트를 strings에 추가 - 로그인 버튼 스타일에 대한 style 생성 - xml 임시로 작성 * ui: 앱 로고 삽입 및 margin 조정 - 임시 로고 이미지 저장 - 로고 크기 및 마진 조정 * feat: 로그인 API Service 작성 및 Retrofit 객체 생성 * feat: 로그인 DataSource 작성 * feat: 로그인 Repository 생성 * feat: 사용자 정보를 저장하는 SharedPreferences Manager 생성 - 토큰 값 불러오기 및 저장 - 추후 사용자 닉네임, 사용자 프로필 이미지 등의 정보 저장 가능 * feat: Application 생성 및 사용자 정보 Preferences Manager 캐싱 * ui: Splash Screen 화면 구성을 위한 테마 생성 * feat: Preferences 로부터 사용자 토큰 값을 가져와 헤더에 추가하도록 변경 * refactor: Repository 네이밍 통일 * refactor: DataSource 기본 인자 추가 * feat: LoginViewModel 및 Handler 작성 * feat: LoginViewModel 을 생성하는 ViewModel Factory 작성 * feat: LoginActivity 작성 및 양방향 데이터 바인딩 적용 * feat: StaccatoApplication과 LoginActivity 설정 및 LoginActivity를 시작 화면으로 변경 * style: 불필요한 namespace 제거 및 lint 확인 * refactor: LoginViewModel과 Factory를 viewmodel 패키지로 분리 * refactor: TimelineViewModel과 Factory를 viewmodel 패키지로 분리 * style: ktlint 적용 * fix: 불필요한 ConverterFactory 제거 - 더 이상 사용하지 않는 text/plain 변환용 ScalarsConverterFactory 제거 * feat: 닉네임 로그인 요청 및 응답에 대한 DTO 작성 * refactor: 로그인 요청, 응답 시 DTO 활용 * fix: 토큰 값을 불러오고 및 저장하는 동작의 비동기 처리 및 화면 전환 개선 * refactor: 토큰 값을 캐싱하여 저장하는 TokenManager 생성 및 적용 - 매번 runBlocking을 통해 Preference에 저장된 토큰 값을 불러오는 것은 네트워크 성능을 저하시킨다. - 따라서, token 값을 캐싱하여 저장하는 TokenManager를 활용한다. - 첫 네트워크 요청 시에만 토큰을 불러오는 작업을 동기적으로 처리하기 위해 Main Thread가 Blocking 된다. - TokenManager가 Preference로부터 가져온 토큰을 캐싱하여 저장한다. - 이후 요청부터는 캐시된 토큰을 가져오므로 Main Thread가 Blocking 되지 않는다. * style: ktlint 적용 * feat: Night 모드 비활성화 * refactor: 여행 기간 날짜 형식 변환을 BindingAdapter에서 수행 - TimelineTravelUiModel 프로퍼티 수정 - UiModel의 여행기간 날짜를 LocalDate로 갖도록 통일 - 추후 날짜 관련 UI가 변경되었을 때 확장성 고려 - BindingAdapters에 날짜 형식 변환해주는 메서드 작성 * chore: 주석 처리된 Log 코드 삭제 * style: xml View의 ID 네이밍 컨벤션 적용 * ui: 앱 심볼 로고 추가 및 스플래시 스크린에 적용 * feat: 방문 상세 생성 API 연결 * ui: 배경 색을 흰 색으로 지정 * feat: 키보드 활성화 상태에서 화면 터치 시 키보드를 내리는 기능 추가 * style: ktlint 적용 * feat: 방문 상세 수정, 삭제 API 연결 * feat: 방문 기록 생성/수정 시 양방향 데이터 바인딩 적용 * fix: merge 과정에서 발생한 id값 네이밍 충돌 해결 * build: 앱 version code와 version name 수정 * feat: 방문 기록 생성 화면 사진 다중 선택 구현 * feat: 방문 기록 생성 이미지 업로드 구현 * feat: 스플래시 스크린 시간 조정 및 데모 시연용 토큰 활성화 * fix: 동일한 사진이 여러 장 업로드되는 버그 수정 * feat: 기존 로그인 기능으로 롤백 --------- Co-authored-by: somin * fix: 테스트 배포를 위한 버그 수정 #198 (#219) * style: formatting * fix: 무한 로딩 오류 수정 * fix: 여행 생성 오류 수정 * add: 앱 아이콘 변경 * ui: timeline empty view 추가 * feat: timeline empty view 가시성 설정 * ui: 여행 내 방문 기록 empty view 추가 및 가시성 설정 * ui: 방문 기록 내 로그 미지원 기능 view 추가 * feat: 사진 첨부 카메라 미지원 기능 알림 추가 * ui: 필수값 표기 style 정의 * ui: 여행 생성 및 수정 필수값 표기 추가 * ui: 방문 기록 생성 및 수정 필수값 표기 추가 * feat: 생성, 수정, 로그인 시 다중 요청 전송을 막기 위한 화면 터치 제한 * feat: 장소 생성의 사진 첨부 리사이클러뷰 구현 - 사진 추가 & 삭제 구현 - GridLayout으로 변경 - 사진 중복 없이 최대 5장으로 제한 - 새로 추가된 사진이 기존 사진 뒤에 더해지도록 구현 * chore: 방문 생성 화면 rv_photo_attach로 xml id 수정 * ui: app icon 및 splash icon 변경 * refactor: xml ID 네이밍 컨벤션 적용 --------- Co-authored-by: somin Co-authored-by: Junyoung-WON * refactor: 도메인명 변경에 따라 travel을 memory로 수정 #217 (#231) * refactor: 패키지명 travel -> memory로 수정 * refactor: dto의 TravelMapper 를 MemoryMapper 로 네이밍 변경 * refactor: 여행(현 추억) 생성 response dto 네이밍 변경 - TravelCreationResponse -> MemoryCreationResponse * refactor: 여행(현 추억) request dto 네이밍 변경 - TravelRequest -> MemoryRequest * refactor: 여행(현 추억) 조회 response dto 네이밍 변경 - TravelResponse -> MemoryResponse * refactor: 여행(현 추억) 수정 request dto 네이밍 변경 - TravelUpdateRequest -> MemoryUpdateRequest * refactor: 여행(현 추억) 내 방문 dto 네이밍 변경 - TravelVisitDto -> MemoryVisitDto * refactor: 타임라인 여행(현 추억) item의 dto 네이밍 변경 - TimelineTravelDto -> TimelineMemoryDto * refactor: 여행(현 추억) ApiService 네이밍 변경 - TravelApiService -> MemoryApiService * refactor: 여행(현 추억) DataSource 네이밍 변경 - TravelDataSource -> MemoryDataSource - TravelRemoteDataSource -> MemoryRemoteDataSource * refactor: 여행(현 추억) Repository 네이밍 변경 - TravelRepository -> MemoryRepository - TravelDefaultRepository -> MemoryDefaultRepository * style: TimelineMapper import 재정렬 * refactor: NewTravel 도메인명을 NewMemory로 변경 * refactor: Travel 도메인명을 Memory로 변경 * refactor: TravelVisit 도메인명을 MemoryVisit으로 변경 * refactor: presentation의 TravelMapper 명 변경 - TravelMapper -> MemoryMapper * refactor: 여행(현 추억) ui 모델명 변경 - TravelUiModel -> MemoryUiModel - TravelVisitUiModel -> MemoryVisitUiModel * refactor: 여행(현 추억) view model 명 변경 - TravelViewModel -> MemoryViewModel - TravelViewModelFactory -> MemoryViewModelFactory * refactor: MemoryApiService의 Path 변경 - travel을 memory로 변경 - travels을 memories로 변경 * refactor: Memory 관련 dto 변수명 변경 - travel을 memory로 변경 * refactor: Timeline Dto의 Memory 관련 변수명 변경 - travel을 memory로 변경 - travels를 memories로 변경 * refactor: Memory 관련 도메인 모델의 변수명 변경 - travel을 memory로 변경 * refactor: Memory 관련 ui 모델의 변수명 변경 - travel을 memory로 변경 * refactor: data layer의 Memory 관련 함수 및 변수명 변경 - travel을 memory로 변경 * refactor: 방문 생성 request dto의 travelId 변수명 변경 - travelId -> memoryId * refactor: 여행(현 추억) 조회 view model 및 fragment의 네이밍 변경 - travel -> memory * refactor: fragment_travel 의 리소스 네이밍 변경 - travel -> memory - strings.xml의 리소스명 변경 * refactor: TravelCreationActivity 네이밍 변경 - TravelCreationActivity -> MemoryCreationActivity * refactor: 여행(현 추억) 생성의 ViewModel 관련 네이밍 변경 - TravelCreationViewModel -> MemoryCreationViewModel - TravelCreationViewModelFactory -> MemoryCreationViewModelFactory - 관련 함수 및 변수명 변경 - travel -> memory * refactor: 여행(현 추억) 생성, 수정에 관한 xml 리소스 명 변경 - travel -> memory - strings.xml 의 관련 리소스 수정 * refactor: 여행(현 추억) 수정 Activity, Handler 의 네이밍 변경 - travel -> memory * refactor: 여행(현 추억) 수정 ViewModel 의 네이밍 변경 - 관련 함수 및 변수 명 변경 - travel -> memory - Factory 클래스명 변경 * refactor: 여행(현 추억) 생성, 수정에서의 파일 변환 메서드명 변경 - travel -> memory - 자식 파일 명 상수화 * refactor: Timeline 의 UI 모델 및 Travel ID Key 의 리네이밍 - travel -> memory 로 일괄 변경 * refactor: presentation/timeline 내 travel 도메인명 변경 - travel -> memory - TimelineMapper 내 domain model -> ui model 변환 메서드명 변경 * refactor: dto/MemoryMapper 내 domain 변환 메서드명 변경 - dto/MemoryMapper 내 domain model을 dto로 변환하는 메서드명 변경 - travel -> memory * refactor: dummyTravel 을 dummyMemory 로 변경 * refactor: MainActivity 내 travel을 memory로 변경 * refactor: activity_main 내 travel을 memory로 변경 * refactor: TimeLineApiService 내 GET 메서드 path 수정 - travels -> memories * refactor: MemoryFragment 내 travel 을 memory 로 변경 - MemoryFragment, fragment_memory 내 travel 을 memory 로 변경 * refactor: MemoryViewModel 내 error message 변수명 변경 - TRAVEL_ERROR_MESSAGE -> MEMORY_ERROR_MESSAGE * refactor: navigation graph 내 travel을 memory로 변경 * refactor: VisitUpdateActivity 내 extra 키 값 수정 - TRAVEL_ID_KEY -> MEMORY_ID_KEY - TRAVEL_TITLE_KEY -> MEMORY_TITLE_KEY * refactor: VisitFragment 내 travel을 memory로 변경 * refactor: VisitUpdateActivity 내 travel을 memory로 변경 * refactor: VisitUpdateViewModel 내 travel을 memory로 변경 * refactor: VisitTravelUiModel을 VisitMemoryUiModel로 변경 * refactor: 방문 수정 xml의 travel을 memory로 변경 * refactor: 여행(현 추억) 선택 xml 내 travel을 memory로 변경 * refactor: 여행 선택 바텀 시트 내 travel을 memory로 변경 - TravelSelectionFragment -> MemorySelectionFragment 로 수정 - TravelSelectionHandler -> MemorySelectionHandler 로 수정 - TravelSelectionFragment 내 메서드명 수정 - TravelSelectionHandler 내 매개변수명 수정 * refactor: VisitRepository와 구현체의 메서드 내 매개변수명 통일 * refactor: VisitsViewHolder 내 travel을 memory로 변경 * refactor: VisitCreationActivity 내 travel을 memory로 변경 * refactor: VisitCreationViewModel 내 travel을 memory로 변경 * refactor: 방문 생성 xml 내 travel을 memory로 변경 * refactor: BindingAdapters 내 travel을 memory로 변경 * refactor: strings 내 travel을 memory로 변경 - strings 내 '여행'을 '추억'으로 수정 Co-authored-by: Junyoung-WON Co-authored-by: s6m1n * refactor: visit, visit log 도메인명 수정 #218 (#237) * refactor: VisitApiService 내 visit을 moment 로 변경 - 파일명 수정 - path 수정 - 메서드명 수정 - 매개변수명 수정 * refactor: data/visit 패키지명을 moment로 변경 * refactor: data/dto/visit 패키지명을 moment로 변경 * refactor: VisitCreationRequest 네이밍 변경 - 이전: VisitCreationRequest - 이후: MomentCreationRequest * style: StaccatoClient import 재정렬 * refactor: VisitCreationResponse 네이밍 변경 - 이전: VisitCreationResponse - 이후: MomentCreationResponse - 필드명 변경 : visitId -> momentId * refactor: VisitResponse 네이밍 변경 - 이전: VisitResponse - 이후: MomentResponse - VisitResponse 필드 내 visit을 moment로 변경 - VisitResponse 필드 내 visitLogs SerialName을 comments로 변경 * refactor: VisitUpdateRequest 네이밍 변경 - 이전: VisitUpdateRequest - 이후: MomentUpdateRequest - VisitUpdateRequest 필드 내 visit을 moment로 변경 * refactor: VisitLogDto 내 SerialName 변경 - visitLogId를 commentId로 변경 * refactor: MemoryResponse 내 visits SerialName 변경 - visits를 moments로 변경 * refactor: VisitCreationViewModel 내 FORM_DATA_NAME 변경 - 이전: visitImageFiles - 이후: momentImageFiles * refactor: MemoryVisitDto 내 visit를 moment로 변경 - MemoryVisitDto -> MemoryMomentDto로 변경 - visitId -> momentId로 변경 - visitImageUrl -> momentImageUrl로 변경 * refactor: VisitRemoteDataSource 내 visit을 moment로 변경 - VisitRemoteDataSource -> MomentRemoteDataSource로 변경 - 메서드명 변경 - 매개변수명 변경 * refactor: MomentRepository 및 구현체 내 visit을 moment로 변경 - VisitRepository -> MomentRepository로 변경 - VisitDefaultRepository -> MomentDefaultRepository로 변경 - 메서드명 변경 - 매개변수명 변경 * refactor: Visit 도메인 모델명 및 변수명 변경 - Visit -> Moment로 변경 - visitLogs -> comments로 변경 * refactor: Memory 도에인 모델의 visits을 moments로 변경 * refactor: MemoryVisit 도메인 모델 내 visit을 moment로 변경 * refactor: MemoryResponse의 visits 필드명을 moments로 변경 * refactor: dto/mapper/VisitMapper를 MomentMapper로 변경 * refactor: presentation/visit 패키지명을 moment로 변경 * refactor: VisitViewHolderType 네이밍 변경 - VisitViewHolderType -> MomentViewHolderType - enum 상수명 변경 - VISIT_DEFAULT -> MOMENT_DEFAULT - MY_VISIT_LOG -> MY_COMMENTS * refactor: VisitViewHolder 네이밍 변경 - VisitViewHolder -> MomentViewHolder - VisitDefaultViewHolder -> MomentDefaultViewHolder - MyVisitLogViewHolder -> MyCommentViewHolder * refactor: VisitAdapter 내 visit을 moment로 변경 - VisitAdapter -> MomentAdapter 로 변경 - visit -> moment 로 변경 * refactor: MomentAdapter 내 visit log를 comments로 변경 * refactor: VisitDetailUiModel 내 visit을 moment로 변경 - VisitDetailUiModel -> MomentDetailUiModel - VisitDefaultUiModel -> MomentDefaultUiModel - visitImageUrls -> momentImageUrls * refactor: VisitLogUiModel을 CommentsUiModel로 변경 * refactor: VISIT_ID_KEY extra key id 네이밍 변경 - VISIT_ID_KEY -> MOMENT_ID_KEY * refactor: VisitFragment 내 visit을 moment로 변경 * refactor: VisitViewModel 내 visit을 moment로 변경 - VisitViewModel -> MomentViewModel로 변경 - VisitViewModelFactory -> MomentViewModelFactory로 변경 * refactor: VisitMemoryUiModel 네이밍 변경 - VisitMemoryUiModel -> MomentMemoryUiModel로 변경 * refactor: presentation/visitcreation 패키지명 momentcreation으로 변경 * refactor: VisitCreationActivity 내 visit을 moment로 변경 - VisitCreationActivity -> MomentCreationActivity로 변경 * refactor: VisitCreationHandler 네이밍 변경 - VisitCreationHandler -> MomentCreationHandler로 변경 * refactor: VisitCreationViewModel 내 visit을 moment로 변경 - VisitCreationViewModel -> MomentCreationViewModel로 변경 - 메서드 및 변수명 변경 * refactor: 여행 -> 추억, 방문 기록 -> 스타카토로 도메인명 변경 * feat: s3 api 연결 #239 (#241) * feat: ImageResponse, ImageApiService 구현 * feat: ImageRepository 및 구현체 구현 Co-authored-by: s6m1n * fix: 추억 기능 버그 수정 #246 (#252) * fix: 일부 EditText 개행 불가 처리 및 키보드 숨김 처리 #247 (#249) * ui: 닉네임과 추억 생성, 수정 제목 입력 시 줄바꿈 제한 * fix: 키보드 활성화 상태에서 빈 화면 터치로 키보드 숨김 처리 - 메서드 명 변경: setHideKeyboardAction -> setHidingKeyboardAction * style: 클래스 내 override 메서드의 순서 변경 - 팀 코드 컨벤션에 맞게 순서 재정렬 - override 메서드를 상단에 둔다. * style: ktlint 적용 * fix: root뷰 터치 시 클릭 이벤트가 발생하지 않는 오류 수정 - 원인 분석: ConstraintLayout 내부 Toolbar 및 ScrollView, 그리고 그 자식 View들이 클릭 이벤트를 가로채기 때문에, 바인딩 된 최상단 root 뷰인 ConstraintLayout의 클릭 이벤트가 동작하지 않는다. - 해결 방법: 여러 클릭 이벤트를 가로채는 dispatchTouchEvent 메서드를 오버라이드하여, 터치된 부분이 현재 포커스가 되지 않은 View(키보드 바깥 화면) 범위라면, 키보드를 숨기는 동작을 추가하였다. * refactor: 키보드 숨김 동작을 handler 바인딩으로 적용 - LoginHandler 에 화면 터치에 대한 동작을 추가, 화면 터치 시 키보드를 숨김 처리하는 동작을 바인딩으로 설정 - InputMethodManager 인스턴스를 지연초기화하여 저장 * refactor: InputMethodManager 인스턴스를 lazy로 지연 초기화 * fix: 닉네임, 제목 입력 칸의 키보드 액션 버튼 변경 - 키보드의 액션 타입을 Search에서 Done으로 변경 * style: ktlint 적용 * refactor: 타임라인 리팩터링 #232 (#263) * refactor: TimelineViewModelFactory의 생성자 파라미터 추가 - 내부 프로퍼티에 속해있던 TimelineRepository를 생성자 프로퍼티로 변경 * fix: 추억 목록 아이템이 하나일 때의 View 수정 - 아이템 개수가 하나일 때는 타임라인의 선이 나타나지 않도록 변경 * chore: 코루틴 예외 처리 로그에context 출력 * refactor: 메서드 분리 및 순서 재정렬 - 코드 컨벤션: override 메서드는 상단에 위치한다 * refactor: TimelineViewModel 생성 팩토리 메서드 활용 * style: ktlint 적용 * ui: 화면 전환에 사용될 twin animation 효과 생성 * ui: animation 효과 활용하여 화면 전환 애니메이션 적용 * ui: Main 화면의 배경 색을 하얀색(#FFFFFF)으로 지정 * style: ktlint 적용 * feat: 기분 선택 기능 구현 및 스타카토 조회 화면 구조 변경 #191 (#289) * feat: 기분 수정 요청을 보내는 Request Dto 작성 * feat: MomentApiService 에 기분 수정 요청에 대한 API 작성 * feat: 기분 수정 요청에 대한 DataSource 메서드 작성 * feat: 기분 도메인 모델 생성 * feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성 * ui: 기분 아이콘 이미지 리소스 추가 * ui: 기분 아이콘의 테두리를 selector로 생성 - 선택/미선택에 따라 다른 ui를 나타낸다 * ui: 기분 아이콘에 사용할 style 지정 * fix: API 변경에 따라 DTO 및 Mapper 변경 - 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경 * fix: 순간 DTO에 기분 필드 추가 - 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정 * feat: 기분 선택 api에 필요한 repository 메서드 작성 * feat: 기분 uiModel 생성 * feat: 댓글에 대한 UI 모델 생성 * feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성 * feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성 * feat: 댓글 화면 구성 및 Adapter, Fragment 작성 * feat: 순간(현 스타카토)의 Ui Model Mapper 변경 MomentDetailUiModel.CommentsUiModel -> CommentUiModel MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel Feeling을 Ui Model로 변환하는 Mapper 추가 * feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성 * feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성 * fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정 * fix: 누락된 ViewModel 데이터 바인딩 설정 * feat: 순간 조회 화면 재구성 * refactor: 네비게이션 action 및 id 네이밍 수정 visit -> moment로 수정 * refactor: 방문 -> 순간 으로 키워드 변경 * refactor: 불필요한 클래스 및 xml 파일 제거 * style: ktlint 적용 * feat: 추억 API 변경사항 반영 및 리팩터링 #259 (#265) * ui: 추억 생성 화면 사진 로드 시 coil 라이브러리 사용 * ui: 삭제 버튼 아이콘 추가 * ui: 추억 생성 화면 사진 삭제 버튼 추가 * feat: 추억 생성 view model의 imageUri 설정 매개변수 타입 변경 * feat: 추억 생성 화면 사진 삭제 구현 * feat: 추억 수정 화면 사진 첨부 icon 가시성 설정 * ui: 추억 수정 화면 사진 삭제 버튼 추가 * feat: 추억 수정 화면 사진 삭제 버튼 가시성 설정 * feat: 추억 수정 view model의 imageUri 설정 매개변수 타입 변경 * feat: 추억 수정 화면 사진 삭제 구현 * fix: 추억 생성 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정 * fix: 추억 수정 화면의 사진 첨부란 연속 클릭 시 앱 종료 되는 버그 수정 * feat: MemoryRequest dto에 썸네일 사진 url 필드 추가 * feat: 추억 생성 메서드의 시그니처 변경 - MemoryApiService 내 추억 생성 메서드의 시그니처 변경 - 위 변경에 따른 DataSource, Repository, ViewModel의 추억 생성 관련 메서드 시그니처 변경 * feat: 추억 생성 view model 주 생성자로 ImageRepository 주입 * feat: 추억 생성 화면의 썸네일 사진 저장 기능 구현 * feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 생성 화면) - 추억 생성 화면에서 서버에 저장된 사진을 로드하는 기능 구현 - UI에 불러온 사진을 표시하는 로직 수정 * feat: 추억 생성 시 썸네일 사진 url 추가 * refactor: MemoryRequest의 추억 썸네일 사진 기본 인자 값 null로 설정 * feat: 추억 수정 메서드의 시그니처 변경 * feat: 추억 수정 view model 주 생성자로 ImageRepository 주입 * feat: 추억 수정 화면의 썸네일 사진 저장 기능 구현 * feat: 서버에서 저장된 사진을 불러오는 기능 추가 (추억 수정 화면) - 추억 수정 화면에서 서버에 저장된 사진을 로드하는 기능 구현 - UI에 불러온 사진을 표시하는 로직 수정 * feat: 추억 수정 시 썸네일 사진 url 추가 * refactor: 불필요한 MemoryUpdateRequest 제거 * ui: empty view 캐릭터 이미지 추가 * ui: 추억 설명글 유무에 따른 가시성 설정 * ui: 함께 한 사람들 가시성 gone 으로 설정 - 4차 스프린트 범위에서 제외됨 * feat: 이미지 선택 옵션 추가 (단일 선택 및 다중 선택 지원) * ui: TextInputLayout, TextInputEditText Style 정의 * ui: 추억 생성 화면 입력란 TextInputLayout으로 변경 - counter 속성 사용을 위해 TextInputLayout으로 변경함 * ui: 추억 수정 화면 입력란 TextInputLayout으로 변경 - counter 속성 사용을 위해 TextInputLayout으로 변경함 * ui: 추억 조회 화면 썸네일 사진 유무에 따른 가시성 설정 * ui: empty view 캐릭터 이미지 크기 변경 * ui: 앱 이름 Staccato_AN -> Staccato 로 수정 * refactor: 추억 생성 및 수정 화면 메서드 순서 정리 * ui: 제목용 TextInputEditTextStyle 정의 및 적용 * ui: 추억 생성 및 수정 화면 썸네일 coilPlaceHolder 변경 - 이전: shape_place_holder_rectangle - 이후: shape_all_gray1_8dp * refactor: 삭제 다이얼로그 show 메서드 호출 방식 변경 - apply를 사용하지 않는 방식으로 변경 * ui: 코멘트 미지원 안내 view 추가 * feat: 스타카토 생성, 수정 화면 사진 및 완료 버튼 개선 #242 (#291) * feat: (스타카토 생성 화면) 사진 드래그로 순서 변경 기능 구현 * refactor: data 패키지에 S3 이미지 API 분리 적용 * refactor: AttachedPhotoUiModel 및 프로그래스바 추가 * feat: recyclerView에서 지워진 사진의 job cancel 처리 * refactor: editText를 TextInputLayout로 수정 * feat: (스타카토 수정 화면) 사진 드래그로 순서 변경 / 로딩 구현 * refactor: 프로퍼티 네임 변경 및 visitedAt LocalDateTime으로 수정 * style: ktlint 적용 * build: 구글 맵 API 사용에 따른 CI 수정 #296 (#297) * build: 구글 맵 api key를 저장하는 파일을 설정하는 명령어 작성 * refactor: defaults 에 설정된 shell 설정에 따라 추가적인 shell 설정 삭제 * feat: Google Map 연결, 스타카토 목록 조회 API 연결 #54 (#295) * build: google map 의존성 추가 * build: 구글맵 관련 properties ignore 추가 * build: 구글맵 api key 설정 * feat: Google Map 연결 * feat: MainActivity Handler 구현 * ui: 추억 및 스타카토 생성 메뉴 추가 * ui: popup menu style 정의 * feat: 추억 생성 및 수정 menu 연결 - handler 연결 - 메서드 분리 * feat: 위치 권한 요청 구현 - ACCESS_FINE_LOCATION 권한 요청 - ACCESS_COARSE_LOCATION 권한 요청 * feat: 현 위치 표시 * style: MainActivity formatting * feat: locationPermissions 타입 변경 - 이전: List - 이후: Array * feat: MomentLocationDto, MomentLocationResponse 추가 * feat: 스타카토 목록 조회 api service 구현 * feat: 스타카토 목록 조회 data source 구현 * feat: MomentLocation 도메인 모델 구현 * feat: MomentLocationDto를 도메인 모델로 변환하는 mapper 구현 * feat: 스타카토 목록 조회 repository 구현 * feat: 스타카토 목록 조회 view model 구현 * feat: 스타카토 목록을 marker로 표시 * refactor: home 패키지명을 maps로 변경 * feat: 마커 클릭 시 스타카토 상세로 이동 기능 구현 * feat: 스타카토 조회 추억 id, 제목 필드 추가 * feat: 마지막 위치 위경도 찾기 * refactor: 안드로이드 1차 QA 반영 #299 (#301) * refactor: 안드로이드 1차 QA 반영 * refactor: 안드로이드 1차 QA 반영2 * refactor: 안드로이드 1차 QA 반영3 * refactor: 삭제 메시지 변경 * fix: 스타카토 조회 화면 스택 관리 및 ui 수정 #304 (#306) * feat: 지도 화면에서 스타카토 조회 화면으로 이동 시 스택 관리 * feat: 타임라인 화면에서 추억이 존재하지 않을 때 추억 생성 버튼 추가 * ui: 스타카토 조회 화면 툴바 위치 고정 * build: Android CD 적용 #300 (#308) * build: CD 워크플로우 yml 파일 작성 * build: keystore 접근을 위한 build.gradle.kts 파일 설정 * build: 기존 apk 추출 ci 파일 수정 - demo 버전의 apk를 추출 및 배포하는 목적에 맞게 파일 명 수정 - apk 빌드 후 테스트를 수행하는 job 추가 - firebase 앱 배포에 아티팩트 업로드하는 job 추가 * fix: ci 파일에도 keystore 생성 job 추가 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 수정 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정 * fix: 키스토어 환경변수를 base64로 디코딩하는 명령어 재수정 * fix: ci 파일에 키스토어 관련 설정 적용 * fix: 키스토어 관련 명령어 일부 수정 * fix: build.gradle.kts 불필요한 괄호 제거 * fix: keystore.properties 로 부터 프로퍼티를 가져오는 형식 변경 * fix: upload-artifact step에서 빌드 파일의 upload 경로 수정 (#316) upload-artifact 는 defaults 설정의 working-directory 경로가 적용되지 않음 * fix: android cd 재수정 (2차) #317 (#319) * fix: upload-artifact 빌드 파일의 upload 경로 3차 수정 * fix: 배포 시 빌드 파일의 경로 수정 * fix: 빌드 파일의 upload 경로 수정 및 파일이 없는 경우 에러 처리 * fix: 빌드 파일의 upload 경로 4차 수정 * fix: 빌드 파일의 upload 경로 5차 수정 * fix: 빌드 파일의 upload 경로 6차 수정 - 디렉터리 경로 생성 후 upload 실행 * fix: 빌드 파일의 upload 경로 7차 수정 github의 workspace 환경변수(절대경로) 활용 * fix: clean test 제거 및 디버그용 파일 경로 탐색 명령어 추가 * fix: 디버그용 파일 경로 검색 명령어 수정 * fix: 디버그용 파일 경로 검색 명령어 삭제 * fix: 디버그용 파일 검색 명령어 삭제 및 업로드 파일 경로명 수정 * feat: 스타카토 생성 시 현 위치의 주소를 가져오는 기능 구현 #314 (#324) * feat: MainActivity에서 주소를 가져오는 로직 삭제 * feat: 스타카토 생성 시 현 위치의 주소를 가져오는 로직 구현 * refactor: 메서드 순서 정렬 * refactor: 스타카토 조회 화면 ViewPager2 적용 및 UI 아이콘 개선 #318 (#320) * refactor: 아이콘 추가 및 UI 개선 * feat: 스타카토 상세 사진 Viewpager 적용 * feat: 스타카토 상세 사진 Viewpager에 dot indicator 추가 * style: ktLint Format * feat: 메인 지도 화면에서 스타카토 생성하는 플로우 구현 #321 (#327) * feat: 날짜로 추억 목록 불러오는 getMemories API 추가 * feat: 메인에서 스타카토 생성 시 추억 목록 선택 가능 * feat: 스타카토 생성 시 역지오코딩과 추억 선택 연동 * build: debug와 release로 buildTypes 분리 (#329) - appName, appId, baseUrl 분리 - release에 난독화 적용 * build: debug 와 release 배포 분기에 따른 CD 수정 - CD에 대한 트리거 재설정 : main 브랜치에 대한 push 및 pr * fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 #326 (#330) * refactor: 지도 화면 onResume에서 스타카토 목록 load * refactor: 스타카토 목록 로드 메서드명 변경 - 이전: loadMoments - 이후: loadStaccatos * feat: 공유 view model에 스타카토 목록 업데이트 상태 추가 * fix: 스타카토 생성, 삭제 후 지도 화면의 마커가 갱신되지 않는 오류 해결 * feat: 지도 로드 시 현위치로 이동하도록 구현 * build: ci 및 cd 파일 수정 ci - 불필요한 gradle 빌드 및 테스트 제거 cd - 타겟 브랜치 develop 제거 * feat: 댓글 조회, 생성, 삭제 기능 구현 #290 (#331) * feat: 기분 수정 요청을 보내는 Request Dto 작성 * feat: MomentApiService 에 기분 수정 요청에 대한 API 작성 * feat: 기분 수정 요청에 대한 DataSource 메서드 작성 * feat: 기분 도메인 모델 생성 * feat: 기분 도메인을 기분 수정 Request로 변환하는 메서드 작성 * ui: 기분 아이콘 이미지 리소스 추가 * ui: 기분 아이콘의 테두리를 selector로 생성 - 선택/미선택에 따라 다른 ui를 나타낸다 * ui: 기분 아이콘에 사용할 style 지정 * fix: API 변경에 따라 DTO 및 Mapper 변경 - 순간(현 스타카토)의 visitedAt의 타입을 LocalDate에서 LocalDateTime으로 변경 * fix: 순간 DTO에 기분 필드 추가 - 순간 Dto에 기분(Feeling) 필드를 추가함에 따라 Mapper 및 도메인 수정 * feat: 기분 선택 api에 필요한 repository 메서드 작성 * feat: 기분 uiModel 생성 * feat: 댓글에 대한 UI 모델 생성 * feat: 순간(현 스타카토) 상세 정보에 대한 UI 모델 생성 * feat: 기분 ImageView 의 선택 상태 바인딩 어댑터 작성 * feat: 댓글 화면 구성 및 Adapter, Fragment 작성 * feat: 순간(현 스타카토)의 Ui Model Mapper 변경 MomentDetailUiModel.CommentsUiModel -> CommentUiModel MomentDetailUiModel.MomentDefaultUiModel -> MomentDetailUiModel Feeling을 Ui Model로 변환하는 Mapper 추가 * feat: 기분 선택 View 구성 및 Fragment, ViewModel, Adapter, Handler 작성 * feat: 순간 상세에 대한 View 구성 및 Fragment, ViewModel 작성 * fix: 기분 선택 클릭 리스너와 바인딩 어댑터 설정 및 View 수정 * fix: 누락된 ViewModel 데이터 바인딩 설정 * feat: 순간 조회 화면 재구성 * refactor: 네비게이션 action 및 id 네이밍 수정 visit -> moment로 수정 * refactor: 방문 -> 순간 으로 키워드 변경 * refactor: 불필요한 클래스 및 xml 파일 제거 * ui: xml 컨벤션에 맞추어진 타 사용자의 댓글 ui 구성 * feat: 댓글 API의 DTO 작성 * feat: 댓글 API Service 작성 * feat: 댓글 CRUD DataSource 작성 * refactor: CommentApiService 각 메서드의 반환 값을 Response로 변경 * feat: CommentApiService 를 create * feat: CommentDataSource 구현체 생성 * refactor: 댓글 Dto 클래스 네이밍 변경 - VisitLogDto -> CommentDto * refactor: CommentDto 의 ID 프로퍼티 네이밍 변경 - visitLogId -> commentId * refactor: VisitLog 도메인 모델 클래스의 네이밍 변경 - VisitLog -> Comment * refactor: Comment 도메인 모델의 ID 프로퍼티 네이밍 변경 - visitLogId -> commentId * feat: 새로운 댓글 도메인 모델 생성 * feat: CommentRepository 작성 * feat: Domain 모델과 DTO 모델을 변환해주는 Mapper 작성 - CommentDto를 Comment로 변환하는 메서드를 CommentMapper.kt로 이동 * feat: CommentRepository의 기본 구현체 작성 * feat: 댓글 ViewModel, Factory 작성 및 Comment 불러오기 구현 * ui: ViewModel 데이터바인딩 및 빈 댓글 문구에 대한 strings 설정 * feat: CommentsViewModel 활용 및 옵저빙 * feat: 댓글 조회, 생성, 삭제 기능 구현 * chore: ktlint 적용 * feat: 추억 생성 및 수정 이미지 로딩 중 표시 및 저장 버튼 비활성화 #332 (#334) * feat: 추억 생성 이미지 로딩 중 표시 * feat: 추억 수정 이미지 로딩 중 표시 * feat: 추억 생성 및 수정 이미지 로딩 중 저장 버튼 비활성화 * style: formatting * refactor: 댓글 화면 개선 및 리팩터링 #333 (#335) * fix: merge conflicts 해결 * fix: 글자 수 제한 500자로 수정 * style: ktlint 체크 * build: CD 수정 - 구글 플레이스토어 업로드 스텝 추가 * build: defaultConfig의 버전 코드와 이름 수정 versionCode : 2 -> 3 versionName : 1.1 -> 1.0.0 (배포 버전과 동일) * refactor: 패키지명 변경 #342 (#343) - 5차 스프린트 요구사항 만족을 위해 패키지명 변경 - 이전: com.woowacourse.staccato - 이후: com.on.staccato * ui: 타임라인 화면 디자인 수정 #347 (#348) * layout: 타임라인 디자인 수정 및 STATE_HALF_EXPANDED 구현 * chore: 불필요한 파일 삭제 * chore: 수정된 패키지명 반영 * layout: empty 추억 view 높이 조절 * layout: 기분 선택 여부 컬러/흑백 처리 * ui: 추억 화면 디자인 수정 및 추억 생성 플로우 변경 #346 (#355) * ui: 추억 썸네일 이미지용 gradient drawable 구현 * ui: 스타카토 썸네일 이미지용 gradient drawable 구현 * ui: 추억 조회 화면 ui 수정 - 추억 상세 내용 ui 수정 - 스타카토 목록 ui 수정 * ui: 스타카토 추가 버튼 수정 * feat: 홈 화면의 추억 생성 플로우 제거 - 홈 화면에서는 스타카토 생성만 가능하게 변경 * ui: 추억 생성 및 수정 화면 toolbar 제목 추가 * ui: 스타카토 생성 및 수정 화면 toolbar 제목 추가 * ui: 타임라인 화면 추억 추가 및 정렬 버튼 추가 * style: formatting * refactor: 댓글 화면 개선 #333 (#354) * fix: merge conflicts 해결 * fix: 글자 수 제한 500자로 수정 * style: ktlint 체크 * build: CD 수정 - 구글 플레이스토어 업로드 스텝 추가 * ui: 댓글 구성요소의 UI 개선 RecyclerView - 아이템 변화 시 애니메이션 효과 제거 - 스크롤 시 물결 무늬 애니메이션 제거 - 최소 높이 지정 댓글이 없는 경우의 Default View - 높이 및 마진 조정 * refactor: UserInfoSharedPreferences의 파일, 키 이름 변경 - 패키지명 변경에 따라 해당 SF가 사용하는 파일, 키 이름 변경 * fix: xml 속성 수정 - layout_marginBottom 오타 수정 - app:itemAnimator 속성 제거 * feat: 댓글 입력 중 화면 터치 시 키보드 비활성화 구현 - MainActivity 에서 dispatchTouchEvent 를 오버라이드하여, focus 된 EditText의 focus를 해제하고, 키보드를 숨김처리하도록 구현 * ui: RecyclerView와 댓글이 없을 때 View의 높이 조정 * feat: 리사이클러뷰 애니메이션 효과 제거 및 adapter 설정 메서드명 변경 * feat: 댓글 수정하기 메뉴 제거 및 댓글 삭제 시 삭제 다이얼로그를 띄우도록 변경 --------- Co-authored-by: Somin Lee <46596035+s6m1n@users.noreply.github.com> Co-authored-by: hodu <92203597+Junyoung-WON@users.noreply.github.com> Co-authored-by: Junyoung-WON Co-authored-by: s6m1n * style: code convention 적용 * fix: 중복 닉네임 입력 시 유저 정보 불러오도록 수정 #344 (#345) * build: develop 브랜치 배포 트리거 추가 * fix: 중복 닉네임 사용 가능하도록 수정 * style: code convention 적용 * fix: 사용자의 추억 내에서 중복 제목 검증하도록 수정 #365 (#366) * chore: android/backed path & trigger 수정 #367 (#368) * chore: BE/AN path 지정 및 trigger 수정 * chore: BE/AN trigger 수정 * chore: BE trigger 수정 * chore: path 오류 수정 --------- Co-authored-by: somin Co-authored-by: BurningFalls Co-authored-by: devhoya97 Co-authored-by: YoonJuHo Co-authored-by: Hyeyeon Gong <103019852+hxeyexn@users.noreply.github.com> Co-authored-by: hodu <92203597+Junyoung-WON@users.noreply.github.com> Co-authored-by: devhoya97 <146502065+devhoya97@users.noreply.github.com> Co-authored-by: Somin Lee <46596035+s6m1n@users.noreply.github.com> Co-authored-by: Junyoung-WON Co-authored-by: hxeyexn --- .github/workflows/android-cd.yml | 3 +- ...ml => android-ci-cd-demo-apk.yml.disabled} | 3 +- .github/workflows/android-ci.yml | 68 ++----------------- .github/workflows/backend-ci-cd-dev.yml | 1 + .github/workflows/backend-ci-cd-prod.yml | 1 + .github/workflows/backend-ci-cd-stage.yml | 1 + .github/workflows/backend-ci.yml | 1 + .../repository/MemoryMemberRepository.java | 3 + .../memory/repository/MemoryRepository.java | 1 - .../memory/service/MemoryService.java | 10 +-- .../memory/service/MemoryServiceTest.java | 15 +++- 11 files changed, 32 insertions(+), 75 deletions(-) rename .github/workflows/{android-ci-cd-demo-apk.yml => android-ci-cd-demo-apk.yml.disabled} (98%) diff --git a/.github/workflows/android-cd.yml b/.github/workflows/android-cd.yml index ff40666dc..413857c5e 100644 --- a/.github/workflows/android-cd.yml +++ b/.github/workflows/android-cd.yml @@ -2,8 +2,7 @@ name: Android CI/CD for release on: push: - branches: [ "main" ] - pull_request: + paths: 'android/**' branches: [ "main" ] env: diff --git a/.github/workflows/android-ci-cd-demo-apk.yml b/.github/workflows/android-ci-cd-demo-apk.yml.disabled similarity index 98% rename from .github/workflows/android-ci-cd-demo-apk.yml rename to .github/workflows/android-ci-cd-demo-apk.yml.disabled index 8d1bf76ac..79dfd12f1 100644 --- a/.github/workflows/android-ci-cd-demo-apk.yml +++ b/.github/workflows/android-ci-cd-demo-apk.yml.disabled @@ -2,8 +2,7 @@ name: Android CI/CD for generating demo APK on: push: - branches: [ "develop" ] - pull_request: + paths: 'android/**' branches: [ "develop" ] env: diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 3c3258493..baeac0ce0 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -1,9 +1,8 @@ name: Android CI for develop-an on: - push: - branches: [ "develop-an" ] pull_request: + paths: 'android/**' branches: [ "develop-an" ] env: @@ -68,70 +67,11 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Clean test - run: ./gradlew clean test - - build: - needs: test - name: Build and Run - runs-on: ubuntu-latest - - defaults: - run: - shell: bash - working-directory: ./android/Staccato_AN - - permissions: - contents: read - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - cache: gradle - - - name: Create local.properties - run: | - touch local.properties - shell: bash - - - name: Set Base Url in local.properties - run: | - echo "base_url=\"$BASE_URL\"" >> local.properties - shell: bash - - - name: Create google-services.json - run: | - echo $GOOGLE_SERVICES_JSON > ./app/google-services.json - shell: bash - - - name: Create secrets.properties - run: | - echo $SECRETS_PROPERTIES > secrets.properties - shell: bash - - - name: Create local.defaults.properties - run: | - echo $LOCAL_DEFAULTS_PROPERTIES > local.defaults.properties - shell: bash - - - name: Create KeyStore File and Properties - run: | - mkdir -p ./app/signing - echo "$UPLOAD_KEY_STORE_JKS" | base64 --decode > ./app/signing/upload_key_store.jks - echo "$KEY_STORE_PROPERTIES" > ./app/signing/keystore.properties - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Run ktlint run: ./gradlew ktlintCheck + - name: Run test + run: ./gradlew test + - name: Build with Gradle run: ./gradlew build diff --git a/.github/workflows/backend-ci-cd-dev.yml b/.github/workflows/backend-ci-cd-dev.yml index c92e4f4cb..0099e7967 100644 --- a/.github/workflows/backend-ci-cd-dev.yml +++ b/.github/workflows/backend-ci-cd-dev.yml @@ -2,6 +2,7 @@ name: Backend CI/CD dev on: pull_request: + paths: 'backend/**' branches: [ "develop-be", "develop" ] jobs: diff --git a/.github/workflows/backend-ci-cd-prod.yml b/.github/workflows/backend-ci-cd-prod.yml index ec42030b7..e91eaa781 100644 --- a/.github/workflows/backend-ci-cd-prod.yml +++ b/.github/workflows/backend-ci-cd-prod.yml @@ -2,6 +2,7 @@ name: Backend CI/CD prod on: push: + paths: 'backend/**' branches: ["main"] jobs: diff --git a/.github/workflows/backend-ci-cd-stage.yml b/.github/workflows/backend-ci-cd-stage.yml index 70c341f41..999fff3e5 100644 --- a/.github/workflows/backend-ci-cd-stage.yml +++ b/.github/workflows/backend-ci-cd-stage.yml @@ -2,6 +2,7 @@ name: Backend CI/CD stage on: push: + paths: 'backend/**' branches: [ "develop-be", "develop" ] jobs: diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index 6cb242694..44e07d7b6 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -2,6 +2,7 @@ name: Backend CI on: pull_request: + paths: 'backend/**' branches: [ "develop-be", "develop", "main" ] permissions: write-all diff --git a/backend/src/main/java/com/staccato/memory/repository/MemoryMemberRepository.java b/backend/src/main/java/com/staccato/memory/repository/MemoryMemberRepository.java index b21768370..dd7ac4b17 100644 --- a/backend/src/main/java/com/staccato/memory/repository/MemoryMemberRepository.java +++ b/backend/src/main/java/com/staccato/memory/repository/MemoryMemberRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import com.staccato.member.domain.Member; import com.staccato.memory.domain.MemoryMember; public interface MemoryMemberRepository extends JpaRepository { @@ -19,4 +20,6 @@ public interface MemoryMemberRepository extends JpaRepository findAllByMemberIdAndIncludingDateOrderByCreatedAtDesc(@Param("memberId") long memberId, @Param("date") LocalDate date); + + boolean existsByMemberAndMemoryTitle(Member member, String title); } diff --git a/backend/src/main/java/com/staccato/memory/repository/MemoryRepository.java b/backend/src/main/java/com/staccato/memory/repository/MemoryRepository.java index 76e006028..3d2fd7114 100644 --- a/backend/src/main/java/com/staccato/memory/repository/MemoryRepository.java +++ b/backend/src/main/java/com/staccato/memory/repository/MemoryRepository.java @@ -5,5 +5,4 @@ import com.staccato.memory.domain.Memory; public interface MemoryRepository extends JpaRepository { - boolean existsByTitle(String title); } diff --git a/backend/src/main/java/com/staccato/memory/service/MemoryService.java b/backend/src/main/java/com/staccato/memory/service/MemoryService.java index 6cc89e30c..df4221475 100644 --- a/backend/src/main/java/com/staccato/memory/service/MemoryService.java +++ b/backend/src/main/java/com/staccato/memory/service/MemoryService.java @@ -34,8 +34,8 @@ public class MemoryService { @Transactional public MemoryIdResponse createMemory(MemoryRequest memoryRequest, Member member) { - validateMemoryTitle(memoryRequest.memoryTitle()); Memory memory = memoryRequest.toMemory(); + validateMemoryTitle(memory, member); memory.addMemoryMember(member); memoryRepository.save(memory); return new MemoryIdResponse(memory.getId()); @@ -83,10 +83,10 @@ private String getMomentThumbnail(Moment moment) { public void updateMemory(MemoryRequest memoryRequest, Long memoryId, Member member) { Memory originMemory = getMemoryById(memoryId); validateOwner(originMemory, member); + Memory updatedMemory = memoryRequest.toMemory(); if (originMemory.isNotSameTitle(memoryRequest.memoryTitle())) { - validateMemoryTitle(memoryRequest.memoryTitle()); + validateMemoryTitle(updatedMemory, member); } - Memory updatedMemory = memoryRequest.toMemory(); List moments = momentRepository.findAllByMemoryIdOrderByVisitedAt(memoryId); originMemory.update(updatedMemory, moments); } @@ -96,8 +96,8 @@ private Memory getMemoryById(long memoryId) { .orElseThrow(() -> new StaccatoException("요청하신 추억을 찾을 수 없어요.")); } - private void validateMemoryTitle(String title) { - if (memoryRepository.existsByTitle(title)) { + private void validateMemoryTitle(Memory memory, Member member) { + if (memoryMemberRepository.existsByMemberAndMemoryTitle(member, memory.getTitle())) { throw new StaccatoException("같은 이름을 가진 추억이 있어요. 다른 이름으로 설정해주세요."); } } diff --git a/backend/src/test/java/com/staccato/memory/service/MemoryServiceTest.java b/backend/src/test/java/com/staccato/memory/service/MemoryServiceTest.java index 13739d7df..ac3ac7585 100644 --- a/backend/src/test/java/com/staccato/memory/service/MemoryServiceTest.java +++ b/backend/src/test/java/com/staccato/memory/service/MemoryServiceTest.java @@ -82,7 +82,7 @@ void createMemory() { ); } - @DisplayName("이미 존재하는 추억 이름으로 추억을 생성할 수 없다.") + @DisplayName("사용자의 추억 중 이미 존재하는 추억 이름으로 추억을 생성할 수 없다.") @Test void cannotCreateMemoryByDuplicatedTitle() { // given @@ -96,6 +96,19 @@ void cannotCreateMemoryByDuplicatedTitle() { .hasMessage("같은 이름을 가진 추억이 있어요. 다른 이름으로 설정해주세요."); } + @DisplayName("다른 사용자의 이미 존재하는 추억 이름으로 추억을 생성할 수 있다.") + @Test + void canCreateMemoryByDuplicatedTitleOfOther() { + // given + MemoryRequest memoryRequest = MemoryRequestFixture.create(LocalDate.of(2024, 7, 1), LocalDate.of(2024, 7, 10)); + Member member = memberRepository.save(MemberFixture.create()); + Member otherMember = memberRepository.save(MemberFixture.create("other")); + memoryService.createMemory(memoryRequest, otherMember); + + // when & then + assertThatNoException().isThrownBy(() -> memoryService.createMemory(memoryRequest, member)); + } + @DisplayName("현재 날짜를 포함하는 모든 추억 목록을 조회한다.") @MethodSource("dateProvider") @ParameterizedTest