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

리프레시 토큰 관리를 Redis로 변경 #710

Merged
merged 21 commits into from
Feb 17, 2024
Merged

리프레시 토큰 관리를 Redis로 변경 #710

merged 21 commits into from
Feb 17, 2024

Conversation

cookienc
Copy link
Member

관련이슈

참고사항

  • 기존 RefreshToken로직을 Redis로 변경했습니다.
    • 이 과정에서 Token 관련 기능을 Facade 패턴으로 변경했습니다 -> Oauth는 토큰 관리보다는� login과 같은 회원 인증이 먼저라고 생각하는데 토큰 관련 코드가 절반 이상이라 복잡해 보여서 그랬어용
  • docker compose 오류가 있어 Spring Boot 버전을 3.1.1 -> 3.1.8버전으로 변경했습니다.
  • CRUD repository를 사용하면 jpa처럼 쓸 수 있어서 redistemplate은 사용 안했습니다.
  • 테스트에서만 expire가 필요해서 redistemplate을 빈으로 등록해놨습니다.
  • TestContainer를 사용해서 Redis를 띄워서 테스트합니다. m1에서 이슈가 있어요

중요한 내용은 없지만 블로그 글 첨부합니다~�

@cookienc cookienc added 💙 BE 백엔드 작업입니다. ♻️ refactor 코드를 개선하고 오겠습니다. labels Feb 12, 2024
@cookienc cookienc self-assigned this Feb 12, 2024
Comment on lines +30 to +36
public RedisTemplate<String, String> redisTemplate() {
final RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
Copy link
Member

Choose a reason for hiding this comment

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

운영 코드에서는 RedisTemplate을 이용하지 않았는데 테스트에서는 이용하게 된 이유가 궁금합니다!

Copy link
Member

Choose a reason for hiding this comment

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

오 블로그 글 봤는데 TypeReference로 해결이 되나 궁금하네요🤔🤔

Copy link
Member Author

Choose a reason for hiding this comment

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

  1. CrudRepository를 상속하면 Jpa처럼 Redis를 사용할 수 있다는게 장점이라 느껴져서 Redistemplate을 사용하지 않았습니다! 단순히 저장하고 조회하는 기능만 리프레시 토큰에서 사용해서요. 그런데 테스트해서는 토큰 만료를 테스트해야되서 redistemplate을 사용해서 expire 메서드가 필요했습니다. 그래서 테스트 코드에서는 사용하게 되었습니다.

TypeReference를 말씀하신거보니 Jackson2JsonRedisSerializer 같은데요. 이 부분은 설명이 살짝 부족했네요

        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(RefreshToken.class));
        redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RefreshToken.class));

이 Serializer는 다음과 같이 빈으로 등록할 때 타입을 지정해서 등록하기 때문에 TypeReference만으로도 잘 동작합니다!

Comment on lines +21 to +22
System.setProperty("spring.redis.host", redisContainer.getHost());
System.setProperty("spring.redis.port", redisContainer.getMappedPort(6379).toString());
Copy link
Member

Choose a reason for hiding this comment

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

'@DynamicPropertySource'를 사용해보는거는 어떤가요?

Copy link
Member Author

Choose a reason for hiding this comment

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

5. An Alternative: Test Fixtures
So far, in both approaches, the fixture setup and the test code are tightly intertwined. Sometimes, this tight coupling of two concerns complicates the test code, especially when we have multiple things to set up. Imagine what the infrastructure setup would look like if we were using PostgreSQL and Apache Kafka in a single test.

In addition to that, the infrastructure setup and applying dynamic configurations will be duplicated in all tests that need them.

밸덩에서 퍼온건데 @DynamicPropertySource는 각각의 테스트에서만 사용할 수 있는듯?
혹시 어떻게 하는지 아시나용?

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
Member

Choose a reason for hiding this comment

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

요런 느낌입니다!
(*자바로는 실험 못해봄 🙃)

public class RedisTestProperties {

    @DynamicPropertySource
    public static void redisTestProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.redis.host", redisContainer.getHost());
        registry.add("spring.redis.port", Integer.toString(redisContainer.getMappedPort(6379).toString());
    }
}

Copy link
Member Author

Choose a reason for hiding this comment

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

오호 이거 해봤는데 안되더라구... 레디스테스트컨테이너는 setProperty로 설정을 덮어(?)씌워야되는데(왜인지 모름), 저건 static으로 올리니까 안되는거 같음

@cookienc cookienc merged commit c622a2c into dev/BE Feb 17, 2024
1 check passed
@cookienc cookienc deleted the feat/704 branch February 17, 2024 10:43
cookienc added a commit that referenced this pull request Feb 17, 2024
* 리프레시 토큰 관리를 Redis로 변경 (#710)

* feat: redis 설정 추가

* refactor: RefreshToken 관리를 redis로 업데이트

* test: refreshToken 관련 service 테스트 수정

* refactor: EmbbedRedis 설정 제거

* feat: Redis Test Container 설정 추가

* refactor: 테스트가 용이하게 RefreshToken TTL을 외부에서 관리

* test: OauthComand관련 테스트 수정

* test: Restdocs 테스트 수정

* refactor: OauthCommandService 생성자에 refreshTokenExpireMinutes를 받도록 수정

* test: RefreshToken 추가

* test: 사용하지 않는 RefreshToken 삭제

* refactor: RefreshToken2 를 RefreshToken으로 이름 변경

* refactor: expire minutes 이름 변경

* test: RefreshTokenFixture로 리팩토링

* refactor: Facade 패턴 적용

* refactor: ttl 단위를 분으로 변경

* refactor: RedisConfig에 username과 password 추가

* feat: docker-compose 에 redis 설정 추가

* refactor: 사용하지 않는 Restemplate 제거

* refactor: 스프링 부트 버전 3.1.8로 업그레이드

* refactor: redis.conf bind를 localhost만 가능하도록 변경

* 게시글 조회 API에 게시글 총 개수 포함해서 반환 (#711)

refactor: 글 조회시 전체 개수가 같이 반환되도록 구현

* 완료된 리뷰가 많은 서포터 순대로 조회하는 기능 구현 (#712)

* feat: 리뷰가 많은 사람 랭킹 구하는 기능 구현

* test: 랭킹 인수테스트와 restdocs 테스트 구현

* feat: 랭킹에 company 항목 추가

* refactor: 다른 랭킹도 추가할 수 있도록 Rankable 마커 인터페이스 구현
cookienc added a commit that referenced this pull request Feb 19, 2024
* 리프레시 토큰 관리를 Redis로 변경 (#710)

* feat: redis 설정 추가

* refactor: RefreshToken 관리를 redis로 업데이트

* test: refreshToken 관련 service 테스트 수정

* refactor: EmbbedRedis 설정 제거

* feat: Redis Test Container 설정 추가

* refactor: 테스트가 용이하게 RefreshToken TTL을 외부에서 관리

* test: OauthComand관련 테스트 수정

* test: Restdocs 테스트 수정

* refactor: OauthCommandService 생성자에 refreshTokenExpireMinutes를 받도록 수정

* test: RefreshToken 추가

* test: 사용하지 않는 RefreshToken 삭제

* refactor: RefreshToken2 를 RefreshToken으로 이름 변경

* refactor: expire minutes 이름 변경

* test: RefreshTokenFixture로 리팩토링

* refactor: Facade 패턴 적용

* refactor: ttl 단위를 분으로 변경

* refactor: RedisConfig에 username과 password 추가

* feat: docker-compose 에 redis 설정 추가

* refactor: 사용하지 않는 Restemplate 제거

* refactor: 스프링 부트 버전 3.1.8로 업그레이드

* refactor: redis.conf bind를 localhost만 가능하도록 변경

* 게시글 조회 API에 게시글 총 개수 포함해서 반환 (#711)

refactor: 글 조회시 전체 개수가 같이 반환되도록 구현

* 완료된 리뷰가 많은 서포터 순대로 조회하는 기능 구현 (#712)

* feat: 리뷰가 많은 사람 랭킹 구하는 기능 구현

* test: 랭킹 인수테스트와 restdocs 테스트 구현

* feat: 랭킹에 company 항목 추가

* refactor: 다른 랭킹도 추가할 수 있도록 Rankable 마커 인터페이스 구현

* feat: review 완료 시 reviewCount 증가 기능 구현 (#721)

* feat: review 완료 시 reviewCount 증가 기능 구현

* test: reviewCount 증가로직 테스트 구현

* refactor: 리뷰수 증가 로직을 RunnerPost 안으로 옮김

* reviewCount가 0인 항목이 조회가 되면 제외되도록 구현 (#722)

* refactor: reviewCount가 0인 항목이 조회가 되면 제외되도록 구현

* refactor: count 할 때 reviewStatus가 포함되도록 변경
cookienc added a commit that referenced this pull request Feb 21, 2024
* 리프레시 토큰 관리를 Redis로 변경 (#710)

* feat: redis 설정 추가

* refactor: RefreshToken 관리를 redis로 업데이트

* test: refreshToken 관련 service 테스트 수정

* refactor: EmbbedRedis 설정 제거

* feat: Redis Test Container 설정 추가

* refactor: 테스트가 용이하게 RefreshToken TTL을 외부에서 관리

* test: OauthComand관련 테스트 수정

* test: Restdocs 테스트 수정

* refactor: OauthCommandService 생성자에 refreshTokenExpireMinutes를 받도록 수정

* test: RefreshToken 추가

* test: 사용하지 않는 RefreshToken 삭제

* refactor: RefreshToken2 를 RefreshToken으로 이름 변경

* refactor: expire minutes 이름 변경

* test: RefreshTokenFixture로 리팩토링

* refactor: Facade 패턴 적용

* refactor: ttl 단위를 분으로 변경

* refactor: RedisConfig에 username과 password 추가

* feat: docker-compose 에 redis 설정 추가

* refactor: 사용하지 않는 Restemplate 제거

* refactor: 스프링 부트 버전 3.1.8로 업그레이드

* refactor: redis.conf bind를 localhost만 가능하도록 변경

* 게시글 조회 API에 게시글 총 개수 포함해서 반환 (#711)

refactor: 글 조회시 전체 개수가 같이 반환되도록 구현

* 완료된 리뷰가 많은 서포터 순대로 조회하는 기능 구현 (#712)

* feat: 리뷰가 많은 사람 랭킹 구하는 기능 구현

* test: 랭킹 인수테스트와 restdocs 테스트 구현

* feat: 랭킹에 company 항목 추가

* refactor: 다른 랭킹도 추가할 수 있도록 Rankable 마커 인터페이스 구현

* feat: review 완료 시 reviewCount 증가 기능 구현 (#721)

* feat: review 완료 시 reviewCount 증가 기능 구현

* test: reviewCount 증가로직 테스트 구현

* refactor: 리뷰수 증가 로직을 RunnerPost 안으로 옮김

* reviewCount가 0인 항목이 조회가 되면 제외되도록 구현 (#722)

* refactor: reviewCount가 0인 항목이 조회가 되면 제외되도록 구현

* refactor: count 할 때 reviewStatus가 포함되도록 변경

* 리뷰 상태별로 게시글 전체 개수를 조회하는 기능 구현 (#728)

* feat: 리뷰 상태별로 게시글 전체 개수를 조회하는 기능 구현

* test: Restdocs 테스트 추가
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💙 BE 백엔드 작업입니다. ♻️ refactor 코드를 개선하고 오겠습니다.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

2 participants