본문 바로가기
개발/DB, SQL

[SQL] WHERE 1 = 1

by 카펀 2022. 2. 15.

업무 중 마주한 내용에 대해 추가적으로 알아보고자 공부하고 작성하였습니다.

 

이미 작성된 쿼리를 보다 보면 이런 내용을 많이 볼 수 있습니다.

select * from TEST_TABLE a
where 1 = 1
and a.name is not null
and a.gender = 'male'

where 1 = 1 이라는 내용입니다.

항상 참인 의미 없어 보이는 내용인데, MyBatis 등에 쿼리를 미리 작성해 두는 경우에 많이 보게 됩니다.

이 내용은 왜 붙여서 사용할까요?

 

사용하는 경우

위 코드를 다시 보겠습니다.

where 1 = 1 이라는 내용이 없다면, 아래와 같이 작성하게 됩니다.

select * from TEST_TABLE a
where
a.name is not null
and a.gender = 'male'

그리고 "a is not null" 을 주석 처리하고 싶다면?

select * from TEST_TABLE a
where
--a.name is not null
--and 
a.gender = 'male'

위의 내용을 주석 처리하느라 뒤의 쿼리의 "and" 까지 신경을 쓰게 됩니다.

하지만 where 1=1 이라는 문장이 위에 있다면, "a.name is not null" 만 주석 처리하면 깔끔하죠.

 

또, 동적 쿼리에서 특정 상황마다 WHERE 문을 다르게 사용하는 경우에도 많이 사용합니다.

동적 쿼리란, 상황에 따라 변하는 쿼리를 의미합니다.

아래와 같은 예를 봅시다.

<sql>
	select * from TABLE_TEST a
	where 1 = 1
	<if test="@패키지명@isNotEmpty(a.name)">
		and a.gender = 'male'
	</if>
</sql>

(억지로 만든 예시입니다. 이런 느낌이구나 하는 정도로 봐 주세요)

위와 같은 경우에는, 조건에 따라 and 문을 붙이기도 하고, 안 붙이기도 합니다.

이럴 때는 위처럼 where 1 = 1을 붙이면 if문을 깔끔하게 붙일 수 있습니다.

 

사용하면 안 되는 이유

그럼에도 불구하고, WHERE 1=1을 사용하면 안 된다는 의견도 많습니다.

불필요한 내용을 넣어서, 의도하지 않은 경우가 발생할 수 있다는 점인데요.

 

이번엔 조회가 아닌 삭제의 경우를 봅시다.

<sql>
	delete * from TABLE_TEST a
	where 1 = 1
	<if test="@패키지명@isNotEmpty(a.name)">
		and a.gender = 'male'
	</if>
</sql>

위 경우에는, 이름이 존재하면 모든 남자의 정보를 지웁니다.

하지만 이름이 존재하지 않는다면?

테이블의 모든 내용을 지우게 됩니다.

 

이것 역시 예시로 만든 내용이라 현실성은 떨어지지만,

만약 수많은 if문을 포함시켰는데 모든 if문이 false인 경우라면, 그리고 그게 운영 테이블에서 발생한다면,

운영 테이블의 모든 내용을 삭제시키는 쿼리가 돌아갈 수도 있겠죠.

 

WHERE 1=1 을 사용하는 것에 대해서 많은 분들의 의견이 갈리는 것 같습니다.

습관이 될 수 있으니 애초부터 사용을 지양하자는 의견부터, 예외 처리를 잘 하면 되지 않느냐는 의견도 있습니다.

또, 위처럼 delete를 사용할 때는 누가 WHERE 1 = 1을 쓰냐는 분도 계시고요.

이런 의견에 대해 재밌는 토론 내용이 있어서 하나 가져왔습니다.

 

https://okky.kr/article/250963

 

OKKY | 동적 쿼리 만들때 where 1=1 쓰면 안되는 이유에 대하여..

동적 쿼리 만들때 where 1=1을 쓰지 말아야 하는 이유에 대하여.. 안녕하세요.. 예전에 이 부분에 대해 댓글을 달은적이 있었습니다.. 그때 저는 where 1=1을 쓰면 안된다고 했습니다..잠재적 버그를

okky.kr

 

사용되는 배경에 대해 알고 나니, 쿼리를 조금 더 잘 이해할 수 있을 것 같습니다.

실무에서 접하는 내용을 그냥 있는 그대로 받아들이지 않고, 이렇게 배경을 알아가는 것이 중요하다고 생각합니다.

 

'개발 > DB, SQL' 카테고리의 다른 글

[SQL] WITH 문  (0) 2022.02.02
DBeaver - 편리한 DB 관리 도구  (0) 2022.01.29

댓글