우선 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;
}
오류문에서 이렇게 출력이 된다.
'spring boot' 카테고리의 다른 글
Spring boot 유효성 검사 //해당하는 내역 보여주기. / Jasypt 암호화 (0) | 2024.03.14 |
---|---|
Spring boot @handleMethodArgumentNotValid / delete/@Transactional (0) | 2024.03.12 |
Spring boot 웹에서 만든 패키지 보기 (0) | 2024.03.11 |
Spring boot 다른 포트 설정 (0) | 2024.03.11 |
Spring boot 유효성 검사 / 복사 (0) | 2024.03.07 |