본문 바로가기
spring boot

Spring boot 오류에 대한 설정/ UPDATE /{ID}

by improve 2024. 3. 11.

 

 

우선 package 형식은 이렇게 만든다.

 

update를 해주기 위해선 controller에 putMapping을 해줘야 한다.

 

 

●UserService

package com.mh.restapi03.users;

import com.mh.restapi03.exception.ErrorCode;
import com.mh.restapi03.exception.LoginException;
import com.mh.restapi03.exception.UserException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    public List<User> getAllUsers(User user){
        List<User> list = userRepository.findAll();
        return list;
    }
    public User regist(User user){
        User emailuser = userRepository.findByEmail(user.getEmail());
        if (emailuser != null){
            throw new LoginException(ErrorCode.DUPLICATE);
        }
        //insert 구문 실행
        userRepository.save(user);
        return user;
    }

    public User getUserById(Long id){
        Optional <User> optionalUser = userRepository.findById(id);
        if ( optionalUser.isEmpty()){
         throw new UserException(ErrorCode.NOTFOUND);
        }
        else
            return optionalUser.get();
    }

    public User UpdateUser(User user){

        User EmailUser =userRepository.findByEmail(user.getEmail());
        if (EmailUser == null){
            throw new UserException(ErrorCode.NOTUPDATEEMAIL);
        }

        // update 실행...
        // 시간 비밀번호 이름 변경 기능
        EmailUser.setPassword(user.getPassword());
        EmailUser.setWdate(user.getWdate());
        EmailUser.setUsername(user.getUsername());

        User dbuser = userRepository.save(user);
        return dbuser;
    }


}

UpdateUser을 만들어서 userRepository에 저장한다.

Email은 @NOTBLACK이기 떄문에 빈칸이 들어가면 안된다.

그렇기 때문에 null값이 들어가게 되면 ErrorCode에있는 NOTUPDATEEMAIL을 던져줘라 

 

 

public User getUserById(Long id){
    Optional <User> optionalUser = userRepository.findById(id);
    if ( optionalUser.isEmpty()){
     throw new UserException(ErrorCode.NOTFOUND);
    }
    else
        return optionalUser.get();
}

 

여기서 getUserById는 해당하는 값만 불러 올수 있게 해놨다.

optional로 해서 userRepositoy에 id값을 optionalUser에서 넣어준다 .

만약 이 칸이 빈칸이면 

오류 코드를 던져줘라  아니면 실행해라 

 

●UserController

package com.mh.restapi03.users;


import com.mh.restapi03.exception.ErrorCode;
import com.mh.restapi03.exception.UserException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequiredArgsConstructor
@Validated
@Tag(name = "User-controller",description = "유저 조회 등록 수정 삭제") // 상단 제목을 설정 할 수 있다 .
public class UserController {

    private final UserService userService;

    @Operation(summary = "사용자 전체 목록 보기",description = "사용자 전체 정보를 조회 할 수 있다.") // get에 대한 제목을 설정
    @ApiResponses(
            {
                    @ApiResponse(responseCode = "200",description = "ok"),
                    @ApiResponse(responseCode = "404",description = "사용자들이 없을 때 나옵니다.")
            }
    )
    @GetMapping("users")
    public ResponseEntity<List<User>> getAllUsers(User user){
        List<User> list = userService.getAllUsers(user);
        if (list.size() ==0 ){

         throw new UserException(ErrorCode.NOTFOUND);

        }

        return ResponseEntity.ok(list);
        //return ResponseEntity.status(HttpStatus.OK).body(list); 상태값을 넘겨줄려고 할 때 이렇게 쓴다.
    }
    @GetMapping("users/{id}")
    public ResponseEntity<User> getUsers(
            @Parameter(description = "조회하고자 하는 사용자 ID",
            name = "사용자 ID",
                    required = true
            )
            @PathVariable Long id) {

        System.out.println(id);
        User user = userService.getUserById(id);
        return ResponseEntity.status(HttpStatus.OK).body(user);

    }

        @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);
    }
    @PutMapping("users")
    public ResponseEntity<User> UpdateUser(@RequestBody @Valid UserDto userDto){

        ModelMapper modelMapper = new ModelMapper();
        User user = modelMapper.map(userDto, User.class);
        user.setWdate(LocalDateTime.now());

        User dbuser = userService.UpdateUser(user);

        return ResponseEntity.status(HttpStatus.ACCEPTED).body(dbuser);
    }
}

 

여기서 {ID}는 

@GetMapping("users/{id}")
public ResponseEntity<User> getUsers(
        @Parameter(description = "조회하고자 하는 사용자 ID",
        name = "사용자 ID",
                required = true
        )
        @PathVariable Long id) {

    System.out.println(id);
    User user = userService.getUserById(id);
    return ResponseEntity.status(HttpStatus.OK).body(user);

}

 

user/id를 호출하게 되면 그아이디 값만 출력하게 된다.

ok(200) 을 출력한다.

여기서 @Parameter은 이름을 정해 줄 수있다 (name과 description)

 

 

@PutMapping("users")
public ResponseEntity<User> UpdateUser(@RequestBody @Valid UserDto userDto){

    ModelMapper modelMapper = new ModelMapper();
    User user = modelMapper.map(userDto, User.class);
    user.setWdate(LocalDateTime.now());

    User dbuser = userService.UpdateUser(user);

    return ResponseEntity.status(HttpStatus.ACCEPTED).body(dbuser);
}

 

PutMapping으로 Update를 해준다.

ModelMapper로 User을 UserDto로 복사를 해준다.

 

userService에 업데이트를 불러오고 실행해준다.

 

 

●GlobalExceptionHandler

package com.mh.restapi03.exception;

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 GlobalExceptionHandeler 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);
    }
    @ExceptionHandler(UserException.class)
    public final ResponseEntity<ErrorResponse> handleException(UserException e){
//        UserException exception = (Exception)e;
        ErrorResponse errorResponse
                = ErrorResponse.builder()
                .errorMessage(e.getErrorCode().getMessage())
                .errorCode(e.getErrorCode().getErrorCode())
                .errorDateTime(LocalDateTime.now())
                .wdate(LocalDateTime.now())
                .build();
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse);
    }


}

 

여기서 모든 오류를 관리 한다.

LoginException은 Post방식을 할 때 의 오류를 관리 

UserException은 Update방식을 할 때 의 오류를 관리

 

오류 메세지랑 오류 코드 오류 시간과 날짜는 ErrorCode 에서 얻어온다.

 

●UserException

package com.mh.restapi03.exception;

import lombok.Getter;

@Getter
public class UserException extends RuntimeException {

    private ErrorCode errorCode;

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

 

●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;
    }
}

 

 

 

●ErrorCode

package com.mh.restapi03.exception;

import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.http.HttpStatus;


@Getter
@ToString
public enum ErrorCode {
    DUPLICATE(HttpStatus.BAD_REQUEST,"DUPLICATE","중복된 내용이 있습니다."),
    NOTFOUND(HttpStatus.NOT_FOUND,"NOTFOUND","내용이 없습니다."),
    TEST(HttpStatus.BAD_GATEWAY,"c001","TEST입니다."),
    NOTUPDATEEMAIL(HttpStatus.NOT_FOUND,"NOTUPDATE","수정할 이메일이 없습니다.")
    ;


    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;
    }
}

 

ErrorCode를 개인적으로 설정을 해준다 .

 

NOTFOUND는 빈칸이 있으면 출력된다.

DUPLICATE는 중복한 문자가 있으면 출력된다.

NOTUPDATEEMAIL은 수정할 이메일이 없으면  출력이다.

 

●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;
}

 

오류문에서 이렇게 출력이 된다.