๋์ปค์ ๋ ๋์ค๋ฅผ ์ฐ๋ํ๋๋ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๋ด๊ฐ ์์ฑํ๋ ค๊ณ ํ๋ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
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 ๋ถ๋ถ์ ์์ ํด์ฃผ์๋ค.
์์๊ฐ์ด ํจ์ค์๋ ์ค์ ๋ถ๋ถ์ ์ ๊ฑฐํด์ฃผ์๋ค. ํ์ง๋ง ๋ณด์์ ์ํํ ์์์ด ํ ์คํธ๊ณผ์ ์ด ๋๋๋ฉด ํจ์ค์๋๋ฅผ ์ ์ฉํ ์์ ์ด๋ค.
์ฌ๊ธฐ๊น์ง ์ค์ ํด์ฃผ๋ ์ ์์ ์ผ๋ก ๋ ๋์ค๋ฅผ ์ฐ๋ํ์ฌ ์ฌ์ฉํ ์์๊ฒ ๋์๋ค. ํ๋ฃจ์ข ์ผ ๊ณ ๋ฏผํ ๋ฌธ์ ์ฌ์ ํด๊ฒฐํ๊ณ ๋๋ ์ ๋ง ๊ธฐ๋ถ์ด ์ข์๋ค. ๋ฉํฌ...!