Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[feat/CK-235] Redis 캐시를 적용한다 #197

Merged
merged 6 commits into from
Nov 13, 2023

Conversation

younghoondoodoom
Copy link
Collaborator

@younghoondoodoom younghoondoodoom commented Nov 8, 2023

📌 작업 이슈 번호

CK-235

✨ 작업 내용

Redis 캐싱을 적용 했습니다. Redis의 성능 개선이나 클러스터링 같은건 전혀 안되어있습니다!
캐싱이 적용된 항목은 다음과 같습니다.

  • Roadmap 목록 조회(카테고리, 정렬 조건에 따라 모두 적용)
  • Roadmap 검색
  • Category 목록 조회

Redis 캐싱 동작 방식

특정 조건(size, 정렬 조건 등)으로 검색 시 redis 먼저 탐색 -> hit 되면 메소드 타지 않고 바로 반환
-> miss 되면 메소드 타고 DB가서 데이터 가져옴 -> redis에 적재 -> 반환

각 클래스가 하는 역할

@Cacheable : 캐싱할 부분 정의. roadmapList + 만들어진 key를 key 값으로 해서 redis에 데이터 적재.
@CacheEvict : 캐시가 초기화 될 부분 정의. 설정된 cacheName인 캐시들을 redis에서 삭제함. @Cacheable의 cacheName이 redis key에 prefix로 들어가는데, 설정된 cacheName이 key prefix와 일치하면 redis에서 삭제하는 방식인 것 같음.
CacheKeyGenerator : cache key가 만들어지는 부분. 현재는 parameter의 hash 값의 조합으로 만들었는데, 사용하기 힘든 구조이긴함.

💬 리뷰어에게 남길 멘트

RedisConfig에서 다음 코드에 문제가 있습니다.

final BasicPolymorphicTypeValidator typeValidator = BasicPolymorphicTypeValidator
                .builder()
                .allowIfSubType(Object.class)
                .build();

objectMapper.activateDefaultTyping(typeValidator, ObjectMapper.DefaultTyping.EVERYTHING);

찾아보니 .allowIfSubType(Object.class) && ObjectMapper.DefaultTyping.EVERYTHING으로 할 경우, 모든 클래스에 대해서 직렬화, 역직렬화를 하게됩니다. 이렇게 되면 외부에서 이상한 코드가 있는 클래스를 주입하면 어플리케이션에서 그대로 직렬화해서 침투하게 되는거죠. 거기에 위험한 로직(ex. rm -rf, DB 삭제) 같은게 있으면 위험한 상황이 되는겁니다.

그래서 redisCacheManager에서만 사용하는 ObjectMapper를 선언해서 사용했습니다. 전역적으로 사용하는 ObjectMapper는 따로 있으니 위험한 요소가 없다고 판단하긴 했는데, 위험할 거 같으면 말씀해주세요!

더 자세한 내용은 블로그에 글 작성하고 공유하겠습니다! 커멘트로 궁금한 점 많이 물어봐주세요. 저도 더 공부해야할 거 같아서..

🚀 요구사항 분석

  • redis 캐싱을 적용한다.

Copy link

github-actions bot commented Nov 8, 2023

Unit Test Results

  79 files    79 suites   41s ⏱️
763 tests 763 ✔️ 0 💤 0
777 runs  777 ✔️ 0 💤 0

Results for commit 933fb35.

♻️ This comment has been updated with latest results.

Copy link

github-actions bot commented Nov 8, 2023

🪄 Test Coverage Report

File Coverage [99.49%] 🍏
CacheKeyGenerator.java 100% 🍏
RoadmapCreateService.java 100% 🍏
RefreshTokenRepositoryImpl.java 100% 🍏
RoadmapReadService.java 99.11% 🍏
Total Project Coverage 98.37% 🍏

Copy link
Collaborator

@Ohjintaek Ohjintaek left a comment

Choose a reason for hiding this comment

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

Redis... 사실 아직 잘 모르겠지만 밀리와 두둠 덕분에 조금씩 파악을 하고 있는 느낌이 듭니다. 감사해요 🙇‍♂️

@Cacheable이나 @CacheEvict가 Redis에 의존적이 아니라 스프링에 의존적이길래 찾아보니 redis 말고도 다양한 memory database가 있다는 것도 알게 되었네요. 그 외에도 처음 보는 것들이 많아 공부하느라 조금 늦었는데 물어볼 부분 있으면 코멘트 남기라고 하셔서 남깁니다

이번에도 수고하셨어요 두둠!!! 👍👍


@BeforeEach
void init() {
refreshTokenRepository = new RefreshTokenRepository(redisTemplate, 2000L);
MockitoAnnotations.openMocks(this);
Copy link
Collaborator

Choose a reason for hiding this comment

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

Mockito에서 @mock을 모킹해주고 @Injectmocks에 모킹된 객체들을 주입해주는 역할을 하는 메서드인데 클래스에 @ExtendWith(MocktoExtension.class)를 붙여놓으면 필요가 없다고 하네요

Copy link
Member

Choose a reason for hiding this comment

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

@Ohjintaek 혹시 무슨 말인지 더 설명해주실 수 있나요??
@Injectmocks를 RefreshTokenRepsoitoryImpl에 붙이면 MockitoAnnotations.openMocks(this); 위 코드가 필요없다는 말씀이신거죠..?

Copy link
Collaborator

Choose a reason for hiding this comment

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

ExtendWith와 openMocks의 역할이 똑같아서 둘 중 하나만 써도 된다는 의미였어요!! 실제로 해 봤을때도 그랬구요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

refreshTokenValidityInSeconds을 수동으로 넣어주려고 해당 설정을 넣었는데 MockitoAnnotations.openMocks(this);가 필요가 없겠네요! refreshTokenRepository를 수동으로 만들어주니까요. 놓치고 있었는데 감사합니다👍

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

참고로 수동으로 객체를 만들어주니까 @InjectMock를 사용하지 않아도 되네요

@@ -187,6 +190,7 @@ private List<RoadmapTagDto> makeRoadmapTagDto(final RoadmapTags roadmapTags) {
.toList();
}

@Cacheable(value = "roadmapList", keyGenerator = "cacheKeyGenerator", cacheManager = "redisCacheManager")
Copy link
Collaborator

Choose a reason for hiding this comment

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

검색에 대해서 @Cacheable 사용하는 건 cache hit가 그렇게 높지 않을 거라고 예상하는데 추가해주신 이유가 있나요?

추가적으로 궁금한 건 redis를 사용량을 넘어서는 캐싱이 필요하다면 기존의 캐싱된 데이터를 만료가 가까운 순으로 삭제하는 건가요? 아니면 캐싱이 되지 않는 건가요?

Copy link
Member

Choose a reason for hiding this comment

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

저도 검색에 대해서 사용하는 것은 큰 효과를 보지 못할 것 같다는 생각이 들어요!

Copy link
Collaborator Author

@younghoondoodoom younghoondoodoom Nov 10, 2023

Choose a reason for hiding this comment

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

ttl을 30분으로 설정 해놔서 자주 검색되는 데이터에 한해서는 효과를 볼 거 같았는데 모든 검색 결과를 모두 캐싱하면 오히려 메모리를 과도하게 사용하겠네요! 검색은 캐싱에서 제외하겠습니다!

private static final String DELIMITER = "_";

@Override
public Object generate(final Object target, final Method method, final Object... params) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

왜 파라미터까지 하나씩 다 받고 key에 추가해줄까 잘 몰랐는데 생각해보니 파라미터까지 동일한 요청인지 판별해야 해서 그런거더라구요. 좋은데요? 😀

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

제 머리로는 이게 일단 최선이라고 생각했는데 캐시 key를 생성하는 전략에 대해서 좀 고민해봐야할거 같아요. 다 같이 한번 얘기해봤으면 좋겠어요!

Copy link
Member

@miseongk miseongk left a comment

Choose a reason for hiding this comment

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

두둠 캐시 적용하시느라 고생하셨어요 😊
저도 레디스 캐시에 대해서 머릿속으로는 고민을 많이 해봤는데, 뭔가 명확하게 결론이 나지 않아서 시도하지 못했었는데 역시 두둠 빠르시네요 👍
궁금한 것들 몇가지 남겨보았어요.
더 이야기 나누고 싶은데 일정이 급하신 것 같으니 일단 어프루브 할게요!
추후에 제가 코멘트 남긴 부분에 대해서 같이 고민해보고 더 개선해나갈 수 있으면 좋겠어요!

리뷰가 늦어서 죄송합니다..🙇‍♀️

Comment on lines 35 to 36
@Mock
private ValueOperations<String, String> valueOperationsMock;
Copy link
Member

Choose a reason for hiding this comment

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

잘 몰라서 물어보는 건데요!
ValueOperation을 직접 모킹을 해줘야 동작하나요? 아래 테스트 코드에서

when(valueOperationsMock.get(refreshToken))
               .thenReturn(memberIdentifier);

위 부분처럼 하지 않고,

when(redistemplateMock.opsForValue().get(refreshToken))
.thenReturn(memberIdentifier);

위와 같이 하는게 불가능한가요?!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

redistemplateMock에서 ValueOperations가 null이라서 npe 나더라고요. 두번 타고 들어가서 모킹하는건 안되는거 같아요!


@BeforeEach
void init() {
refreshTokenRepository = new RefreshTokenRepository(redisTemplate, 2000L);
MockitoAnnotations.openMocks(this);
Copy link
Member

Choose a reason for hiding this comment

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

@Ohjintaek 혹시 무슨 말인지 더 설명해주실 수 있나요??
@Injectmocks를 RefreshTokenRepsoitoryImpl에 붙이면 MockitoAnnotations.openMocks(this); 위 코드가 필요없다는 말씀이신거죠..?

Comment on lines 49 to 57
final BasicPolymorphicTypeValidator typeValidator = BasicPolymorphicTypeValidator
.builder()
.allowIfSubType(Object.class)
.build();
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.registerModule(new ParameterNamesModule());
objectMapper.activateDefaultTyping(typeValidator, ObjectMapper.DefaultTyping.EVERYTHING);
final RedisSerializer<Object> serializer = new GenericJackson2JsonRedisSerializer(objectMapper);
Copy link
Member

Choose a reason for hiding this comment

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

이 부분이 설명해주신 부분이군요!
그럼 위 세팅은 스프링 부트에서 자동으로 지정해주는 설정과 동일한건가요??
한가지 궁금한 점이 있는데, 그럼 새로운 ObjectMapper를 생성하는 것 말고는 다른 대안은 없나요?!
그냥 레디스 캐시를 적용하기 위해서는 위와 같은 위험을 감수해야하는 것인지 궁금했어요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

사실 새로운 ObjectMapper를 사용해도 보안 상 위험하다고 해요. 어플리케이션 내에 개발자가 의도하지 않은 클래스가 들어와서 이상한 짓을 할 수도 있으니까요! 저희는 redis가 private instance에 떠있고 이 어플리케이션에서만 해당 redis를 사용하니까 문제 없어서 일단 그렇게 적용한거에요!

그리고 스프링 부트에서 자동으로 지정해주는 설정이랑 좀 다를거에요! 자동으로 지정해주는건 request, response에 맞게 안전한 설정이 되어있는걸로 알고있습니다! 타입 검사를 좀 엄격하게 하는걸로 알아요

다른 대안은 없는거 같고 새로 생성한 objectMapper를 잘 설정해서 엄격하게 타입 검사를 해주는게 좋을 거같아요. 관련해서 지식이 부족해서 지금은 엄청 취약한데 학습 더 해보고 적용해보겠습니다!

@@ -68,6 +69,7 @@ public class RoadmapReadService {
private final MemberRepository memberRepository;
private final FileService fileService;

@Cacheable(value = "roadmap", keyGenerator = "cacheKeyGenerator", cacheManager = "redisCacheManager")
Copy link
Member

Choose a reason for hiding this comment

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

로드맵 조회와 로드맵 목록 조회 등등 각각의 API 마다 레디스에 따로 저장하게 되는 방식인거죠?
그렇다면 카테고리와 정렬조건에 따른 모든 경우에 수로 레디스에 저장이 되는건가요?
최대 카테코리(12개) * 정렬조건(3개) * 로드맵 수의 데이터가 저장이 될 수 있을 것 같은데,
만약 그렇다면 각각의 API 마다 저장하는데 그 안에서도 경우의 수가 너무 많아서 한 번에 많은 사용자가 접속한다면 메모리가 터지는 일이 발생하지 않을까요..? 😮 어느 정도 적재되어야 터질지는 잘 모르겠지만 최악의 경우를 생각해봤어요!

Copy link
Member

Choose a reason for hiding this comment

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

썬샷이 남겨주신 것 처럼 어느 기준치를 넘었을 때는 삭제되거나 어떤 조치가 취해질 것 같은데,
그렇다면 정말 조회가 빈번하게 일어나는 로드맵에 대해서만 레디스에 저장하는 방식이 더 좋을 것 같아요!
예를 들어 로드맵을 최근 100개까지만 저장하는식으로요.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

그런 경우를 대비해서 ttl을 30분으로 잡았는데 더 복잡한 방법은 직접 AOP 메소드를 구현해서 할 수 있을 거 같아요! 다같이 전략을 정해보면 어떨까요

@@ -187,6 +190,7 @@ private List<RoadmapTagDto> makeRoadmapTagDto(final RoadmapTags roadmapTags) {
.toList();
}

@Cacheable(value = "roadmapList", keyGenerator = "cacheKeyGenerator", cacheManager = "redisCacheManager")
Copy link
Member

Choose a reason for hiding this comment

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

저도 검색에 대해서 사용하는 것은 큰 효과를 보지 못할 것 같다는 생각이 들어요!

@miseongk miseongk added the feature 🔅 Improvements or additions to documentation label Nov 10, 2023
@younghoondoodoom younghoondoodoom merged commit b9e6841 into develop-backend Nov 13, 2023
1 check passed
Copy link

🪄 Test Coverage Report

File Coverage [99.49%] 🍏
CacheKeyGenerator.java 100% 🍏
RoadmapCreateService.java 100% 🍏
RefreshTokenRepositoryImpl.java 100% 🍏
RoadmapReadService.java 99.11% 🍏
Total Project Coverage 98.37% 🍏

younghoondoodoom added a commit that referenced this pull request Dec 3, 2023
* [feat/CK-179] 로드맵 카테고리 생성을 구현한다 (#141)

* feat: 로드맵 카테고리 생성 인수테스트 작성

* feat: 로드맵 카테고리 생성 서비스 구현

* feat: 로드맵 카테고리 생성 api 구현

* docs: 로드맵 카테고리 생성 docs 작성

* refactor: 인수테스트 카테고리 생성 api로 수정

* feat: 로드맵 카테고리 앞뒤 공백 제거하도록 수정

* [feat/CK-190] 골룸 생성 시 투두리스트를 필수로 입력받는 로직을 제거한다 (#145)

* feat: 골룸 생성 시 투두리스트 필수 입력 로직 제거

* refactor: 사용하지 않는 메서드 제거

* [feat/CK-189] 네이버 OAuth 로그인 기능을 구현한다 (#144)

* feat: 회원 전화번호, 생년월일 삭제, 이메일 추가

* feat: naver oauth 구현 및 member field 변경

* feat: 네이버 로그인 uri 변경

* docs: 네이버 로그인 API 명세 작성

* feat: NaverOauthService 테스트코드 작성

* test: oauth 기능 테스트 코드 추가

* test: NaverOauthNetworkService 테스트 수정

* chore: git submodule 업데이트

---------

Co-authored-by: ChoiYoungHoon <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>

* feat: MemberProfile email not null 및 Member salt nullable 설정

* feat: oauth 회원가입 시 아이디에 uuid 붙히도록 수정

* design: 네이버 로그인 버튼 구현

* feat: naver oauth API 통신 구현

* feat: 네이버 로그인 주소 반환 시 응답 코드 200으로 변경

* feat: 네이버 oauth 로그인 시 콜백 변경 및 auth code 받도록 수정

* feat: 네이버 oauth api 수정

* fix: 시작 날짜가 오늘 이전이면서 모집 중인 골룸도 자동으로 시작하도록 수정

* feat: 이미지 파일 get url 요청 시 cloud front로 내려주도록 수정

* fix: 로드맵 태그 여러개일시 데이터 조회 중복 문제 해결

* fix: 파일 경로 생성시 한글과 공백은 인코딩한다

* test: test coverage 수정

* fix: file 확장자 오류를 해결한다

* fix: file이름을 저장할때 uuid로만 저장한다

* feat: 로드맵 태그에 BatchSize 적용

* feat: 골룸 노드 목록 조회 시 노드 설명과 이미지 반환하도록 수정

* [feat/CK-227] 로드맵 골룸 조회 시 최신순일때는 모든 상태를, 마감임박 순일 땐 모집 중인 상태만 반환한다 (#185)

* chore: 패키지 경로 수정

* feat: 조건에 따른 로드맵 골룸 조회 시 쿼리 수정

* refactor: 1:N 문제 방지를 위해 @batchsize 설정

* feat: 로드맵 골룸 응답에 골룸 상태 추가

* chore: 서브모듈 업데이트

* chore: 패키지 경로 수정

* refactor: 메서드 네이밍 수정

* refactor: BaseEntity의 CreatedAt 스프링 의존성 끊기 (#191)

* refactor: MemberIdentifierArgumentResolver에서 Authenticated 어노테이션 확인하도록 수정 (#193)

* [feat/CK-232] 전역적으로 사용하는 Exception을 분리하고 AOP로 예외를 변환하는 기능을 구현한다. (#194)

* refactor: exception 패키지를 service 패키지 하위로 이동

* feat: 도메인 Exception을 서비스 Exception으로 변환해주는 AOP 구현

* [feat/CK-222] Redis를 도입하고 Refresh Token을 Redis에 저장하도록 변경한다 (#190)

* build: spring data redis 및 testcontainers 의존성 추가

* feat: RefreshToken 레디스에 저장하도록 변경

* test: Redis 테스트 설정 및 RefreshTokenRedisRepository 테스트

* chore: 서브모듈 업데이트

* refactor: JwtTokenProvider에서 RefreshToken 생성해서 반환하도록 수정

* refactor: 리뷰 반영

* refactor: RedisTemplate으로 변경

* test: JwtTokenProvider 테스트 추가

* test: test config에 redis 설정 추가

* test: test 추가

* chore: 기존 refresh token table을 drop하는 쿼리 추가

* refactor: ttl을 초단위로 변경하는 로직 변수 추출

* refactor: 변수명 변경

* refactor: 레디스 테스트 간 격리

* chore: git submodule 업데이트

* [feat/CK-235] Redis 캐시를 적용한다 (#197)

* test: test container에 의존하지 않도록 변경

* feat: redis cache 적용

* feat: redis config 설정 수정

* fix: RedisConfig를 test에서 비활성화 시킨다

* test: CacheKeyGenerator test code 작성

* feat: 수정 요구사항 반영

* chore: 서브모듈 최신화

* chore: 서브모듈 최신화

* chore: flyway v4 파일 제거

* chore: flyway v4 파일 복구

* [feat/CK-237] 골룸 참여 시 발생하는 동시성 이슈를 해결한다 (#199)

* refactor: 골룸 참여 시 발생하는 동시성 이슈를 비관적 락으로 해결

* test: 테스트 코드 수정

* [feat/CK-236] JdbcTemplate을 이용하여 bulk insert를 적용한다 (#198)

* refactor: 기존 saveAll, deleteAll을 bulk insert로 개선

* refactor: Dao 대신 Repository 계층에 의존하도록 수정 - JdbcRepository 추상화

* feat: amazon s3 접근 시 credentials 사용하도록 수정

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Jungwoo <[email protected]>
Co-authored-by: 부엉이 <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
younghoondoodoom added a commit that referenced this pull request Dec 3, 2023
* feat: 골룸 노드 목록 조회 시 노드 설명과 이미지 반환하도록 수정

* [feat/CK-227] 로드맵 골룸 조회 시 최신순일때는 모든 상태를, 마감임박 순일 땐 모집 중인 상태만 반환한다 (#185)

* chore: 패키지 경로 수정

* feat: 조건에 따른 로드맵 골룸 조회 시 쿼리 수정

* refactor: 1:N 문제 방지를 위해 @batchsize 설정

* feat: 로드맵 골룸 응답에 골룸 상태 추가

* chore: 서브모듈 업데이트

* chore: 패키지 경로 수정

* refactor: 메서드 네이밍 수정

* refactor: BaseEntity의 CreatedAt 스프링 의존성 끊기 (#191)

* refactor: MemberIdentifierArgumentResolver에서 Authenticated 어노테이션 확인하도록 수정 (#193)

* [feat/CK-232] 전역적으로 사용하는 Exception을 분리하고 AOP로 예외를 변환하는 기능을 구현한다. (#194)

* refactor: exception 패키지를 service 패키지 하위로 이동

* feat: 도메인 Exception을 서비스 Exception으로 변환해주는 AOP 구현

* [feat/CK-222] Redis를 도입하고 Refresh Token을 Redis에 저장하도록 변경한다 (#190)

* build: spring data redis 및 testcontainers 의존성 추가

* feat: RefreshToken 레디스에 저장하도록 변경

* test: Redis 테스트 설정 및 RefreshTokenRedisRepository 테스트

* chore: 서브모듈 업데이트

* refactor: JwtTokenProvider에서 RefreshToken 생성해서 반환하도록 수정

* refactor: 리뷰 반영

* refactor: RedisTemplate으로 변경

* test: JwtTokenProvider 테스트 추가

* test: test config에 redis 설정 추가

* test: test 추가

* chore: 기존 refresh token table을 drop하는 쿼리 추가

* refactor: ttl을 초단위로 변경하는 로직 변수 추출

* refactor: 변수명 변경

* refactor: 레디스 테스트 간 격리

* chore: git submodule 업데이트

* [feat/CK-235] Redis 캐시를 적용한다 (#197)

* test: test container에 의존하지 않도록 변경

* feat: redis cache 적용

* feat: redis config 설정 수정

* fix: RedisConfig를 test에서 비활성화 시킨다

* test: CacheKeyGenerator test code 작성

* feat: 수정 요구사항 반영

* chore: 서브모듈 최신화

* chore: 서브모듈 최신화

* chore: flyway v4 파일 제거

* chore: flyway v4 파일 복구

* [feat/CK-237] 골룸 참여 시 발생하는 동시성 이슈를 해결한다 (#199)

* refactor: 골룸 참여 시 발생하는 동시성 이슈를 비관적 락으로 해결

* test: 테스트 코드 수정

* [feat/CK-236] JdbcTemplate을 이용하여 bulk insert를 적용한다 (#198)

* refactor: 기존 saveAll, deleteAll을 bulk insert로 개선

* refactor: Dao 대신 Repository 계층에 의존하도록 수정 - JdbcRepository 추상화

* [feat/CK-239] Amazon S3 접근 시 credential 정보를 이용하도록 수정한다 (#201)

* feat: amazon s3 접근 시 credentials 사용하도록 수정

* test: test application.yml에 credentials 추가

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
@younghoondoodoom younghoondoodoom deleted the feature/CK-235 branch December 10, 2023 10:47
younghoondoodoom added a commit that referenced this pull request Dec 10, 2023
* [feat/CK-179] 로드맵 카테고리 생성을 구현한다 (#141)

* feat: 로드맵 카테고리 생성 인수테스트 작성

* feat: 로드맵 카테고리 생성 서비스 구현

* feat: 로드맵 카테고리 생성 api 구현

* docs: 로드맵 카테고리 생성 docs 작성

* refactor: 인수테스트 카테고리 생성 api로 수정

* feat: 로드맵 카테고리 앞뒤 공백 제거하도록 수정

* [feat/CK-190] 골룸 생성 시 투두리스트를 필수로 입력받는 로직을 제거한다 (#145)

* feat: 골룸 생성 시 투두리스트 필수 입력 로직 제거

* refactor: 사용하지 않는 메서드 제거

* [feat/CK-189] 네이버 OAuth 로그인 기능을 구현한다 (#144)

* feat: 회원 전화번호, 생년월일 삭제, 이메일 추가

* feat: naver oauth 구현 및 member field 변경

* feat: 네이버 로그인 uri 변경

* docs: 네이버 로그인 API 명세 작성

* feat: NaverOauthService 테스트코드 작성

* test: oauth 기능 테스트 코드 추가

* test: NaverOauthNetworkService 테스트 수정

* chore: git submodule 업데이트

---------

Co-authored-by: ChoiYoungHoon <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>

* feat: MemberProfile email not null 및 Member salt nullable 설정

* feat: oauth 회원가입 시 아이디에 uuid 붙히도록 수정

* design: 네이버 로그인 버튼 구현

* feat: naver oauth API 통신 구현

* feat: 네이버 로그인 주소 반환 시 응답 코드 200으로 변경

* feat: 네이버 oauth 로그인 시 콜백 변경 및 auth code 받도록 수정

* feat: 네이버 oauth api 수정

* fix: 시작 날짜가 오늘 이전이면서 모집 중인 골룸도 자동으로 시작하도록 수정

* feat: 이미지 파일 get url 요청 시 cloud front로 내려주도록 수정

* fix: 로드맵 태그 여러개일시 데이터 조회 중복 문제 해결

* fix: 파일 경로 생성시 한글과 공백은 인코딩한다

* test: test coverage 수정

* fix: file 확장자 오류를 해결한다

* fix: file이름을 저장할때 uuid로만 저장한다

* feat: 로드맵 태그에 BatchSize 적용

* [Release] 골룸 대시보드 내의 노드 반환 데이터 추가 및 골룸 목록 조회 시 모든 상태의 골룸을 조회하도록 수정한다. (#188)

* feat: 골룸 노드 목록 조회 시 노드 설명과 이미지 반환하도록 수정

* [feat/CK-227] 로드맵 골룸 조회 시 최신순일때는 모든 상태를, 마감임박 순일 땐 모집 중인 상태만 반환한다 (#185)

* chore: 패키지 경로 수정

* feat: 조건에 따른 로드맵 골룸 조회 시 쿼리 수정

* refactor: 1:N 문제 방지를 위해 @batchsize 설정

* feat: 로드맵 골룸 응답에 골룸 상태 추가

* chore: 서브모듈 업데이트

* chore: 패키지 경로 수정

* refactor: 메서드 네이밍 수정

---------

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

* [Release] 동시성 문제 해결 및 캐시를 적용하여 성능 개선을 한다. (#203)

* feat: 골룸 노드 목록 조회 시 노드 설명과 이미지 반환하도록 수정

* [feat/CK-227] 로드맵 골룸 조회 시 최신순일때는 모든 상태를, 마감임박 순일 땐 모집 중인 상태만 반환한다 (#185)

* chore: 패키지 경로 수정

* feat: 조건에 따른 로드맵 골룸 조회 시 쿼리 수정

* refactor: 1:N 문제 방지를 위해 @batchsize 설정

* feat: 로드맵 골룸 응답에 골룸 상태 추가

* chore: 서브모듈 업데이트

* chore: 패키지 경로 수정

* refactor: 메서드 네이밍 수정

* refactor: BaseEntity의 CreatedAt 스프링 의존성 끊기 (#191)

* refactor: MemberIdentifierArgumentResolver에서 Authenticated 어노테이션 확인하도록 수정 (#193)

* [feat/CK-232] 전역적으로 사용하는 Exception을 분리하고 AOP로 예외를 변환하는 기능을 구현한다. (#194)

* refactor: exception 패키지를 service 패키지 하위로 이동

* feat: 도메인 Exception을 서비스 Exception으로 변환해주는 AOP 구현

* [feat/CK-222] Redis를 도입하고 Refresh Token을 Redis에 저장하도록 변경한다 (#190)

* build: spring data redis 및 testcontainers 의존성 추가

* feat: RefreshToken 레디스에 저장하도록 변경

* test: Redis 테스트 설정 및 RefreshTokenRedisRepository 테스트

* chore: 서브모듈 업데이트

* refactor: JwtTokenProvider에서 RefreshToken 생성해서 반환하도록 수정

* refactor: 리뷰 반영

* refactor: RedisTemplate으로 변경

* test: JwtTokenProvider 테스트 추가

* test: test config에 redis 설정 추가

* test: test 추가

* chore: 기존 refresh token table을 drop하는 쿼리 추가

* refactor: ttl을 초단위로 변경하는 로직 변수 추출

* refactor: 변수명 변경

* refactor: 레디스 테스트 간 격리

* chore: git submodule 업데이트

* [feat/CK-235] Redis 캐시를 적용한다 (#197)

* test: test container에 의존하지 않도록 변경

* feat: redis cache 적용

* feat: redis config 설정 수정

* fix: RedisConfig를 test에서 비활성화 시킨다

* test: CacheKeyGenerator test code 작성

* feat: 수정 요구사항 반영

* chore: 서브모듈 최신화

* chore: 서브모듈 최신화

* chore: flyway v4 파일 제거

* chore: flyway v4 파일 복구

* [feat/CK-237] 골룸 참여 시 발생하는 동시성 이슈를 해결한다 (#199)

* refactor: 골룸 참여 시 발생하는 동시성 이슈를 비관적 락으로 해결

* test: 테스트 코드 수정

* [feat/CK-236] JdbcTemplate을 이용하여 bulk insert를 적용한다 (#198)

* refactor: 기존 saveAll, deleteAll을 bulk insert로 개선

* refactor: Dao 대신 Repository 계층에 의존하도록 수정 - JdbcRepository 추상화

* [feat/CK-239] Amazon S3 접근 시 credential 정보를 이용하도록 수정한다 (#201)

* feat: amazon s3 접근 시 credentials 사용하도록 수정

* test: test application.yml에 credentials 추가

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>

* chore: properties 버젼 변경

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Jungwoo <[email protected]>
Co-authored-by: 부엉이 <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 👨‍👩‍👧‍👦 BackEnd feature 🔅 Improvements or additions to documentation
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

3 participants