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 |