본문 바로가기
spring boot

Spring boot 유효성 검사 / 복사

by improve 2024. 3. 7.

 

package 형식은 이런식입니다.

 

 

insert 할 때 이메일이 중복이 나면 에러문에 대해 설정을 해주었다.

 

 

●UserDto

package com.mh.restapi03.users;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;


// 사용자 요청해서 유효성 검사

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
    private Long id;
    @NotBlank // 빈공백을 입력 못한다.
    private String username;

    private String email;
    private String password;
    private Gender gender;

    @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss")
    private LocalDateTime wdate;

//    public static User of(UserDto userDto){
//        User user = new User();
//       user.setId(userDto.getId());
//        user.setEmail(userDto.getEmail());
//        user.setUsername(userDto.getUsername());
//        user.setPassword(userDto.getPassword());
//        user.setWdate(LocalDateTime.now());
//        user.setGender(userDto.getGender());
//        return  user;
//    }
}

 

우선 Dto 클래스를 만들어준다.

 

●UserContorller

 @PostMapping("users")
    public ResponseEntity<User> addUser(@RequestBody @Valid UserDto userDto){

        userDto.setWdate(LocalDateTime.now());
        ModelMapper modelMapper = new ModelMapper();
        User user = modelMapper.map(userDto,User.class);
       // User user = modelMapper.map(userDto,User.class);
//        BeanUtils.copyProperties(userDto,user);
        // 클래스를 복사 하는 법 BeanUtils.copyPropertoes 와 modelMapper 가 있다.
        User dbuser = userService.regist(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(dbuser);
    }

 

User에 대한 내용을 ModelMapper로 복사를 한다. UserDto로 

 

ModelMapper 를 사용할려면 ModelMapper maven 을 pom.xml 을 추가해준다.

<!-- https://mvnrepository.com/artifact/org.modelmapper/modelmapper -->
<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>3.2.0</version>
</dependency>

 

 

●UserExceptionHandeler

package com.mh.restapi03.users;

import com.mh.restapi03.exception.ErrorResponse;
import com.mh.restapi03.exception.LoginException;
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.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import java.time.LocalDateTime;

// 모든 예외는 여기서 진행 할 수 있도록 만든다.
@ControllerAdvice // aop 기술
public class UserExceptionHandeler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(LoginException.class)
    public final ResponseEntity<ErrorResponse> hanleLoginException(LoginException e){
        ErrorResponse errorResponse = ErrorResponse.builder()
                .errorCode(e.getErrorCode().getErrorCode())
                .errorMessage(e.getErrorCode().getMessage())
                .wdate(LocalDateTime.now())
                .errorDateTime(LocalDateTime.now())
                .build();
        return ResponseEntity.status(e.getErrorCode().getHttpStatus()).body(errorResponse);

    }


}

 

모든 예외의 진행은 이 클래스에서 진행한다.

 

예외를 진행 하기 위해선 maven 을 추가해주어야 한다.

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>3.2.3</version>
</dependency>

 

 

●UserRepository

package com.mh.restapi03.users;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User,Long>{
    //findall, save, deleteBYID, findById

    // select * from user where email =?;  자동으로 만들어 준다
    public User findByEmail(String email);

}

 

email에 대한 쿼리문을 만들어준다.

 

●LoginException

package com.mh.restapi03.exception;

import lombok.Getter;

@Getter
public class LoginException extends RuntimeException {

    private ErrorCode errorCode;
    public LoginException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }
}

 

RunTimeException을 상속 받는다.

 

●ErrorCode

package com.mh.restapi03.exception;

import lombok.Getter;
import lombok.Setter;
import org.springframework.http.HttpStatus;


@Getter
public enum ErrorCode {
    DUPLICATE(HttpStatus.BAD_REQUEST,"A001","중복된 내용이 있습니다."),
    NOTFOUND(HttpStatus.NOT_FOUND,"B001","내용이 없습니다."),
    TEST(HttpStatus.BAD_GATEWAY,"c001","TEST입니다.")
    ;


    private HttpStatus httpStatus;

    private String errorCode;

    private String message;

    ErrorCode(HttpStatus httpStatus, String errorCode, String message) {
        this.httpStatus = httpStatus;
        this.errorCode = errorCode;
        this.message = message;
    }
}

 

에러 코드에 대한 값을 지정한다.

 

●ErrorResponse

package com.mh.restapi03.exception;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;


@Getter
@Setter
@Builder
public class ErrorResponse {

    private String errorCode;

    private String errorMessage;

    @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss")
    private LocalDateTime wdate;

    private LocalDateTime errorDateTime;
}

 

코드와 메세지 날짜에 값을 출력하게 한다.

 

'spring boot' 카테고리의 다른 글

Spring boot 웹에서 만든 패키지 보기  (0) 2024.03.11
Spring boot 다른 포트 설정  (0) 2024.03.11
Spring boot JPA(2), 포트 설정  (0) 2024.03.06
spring boot JPA  (1) 2024.03.05
spring boot 복습  (0) 2024.03.04