Error Logs๐Ÿพ

๋„์ปค + Redis ์—ฐ๋™ ์—๋Ÿฌ

hae02y 2023. 12. 26. 16:51
๋ฐ˜์‘ํ˜•

๋„์ปค์™€ ๋ ˆ๋””์Šค๋ฅผ ์—ฐ๋™ํ•˜๋Š”๋ฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Docker ๋‚ด๋ถ€์—์„œ Spring์ด ์‹คํ–‰๋˜๊ณ ์žˆ๊ณ , AWS EC2 Host ์„œ๋ฒ„์—์„œ Redis๋ฅผ ๋Œ๋ฆฌ๋Š” ์ƒํƒœ์ด๋‹ค. ๋ฌธ์ œ๋Š” Spring ๋‚ด๋ถ€์˜ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๋ฌธ์ œ V1

์ผ๋‹จ ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š”


์•„๋ž˜์™€ ๊ฐ™์ด application.yml์„ 3๊ฐ€์ง€ ๋ฒ„์ „์œผ๋กœ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
dev๋Š” ๋กœ์ปฌ์—์„œ ๋™์ž‘ํ•˜๋Š” H2, Redis๋Š” localhost์—์„œ ๋™์ž‘ํ•˜๋„๋ก ์ž‘์„ฑ์ด ๋˜์–ด์žˆ์—ˆ๋‹ค.
์ด๊ฒƒ์ €๊ฒƒ ๋ฌธ์ œ์ ์„ ์ฐพ๋‹ค๋ณด๋‹ˆ


application-prod ์— ์ ์šฉ๋˜์–ด์žˆ๋Š” ํ•ด๋‹น ๋ถ€๋ถ„์ด ์ •์ƒ์ ์œผ๋กœ ์ฝํžˆ๊ณ  ์žˆ์ง€์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฒƒ. REDIS_HOST์— host์˜ IP๋ฅผ ์ž…๋ ฅํ•ด๋„ ๋™์ž‘์„ ์‹œ์ผœ๋†“์œผ๋ฉด localhost:6379๋กœ ์‹คํ–‰๋˜๋Š”๊ฒƒ์„ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ์ฐพ์„์ˆ˜์žˆ์—ˆ๋‹ค.

๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ?

๋ฌธ์ œ์ ์„ ์ฐพ์•„๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋ฌธ์ œ์˜€๋‹ค.

@Service  
@RequiredArgsConstructor  
public class RedisUtil {  
private final StringRedisTemplate redisTemplate;//Redis์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ Spring์˜ Redis ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค  

public String getData(String key){//์ง€์ •๋œ ํ‚ค(key)์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Redis์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ  
ValueOperations<String,String> valueOperations=redisTemplate.opsForValue();  
return valueOperations.get(key);  
}  
public void setData(String key,String value){//์ง€์ •๋œ ํ‚ค(key)์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ  
ValueOperations<String,String> valueOperations=redisTemplate.opsForValue();  
valueOperations.set(key,value);  
}  
public void setDataExpire(String key,String value,long duration){//์ง€์ •๋œ ํ‚ค(key)์— ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์ง€์ •๋œ ์‹œ๊ฐ„(duration) ํ›„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ  
ValueOperations<String,String> valueOperations=redisTemplate.opsForValue();  
Duration expireDuration=Duration.ofSeconds(duration);  
valueOperations.set(key,value,expireDuration);  
}  
public void deleteData(String key){//์ง€์ •๋œ ํ‚ค(key)์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Redis์—์„œ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ  
redisTemplate.delete(key);  
}  
}

์œ„์™€๊ฐ™์ด RedisUtil์„ ์ž‘์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด Redis๊ฐ€ Default๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜๊ณ  port์™€ host๋ฅผ ์ฝ์–ด์˜ค์ง€์•Š๋Š”๋‹ค. ์ด๋ฅผ์œ„ํ•ด RedisConfig๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ๋‹ค.

@Configuration  
@EnableRedisRepositories // Redis Repository ํ™œ์„ฑํ™”  
public class RedisConfig {  

@Value("${spring.data.redis.port}")  
private int port;  

@Value("${spring.data.redis.host}")  
private String host;  

@Bean  
public RedisConnectionFactory redisConnectionFactory() {  
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(host, port);  

return lettuceConnectionFactory;  
}  

@Bean  
public RedisTemplate<?, ?> redisTemplate() {  
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();  
redisTemplate.setConnectionFactory(redisConnectionFactory());  
return redisTemplate;  
}  

}

Redis ํ™œ์šฉ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋ถ€๋ถ„์€ Redis ๊ด€๋ จ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(host, port);๋ฅผ ํ†ตํ•ด์„œ host์™€ port๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์›ํ•˜๋Š” host๋กœ redis ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋ณด๋‚ผ์ˆ˜์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฌธ์ œ V2

๋‹ค์Œ์œผ๋กœ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋Š” EC2 ์„œ๋ฒ„์™€์˜ ์—ฐ๋™๋ฌธ์ œ์˜€๋‹ค. ์œ„์—์„œ ๊ทธ๋ ธ๋˜ ๊ตฌ์„ฑ๋„์ฒ˜๋Ÿผ Docker์•ˆ์—์„œ Redis๊ฐ€ ์‹คํ–‰๋˜๋Š”๊ฒƒ์ด ์•„๋‹Œ, Host์˜ local์—์„œ Redis๊ฐ€ ๋Œ๊ณ ์žˆ๋Š” ์ƒํƒœ์˜€๋‹ค.

์ฆ‰ Docker ์•ˆ์—์„œ ์‹คํ–‰๋˜๊ณ ์žˆ๋Š” Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญํ•˜๋Š” Redis์˜ host๊ฐ€ 127.0.0.1(localhost) ์ด๋ผ๋ฉด ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” Redis๊ฐ€ ์‹คํ–‰๋˜๊ณ ์žˆ์ง€์•Š์œผ๋ฏ€๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ

docker run --net host togedog

--net host ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

๋„์ปค์˜ network ๋Š” ๋‹ค์Œ๊ณผ๊ฐ™์ด bridge, host ๋“ฑ์ด ์žˆ๋Š”๋ฐ ์ด๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์™€ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ณต๋ถ€ํ•˜์˜€๋‹ค.

์–ด์จ‹๋“  ํ˜ธ์ŠคํŠธ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ๋˜๋ฉด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 172.17.0.x ๋Œ€์—ญ์œผ๋กœ ์ƒ์„ฑ๋˜์ง€์•Š๊ณ  host์˜ ๋Œ€์—ญ์„ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ํ†ตํ•ด์„œ DOCKER_HOST=127.0.0.1 ๋กœ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

๋ฌธ์ œ V3

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋ ‡๊ฒŒ ํ–ˆ๋Š”๋ฐ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ฝ”๋“œ์™€ ๋„คํŠธ์›Œํฌ์ƒ์˜ ๋ฌธ์ œ๋Š” ๋ชจ๋‘ํ•ด๊ฒฐ๋˜์—ˆ๊ณ , ๋ฌธ์ œ์ ์„ ์ฐพ์•„๋ณด๋‹ค๋ณด๋‹ˆ REDIS์— ์ ‘์†์ด ๋˜๋Š” ๋ถ€๋ถ„์—์„œ ๋ญ”๊ฐ€๊ฐ€ ์ด์ƒํ–ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ redis์— ์ ‘์†ํ• ๋•Œ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ƒํƒœ์˜€๋‹ค.

  • ์ด๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ
vim /etc/redis/redis.conf

์œผ๋กœ ์ ‘์†ํ•˜์—ฌ SECURITY ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.

์œ„์™€๊ฐ™์ด ํŒจ์Šค์›Œ๋“œ ์„ค์ •๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•ด์ฃผ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณด์•ˆ์ƒ ์œ„ํ—˜ํ• ์ˆ˜์žˆ์–ด ํ…Œ์ŠคํŠธ๊ณผ์ •์ด ๋๋‚˜๋ฉด ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ ์šฉํ•  ์˜ˆ์ •์ด๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ์„ค์ •ํ•ด์ฃผ๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ๋ ˆ๋””์Šค๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉํ• ์ˆ˜์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ํ•˜๋ฃจ์ข…์ผ ๊ณ ๋ฏผํ•œ ๋ฌธ์ œ์—ฌ์„œ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜๋‹ˆ ์ •๋ง ๊ธฐ๋ถ„์ด ์ข‹์•˜๋‹ค. ๋ฉœํฌ...!

๋ฐ˜์‘ํ˜•