[SW 직무역량 부트캠프] 9일차

WJ·2023년 7월 6일
post-thumbnail

2023-07-06 SW 직무역량 부트캠프 9일차 TIL

📙 실습

원래 JWT 발급시 TokenProvider에 refreshToken과 accessToken의 발급과 재발급 코드를 모두 때려박아서 사용했는데, 아래처럼 코드를 분리하니 책임이 분리되고 유지보수의 효율이 높아져 더욱 객체지향적인 코드가 되는것 같다.. 생각도 못한 코드

TokenService.java

@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));
    }

}

RefreshTokenService.java

@RequiredArgsConstructor
@Service
public class RefreshTokenService {
    private final RefreshTokenRepository refreshTokenRepository;

    public RefreshToken findByRefreshToken(String refreshToken) {
        return refreshTokenRepository.findByRefreshToken(refreshToken)
                .orElseThrow(() -> new IllegalArgumentException("unexpected refreshtoken"));
    }

}

TokenApiController.java

@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));
    }


}

📙 CI/CD

  • AWS EC2 인스턴스 우분투 서버 생성 및 SSH를 통한 접속을 위한 세팅

    • 인스턴스가 껐다 켜졌을때를 위해 탄력적 IP주소도 세팅
  • 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
  • 깃허브에 푸시후 Actions 탭 확인
  • done !
profile
주니어 개발자

0개의 댓글