-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Elasticache for Redis를 도입하여 캐싱 적용 #86
The head ref may contain hidden characters: "MOCACONG-258-\uBC31-Elasticache"
Conversation
public CacheManager accessTokenCacheManager(RedisConnectionFactory redisConnectionFactory) { | ||
/* | ||
* accessToken 시간만큼 ttl 설정하되, | ||
* 만료 직전 캐시 조회하여 로그인 안되는 동시성 이슈 방지를 위해 accessToken ttl 보다 30분 일찍 만료 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
accessToken 관련 캐시 ttl을 12시간으로 하려다가, 모카콩 접속 시간이 30분 이상일 듯하지 않아서 30분으로 설정했습니다. 괜찮은지 모르겠네요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사용자가 모카콩을 오래 접속하진 않을 거 같진 않아서 30분 혹은 1시간으로 설정해도 될 거 같아요
import org.springframework.cloud.openfeign.FeignClient; | ||
import org.springframework.web.bind.annotation.GetMapping; | ||
|
||
@FeignClient(name = "apple-public-key-client", url = "https://appleid.apple.com/auth") | ||
public interface AppleClient { | ||
|
||
@Cacheable(value = "oauthPublicKeyCache", cacheManager = "oauthPublicKeyCacheManager") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Cacheable
: cache 값이 있으면 해당 값으로 조회
캐시 매니저는 oauthPublicKeyCacheManager
(RedisCacheConfig.class 에 지정한 매니저) 로 설정한다는 의미입니다.
@@ -28,6 +29,7 @@ public class AuthService { | |||
private final AppleOAuthUserProvider appleOAuthUserProvider; | |||
private final KakaoOAuthUserProvider kakaoOAuthUserProvider; | |||
|
|||
@Cacheable(key = "#request.email", value = "accessTokenCache", cacheManager = "accessTokenCacheManager") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
key
값으로 서로 다른 이메일에 대해서는 서로 다른 accessTokenCache로 구별되도록 했습니다.
@@ -177,6 +180,7 @@ public MyCommentCafesResponse findMyCommentCafes(String email, int page, int cou | |||
return new MyCommentCafesResponse(comments.isLast(), responses); | |||
} | |||
|
|||
@CacheEvict(key = "#mapId", value = "cafePreviewCache") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
리뷰 작성, 즐겨찾기 작성, 즐겨찾기 삭제 작업이 일어나면 카페 관련 캐시가 삭제되도록 했습니다.
@@ -41,6 +42,7 @@ dependencies { | |||
annotationProcessor 'org.projectlombok:lombok' | |||
testImplementation 'org.springframework.boot:spring-boot-starter-test' | |||
testImplementation 'io.rest-assured:rest-assured' | |||
testImplementation 'it.ozimov:embedded-redis:0.7.2' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
테스트 환경에서는 실제 redis를 쓰는 것을 지양해야될 뿐더러, elasticache를 사용할 수도 없습니다. 그렇기 때문에 테스트용 embedded-redis 를 추가했습니다.
최신 버전 0.7.3
은 Slf4j를 사용하여 logback과 충돌 이슈가 발생합니다. 따라서 0.7.2로 설정했습니다.
ozimov/embedded-redis#18 (comment)
+) 저 깃허브 이슈 링크 남기니까, 해당 이슈에 제 닉네임이 박제됐네요..ㅋㅋㅋ
try { | ||
redisServer = RedisServer.builder() | ||
.port(port) | ||
.setting("maxmemory 256M") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
embedded-redis
는 메모리 할당을 직접 해주어야 문제가 생기지 않아서 256M 정도로 설정했습니다. (보통은 128M로 하는 것 같아요)
@@ -197,11 +195,9 @@ void previewCafeWithScore() { | |||
favoriteRepository.save(new Favorite(member1, cafe)); | |||
|
|||
PreviewCafeResponse actual1 = cafeService.previewCafeByMapId(member1.getEmail(), cafe.getMapId()); | |||
PreviewCafeResponse actual2 = cafeService.previewCafeByMapId(member2.getEmail(), cafe.getMapId()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
캐싱이 일어나서 actual1이 그대로 반환됩니다.
따라서 제거했습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
변수명을 actual로 변경하는 거 어떠세요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
동작 확인했습니다. 확실히 캐싱을 적용하니 효과가 좋네요 👍 기능상에는 문제가 없어 approve했지만 코멘트 확인해주세요~
@@ -197,11 +195,9 @@ void previewCafeWithScore() { | |||
favoriteRepository.save(new Favorite(member1, cafe)); | |||
|
|||
PreviewCafeResponse actual1 = cafeService.previewCafeByMapId(member1.getEmail(), cafe.getMapId()); | |||
PreviewCafeResponse actual2 = cafeService.previewCafeByMapId(member2.getEmail(), cafe.getMapId()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
변수명을 actual로 변경하는 거 어떠세요?
@@ -226,11 +222,9 @@ void previewCafeWithScoreAndReview() { | |||
favoriteRepository.save(new Favorite(member1, cafe)); | |||
|
|||
PreviewCafeResponse actual1 = cafeService.previewCafeByMapId(member1.getEmail(), cafe.getMapId()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기서도 acutal1 -> actual 로 변경하면 좋을 거 같아요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네 좋습니다~
* docs: Git 풀 리퀘스트 템플릿 문서 작성 (#2) Git PR 템플릿 문서로 자동 생성되도록 작성 * feat: github actions CI 스크립트 작성 (#3) * feat: 비밀번호 암호화 로직 구현 (#4) * feat: application.yml 환경 설정 파일 작성 * feat: 회원 가입 및 탈퇴 로직 구현 * feat: 비밀번호 암호화 로직 구현 * refact: WebSercurityConfigurerAdapter 제거하여 로직 작성 --------- Co-authored-by: kth990303 <[email protected]> * feat: 회원가입 POST api 구현 및 엔티티 컬럼 변경 (#5) * feat: api 스펙 변경으로 인한 phone 컬럼 추가 * feat: 회원가입 POST API 구현 * feat: swagger 환경설정 및 api 적용 (#7) * feat: 배포 환경에서 h2-console 원격 연결 `web-allow-others` 임시 허용 * feat: 카페 관련 엔티티 작성 (#6) * feat: 카페 세부정보 enum 객체 및 예외 생성 * refact: 예외 클래스에 에러 메시지를 명시하도록 변경 * feat: 카페 엔티티 초기 구현 * style: SecurityConfig 클래스 띄어쓰기 컨벤션 적용 * feat: 카페 세부정보 갱신 로직 작성 * fix: 카페 세부정보 api 변경에 따른 enum value 수정 * feat: 카페 엔티티에 좌표 추가 구현 * refactor: 좌표 타입 `BigDecimal`로 모두 변환 * fix: 카페에 특정 세부정보 리뷰가 없을 경우 해당 타입은 null을 반환하도록 변경 * feat: 로그인 및 토큰 발급 POST api 구현 (#8) * feat: 인터셉터 로그인 구현 * feat: 로그인 및 토큰 발급 POST api 구현 * style: 주석 삭제 * feat: 리팩토링 및 회원 로그인 예외 처리 및 JWT 토큰 페이로드 확인 기능 추가 * fix: AuthAcceptanceTest에서 발생한 버그 수정 * feat: JwtTokenProvider 테스트 추가 및 파일명 변경 * feat: 인증 바인딩 어노테이션 구현 * fix: swagger request 허용 * style: 띄어쓰기 컨벤션 수정 --------- Co-authored-by: TaeHyeon Kim <[email protected]> * feat: 통합 및 인수테스트 격리 틀 세팅 구현 (#9) * fix: `Score` Entity 누락된 id 컬럼명 설정 * feat: 테스트 간 db truncate 및 id restart 1 세팅 구현 * refact: `InitializingBean` 대신 `@PostConstruct` 사용함으로써 의존성 제거 * feat: `@ServiceTest` 적용 안된 통합테스트에 적용 * feat: ControllerAdvice에서의 exceptionHandler를 이용한 예외 dto 처리 구현 (#11) * feat: 회원 정보 필드 검증 로직 구현 * feat: 커스텀 예외 적용 * feat: 예외 반환 dto를 받는 controller advice 구현 * feat: 비밀번호 검증 로직 위치 변경 및 테스트 픽스쳐 비밀번호 형식 적용 * feat: dto 검증 `@Valid` 추가 * feat: 회원탈퇴 DELETE api 구현 (#10) * feat: 회원 탈퇴 DELETE API 구현 및 회원 탈퇴 테스트 코드 수정 * feat: 회원 탈퇴 인수 테스트 코드 작성 * style: 기능 구현에 불필요한 코드 삭제 * style: delete 메서드 파라미터 타입 변경 * fix: argument resolver `WebConfig`에 등록 * refact: `LoginUserEmail` 디렉토리 위치 변경 * test: 패스워드 형식에 맞게 변경 * test: 인수테스트 픽스쳐 생성 --------- Co-authored-by: kth990303 <[email protected]> * fix: swagger ui `AuthenticationPrincipal` api spec에서 hidden 처리 * feat: 회원가입 시 중복체크 api 구현 (#12) * feat: 이메일 중복체크 API 구현 * test: 이메일 중복체크 테스트 코드 추가 * test: 이메일 중복체크 인수테스트 코드 추가 및 파라미터 이름 변경 * feat: 닉네임 중복체크 api 구현 및 테스트코드 작성 * test: 닉네임 중복체크 인수테스트 코드 작성 * feat: IsDuplicateResponse DTO 객체 생성 * fix: 회원가입 시 중복체크 메서드 수정 * fix: 회원가입 시 중복체크 메서드 수정 및 이메일 커스텀 예외 추가 * fix: 회원가입 시 중복체크 테스트 코드 수정 * fix: 회원가입 시 중복체크 인수 테스트 코드 수정 및 null체크 인수 테스트 삭제 * style: boolean 변경 및 접근제어자 변경 * feat: 회원 전체조회 api 구현 (#13) * feat: 회원 전체조회 DTO 추가 * feat: 회원 전체조회 API 기능 구현 * test: 회원 전체조회 테스트 코드 작성 * fix: 비즈니스 로직 이동 및 인수테스트 추가 * fix: 회원 전체조회 인수테스트 수정 * style: getAllMembers 반환타입 수정 * fix: `api docs`와 다른 response spec 변경 (#15) * feat: 회원 전체삭제 delete api 구현 (#14) * feat: 회원 전체삭제 기능 구현 * test: 회원 전체삭제 테스트 및 인수테스트 작성 * style: 필요없는 애노테이션 삭제 * fix: conflicts 에러 해결 * fix: conflicts 에러 해결 * fix: conflicts 에러 해결 * style: 접근 제어자 변경 및 deleteAll 코드 로직 변경 * feat: 텀블러 할인 정보 제거 (#16) * feat: 카페 등록 post api 구현 (#17) * feat: 카페 등록 POST API 구현 및 테스트 작성 * test: 카페 등록 인수테스트 작성 * style: 코드 간 공백 제거 * style: 메서드 명 변경 및 공백 수정 * style: 불필요한 코드 제거 * delete: CoordinateTest 제거 * fix: '/cafes' 인터셉터 처리 제외 * �fix: 브랜치 병합으로 인한 Cafe 테스트 깨지는 현상 수정 (#18) * feat: 카페 등록 POST API 구현 및 테스트 작성 * test: 카페 등록 인수테스트 작성 * style: 코드 간 공백 제거 * style: 메서드 명 변경 및 공백 수정 * feat: Post에 해당하는 '/cafes' 만 인터셉터 처리 제외 기능 추가 * style: 불필요한 코드 제거 * delete: CoordinateTest 제거 * fix: '/cafes' 와 일치하는 경우에만 인터셉터 처리에서 제외 * fix: preHandle 수정 및 '/cafes/**' 인터셉터 처리제외 추가 * fix: '/cafes' 인터셉터 처리 제외 * fix: Cafe 테스트 tumbler 인자 삭제 * feat: 여러 쿼리가 나가는 메서드에 `@Transactional` 추가 * feat: RDS 연동 및 prod.yml 생성 * feat: `spring.config.activate.on-profile` 설정 변경 * feat: 카페 정보 조회 api 구현 (#19) * feat: 여러 쿼리가 나가는 메서드에 `@Transactional` 추가 * feat: studyType 정보를 별도의 생명주기를 가지도록 구현 * refact: 생성자로 들어오는 `mapId` 네이밍을 `id`에서 `mapId`로 변경 * fix: MySQL 예약어에 해당되는 컬럼명 변경 `value` -> `studyTypeValue` * feat: 카페 정보 조회 비즈니스 로직 작성 * feat: 카페 정보 조회 api 구현 * fix: 인증 필요한 api 에 `@SecurityRequirement(name = "JWT")` 추가 * feat: prod 파일 설정 변경 * feat: prod 파일 설정 변경 spring boot 2.4부터 `profiles.active` 설정 안됨. `application-{profile}.yml` 파일명 자동인식 이용 * feat: 카페에 대한 리뷰 작성 api 구현 (#20) * refact: `studyTypeValue`가 대문자로 들어오더라도 소문자로 처리해주도록 변경 * feat: 카페에 대한 리뷰 작성 비즈니스 로직 구현 * feat: 카페에 대한 리뷰 작성 api 구현 * refact: 불필요하게 StudyType 전체를 조회하는 로직 개선 및 JPQL 쿼리 튜닝 * refact: 불필요하게 Review 전체를 조회하는 로직 개선 및 JPQL 쿼리 튜닝 * test: JPQL 테스트 코드 작성 * feat: 카페 댓글 작성 기능 구현 (#21) * feat: 코멘트 도메인 로직 및 길이 검증 테스트 작성 * feat: 코멘트 작성 비즈니스 로직 작성 * feat: 코멘트 도메인에게 책임 위임 * feat: 코멘트 작성 기능 추가에 따른 카페 정보 조회 로직 추가 구현 * feat: 코멘트 작성 api 구현 * chore: imgUrl 관련 TODO 주석 추가 * fix: Json 직렬화 조건으로 인한 response 변경 * feat: 카페에 대한 리뷰 수정 api 구현 (#24) * feat: 카페 세부정보 수정 비즈니스 로직 구현 * fix: 메서드 분리 및 파라미터 변경 * test: 카페 세부정보 변경 테스트 추가 * test: 카페 세부정보 수정 인수테스트 작성 * style: 공백 제거 * style: 예외메시지 수정 * style: 타입 Optional 수정 * fix: @Setter 제거 및 CafeReviewUpdate DTO 생성 * fix: setter 삭제 및 생성자로 리뷰 수정 기능 변경 * fix: Entity에 JPA 변경감지 이용한 수정기능 적용 * fix: updatedCafeDetail에서 null 처리 추가 * test: 수정 메서드 검증 테스트 추가 * feat: 카페 목록 필터링 조회 get api 구현 (#25) * feat: 카페 필터링 조회 비즈니스 로직 구현 * test: 카페 필터링 조회 테스트 코드 작성 * fix: CafeFilter DTO 적용 * test: 카페 필터링 조회 인수 테스트 코드 작성 * feat: 카페 즐겨찾기 등록 api 구현 (#26) * feat: 카페 즐겨찾기 비즈니스 로직 구현 * feat: 카페 즐겨찾기 등록 api 구현 * feat: 즐겨찾기 추가에 따른 카페 조회 response body 정보 추가 * feat: 중복 즐겨찾기 예외처리 구현 * refact: 커버링 인덱스 조회하도록 쿼리튜닝 * feat: 초성, 중성, 종성 분리 닉네임 검증 허용 (#27) * feat: aws S3와 연동하여 프로필 이미지 변경 기능 구현 (#28) * feat: aws S3 연동 후 이미지 파일 업로드 비즈니스 로직 구현 * test: 테스트 yml 분리 및 mockito 이용한 테스트 코드 작성 * feat: 프로필 이미지 변경 api 구현 * feat: imgUrl 컬럼 추가에 따른 댓글 작성자 프로필 이미지 반환 기능 추가 * fix: 누락된 `@SecurityRequirement(name = "JWT")` 추가 * fix: 특정 카페 조회 api response 변경 (#29) * feat: CafeDetail 에서 각 세부정보의 value 값을 받을 수 있도록 구현 * feat: 값 객체 컬럼이 모두 null이어도 해당 객체 자체는 null이 되지 않도록 설정 * feat: 카페 세부정보 반환 api 변경 * refact: import 순서 변경 및 getter 중복 호출 제거 * feat: 마이페이지 조회 api 구현 (#31) * feat: 마이페이지 정보 조회 비즈니스 로직 구현 * feat: 마이페이지 정보 조회 api 구현 * feat: 생성 및 수정 시각 저장 엔티티 구현 (#30) * feat: BaseTimeEntity 생성 * test: 멤버 엔티티 생성 시각 저장 테스트코드 추가 * feat: BaseTime 엔티티 상속 추가 * style: CafeDetail 상속 제거 * rafact: EnableJpaAuditing Configuration으로 분리 * test: 수정시각 저장 테스트 코드 작성 * fix: PrePersist, PreUpdate 추가 * style: 주석 제거 * refact: 테스트 코드 수정 * refact: BaseTime 엔티티 및 테스트 리팩토링 * refact: 불필요한 메서드 및 `@Setter` 삭제 * test: `@RepositoryTest` 어노테이션 생성 --------- Co-authored-by: kth990303 <[email protected]> * feat: 스프링 애플리케이션 time zone 설정 (#32) * feat: 카페 즐겨찾기 해제 delete api 구현 (#33) * feat: 즐겨찾기 삭제 비즈니스 로직 구현 및 예외 추가 * fix: 즐겨찾기 삭제 비즈니스 로직 수정 * test: 즐겨찾기 삭제 테스트 코드 작성 * test: 즐겨찾기 삭제 인수테스트 코드 작성 * style: 공백 제거 * test: 즐겨찾기 삭제 예외 테스트 추가 * feat: 즐겨찾기 삭제 delete api url 수정 반영 --------- Co-authored-by: kth990303 <[email protected]> * feat: 서버 에러 발생 시 슬랙 알림 기능 구현 (#35) * feat: `slack-api-client` 의존성 추가 * feat: 500번대 에러 발생 시 슬랙에 알림 보내도록 구현 * fix: 슬랙 통신 에러 발생 시 재귀적 예외 발생가능성 있는 코드 수정 * feat: OAuth Apple 로그인 api 구현 (#34) * feat: `FeignClient`를 이용한 apple 서버와 통신하여 public key 획득 구현 * feat: apple 전용 jwt parser 구현 * feat: claims 검증 객체 구현 * refactor: public key 생성 책임을 `PublicKeyGenerator`에게 위임 * feat: apple oauth 로그인 시 platform id 반환 기능 구현 * feat: 인증 인터셉터 `excludePatterns`에 oauth 추가 * feat: `Member`에 OAuth Platform 및 platformId 컬럼 추가 * fix: aws s3 업로드 실패 시 예외를 catch가 아닌 throw하도록 변경 * feat: Apple identity token 값에서 이메일을 받도록 구현 * feat: Apple OAuth 비즈니스 로직 구현 * feat: Apple OAuth api 틀 구현 * feat: 애플 Oauth 로그인 시 platformId 반환하도록 api 변경 구현 * feat: OAuth 회원가입 비즈니스 로직 구현 * feat: OAuth 로그인 및 회원가입 api 구현 * feat: client-id local 환경에서 환경변수 주입받도록 변경 * test: Claims 검증이 올바르지 않을 경우 예외 반환 여부 테스트 작성 * feat: nonce 암호화 로직 구현 * refact: 알고리즘 종류 및 format code 상수로 변경 * feat: JSON 파싱 예외 핸들러 구현 (#36) * feat: ContentType 관련 예외 핸들링 구현 (#37) * refactor: 로깅 레벨 변경 및 예외메시지 수정 * refactor: `HttpMediaTypeException` 예외 핸들링 구현 * fix: Apple OAuth 최종 회원가입 로직 수정 (#41) * feat: 회원가입 최종 판단 여부를 nickname 으로 결정하는 책임 구현 * feat: 닉네임이 존재하지 않으면 `isRegistered` false 로 보내는 비즈니스 로직 구현 * feat: CORS 이슈 해결 적용 (#40) * fix: 접속 서버 프로토콜, 호스트 정보 감지하여 https 환경에서 swagger 이용 가능하도록 변경 * refactor: StudyType 엔티티에서 값 객체로 변경 (#38) * feat: StudyType 엔티티 삭제 후 enum 으로 변경 * feat: StudyType CafeDetail에 포함 * feat: 특정 카페 StudyType 갱신 로직 변경 * refactor: null 반환 책임 각 도메인에게 위임 * feat: 이메일 인증 코드 전송 api 구현 (#39) * feat: 의존성 추가 및 환경변수 설정 email 의존성, ses 의존성, html 파일 String 변환 io 의존성 * feat: aws SES 연동 후 이메일 전송 로직 구현 * feat: 이메일 인증코드 전송 비즈니스 로직 구현 * test: 인증코드 범위 테스트 추가 * feat: 이메일 인증코드 발송 api 구현 * feat: 이메일 인증코드 발송 로직 비동기 처리 * feat: 카페 코멘트 수정 put api 구현 (#42) * feat: 카페 코멘트 수정 비즈니스 로직 구현 * feat: 카페 코멘트 수정 비즈니스 로직 구현 * test: 카페 코멘트 수정 테스트 코드 추가 * test: 카페 코멘트 수정 인수테스트 코드 추가 * feat: 카페_코멘트_수정 static 메서드 추가 * fix: 코멘트 수정 로직 변경 및 코멘트 저장 메서드 이름 변경 * fix: 코멘트 변경 테스트 수정 * refactor: `HttpRequestMethodNotSupportedException` 예외 핸들링 구현 (#43) * fix: 리뷰나 댓글 작성한 회원탈퇴가 불가능한 버그 수정 (#44) * feat: 이벤트를 이용한 회원 탈퇴 로직 구현 * feat: 탈퇴한 회원에 대한 카페 댓글 반환 로직 수정 * refactor: 코멘트 수정 로직 변경 * fix: 즐겨찾기 등록한 회원 탈퇴 가능하도록 변경 (#45) * feat: 즐겨찾기 삭제 로직 비동기 및 이벤트 발행으로 구현 * refactor: 불필요한 서비스 클래스 삭제 * feat: 카페 코멘트 목록 조회 api 구현 (#48) * fix: 카페 조회 화면에서 댓글은 최대 3개까지만 보이도록 변경 * feat: 카페 코멘트 목록 조회 비즈니스 로직 구현 * feat: 카페 코멘트 목록 조회 api 구현 * feat: 마이페이지에서 즐겨찾기한 카페 목록 조회 api 구현 (#47) * feat: 회원이 즐겨찾기한 카페 목록 조회 비즈니스 로직 구현 * feat: 마이페이지에서 즐겨찾기한 카페 목록 조회 api 구현 * fix: BaseTime 컬럼 타입 TimeStamp 변경 (#50) * feat: 카페 이미지 등록 POST api 구현 (#49) * feat: Cafe 도메인 imgUrl 추가 * feat: Cafe 도메인 imgUrl 추가 * feat: 카페 이미지 POST API 비즈니스 로직 구현 * test: 카페 이미지 저장 테스트 * test: 카페이미지 여러번 등록 테스트 추가 * fix: addCafeImgUrl 및 List 변경 * fix: 카페 이미지 저장 테스트 수정 * fix: 카페이미지 POST API 구현 코드 수정 * fix: 카페이미지 POST API 테스트 코드 수정 * refact: fetch eager 수정 * refact: 카페이미지 등록 null 처리 제거 * feat: 회원 전체삭제 관련 로직 및 api 삭제 (#52) * feat: 특정 카페 코멘트 중 나의 코멘트만 조회하는 api 구현 (#53) * feat: 카페 코멘트 중 나의 코멘트만 조회하는 비즈니스 로직 구현 * feat: 카페 코멘트 중 나의 코멘트만 조회하는 api 구현 * fix: 이메일 뿐 아니라 닉네임이 중복되면 가입하지 못하도록 변경 (#54) * fix: 이메일 뿐 아니라 닉네임이 중복되면 가입하지 못하도록 변경 * refactor: 닉네임 중복 예외 시 1004 에러 반환 * refactor: 사용하지 않는 `findByEmailOrNickname` 제거 * feat: kakao OAuth 로그인 api 구현 (#51) * feat: 환경변수 주입 * refactor: OAuth Response DTO 통일 * feat: kakao oauth 토큰 발급 기능 구현 * feat: kakao oauth 유저 정보 발급 기능 구현 * feat: kakao oauth 기능 구현 * feat: kakao oauth 비즈니스 로직 구현 * refactor: `redirectUri`를 환경변수로 주입받도록 변경 * feat: Kakao OAuth 로그인 api 구현 * feat: 도커 이미지 기반 github action 배포 자동화 구현 (#56) * feat: 도커 이미지 생성 파일 (dockerfile) 작성 * feat: 컨테이너 관리 파일 docker-compose 작성 * feat: github action cd 스크립트 작성 * feat: application-prod yml 삭제 github action 의 touch 명령어로 작동하도록 * feat: plain jar파일 생성 삭제 * feat: 내가 작성한 특정 카페 리뷰 조회 api 구현 (#57) * feat: 내가 작성한 특정 카페 리뷰 조회 비즈니스 로직 구현 * feat: 내가 작성한 특정 카페 리뷰 조회 api 구현 * feat: 내가 작성한 평점 및 null 처리 구현 * fix: api 명세 변경에 따른 `my` 추가 * feat: docker-compose 파일 디렉토리 이동 명령어 추가 * fix: 카페 리뷰 작성 시 스터디타입에 `both` 선택이 가능하도록 로직 수정 (#59) * feat: 카페 세부정보 리뷰로 both 작성 케이스 추가 * test: 카페 세부정보 리뷰로 `both` 요청이 들어오는 케이스가 존재하도록 테스트 변경 * feat: 프로필 회원정보 수정 PUT api 구현 (#60) * feat: ProfileInfoUpdateRequest 추가 * feat: 회원정보수정 비즈니스 로직 작성 * feat: 회원정보 수정 비즈니스 로직 추가 * test: 회원정보 수정 테스트 코드 추가 * feat: InvalidArgumentException 추가 및 예외 처리 추가 * refact: 프로필 이미지 수정 반환타입 수정 * fix: 회원정보 수정 uri 수정 * refact: 프로필 이미지 수정 updateProfileInfo 코드 리팩토링 * test: 중복된 닉네임으로 수정 시 예외 반환 테스트 추가 * refact: Member 도메인 필요없는 메서드 삭제 * feat: 카페 이미지 조회 GET API 구현 (#55) * fix: 카페이미지 GET 비즈니스 로직 코드 수정 * test: 카페 이미지 조회 테스트 코드 작성 * delete: test_img2, test_img2 삭제 * fix: 카페이미지 GET 테스트 수정 * refact: DatabaseCleaner에서 cafe_image 테이블 격리 작업 추가 * refact: CafeImageResponse isMe 필드 추가 * feat: 카페 이미지 GET 수정 중간 구현 * feat: 카페이미지 조회 비즈니스 로직 수정 * feat: CafeImagesResponse 추가 * refact: 카페 이미지 등록 로직 수정 * test: 카페 이미지 조회 isMe 반환 테스트 추가 * refact: 주석 코드 제거 * feat: 카페 조회에 CafeImageResponse 추가 * test: 카페 조회시에 카페 이미지도 조회하는 테스트 추가 * fix: 카페 조회시 카페 이미지 5개 조회하도록 수정 * refact: CafeImage 클래스 BaseTime 추가 * refact: 필요없는 코드 삭제 * refact: CafeImage에 isOwned 책임 위임 * test: 카페 이미지 조회 인수테스트 추가 * refact: findCafeImageResponses 메서드 코드위치 변경 * feat: 카페 코멘트 조회 response에 id 추가 (#61) * fix: SpringSecurity 인증 더블 체크 버그 수정 (#46) * fix: SpringSecurity 인증 더블 체크 버그 수정 * refact: 스프링 시큐리티 의존성 제거 --------- Co-authored-by: kth990303 <[email protected]> * fix: KAKAO OAuth 플랫폼이 잘못 저장되는 버그 및 인가코드 예외 핸들링 구현 (#63) * fix: kakao OAuth 로그인 시 `APPLE` 플랫폼으로 저장되던 버그 수정 * feat: kakao OAuth 로그인 시 인가코드가 올바르지 않은 경우 예외 핸들링 * feat: 애플리케이션 로깅 전략 수립 및 로그 저장 구현 (#58) * feat: logback 로깅 전략 수립 * feat: 로그 표시 기능 구현 * feat: depth에 따른 로그 표시 기능 및 동시성 고려 * feat: 로그 표시할 위치를 결정하는 AOP 구현 * feat: DTO 에 `@ToString` 추가 * style: 초기 화살표 길이 0에서 1로 수정 * feat: 민감정보 마스킹 처리 구현 * fix: 서비스 레이어에 객체로 넘겨주어 args 변수 매핑되게 넘겨주도록 변경 * fix: logback rollingpolicy date 토큰 형식 수정 * fix: logback rollingpolicy filenamepattern 날짜 형식 수정 * feat: 카페 이미지 수정 PUT API 구현 및 조회 API 변경 (#62) * feat: CafeImage 도메인 isUsed 필드 추가 * feat: 카페이미지 수정 비즈니스 로직 작성 * feat: 카페 이미지 조회 시 isUsed가 True인 경우에만 조회하도록 로직 수정 * feat: NotFoundCafeImageException 예외 추가 * fix: 카페 이미지 조회 로직 수정 * feat: 카페 이미지 조회 response에 id 추가 * test: 카페 이미지 수정 테스트 코드 추가 * fix: 카페 이미지 수정 서비스 로직 순서 변경 * refact: 카페 이미지 관련 코드 리팩토링 * feat: findCafeImageResponses isUsed True인 경우에만 조회하도록 로직 수정 * refact: 메서드간 공백 추가 * test: 카페 이미지 처음 조회 시 isUsed가 true인 이미지만 조회 * refact: 카페 이미지 수정 테스트 변수명 given 수정 * fix: 카페 세부정보 계산 로직 최대값에서 평균점수로 변경 (#64) * fix: 카페 세부정보 계산 로직 최대값에서 평균점수로 변경 * refactor: 반올림 로직 `Math.round()` 이용 * feat: 카페 코멘트 삭제 DELETE API 구현 (#68) * feat: 코멘트 삭제 비즈니스 로직 구현 및 해당 커스텀 예외 추가 * feat: 카페 코멘트 삭제 비즈니스 로직 수정 * test: 카페 코멘트 삭제 테스트 코드 작성 * test: 카페 코멘트 삭제 테스트 코드 작성 * feat: AcceptanceFixtures에 코멘트_삭제 추가 * feat: 작성 코멘트 목록 조회 GET API 구현 (#67) * feat: 작성 코멘트 목록 조회 비즈니스 로직 구현 * test: 작성 코멘트 목록 조회 테스트 코드 추가 * test: 작성 코멘트 목록 조회 인수테스트 코드 작성 * refact: 필요없는 공백 제거 * feat: 사용하지 않는 이미지 배치 삭제 구현 (#66) * feat: 회원 프로필 이미지 엔티티화 * feat: s3 이미지 배치 삭제 기능 구현 * feat: 사용하지 않는 이미지 삭제 비즈니스 로직 구현 * feat: 새벽 4시마다 사용하지 않는 비즈니스 로직을 호출하는 기능 구현 * fix: 잘못된 오브젝트명 수정 및 로그 추가 * feat: 리뷰 남긴 카페 목록 조회 GET API 구현 (#65) * feat: 리뷰 남긴 카페 목록 조회 비즈니스 로직 구현 * test: 리뷰 남긴 카페 목록 조회 테스트 코드 작성 * refact: 리뷰 남긴 카페 목록 조회 테스트 코드 수정 * refact: findMyReviewCafes 오타 수정 * refact: findByMyReviewCafes 필드 Pageable 변경 * test: CafeRepositoryTest 리뷰 등록한 카페 목록 조회 테스트 추가 * refact: findScoreByCafeIdAndMemberId 추가 및 그에 따른 서비스 코드 수정 * test: ScoreRepositoryTest 등록한 평점 조회 테스트 코드 추가 * feat: 로그를 도커 컨테이너가 아닌 호스트에 남도록 볼륨 생성 (#70) * feat: 불필요한 pinpoint 설정 삭제 * feat: 도커 볼륨을 통한 컨테이너 로그 디렉토리 호스트와 연결 * refactor: 도커 기반 이미지 JDK가 아닌 JRE로 경량화 * fix: docker user 호스트 쓰기 권한이 있는 유저로 명시 * feat: 에러 발생 시 슬랙 알람을 비동기로 보내도록 구현 (#69) * feat: 개발 서버와 운영 서버 분리 (#71) * feat: `application-dev.yml` 생성 * fix: 개발 환경에서의 로그는 파일로 남도록 기능 변경 * feat: 비밀번호 확인 인증 POST API 구현 (#72) * feat: 비밀번호 확인 인증 DTO 추가 * feat: 비밀번호 확인 인증 비즈니스 로직 작성 * test: 비밀번호 확인 인증 테스트 코드 작성 * test: 비밀번호 확인 인증 인수 테스트 코드 작성 * refact: 비밀번호 인증 테스트 DisplayName 변경 * refact: 비밀번호 확인 인증 request로 값 전달하는 로직으로 변경 * feat: LoginInterceptor 적용 경로 변경 (#73) * feat: 이메일 인증 api 내 검증 로직 추가 구현 (#74) * feat: nonce 값 yml 파일에 작성 * feat: 이메일 인증 api 요청 시 nonce, email 가입 여부 검증 로직 추가 * fix: 마이페이지 참여 카페 반환 시 `mapId` 필드 추가하도록 수정 (#77) * fix: 페이지네이션 api response `currentPage` -> `isEnd` 변경 (#75) * feat: MaxUploadSizeExceededException 예외 처리 추가 (#78) * feat: 이미지 용량 커스텀 예외 추가 * feat: resolve-lazily와 max-swallow-size 옵션 설정 * feat: test에 resolce-lazily와 max-swallow-size 설정 추가 * test: 이미지 용량 예외 처리 테스트 삭제 * refact: 필요없는 코드 삭제 * refact: 필요없는 코드 삭제 * refact: 필요없는 설정 코드 삭제 및 oversized_img.jpg 삭제 * refact: swallow-max-size 설정 코드 제거 * feat: 비밀번호 찾기 API 구현 (#76) * feat: 회원 비밀번호 변경 비즈니스 로직 구현 * feat: 회원 비밀번호 찾기 및 변경 API 구현 * feat: nonce 값을 로깅에서 마스킹 처리 * fix: 비밀번호 찾기 API HTTP Method `PUT`으로 변경 * style: 메서드 순서 변경 * test: 올바르지 않은 비밀번호로 비밀번호 찾기 및 재발급 요청 시 예외 테스트 추가 * feat: 카페 정보 미리보기 조회 GET API 구현 (#79) * feat: PreviewCafeResponse DTO 추가 * feat: 카페 미리보기 조회 비즈니스 로직 코드 구현 * test: 카페 미리보기 조회 테스트 코드 작성 * test: 카페 미리보기 조회 인수테스트 코드 작성 * fix: 카페 세부정보 등록 수정 리뷰 개수 반환하도록 API 수정 (#80) * fix: 카페 세부정보 등록 DTO 수정 * fix: 카페 세부정보 수정 DTO 수정 * test: 카페 세부정보 등록 및 수정 테스트 코드 수정 * test: 카페 세부정보 등록 및 수정 인수 테스트 코드 수정 * refact: 코드 간 공백 추가 * feat: 프로필 수정 페이지 조회 GET API 구현 (#82) * feat: 프로필 수정 페이지 조회 response DTO 추가 * feat: 프로필 수정 페이지 조회 비즈니스 로직 작성 * test: 프로필 수정 페이지 조회 테스트 코드 작성 * test: 프로필 수정 페이지 조회 인수테스트 코드 작성 * fix: 이메일 및 비밀번호 api에서 token 필요하도록 변경 (#81) * fix: 프로필 정보 수정 PUT API 변경 (#83) * fix: MemberProfileUpdateRequest DTO 변경 * fix: 프로필 정보 수정 서비스 로직 변경 * test: 프로필 정보 수정 테스트코드 수정 * fix: 프로필 정보 수정 DTO에서 email 제거 * test: 프로필 수정 페이지 조회 email 삭제로 인한 테스트 코드 수정 * fix: 우분투 서버에서 메일 경로 인식 못하는 버그 수정 (#84) * feat: 사용자의 디렉토리 위치 추가 * feat: 이메일 형식 파일 위치 수정 * feat: 이메일 html 파일 형식이 아닌 `String`으로 저장 * feat: html 파일 String 변환 의존성 제거 * feat: 타인의 민감정보가 아닌 케이스는 마스킹 제외 * feat: 로그에 nonce 값 확인할 수 있도록 구현 * feat: 도커 이미지 빌드 시에 prod 옵션으로 빌드되도록 추가 도커 컨테이너 실행시 뿐만 아니라 이미지 빌드 시에도 prod 설정되도록 * fix: 마이페이지 조회 GET API response 수정 (#88) * refact: 마이페이지 조회 DTO 수정 * test: 마이페이지 조회 테스트 코드 수정 * test: 마이페이지 조회 인수 테스트 코드 수정 * fix: studyType별로 카페 필터링 조회 API - POST API로 수정 (#85) * fix: StudyType별로 카페 조회 POST로 변경 * test: StudyType별로 카페 조회 테스트 코드 수정 * refact: studyType 카페 필터링 조회 URI 변경 * refact: studyType카페필터링 DTO name 변경 * refact: 120자 이상 코드 줄바꿈 리팩터링 * refact: studyType별 카페 필터링 조회 uri 수정 * feat: 즐겨찾기한 카페 필터링 조회 POST API 구현 (#87) * feat: 즐겨찾기 카페 필터링 DTO 추가 * feat: 즐겨찾기 카페 필터링 비즈니스 로직 작성 * test: 즐겨찾기 카페 필터링 조회 테스트 코드 작성 * test: 즐겨찾기 카페 필터링 조회 인수테스트 코드 작성 * refact: 즐겨찾기 카페 필터링 서비스 로직 수정 * test: findNearCafeMapIdsByMyFavoriteCafes 테스트 추가 * refact: getCafefsFilterFavorites 테스트 코드 수정 * fix: conflicts 해결 * feat: Elasticache for Redis를 도입하여 캐싱 적용 (#86) * feat: redis 의존성 추가 * feat: redis 관련 설정 추가 * feat: 카페 미리보기에 `@Cacheable` 설정 추가 * feat: 로컬 yml redis 설정 추가 * feat: 리뷰 또는 즐겨찾기 등록 시 캐시 삭제 * feat: 즐겨찾기 해제 시 캐시 삭제 * feat: 목적에 따른 CacheManager 분리 및 로그인 시 캐시 적용 * feat: Apple OAuth Public key 캐싱 적용 * refactor: 인증 캐시 ttl 변경 및 주석 추가 * fix: accessToken 캐시 만료 ttl 수정 * feat: 테스트용 내장 임베디드 의존성 및 환경변수 추가 * test: 테스트 임베디드 redis 설정 * test: 테스트 격리를 위한 `DatabaseCleaner` 캐시 제거 * test: 같은 메서드 내에 캐시로 남아있는 현상 제거 * style: 실제값 하나뿐인 변수명 `actual1` -> `actual` 변경 * fix: 내가 작성한 특정 카페 리뷰 조회 GET API 수정 (#89) * fix: findMyCafeReview - review도 null 반환하도록 수정 * test: 작성하지 않은 카페 리뷰 조회 테스트 코드 추가 * feat: 카페 이미지를 요청 당 3개까지 올릴 수 있도록 구현 (#90) * fix: 자체 로그인 캐싱 제거 (#91) * fix: 자체 로그인 캐싱 제거 * refactor: 불필요한 의존성 제거 * fix: save 메소드 동시성 문제 해결 (#92) * style: 120자 넘는 코드 엔터 * feat: 도메인 unique 속성 추가 * fix: unique로 회원가입 동시성 문제 해결 * fix: unique로 카페 등록 동시성 문제 해결 * fix: UniqueConstraiont로 리뷰 등록 동시성 문제 해결 * fix: UniqueConstraint로 즐겨찾기 등록 동시성 문제 해결 * test: 카페 리뷰 등록 동시성 테스트 코드 추가 * fix: unique 속성으로 카페 이미지 등록 동시성 문제 해결 * style: 테스트 코드 변경 * refact: CafeService 코드 리팩터링 * style: FavoriteService 코드 정렬 * design: 카페 이미지 업로드 테스트 코드 수정 * refact: 동시성 테스트 분리 * fix: 카페 이미지 동시성 관련 코드 롤백 * feat: nickname unique 속성 추가 * delete: concurrency 패키지 삭제 * style: assert문 수정 * style: 코드 컨벤션에 따라 수정 * fix: unique 속성으로 인해 닉네임 테스트 코드 수정 * feat: 도커 자동 배포화 작업을 메인 브랜치에서만 동작하도록 변경 (#93) --------- Co-authored-by: Ji-soo708 <[email protected]>
개요
캐시 적용 전 카페 미리보기 조회 API
캐시 적용 후 카페 미리보기 조회 API
작업사항
주의사항
로컬에서
redis-cli
를 이용하여 조회하는 것을 추천드립니다.redis
,redis-cli
가 설치돼있지 않으면 카페 미리보기 조회 API가 실패합니다.127.0.0.1
이 엔드포인트가 될 것입니다.)개발 환경, 운영 환경은 비용 문제로 인해 동일한 elasticache를 참조합니다.
redis-cli -h {AWS Elasticache 엔드포인트} -p ${AWS Elasticache 포트}
캐시 만료일자가 적절한지 체크해주세요.