스프링

 

 

1. 라이브러리

		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-validation</artifactId>
		    <version>2.5.2</version>
		</dependency>

 

 

2. CMRespDto

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class CMRespDto<T> {
 
	private int code; //1(성공), -1(실패)
	private String message;	
	private T data;
	
}

 

 

3.  CustomValidationException

import java.util.Map;

public class CustomValidationException extends RuntimeException {
	
	private static final long serialVersionUID = -807520916259076805L;

	private String message;
	private Map<String,String> errorMap;
	
	public CustomValidationException(String message, Map<String,String> errorMap) {
		super(message);
		this.message=message;
		this.errorMap=errorMap;
	}
	
	
	public Map<String,String> getErrorMap(){
		return errorMap; 
	}
	
	
}

 

 

CustomValidationApiException

import java.util.Map;

public class CustomValidationApiException extends RuntimeException {
	
	private static final long serialVersionUID = -807520916259076805L;

	private Map<String,String> errorMap;
	
	public CustomValidationApiException(String message) {
		super(message);	
	}
	
	
	public CustomValidationApiException(String message, Map<String,String> errorMap) {
		super(message);	
		this.errorMap=errorMap;
	}
	
	
	public Map<String,String> getErrorMap(){
		return errorMap; 
	}
	
	
}

 

 

 

 

 

4.ControllerExceptionHandler

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

import com.cos.photogramstart.handler.ex.CustomApiException;
import com.cos.photogramstart.handler.ex.CustomValidationApiException;
import com.cos.photogramstart.handler.ex.CustomValidationException;
import com.cos.photogramstart.utils.Script;
import com.cos.photogramstart.web.dto.CMRespDto;

@RestController
@ControllerAdvice
public class ControllerExceptionHandler {
	
	@ExceptionHandler(CustomValidationException.class)
	public String validationException(CustomValidationException e) {		
		//CMRespDto,Script 비교
		//1.클라이언트에게 응답할 때는 Script 좋음.
		//2.Ajax통신 - CMRespDto
		//3.Android 통신 - CMRespDto
		if(e.getErrorMap()!=null) {
			return Script.back(e.getErrorMap().toString());	
		}else {
			return Script.back(e.getMessage());
		}
	}
	
	
	
	@ExceptionHandler(CustomValidationApiException.class)
	public ResponseEntity<?> validationApiException(CustomValidationApiException e) {	
		return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new CMRespDto<Object>(-1, e.getMessage(), e.getErrorMap())) ;
	}
	
	@ExceptionHandler(CustomApiException.class)
	public ResponseEntity<?> apiException(CustomApiException e){
		return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new CMRespDto(-1, e.getMessage(), null)) ;
	}
	

	
	
}

 

 

 

===================================================================================================================

추가 참조

 

SignupDto

import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;

import org.hibernate.validator.constraints.Length;

import com.cos.photogramstart.domain.user.User;

import lombok.Data;

@Data //Getter, Setter
public class SignupDto {

	@NotBlank(message="유저명을 입력해주세요.")		
	@Length(max = 20)
	private String username;
	
	@NotBlank
	private String password;
	
	@NotBlank(message="이메일을 입력해주세요.")
	@Email(message = "올바른 이메일 주소를 입력해 주세요.")
	private String email;
	
	@NotBlank
	private String name;
	
	
	public User toEntity() {
		return User.builder()
				.username(username)
				.password(password)
				.email(email)
				.name(name)
				.build();				
	}
	
	
	
	
	
}

 

 

AuthController

	/**
	 *  회원가입버튼-> /auth/signup -> /auth/signin
	 *  회원가입버튼 x
	 * @return
	 */
	@PostMapping("/auth/signup")
	public String signup(@Valid	SignupDto signupDto,  Errors errors, Model model) { // key=value(x-www-form-unlencoded)
		log.info("** 회원가입 처리  {}", signupDto.toString());
		
		if(errors.hasErrors()) {
			Map<String,String> erroMap=new HashMap<>();			
	
			for(FieldError error :  errors.getFieldErrors()  ) {
				System.out.println("======================================");
				erroMap.put(error.getField(), error.getDefaultMessage());
				System.out.println("======================================");
			}
			
			throw new CustomValidationException("유효성검사 실패함 " , erroMap);
		}
		
		
		if(errors.hasErrors()) {
			log.info("*************** errors  : {}", errors.toString());
			return "auth/signup";
		}
		
		
		//이메일 중복 체크
		if(authService.existsByEmail(signupDto.getEmail())){						
			log.info("***** 이메일 중복 : {}", signupDto);	
			errors.rejectValue("email", "email" , "이메일 중복");			
			return "auth/signup";
		}
		
				
		User user=signupDto.toEntity();		
		log.info(user.toString());
		authService.insertUser(user);
		return "redirect:/auth/signin";
	}
	

 

 

 

 

signup.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

                         <!--회원가입 인풋-->
                        <form:form class="login__input"  action="/auth/signup"  method="post" 


modelAttribute="signupDto">
                        <!-- required="required" -->
                            <input type="text" name="username" placeholder="유저네임"  value="${signupDto.username}" />   
                            <div class="error"><form:errors path="username"/></div>                         
                            
                            <input type="password" name="password" placeholder="패스워드" required="required" />
                            <div class="error"><form:errors path="password"/></div>
                            
                            <input type="email" name="email" placeholder="이메일" required="required" value="${signupDto.email}" />
                    		<div class="error"><form:errors path="email"/></div>
                     
                            <input type="text" name="name" placeholder="이름"  value="${signupDto.name}" />
                            <div class="error"><form:errors path="name"/></div>                             
                            
                            <button>가입</button>
                        </form:form>
                        

 

 

 

 

 

 

UserApiController

import java.util.HashMap;
import java.util.Map;

import javax.validation.Valid;

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cos.photogramstart.config.auth.PrincipalDetails;
import com.cos.photogramstart.domain.user.User;
import com.cos.photogramstart.handler.ex.CustomValidationApiException;
import com.cos.photogramstart.service.UserService;
import com.cos.photogramstart.web.dto.CMRespDto;
import com.cos.photogramstart.web.dto.user.UserUpdateDto;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

@RestController
@RequiredArgsConstructor
@Log4j2
public class UserApiController {

	
	private final UserService userService;
	
	
	@PutMapping("/api/user/{id}")
	public CMRespDto<?> udpate(@PathVariable int id, 
			@Valid   UserUpdateDto userUpdateDto ,
			Errors errors, //꼭 @Valid 가 적혀있는 다름 파라미터에 적어야 됨
			@AuthenticationPrincipal PrincipalDetails principalDetails) {	
		
		if(errors.hasErrors()) {		
			Map<String,String> erroMap=new HashMap<>();						
			for(FieldError error :  errors.getFieldErrors()) {			
				erroMap.put(error.getField(), error.getDefaultMessage());
			}		
			throw new CustomValidationApiException("유효성검사 실패함 " , erroMap);
			
		}else {
			User userEntity=userService.회원수정(id, userUpdateDto.toEntity());
			principalDetails.setUser(userEntity);
			
			log.info("****업데이트 유저 정보 데이터  : {}", userEntity.toString());
			return new CMRespDto<>(1, "회원수정완료", userEntity);			
		}
				
	}
	
	
	
	
}

 

 

 

CustomApiException

public class CustomApiException extends RuntimeException {
	
	private static final long serialVersionUID = -807520916259076805L;
	
	public CustomApiException(String message) {
		super(message);
	}	
	
}

 

CustomValidationException

import java.util.Map;

public class CustomValidationException extends RuntimeException {
	
	private static final long serialVersionUID = -807520916259076805L;

	private Map<String, String> errorMap;
	
	public CustomValidationException(String message, Map<String, String> errorMap) {
		super(message);
		this.errorMap = errorMap;
	}
	
	public Map<String, String> getErrorMap(){
		return errorMap;
	}
	
	

 

 

 

 

 

 

 

 

 

 

 

소스 :

https://github.com/braverokmc79/EaszUp-Springboot-Photogram-Start

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

정온(靜穩)과 자유는 최대의 보배이다. 정온(靜穩) , 고요함과 평온. -베토벤

댓글 ( 4)

댓글 남기기

작성

스프링 목록    more