🌿SPRING/🌱연습[SPRING]

[SPRING] 입문주차 과제 - 출력 값 + 에러코드 만들어주기

디카페인라떼 2022. 8. 19. 16:49

<전체 조회 시 출력 값>

=> "success" : true 

"data":[{  조회 값 }]

"error" : null

 

 

 

<게시글 작성 시 응답 값>

=>"success" : true

"data":[{  작성한 것들 }]

"error" : null

 

 

 

 

 

 

 

<삭제 성공시>

 

 

 

 

<삭제 실패시>

에러메세지

 

 

 

 


 

 

<내가 만든 게시글 작성 시 응답 값>

^^,,,,, 여기까지 해놓고 다한 줄 알았음^^!!! 생각지도 못함

ㄴㅇㄱ

 


그러면 뭐다? 수정해줘야지 ^^ 야호!! 

 

<차이점>

 - 출력 값을 모두 data로 감싸서 그안에 입력되어있음 + success :boolean  + error : code/msg 가 따로 뜸! 

 - success가 true일때 : 정상 출력, error : null 

  false 일때 :  에러메세지만 출력 data : null

 

 

1차로 든 생각은 [Controller]에서 리턴 값들을 모두 바꿔주면 되겠다! 뭘로?

=>Response Dto 를 따로 만들어서 감싸주면 되겠다 ! =>ResposeDto를 또 만들어도 되나..? =>Dto 는 필요한 만큼 만들면 됩니다 ^^^

 

2. 에러 메세지는 어쩌지? => 예외처리!! (채멘님 ,,,채멘,,,) try catch 사용하기!

 


1. [ResponseDto] 새로 생성 => 아예 패키지를 다시 만들어 줬다.

 

src/java/com/sparta/springhomework/domain/dto/resposeDto

@Getter
public class ResponseDto<T> { // 클래스명 제네릭 사용! T는 다른 걸로써도 상관없음!!
    boolean success;
    T data;
    Error error;
    
    public ResponseDto(boolean success, T data) { //생성자 1
        this.success = success;
        this.data = data;
    }
    
    public ResponseDto(boolean success, T data, ErrorCode errorCode) { //생성자 오버로딩 2
        this.success = success;
        this.data = data;
        this.error = new Error(errorCode);
    }

여기서 (공부했어야 하는) 제네릭타입을 쓴다! 아직 정리는 안했지만 간단하게 본다면

<아무문자나 가능> 은 무슨 타입이든 다 가능하다는 것 ... 즉 리턴으로 나가는 responseDto <원래 리턴값> 을 해주면  어떤 타입이든 리턴해줄 수 있다!! 

 

★제네릭

 

2. 리턴 값을 만들어줬으면 이제 컨트롤러를 수정해주면 된다! 

<전체조회>

src/java/com/sparta/springhomework/controller/PostingController

//전체조회
    @GetMapping("/api/post")
    public ResponseDto<List<Posting>> getPosting() {//원래 리턴 값을 ResponseDto로 감싸줌
        List<Posting> data;// try-catch문에서는 리턴값이 지역변수이므로 따로 변수 지정!
        try {
            data = postingRepository.findAllByOrderByModifiedAtDesc();//true시 리턴 값
        } catch (Exception e) {//예외처리//에러값은 나중에 !!수정 
            return new ResponseDto<List<Posting>>(false, null, ErrorCode.);
        }
        return new ResponseDto<List<Posting>>(true, data);//정상 출력시 
    }

 

3. 에러메세지는 따로 어떻게 관리하지..? error enum을 만들어준다! (채멘님,,,)

 

src/java/com/sparta/springhomework/domain/enums/Errorcode

@Getter
public enum ErrorCode {//enum 클래스의 기본 구조! 그냥 암기,,, 

    ENTITY_NOT_FOUND("NOT_FOUND", "데이터가 존재하지 않습니다."),
    INVALID_ERROR("INVALID_ERROR","에러 발생!!!");


    private final String code;
    private final String message;

    ErrorCode(String code, String message){
        this.code = code;
        this.message = message;
    }
}

2022.08.10 - [JAVA] - [JAVA] 열거형 enum

 

[responseDto] 에도 에러부분을 추가해준다 

    @Getter
    public static class Error {
        private String code;
        private String message;

       public Error(ErrorCode errorCode){
           this.code = errorCode.getCode();
           this.message = errorCode.getMessage();
       }
    }
}

 

다시 [Controller]에서 에러시 나오는 메세지 값을 넣어준다.

 

    //전체조회
    @GetMapping("/api/post")
    public ResponseDto<List<Posting>> getPosting() {
        List<Posting> data;
        try {
            data = postingRepository.findAllByOrderByModifiedAtDesc();
        } catch (Exception e) {
            return new ResponseDto<>(false, null, ErrorCode.INVALID_ERROR);
        }
        return new ResponseDto<>(true, data);
    }

그러면 출력이 

이렇게 깔끔하게 나온다.. 감격 ㅠㅠ

 

이렇게 success값과 data, error를 나눠줘야 프론트쪽과 같이 협업할때 작업이 훨씬 용이해진다고 한다...

 

같은 방법으로 나머지 [Controller]도 수정한다. 

 

 


<비밀번호 확인>

 

1. responseDto는 이미 있음

2.[Controller]단에서 수정해준다!

 

src/java/com/sparta/springhomework/controller/PostingController

    //게시글 비밀번호 확인(비교)
    @PostMapping("/api/post/{id}")//<>에 넣어줄때는 원시타입이 아닌  wrapper 클래스로 넣어주어야한다!
    public ResponseDto<Boolean> comparePassword (@PathVariable Long id,@RequestBody PostingRequestDto.PostingPasswordDto postingPasswordDto) {
        boolean data;//comparepassword 로직 리턴 값이 boolean이기때문에 값을 받아주는 변수를 data
        try {
            data = postingService.comparePassword(id, postingPasswordDto);
        }catch  (EntityNotFoundException e){//아이디 못찾을때 에러를 미리 지정을 했으므로 해당 에러를 감지하여 먼저 가져옴
            log.error(e.getMessage());//에러메세지 로그에 띄움
            return new ResponseDto<>(false,null,ErrorCode.ENTITY_NOT_FOUND);
        }catch  (Exception e){//나머지 에러들
            log.error(e.getMessage());//에러메세지 로그에 띄움
            return new ResponseDto<>(false,null,ErrorCode.INVALID_ERROR);
        }
        return new ResponseDto<>(true,data);
    }

 

❗❗ [Service] comparePassword 함수 

//비밀번호 비교
    public boolean comparePassword ( Long id, PostingRequestDto.PostingPasswordDto postingPasswordDto) {

        Posting posting = postingRepository.findById(id).orElseThrow(
                () -> new EntityNotFoundException("해당 아이디가 존재하지 않습니다." +id));
        return Objects.equals(posting.getPassword(), postingPasswordDto.getPassword());
    }

※ 이미 함수 내에서 매개변수 아이디 값이 없으면 에러메세지를 띄우도록 해둠 !!!

 

 

① 리턴 값에 ResponseDto<Boolean> : <>안에서는 원시형이 아닌 wrapper class로 넣어주어야 한다! (제네릭 참조)

② 아까와 마찬가지로 리턴값을 받아줄 변수  data를 설정해준다

③try문 안에 정상 출력시 값을 입력 data= 으로 !! 지역변수!!

④catch문 : 이미 함수내에 아이디 못찾았을때 에러를 지정해둠!!

그러므로 catch도 (1) 아이디 못 찾았을 때 예외  (2) 나머지 예외  이렇게 처리해준다!!

  ※순차적으로 예외를 처리해 주므로 상위클래스인 Exception은 아래쪽에 적어둔다!!

 

✔Tip! log.error 활용하기!!✔

에러메세지가 로그에 찍히도록 하는 것! 현업에서 많이 사용하므로 평소에 쓰는 습관을 들이자!!!

-> 따로 꼭 정리하기!

 

개념이 헷갈리므로 예외처리는 다시 공부 하자 ^^!

2022.08.13 - [JAVA] - [JAVA] 예외처리(Exception) / Throws

 

<비밀번호 확인 출력값>   

비밀번호 맞을 때

 

 

 

비밀번호 틀릴 때

 

 

 

 

아이디 잘못 입력시 (url 주소 틀림)

 

 

 

 

 


<지난 날의 수정들>

 

2022.08.17 - [SPRING] - [SPRING]입문주차 과제 비밀번호 확인 API 만들기

 

[SPRING]입문주차 과제 비밀번호 확인 API 만들기

03주차 과제를 하면서 다른 부분은 강의부분을 보면서 그대로 작성하면서 이해했는데 새로운 기능이 더 있었다. 이론은 알아도.. 처음부터 해보려니 안되는 것,,, ^^ 고생하면서 했었어서 정리해

wearegolden.tistory.com

2022.08.17 - [SPRING] - [SPRING] 입문주차 과제 - 전체 게시글 목록 조회 / 게시글 조회

 

[SPRING] 입문주차 과제 - 전체 게시글 목록 조회 / 게시글 조회

03 주차 과제를 잘해낸 줄 알았더니 아니었다 ... 전체 게시글 조회 시 : 제목/ 작성자명/ 작성 날짜 가 떠야하고 게시글 조회 시 : 제목/ 작성자명/ 작성날짜 / 작성내용 이 떠야했다.. 어제까지 만

wearegolden.tistory.com