Docker - Redis 컨테이너 실행(CMD, Power Shell)

## Redis 컨테이너 실행
> docker run -d --name redis-local -p 6379:6379 redis
## 정상 실행 확인
> docker ps
> docker exec -it redis-local redis-cli
> ping
PONG ##응답 받으면 정상

Windows - Redis 컨테이너 실행(CMD, Power Shell)

WSL2(Ubuntu) 작업

## Ubuntu 실행
> wsl -d Ubuntu

# Ubuntu에서 설치/실행
> sudo apt update
> sudo apt install -y redis-server
# 비밀번호/유저 설정 (예시: 사용자 default / 비번 redis)
> sudo sed -i "s/^# *requirepass .*/requirepass redis/" /etc/redis/redis.conf
# Redis 6+ ACL: 사용자 default 활성화 예시(필요 시)
echo 'user default on >redis allchannels allcommands allkeys' | sudo tee -a /etc/redis/redis.conf

# 바인드/보안 (WSL로만 접근이면 기본 설정으로 OK, 외부 바인드 필요 없음)
> sudo systemctl restart redis-server
> sudo systemctl status redis-server
> redis-cli -a redis PING   # PONG 확인

## Ubuntu 나가기
> exit

## Windows → WSL localhost 포워딩 확인
> Test-NetConnection 127.0.0.1 -Port 6379

Windows ↔ WSL 포트프록시

  • 127.0.0.1:6379 → (WSL-IP):6379 로 전달
## powershell에서 진행
# Set-WSLPortProxy.ps1 (요지)
param(
  [string]$Distro = "Ubuntu",
  [string]$ListenAddress = "127.0.0.1",
  [int]$ListenPort = 6379,
  [int]$ConnectPort = 6379
)

function Require-Admin {
  $id=[Security.Principal.WindowsIdentity]::GetCurrent()
  $p=New-Object Security.Principal.WindowsPrincipal($id)
  if(-not $p.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)){
    throw "관리자 PowerShell에서 실행하세요."
  }
}

function Get-WSLIPv4([string]$d){
  $cmd="ip -4 route get 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'"
  $ip=(wsl -d $d bash -lc $cmd) -replace '\s',''
  if([string]::IsNullOrWhiteSpace($ip)){
    $cmd2="ip -4 -o addr show dev eth0 | awk '{print $4}' | cut -d/ -f1"
    $ip=(wsl -d $d bash -lc $cmd2) -replace '\s',''
  }
  $ip
}

function Ensure-Service {
  $svc=Get-Service iphlpsvc
  if($svc.Status -ne 'Running'){ Start-Service iphlpsvc }
}

function Set-PortProxy($listenAddr,$listenPort,$connectAddr,$connectPort){
  netsh interface portproxy delete v4tov4 listenaddress=$listenAddr listenport=$listenPort 2>$null | Out-Null
  netsh interface portproxy add v4tov4 listenaddress=$listenAddr listenport=$listenPort connectaddress=$connectAddr connectport=$connectPort
}

function Set-Firewall($ruleName,$port){
  if(-not (Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue)){
    New-NetFirewallRule -DisplayName $ruleName -Direction Inbound -Action Allow -Protocol TCP -LocalPort $port | Out-Null
  }
}

# 실행
Require-Admin
Ensure-Service
$wslIp = Get-WSLIPv4 -d $Distro
Set-PortProxy -listenAddr $ListenAddress -listenPort $ListenPort -connectAddr $wslIp -connectPort $ConnectPort
Set-Firewall -ruleName "WSL PortProxy $ListenPort" -port $ListenPort

# 확인
netsh interface portproxy show all
Test-NetConnection 127.0.0.1 -Port 6379

자동 갱신(스케줄러)

$scriptPath = "C:\Tools\Set-WSLPortProxy.ps1"
$taskName   = "WSL PortProxy Auto-Refresh"
$action     = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scriptPath`" -Distro `"Ubuntu`" -ListenPort 6379 -ConnectPort 6379"
$trigger    = New-ScheduledTaskTrigger -AtLogOn
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -RunLevel Highest -Description "Refresh WSL portproxy for Redis" -Force
# 수동 테스트
Start-ScheduledTask -TaskName $taskName

Spring Boot에서 Redis 연결 설정

  • pom.xml 수정
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • application.properties 수정
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.username=default
spring.data.redis.password=redis
spring.data.redis.timeout=3s
  • 의존성 주입을 위한 Repository 클래스 생성
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public class RedisPermissionRepository {

    private final HashOperations<String, String, String> hashOperations;

    @Autowired
    public RedisPermissionRepository(RedisTemplate<String, String> redisTemplate) {
        this.hashOperations = redisTemplate.opsForHash();
    }

    // 권한 저장
    public void savePermission(String userId, String path, int level) {
        String key = getKey(userId);
        hashOperations.put(key, path, String.valueOf(level));
    }

    // 권한 조회
    public Optional<Integer> getPermission(String userId, String path) {
        String key = getKey(userId);
        String value = hashOperations.get(key, path);
        return Optional.ofNullable(value).map(Integer::valueOf);
    }

    // 전체 권한 삭제 (ex. 로그아웃 또는 권한 변경 시)
    public void deleteAllPermissions(String userId) {
        String key = getKey(userId);
        hashOperations.getOperations().delete(key);
    }

    private String getKey(String userId) {
        return "perm:" + userId;
    }
}

참고

  • Chat GPT 4.0