

원래 JWT 발급시 TokenProvider에 refreshToken과 accessToken의 발급과 재발급 코드를 모두 때려박아서 사용했는데, 아래처럼 코드를 분리하니 책임이 분리되고 유지보수의 효율이 높아져 더욱 객체지향적인 코드가 되는것 같다.. 생각도 못한 코드
@RequiredArgsConstructor
@Service
public class TokenService {
private final TokenProvider tokenProvider;
private final RefreshTokenService refreshTokenService;
private final UserService userService;
public String createNewAccessToken(String refreshToken) {
// 토큰 유효성 검증
if(tokenProvider.validToken(refreshToken)) {
throw new IllegalArgumentException("unexpected token");
}
Long userId = refreshTokenService.findByRefreshToken(refreshToken).getUserId();
User user = userService.findById(userId);
return tokenProvider.generateToken(user, Duration.ofHours(2));
}
}
@RequiredArgsConstructor
@Service
public class RefreshTokenService {
private final RefreshTokenRepository refreshTokenRepository;
public RefreshToken findByRefreshToken(String refreshToken) {
return refreshTokenRepository.findByRefreshToken(refreshToken)
.orElseThrow(() -> new IllegalArgumentException("unexpected refreshtoken"));
}
}
@RequiredArgsConstructor
@RestController
public class TokenApiController {
private final TokenService tokenService;
@PostMapping("/api/latest/token")
public ResponseEntity<CreateAccessTokenResponseDto> createNewAccessToken(@RequestBody CreateAccessTokenRequestDto createAccessTokenRequestDto) {
String newAccessToken = tokenService.createNewAccessToken(createAccessTokenRequestDto.getRefreshToken());
return ResponseEntity.status(HttpStatus.CREATED)
.body(new CreateAccessTokenResponseDto(newAccessToken));
}
}
AWS EC2 인스턴스 우분투 서버 생성 및 SSH를 통한 접속을 위한 세팅
TCP 8080 포트 보안규칙 추가 (실제 진행시 편의를 위해 모든 범위 추가함)

EC2 도커 환경 설정
우분투 내 환경 설정
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo chmod 666 /var/run/docker.sock
docker 이미지 세팅 후 키 생성
ssh-keygen -t rsa -b 4096 -C "[내 메일주소]" -f spring-cicd
CI/CD를 위해 나온.pub 키 내용으로 ~/.ssh/authorized_keys2 생성
Github Action 명세서 main.yml을 디렉토리 최상단/.github/workflows 디렉토리에 작성
name: Java CI with Gradle
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: '<<<OPEN JDK 이름>>>'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build -x test
- name: Docker build
run: |
docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }}
docker build -t spring-cicd .
docker tag spring-cicd <<<도커허브아이디>>>/spring-cicd:${GITHUB_SHA::7}
docker push <<<도커허브아이디>>>/spring-cicd:${GITHUB_SHA::7}
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: <<<AWS EC2 호스트>>>
username: ubuntu
key: ${{ secrets.KEY }}
envs: GITHUB_SHA
script: |
docker pull <<<도커허브아이디>>>/spring-cicd:${GITHUB_SHA::7}
docker tag <<<도커허브아이디>>>/spring-cicd:${GITHUB_SHA::7} spring-cicd
docker stop server
docker rm -f server
docker run -d --name server -p 8080:8080 spring-cicd
