본문 바로가기

Java/삽질기록

[Spring] select COUNT(*) from 테이블명;

참조 : https://kingchobocoding.tistory.com/11

 

ID중복 조회 할때 아이디가 해당하는 id값이 아니라 count값을 비교하여

존재할때 int=1 로 존재하지않으면 int= 0 인 값을 return하도록 설계했다.

 

<script type="text/javascript">
	 var idck=0;
	 function idCheck() {
		        var userId =  $("#userId").val(); 
		        
		        $.ajax({
		            async: true,
		            type : 'POST',
		            data : userId,
		            url : "/users/idcheck",
		            dataType : "json",
		            contentType: "application/json; charset=UTF-8",
		            success : function(data) {
		                if (data.cnt > 0) {
		                    alert("아이디가 존재합니다. 다른 아이디를 입력해주세요.");
		                    $("#userId").focus();
		                } else {
		                    alert("사용가능한 아이디입니다.");
		                    $("#userPassword").focus();
		                    idck = 1;
		                }
		            },
		            error : function(error) {
		                alert("error : " + error);
		            }
		        });
		};
	</script>

회원가입 페이지 부분의 아이디 중복 체크 부분이고

 

mapper 는 이렇게 구현하였었다.

<select id="selectOne" parameterType="String" resultType="Integer">
	select userCount(*) from profileUser
	where userId = #{userId}
 </select>

DAO의 idchek부분

public int idCheck(String userId) {
		int count = sqlSession.selectOne("userDAO.selectOne", userId);
		return count;
	}

 

Controller의 idcheck부분

@RequestMapping(value = "/idcheck", method = RequestMethod.POST)
	 @ResponseBody //responsebody 를 사용하여 JSON으로 넘어온 userid 매개변수로 받음
	public Map<Object, Object> idCheck(@RequestBody String userId) {
		int count = 0;
		Map<Object, Object> map = new HashMap<Object,Object>();
		count = uService.idcheck(userId);
		System.out.println(count);
		map.put("cnt", count);
		return map;
	}

 

 

이 모든게 count(*)를 몰라서 발생했던 부분인데 처음에 userCount(*)부분에서 syntax에러가 나길래 잘못된 부분인줄알고

 

userCount로 변경하여 테이블에도 userCount 컬럼을 추가했었다. << 1차 문제

 

그 후 값들을 아이디값이 있을땐 1을 조회해오지만 아이디값이 없을때는 db에 값이 없으니 NullpointException를 반환하였다.

 

그부분을 해결하기위해서 try & catch 로 감싸서 0이라는 값이 출력되기는 했지만 마찬가지로 NullpointeException이 발생하였고

 

그 문제점을 해결해보기위해 삽질의 시간을 거치다가 문뜩 들었던 생각은 없는값(userCount)를 셀렉해오겠다는 생각부터 잘못된게아닐까

 

그래서 mapper 부분을 찾아보다가 보니 count함수를 사용하는것 데이터 갯수를 가져오고싶을때 라고 한다.

 

Count함수

테이블에 존재하는 데이터 갯수를 가져오고 싶을 때가 있습니다.

이 때 사용하는 함수가 COUNT 함수입니다.

COUNT 함수는 테이블에 컬럼의 데이터 갯수를 가져옵니다.

이 때 NULL인 데이터는 제외하고 계산합니다.

전체 행 갯수를 가져올 때는 컬럼 대신에 *를 지정합니다. 

 

그래서 where 조건을 붙여서 해당하는 userId가 존재할경우 Count함수로 값을 가져오고 없을때는 0을 반환하는것이 문제가없는것이었다

 

그후 mapper를 count함수로 변경하였고 문제없이 행이 존재하면 1을 반환하고 아이디가 없는경우 0을 반환하였다.

<select id="selectOne" parameterType="String" resultType="Integer">
	select Count(*) from profileUser
	where userId = #{userId}
 </select>

 

 

 

결론 : 어떤 역할로 어떤 함수를 사용하는지를 확실히 파악해야한다.

syntax에러가 났다고 참고하는 자료가 틀렸으려나 하는 건방진 생각을 먼저하기전에

내가 해당 함수들의 기능을 정확하게 알고있는지부터 확인해보도록 하자!