본문 바로가기
프로젝트/Spring Boot 블로그프로젝트

[블로그프로젝트] 10. Exception 수정하기 & 아이디 중복 insert 수정

by dantriss 2023. 2. 23.

유튜브에서 블로그 만들기 프로젝트를 따라하면서 나의 스킬을 조금더 레벨업 하고자 한다.

IDE : IntelliJ

언어 : Java

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


 

Exception 처리하는 부분을 수정하였다.

올바른 유저정보를 받아서 해당 부분이 실행했다면 1이 return 잘못된 정보라면 -1이 return이 되어서

컨트롤러에 호출이 되는게 아니라 저번에 만든 GlobalExceptionHandler가 호출이 되어서 service단에서 굳이 return을 해줄 필요가 없다.

 

그래서 userService에서 해당부분을 아래와 같이 변경하였다.

package com.blog.service;

import com.blog.repository.UserRepository;
import com.blog.table.User;
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void 회원가입(User user){
        userRepository.save(user);
    }

}

 

그리고 userApiController에 있는 해당부분을 복사해서

new ResponseDTO<Integer>(HttpStatus.OK.value(),1)

GlobalExceptionHandler에서 해당부분을 수정한다.

package com.blog.handler;

import com.blog.DTO.ResponseDTO;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

@RestController
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ResponseDTO<String> handleException(Exception exception) {
        return new ResponseDTO<String>(HttpStatus.INTERNAL_SERVER_ERROR, exception.getMessage());

    }

}

 

그 후 브라우저에서 회원가입페이지에서 아이디,비밀번호,이메일을 넣거나 postman에서 실험해보면 역시 잘 돌아간다.

 

그런데 나 같은경우는 여기서 문제가 생겼다. 같은 아이디로도 계속 가입이 되는 문제가 있었던 것이다.

 

 

이럴땐 User.java에서 @Column 어노테이션에 unique=ture를 추가해주는 것이다.

 

그 후 application.yml에 가서 ddl-auto: 에 update로 되어있다면 create 로 변경하고 서버를 재실행 해서 테이블들을 전부 drop해준다.

 

다시 회원가입을 진행하고 같은 아이디로 회원가입을 하려고하면 Exception이 발생하고 DB에는 데이터가 들어가지 않는다.

 

그런데 상태메시지가 저렇게 뜨니 어떤 오류인지 알아보기 힘들다. 해당부분을 변경해보자.

ResponseDTO.java에서 HttpStatus를 int 로 변경해보자.

 

그러면 GlobalExceptionHandler.java과 UserApiController.java 에서 오류가 발생할텐데 HttpStatus.OK 뒤에 .value()를 추가해주면 된다.

GlobalExceptionHandler.java 변경 전

GlobalExceptionHandler.java 변경 후

 

 

UserApiController.java 변경 전

package com.blog.controller.api;

import com.blog.DTO.ResponseDTO;
import com.blog.service.UserService;
import com.blog.table.RoleType;
import com.blog.table.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserApiController {

    @Autowired
    private UserService userService;


    @PostMapping("/api/user")
    public ResponseDTO<Integer> save(@RequestBody User user){
            System.out.println("test : save response");
            user.setRole(RoleType.USER);
            userService.회원가입(user);
        return new ResponseDTO<Integer>(HttpStatus.OK.value(),1);
    }

}
package com.blog.handler;

import com.blog.DTO.ResponseDTO;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

@RestController
@ControllerAdvice
public class GlobalExceptionHandler {

/*    @ExceptionHandler(value = IllegalArgumentException.class)
    public String handleException(IllegalArgumentException exception) {

        return "<h1>" + exception.getMessage()+"</h1>";
    }*/

    @ExceptionHandler(value = Exception.class)
    public ResponseDTO<String> handleException(Exception exception) {
        return new ResponseDTO<String>(HttpStatus.INTERNAL_SERVER_ERROR.value(), exception.getMessage());

    }

}

 

그러면 이제 다시 한번 같은 아이디로 회원가입을 시도해보자.

500 error로 뜨면서 한결 보기 편해졌다.

댓글