Skip to content

Commit

Permalink
refactor: [user] 1차 리팩토링
Browse files Browse the repository at this point in the history
프로젝트 구조 1차 리팩토링

테스트 코드는 함께 수정하지 못했다

https 테스트는 진행

issue key : #78
  • Loading branch information
zhyunk committed Apr 28, 2024
1 parent 223117b commit ab26e96
Show file tree
Hide file tree
Showing 83 changed files with 1,561 additions and 1,336 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package kim.zhyun.serveruser.client;

import kim.zhyun.serveruser.data.response.ApiResponse;
import kim.zhyun.serveruser.common.model.ApiResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

Expand All @@ -13,7 +12,7 @@
public interface ArticleClient {

@PostMapping("/delete/withdrawal")
ResponseEntity<ApiResponse<Object>> withdrawalArticleDelete(@RequestBody Set<Long> userIds);
ResponseEntity<ApiResponse<Void>> withdrawalArticleDelete(@RequestBody Set<Long> userIds);

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kim.zhyun.serveruser.common.advice;

public class ApiException extends RuntimeException {

public ApiException(String exceptionMessage) {
super(exceptionMessage);
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package kim.zhyun.serveruser.advice;
package kim.zhyun.serveruser.common.advice;

import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Path;
import kim.zhyun.serveruser.data.response.ApiResponse;
import kim.zhyun.serveruser.data.response.ValidExceptionResponse;
import kim.zhyun.serveruser.common.model.ApiResponse;
import kim.zhyun.serveruser.common.model.ValidExceptionResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
Expand All @@ -21,8 +21,8 @@
import java.util.List;
import java.util.stream.StreamSupport;

import static kim.zhyun.serveruser.data.message.ExceptionMessage.EXCEPTION_REQUIRED_REQUEST_BODY;
import static kim.zhyun.serveruser.data.message.ExceptionMessage.EXCEPTION_VALID_FORMAT;
import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_REQUIRED_REQUEST_BODY;
import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_VALID_FORMAT;

@RestControllerAdvice
public class GlobalAdvice extends ResponseEntityExceptionHandler {
Expand All @@ -31,6 +31,7 @@ public class GlobalAdvice extends ResponseEntityExceptionHandler {
* custom Exception
*/
@ExceptionHandler({
ApiException.class,
MemberException.class,
MailAuthException.class,
UsernameNotFoundException.class,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kim.zhyun.serveruser.advice;
package kim.zhyun.serveruser.common.advice;

public class MailAuthException extends RuntimeException {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kim.zhyun.serveruser.advice;
package kim.zhyun.serveruser.common.advice;

public class MemberException extends RuntimeException {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kim.zhyun.serveruser.advice;
package kim.zhyun.serveruser.common.advice;

public class SignUpException extends RuntimeException {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package kim.zhyun.serveruser.common.annotation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import kim.zhyun.serveruser.common.annotation.constraint.EmailValidator;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_VALID_EMAIL_CODE;
import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_VALID_EMAIL_FORMAT;

@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidator.class)
public @interface Email {

String message() default EXCEPTION_VALID_EMAIL_FORMAT;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package kim.zhyun.serveruser.common.annotation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import kim.zhyun.serveruser.common.annotation.constraint.NicknameValidator;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_VALID_EMAIL_CODE;
import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_VALID_NICKNAME_FORMAT;

@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NicknameValidator.class)
public @interface Nickname {

String message() default EXCEPTION_VALID_NICKNAME_FORMAT;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package kim.zhyun.serveruser.common.annotation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import kim.zhyun.serveruser.common.annotation.constraint.VerifyCodeValidator;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_VALID_EMAIL_CODE;

@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = VerifyCodeValidator.class)
public @interface VerifyCode {

String message() default EXCEPTION_VALID_EMAIL_CODE;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package kim.zhyun.serveruser.common.annotation.constraint;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import kim.zhyun.serveruser.common.advice.ApiException;
import kim.zhyun.serveruser.common.annotation.Email;
import org.apache.logging.log4j.util.Strings;
import org.springframework.stereotype.Component;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmailValidator implements ConstraintValidator<Email, String> {

@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {

if (value != null) {
String regex = "^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$";
Matcher patternMatcher = Pattern.compile(regex).matcher(value);

return patternMatcher.matches();
}

return true;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package kim.zhyun.serveruser.common.annotation.constraint;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import kim.zhyun.serveruser.common.advice.ApiException;
import kim.zhyun.serveruser.common.annotation.Nickname;
import org.apache.logging.log4j.util.Strings;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

public class NicknameValidator implements ConstraintValidator<Nickname, String> {

@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {

if (value != null) {
int length = value.length();

return length >= 1 && length <= 6;
}

return true;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package kim.zhyun.serveruser.common.annotation.constraint;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import kim.zhyun.serveruser.common.advice.ApiException;
import kim.zhyun.serveruser.common.annotation.VerifyCode;
import org.apache.logging.log4j.util.Strings;
import org.springframework.stereotype.Component;

public class VerifyCodeValidator implements ConstraintValidator<VerifyCode, String> {

@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {

return Strings.isNotBlank(value);
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kim.zhyun.serveruser.data.message;
package kim.zhyun.serveruser.common.message;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kim.zhyun.serveruser.data.message;
package kim.zhyun.serveruser.common.message;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kim.zhyun.serveruser.data.response;
package kim.zhyun.serveruser.common.model;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kim.zhyun.serveruser.data.response;
package kim.zhyun.serveruser.common.model;

import lombok.Builder;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package kim.zhyun.serveruser.common.model.type;

public class RoleType {
public static final String TYPE_ADMIN = "ADMIN";
public static final String TYPE_MEMBER = "MEMBER";
public static final String TYPE_WITHDRAWAL = "WITHDRAWAL";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package kim.zhyun.serveruser.config;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ObjectMapperConfig {

@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return objectMapper;
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package kim.zhyun.serveruser.config;

import kim.zhyun.jwt.data.JwtUserDto;
import kim.zhyun.serveruser.advice.MemberException;
import kim.zhyun.serveruser.data.UserDto;
import kim.zhyun.serveruser.service.MemberService;
import kim.zhyun.jwt.dto.JwtUserInfoDto;
import kim.zhyun.serveruser.common.advice.MemberException;
import kim.zhyun.serveruser.config.model.UserDto;
import kim.zhyun.serveruser.domain.member.converter.UserConverter;
import kim.zhyun.serveruser.domain.member.service.MemberService;
import kim.zhyun.serveruser.utils.DateTimeUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
Expand All @@ -16,38 +17,41 @@

import java.util.Set;

import static kim.zhyun.serveruser.data.message.ExceptionMessage.EXCEPTION_SIGNIN_FAIL;
import static kim.zhyun.serveruser.data.message.ExceptionMessage.EXCEPTION_WITHDRAWAL;
import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_SIGNIN_FAIL;
import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_WITHDRAWAL;
import static kim.zhyun.serveruser.utils.DateTimeUtil.dateTimeCalculate;

@RequiredArgsConstructor
@Component
public class SecurityAuthenticationManager implements AuthenticationManager {
private final MemberService userService;
private final PasswordEncoder passwordEncoder;
private final UserConverter userConverter;

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String email = authentication.getName();
String password = (String) authentication.getCredentials();
UserDto userDto = userService.findByEmail(email);
UserDto userDto = userConverter.toDto(userService.findByEmailWithThrow(email));

if (!passwordEncoder.matches(password, userDto.getPassword()))
throw new MemberException(EXCEPTION_SIGNIN_FAIL);

if (userDto.isWithdrawal()) {
DateTimeUtil.DateTimePeriodDto dateTimePeriodDto = dateTimeCalculate(userDto.getModifiedAt());
throw new MemberException(String.format(EXCEPTION_WITHDRAWAL,
throw new MemberException(String.format(
EXCEPTION_WITHDRAWAL,
dateTimePeriodDto.days(),
dateTimePeriodDto.hours(),
dateTimePeriodDto.minutes()));
}

return new UsernamePasswordAuthenticationToken(
JwtUserDto.builder()
JwtUserInfoDto.builder()
.id(userDto.getId())
.email(userDto.getEmail())
.nickname(userDto.getNickname()).build(),
.nickname(userDto.getNickname())
.build(),
userDto.getPassword(),
Set.of(new SimpleGrantedAuthority("ROLE_" + userDto.getRole().getGrade())));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package kim.zhyun.serveruser.config;

import kim.zhyun.jwt.filter.JwtFilter;
import kim.zhyun.serveruser.advice.MemberException;
import kim.zhyun.serveruser.common.advice.MemberException;
import kim.zhyun.serveruser.filter.AuthenticationFilter;
import kim.zhyun.serveruser.filter.ExceptionHandlerFilter;
import kim.zhyun.serveruser.filter.SessionCheckFilter;
Expand All @@ -17,10 +17,10 @@
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.context.SecurityContextHolderFilter;

import static kim.zhyun.serveruser.data.message.ExceptionMessage.EXCEPTION_AUTHENTICATION;
import static kim.zhyun.serveruser.data.message.ExceptionMessage.EXCEPTION_PERMISSION;
import static kim.zhyun.serveruser.data.type.RoleType.TYPE_ADMIN;
import static kim.zhyun.serveruser.data.type.RoleType.TYPE_MEMBER;
import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_AUTHENTICATION;
import static kim.zhyun.serveruser.common.message.ExceptionMessage.EXCEPTION_PERMISSION;
import static kim.zhyun.serveruser.common.model.type.RoleType.TYPE_ADMIN;
import static kim.zhyun.serveruser.common.model.type.RoleType.TYPE_MEMBER;
import static org.springframework.security.config.Customizer.withDefaults;

@RequiredArgsConstructor
Expand Down
Loading

0 comments on commit ab26e96

Please sign in to comment.