Skip to content

Commit c7af82d

Browse files
authored
feat/OPS-358: Redis 의존성 추가 및 RedisConfig 설정 완료. AuthResultData 직렬화 및 AuthResult 클래스에 TTL 도입. (#92)
1 parent 83ccc6d commit c7af82d

File tree

6 files changed

+71
-30
lines changed

6 files changed

+71
-30
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ dependencies {
104104

105105
// Apache Commons Codec
106106
implementation"commons-codec:commons-codec:1.19.0"
107+
108+
// Redis (Spring starter)
109+
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
107110
}
108111

109112
dependencyManagement {

src/main/java/org/tuna/zoopzoop/backend/domain/auth/controller/ApiV1AuthController.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,13 @@ public ResponseEntity<RsData<Void>> logout(
6969
* @param sessionId 쿠키에 포함된 현재 로그인한 사용자의 sessionId.
7070
* @param response Servlet 기반 웹에서 server -> client로 http 응답을 보내기 위한 객체, 자동 주입.
7171
*/
72-
7372
@PostMapping("/refresh")
7473
@Operation(summary = "사용자 액세스 토큰 재발급 (서버 저장 RefreshToken 사용)")
7574
public ResponseEntity<RsData<Void>> refreshToken(
7675
@CookieValue(name = "sessionId")
7776
String sessionId,
7877
HttpServletResponse response
7978
) {
80-
8179
if (sessionId == null) {
8280
return ResponseEntity
8381
.status(HttpStatus.UNAUTHORIZED)
@@ -91,7 +89,11 @@ public ResponseEntity<RsData<Void>> refreshToken(
9189
} catch (AuthenticationException e) {
9290
return ResponseEntity
9391
.status(HttpStatus.UNAUTHORIZED)
94-
.body(new RsData<>("401", e.getMessage(), null));
92+
.body(new RsData<>(
93+
"401",
94+
e.getMessage(),
95+
null
96+
));
9597
}
9698

9799
String refreshToken = refreshTokenEntity.getRefreshToken();
@@ -126,7 +128,6 @@ public ResponseEntity<RsData<Void>> refreshToken(
126128
* 확장프로그램의 액세스 토큰 발급을 위한 백그라운드 풀링에 대응하는 API
127129
* @param state 확장프로그램 로그인 시 전달한 state 값.
128130
*/
129-
130131
@GetMapping("/result")
131132
@Operation(summary = "확장프로그램 백그라운드 풀링 대응 API")
132133
public ResponseEntity<RsData<AuthResultData>> pullingResult(
Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package org.tuna.zoopzoop.backend.domain.auth.dto;
22

3-
public class AuthResultData {
4-
private final String accessToken;
5-
private final String sessionId;
6-
7-
public AuthResultData(String accessToken, String sessionId) {
8-
this.accessToken = accessToken;
9-
this.sessionId = sessionId;
10-
}
11-
12-
public String getAccessToken() {
13-
return accessToken;
14-
}
15-
16-
public String getSessionId() {
17-
return sessionId;
18-
}
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
import java.io.Serializable;
8+
9+
@Data
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class AuthResultData implements Serializable {
13+
private String accessToken;
14+
private String sessionId;
1915
}
Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
package org.tuna.zoopzoop.backend.domain.auth.entity;
22

3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.data.redis.core.RedisTemplate;
35
import org.springframework.stereotype.Component;
46
import org.tuna.zoopzoop.backend.domain.auth.dto.AuthResultData;
5-
import java.util.Map;
6-
import java.util.concurrent.ConcurrentHashMap;
7+
8+
import java.time.Duration;
79

810
@Component
11+
@RequiredArgsConstructor
912
public class AuthResult {
10-
private final Map<String, AuthResultData> results = new ConcurrentHashMap<>();
13+
private final RedisTemplate<String, AuthResultData> redisTemplate;
14+
private static final String PREFIX = "auth:result:";
1115

1216
public void put(String state, String accessToken, String sessionId) {
13-
results.put(state, new AuthResultData(accessToken, sessionId));
17+
AuthResultData data = new AuthResultData(accessToken, sessionId);
18+
redisTemplate.opsForValue().set(PREFIX + state, data, Duration.ofMinutes(1)); // TTL 1분, 프론트단에선 백그라운드 풀링 형식으로 계속 작동할 것이므로.
1419
}
1520

1621
public AuthResultData get(String state) {
17-
return results.remove(state);
18-
}
19-
20-
public void consume(String state) {
21-
results.remove(state);
22+
AuthResultData data = redisTemplate.opsForValue().get(PREFIX + state);
23+
if (data != null) redisTemplate.delete("auth:" + state);
24+
return data;
2225
}
2326
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.tuna.zoopzoop.backend.global.config.redis;
2+
3+
import org.springframework.cache.annotation.EnableCaching;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.data.redis.connection.RedisConnectionFactory;
7+
import org.springframework.data.redis.core.RedisTemplate;
8+
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
9+
import org.springframework.data.redis.serializer.StringRedisSerializer;
10+
import org.tuna.zoopzoop.backend.domain.auth.dto.AuthResultData;
11+
12+
@Configuration
13+
@EnableCaching
14+
public class RedisConfig {
15+
16+
@Bean
17+
public RedisTemplate<String, AuthResultData> redisTemplate(RedisConnectionFactory connectionFactory) {
18+
RedisTemplate<String, AuthResultData> template = new RedisTemplate<>();
19+
template.setConnectionFactory(connectionFactory);
20+
21+
// Key Serializer
22+
template.setKeySerializer(new StringRedisSerializer());
23+
// Value Serializer (JSON 직렬화)
24+
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(AuthResultData.class));
25+
26+
return template;
27+
}
28+
}

src/main/resources/application.yml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ spring:
3535
options:
3636
model: meta-llama/llama-4-scout-17b-16e-instruct
3737
temperature: 0
38+
data: #RedisTemplate 등을 사용하기 위한 직접 연결용
39+
redis:
40+
host: localhost
41+
port: 6379
42+
timeout: 6000
43+
cache: #Spring Cache를 사용하기 위한 Redis
44+
type: redis
45+
redis:
46+
time-to-live: 300000
47+
cache-null-values: false
48+
key-prefix:
3849

3950
springdoc:
4051
default-produces-media-type: application/json;charset=UTF-8
@@ -48,7 +59,6 @@ logging:
4859
server:
4960
port: 8080
5061

51-
5262
app:
5363
seed:
5464
enabled: true

0 commit comments

Comments
 (0)