본문 바로가기
개발자 전향 프로젝트

[SpringBoot Data JPA] 중복은 있을 수 없어 -1

by 샘오리 2022. 10. 26.
728x90
반응형

어떠한 정보를 DB에 저장하고 싶을 때 여러 가지 방법으로 중복체크를 할 수 있지만

그중 나름 간단하면서도 쉬운 방법은 form을 submit 할 시 중복체크를 하는 것이다.

 

그렇게 하기 위해서는 일단 자바스크립트 단에서 form의 값을 받아서 ajax를 통해 컨트롤러에 전달해야 한다.

아래는 샘플 코드이다. 필자는 기본 alert 대신 SweetAlert2라는 라이브러리를 사용했다.

1. 데이터 추가/수정 관련 자바스크립트

 

var 넣을 값을 담은 변수 = {
            넣을 값
        };

$.ajax({
    type: "POST",
    url: "/URL 경로",
    data: 넣을 값을 담은 변수,
    success: function (data) {
        if (data === 1) {
            Swal.fire({
                icon: 'success',
                html: '000 추가되었습니다.',
                showConfirmButton: true,
                confirmButtonColor: '#3085d6',
                confirmButtonText: '확인'
            }), window.location.href = '/추가 후 보내고 싶은 경로';
        } else {
            Swal.fire({
                icon: 'error',
                html: '중복된 값이 있는지 다시 확인해주세요',
                showConfirmButton: false,
                showCancelButton: true,
                cancelButtonColor: '#F63543',
                cancelButtonText: '확인'
            });
        }
    },
});

2. 컨트롤러

보이다시피 중복체크 관련하여 호출한 서비스의 return 값이 1보다 적은 경우

데이터를 추가하는 함수를 호출하고 1이라는 값을 return 하며, 

이 외의 경우에는 2라는 값으로 return 하는 함수이다.

    @ResponseBody
    @PostMapping("/아까 그 경로")
    public Integer 변수명 (@ModelAttribute Dto명 Dto참조변수) {
    
        if(서비스 참조변수.중복체크 함수명(Dto참조변수)<1) {
            서비스 참조변수.추가하는 함수명(Dto참조변수);
            return 1;
        }else{
            return 2;
        }
    }

3. 서비스

Dto에서 중복체크를 하고싶은 칼럼의 값을 빼내서 바인딩 변수= 매개변수에 담고그 매개변수를 리포지토리로 보내는 로직이다.

    public Integer 중복체크 함수명(Dto명 Dto참조변수) {
        데이터타입 변수명(매개변수) = Dto참조변수.get칼럼명();
        return 리포지토리 참조변수.중복체크 함수명(매개변수);
    }

4. 리포지토리

where 조건절에 부합하는 모든 것들을 count 해주는 로직으로 하나라도 중복이 있으면 return 값은 1 이상이 되게 된다.

함수명의 데이터 타입으로 Integer 대신 Boolean을 사용해도 괜찮다.

    @Transactional
    @Query(value = "SELECT COUNT(*) FROM 테이블명 " +
            "WHERE (중복 체크하고 싶은 칼럼명=:매개변수(바인딩 변수)", nativeQuery = true)
    Integer 중복체크 함수명(데이터 타입 매개변수);

5. 다시 컨트롤러

    @ResponseBody
    @PostMapping("/아까 그 경로")
    public Integer 변수명 (@ModelAttribute Dto명 Dto참조변수) {
    
        if(서비스 참조변수.중복체크 함수명(Dto참조변수)<1) {
            서비스 참조변수.추가하는 함수명(Dto참조변수);
            return 1;
        }else{
            return 2;
        }
    }

6. 다시 자바스크립트

리턴받은 값이 1일 경우 추가됐다는 메세지를 출력하고

추가된 것이 조회되는 view로 전송하며

리턴받은 값이 1이 아닐 경우 중복이라는 메세지를 출력하며

그대로 멈추는 로직이다.

var 넣을 값을 담은 변수 = {
            넣을 값
        };

$.ajax({
    type: "POST",
    url: "/URL 경로",
    data: 넣을 값을 담은 변수,
    success: function (data) {
        if (data === 1) {
            Swal.fire({
                icon: 'success',
                html: '000 추가되었습니다.',
                showConfirmButton: true,
                confirmButtonColor: '#3085d6',
                confirmButtonText: '확인'
            }), window.location.href = '/추가 후 보내고 싶은 경로';
        } else {
            Swal.fire({
                icon: 'error',
                html: '중복된 값이 있는지 다시 확인해주세요',
                showConfirmButton: false,
                showCancelButton: true,
                cancelButtonColor: '#F63543',
                cancelButtonText: '확인'
            });
        }
    },
});

 

7. 끝

728x90
반응형