Skip to content

Commit

Permalink
인증 도메인 리펙토링 (#127)
Browse files Browse the repository at this point in the history
* refactor: dto 클래스 Record로 변환 (#126)

- Java 17의 특성을 반영하여 auth 디렉토리의 dto를 모두 Record로 변경했습니다.
- 불필요한 dto들을 제거했습니다.

* cicd: workflow 내 sonarCloud 작업 제거
  • Loading branch information
jemlog authored Nov 21, 2023

Verified

This commit was signed with the committer’s verified signature.
sergio-costas Sergio Costas
1 parent 8b76848 commit a9df550
Showing 77 changed files with 309 additions and 858 deletions.
9 changes: 1 addition & 8 deletions .github/workflows/backend-ci.yml
Original file line number Diff line number Diff line change
@@ -18,12 +18,6 @@ jobs:
with:
java-version: 17
distribution: 'zulu'
- name: Cache SonarCloud packages
uses: actions/cache@v3
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Gradle Caching
uses: actions/cache@v3
with:
@@ -36,8 +30,7 @@ jobs:
- name: Build and analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./gradlew test testCodeCoverageReport sonar --info
run: ./gradlew build

- name: Publish Unit Test Results
uses: EnricoMi/publish-unit-test-result-action@v1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package cmc.mellyserver.auth.certification;
package cmc.mellyserver.auth.certificate;

import static cmc.mellyserver.mail.EmailConstants.*;

@@ -11,36 +11,30 @@

@Repository
@RequiredArgsConstructor
class EmailCertificationNumberDao implements CertificationNumberDao {
class CertificationNumberRepository {

private final StringRedisTemplate redisTemplate;

/**
* 이메일 인증 번호를 Redis에 저장합니다.
* <p>
* 인증번호 유효기간은 3분으로 설정했습니다.
/*
인증번호 유효기간 : 3분
*/
@Override
public void saveCertificationNumber(String email, String certificationNumber) {
public void save(String email, String certificationNumber) {

redisTemplate.opsForValue()
.set(PREFIX_CERTIFICATION + email, certificationNumber,
Duration.ofSeconds(LIMIT_TIME_CERTIFICATION_NUMBER));

}

@Override
public String getCertificationNumber(String email) {
public String get(String email) {
return redisTemplate.opsForValue().get(PREFIX_CERTIFICATION + email);
}

@Override
public void removeCertificationNumber(String email) {
public void remove(String email) {
redisTemplate.delete(PREFIX_CERTIFICATION + email);
}

@Override
public boolean hasKey(String email) {
public Boolean hasKey(String email) {
return redisTemplate.hasKey(PREFIX_CERTIFICATION + email);
}

Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package cmc.mellyserver.auth.certification;
package cmc.mellyserver.auth.certificate;

import cmc.mellyserver.auth.dto.request.EmailCertificationRequest;

public interface CertificationService {

Original file line number Diff line number Diff line change
@@ -1,30 +1,31 @@
package cmc.mellyserver.auth.certification;
package cmc.mellyserver.auth.certificate;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Repository;

import cmc.mellyserver.common.event.SignupCertificationEvent;
import cmc.mellyserver.auth.dto.request.EmailCertificationRequest;
import cmc.mellyserver.common.event.CertificationCompletedEvent;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Profile({"local", "prod"})
@Repository
@RequiredArgsConstructor
class EmailCertificationService implements CertificationService {

private final ApplicationEventPublisher applicationEventPublisher;
private final CertificationNumberRepository certificationNumberRepository;

private final CertificationNumberDao certificationNumberDao;
private final ApplicationEventPublisher applicationEventPublisher;

/**
* 인증 이메일 전송 기능
*/
public void sendCertification(String email) {

String certificationNumber = RandomNumberGenerator.makeRandomNumber();
certificationNumberRepository.save(email, certificationNumber);
applicationEventPublisher.publishEvent(new CertificationCompletedEvent(email, certificationNumber));

applicationEventPublisher.publishEvent(new SignupCertificationEvent(email, certificationNumber));
certificationNumberDao.saveCertificationNumber(email, certificationNumber);
}

// 인증번호 일치 여부 확인
@@ -35,14 +36,14 @@ public void verify(EmailCertificationRequest requestDto) {
}

// 인증 후 DB에서 인증번호 삭제
certificationNumberDao.removeCertificationNumber(requestDto.getEmail());
certificationNumberRepository.remove(requestDto.email());
}

// 인증번호 일치 여부 확인 내부 로직
private boolean isVerify(EmailCertificationRequest requestDto) {
return !(certificationNumberDao.hasKey(requestDto.getEmail())
&& certificationNumberDao.getCertificationNumber(requestDto.getEmail())
.equals(requestDto.getCertificationNumber()));
return !(certificationNumberRepository.hasKey(requestDto.email())
&& certificationNumberRepository.get(requestDto.email())
.equals(requestDto.certificationNumber()));
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package cmc.mellyserver.auth.certification;
package cmc.mellyserver.auth.certificate;

import java.util.Random;

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
import java.io.IOException;

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

@@ -24,40 +25,34 @@ public class JwtExceptionFilter extends OncePerRequestFilter {
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
try {

chain.doFilter(request, response);

} catch (JwtException ex) {

setExpiredErrorResponse(request, response, ex);

setExpiredErrorResponse(response);
} catch (LogoutOrWithdrawException ex) {
setLogoutOrWithdrawErrorResponse(request, response, ex);
setLogoutOrWithdrawErrorResponse(response);
}
}

public void setExpiredErrorResponse(HttpServletRequest request, HttpServletResponse response, Throwable ex)
throws IOException {
private void setExpiredErrorResponse(HttpServletResponse response) throws IOException {

response.setContentType("application/json; charset=UTF-8");
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setStatus(HttpStatus.OK.value());

ErrorResponse error = ErrorResponse.of(ErrorCode.EXPIRED_TOKEN);

final ObjectMapper mapper = new ObjectMapper();
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getOutputStream(), error);

}

public void setLogoutOrWithdrawErrorResponse(HttpServletRequest request, HttpServletResponse response, Throwable ex)
throws IOException {
private void setLogoutOrWithdrawErrorResponse(HttpServletResponse response) throws IOException {

response.setContentType("application/json; charset=UTF-8");
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setStatus(HttpStatus.OK.value());

ErrorResponse error = ErrorResponse.of(ErrorCode.LOGOUT_WITHDRAW_USER);

final ObjectMapper mapper = new ObjectMapper();
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getOutputStream(), error);
}

Original file line number Diff line number Diff line change
@@ -46,12 +46,12 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
filterChain.doFilter(request, response);
}

private void checkLogoutOrWithdrawUser(String jwt) {
private void checkLogoutOrWithdrawUser(String accessToken) {

ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();

if (!Objects.isNull(valueOperations.get(jwt))) {
throw new LogoutOrWithdrawException("이미 로그아웃하거나 탈퇴한 유저 입니다.");
if (Objects.nonNull(valueOperations.get(accessToken))) {
throw new LogoutOrWithdrawException("already Logout or withdraw user");
}
}

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package cmc.mellyserver.auth.controller.dto.common;
package cmc.mellyserver.auth.common.resolver;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package cmc.mellyserver.auth.common.resolver;

public class LoginUser {

private final Long userId;

public LoginUser(Long userId) {
this.userId = userId;
}

public Long getId() {
return userId;
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package cmc.mellyserver.common.resolver;
package cmc.mellyserver.auth.common.resolver;

import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
@@ -7,8 +7,6 @@
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import cmc.mellyserver.auth.controller.dto.common.CurrentUser;
import cmc.mellyserver.auth.controller.dto.common.LoginUser;
import cmc.mellyserver.auth.token.TokenProvider;
import cmc.mellyserver.common.util.HeaderUtil;
import jakarta.servlet.http.HttpServletRequest;
@@ -34,8 +32,8 @@ public Object resolveArgument(final MethodParameter parameter, final ModelAndVie

HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
String accessToken = HeaderUtil.getAccessToken(request);
Long id = tokenProvider.extractUserId(accessToken);
return new LoginUser(id);
Long userId = tokenProvider.extractUserId(accessToken);
return new LoginUser(userId);
}

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -10,29 +10,27 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cmc.mellyserver.auth.AuthService;
import cmc.mellyserver.auth.OAuthService;
import cmc.mellyserver.auth.certification.CertificationService;
import cmc.mellyserver.auth.certification.EmailCertificationRequest;
import cmc.mellyserver.auth.controller.dto.common.CurrentUser;
import cmc.mellyserver.auth.controller.dto.common.LoginUser;
import cmc.mellyserver.auth.certificate.CertificationService;
import cmc.mellyserver.auth.common.resolver.CurrentUser;
import cmc.mellyserver.auth.common.resolver.LoginUser;
import cmc.mellyserver.auth.controller.dto.request.AuthLoginRequest;
import cmc.mellyserver.auth.controller.dto.request.CommonSignupRequest;
import cmc.mellyserver.auth.controller.dto.request.ChangePasswordRequest;
import cmc.mellyserver.auth.controller.dto.request.OAuthLoginRequest;
import cmc.mellyserver.auth.controller.dto.request.OAuthSignupRequest;
import cmc.mellyserver.auth.controller.dto.request.ReIssueAccessTokenRequest;
import cmc.mellyserver.auth.controller.dto.response.OAuthResponseDto;
import cmc.mellyserver.auth.dto.request.ChangePasswordRequest;
import cmc.mellyserver.auth.controller.dto.request.SignupRequest;
import cmc.mellyserver.auth.dto.request.EmailCertificationRequest;
import cmc.mellyserver.auth.dto.response.OAuthResponseDto;
import cmc.mellyserver.auth.dto.response.TokenResponseDto;
import cmc.mellyserver.auth.service.AuthService;
import cmc.mellyserver.auth.service.OAuthService;
import cmc.mellyserver.common.util.HeaderUtil;
import cmc.mellyserver.support.response.ApiResponse;
import cmc.mellyserver.support.response.SuccessCode;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
@@ -63,7 +61,7 @@ public ResponseEntity<ApiResponse<TokenResponseDto>> socialSignup(

// 이메일 회원 가입
@PostMapping("/signup")
public ResponseEntity<ApiResponse<TokenResponseDto>> signup(@Valid CommonSignupRequest commonSignupRequest) {
public ResponseEntity<ApiResponse<TokenResponseDto>> signup(@Valid SignupRequest commonSignupRequest) {

TokenResponseDto signupToken = authService.signup(commonSignupRequest.toDto());
return ApiResponse.success(SuccessCode.INSERT_SUCCESS, signupToken);
@@ -81,7 +79,7 @@ public ResponseEntity<ApiResponse<TokenResponseDto>> login(@Valid @RequestBody A
@PostMapping("/email-certification/sends")
public ResponseEntity<ApiResponse<Void>> sendEmailCertification(@RequestBody EmailCertificationRequest requestDto) {

certificationService.sendCertification(requestDto.getEmail());
certificationService.sendCertification(requestDto.email());
return ApiResponse.success(SuccessCode.INSERT_SUCCESS);
}

@@ -90,7 +88,7 @@ public ResponseEntity<ApiResponse<Void>> sendEmailCertification(@RequestBody Ema
public ResponseEntity<ApiResponse<Void>> resendEmailCertification(
@RequestBody EmailCertificationRequest requestDto) {

certificationService.sendCertification(requestDto.getEmail());
certificationService.sendCertification(requestDto.email());
return ApiResponse.success(SuccessCode.INSERT_SUCCESS);
}

@@ -153,7 +151,7 @@ public ResponseEntity<ApiResponse<TokenResponseDto>> generateAccessToken(
@RequestBody ReIssueAccessTokenRequest reIssueAccessTokenRequest) {

TokenResponseDto tokenResponseDto = authService
.reIssueAccessTokenAndRefreshToken(reIssueAccessTokenRequest.getRefreshToken());
.reIssueAccessTokenAndRefreshToken(reIssueAccessTokenRequest.refreshToken());
return ApiResponse.success(SuccessCode.INSERT_SUCCESS, tokenResponseDto);
}

This file was deleted.

Loading

0 comments on commit a9df550

Please sign in to comment.