반복문 중단과 계속하기: EXIT, CONTINUE
가끔 반복문이 잘 돌아가다가도, 뭔가 멈춰야 할 이유가 생길 때가 있지. 다행히도 PL/pgSQL에서는 이걸 쉽게 제어할 수 있는 도구들이 있어.
EXIT로 반복문 중단하기
가끔 반복문이 끝까지 다 돌기 전에 멈춰야 할 때가 있어. 예를 들면, 원하는 값을 찾았거나, 에러를 발견했거나, 어떤 조건에 따라 반복을 끝내야 할 때지. 이런 상황에서 EXIT를 써.
EXIT는 반복문한테 "이제 그만, 할 일 다 했으니까 멈춰!"라고 말하는 거야.
EXIT의 문법은 진짜 간단해:
EXIT WHEN 조건;
여기서 WHEN은 어떤 조건에서 반복문을 끝낼지 지정해. 만약 조건을 안 쓰면, EXIT는 그냥 바로 현재 반복문을 끝내버려.
예시: 원하는 값을 찾으면 반복문 끝내기
예를 들어, 학생 번호가 들어있는 컬럼이 있고, 특정 id를 가진 학생을 찾고 싶다고 해보자. 학생을 찾으면 반복문을 끝내야 해.
DO $$
DECLARE
student_id INT;
BEGIN
FOR student_id IN 1..100 LOOP
RAISE NOTICE '학생 ID 확인 중: %', student_id;
-- 원하는 학생을 찾으면 반복문 끝내기
IF student_id = 42 THEN
RAISE NOTICE 'ID 42인 학생 찾음!';
EXIT;
END IF;
END LOOP;
END $$;
이 예시에서 반복문은 1부터 100까지 숫자를 돌면서 "학생"을 확인해. ID가 42인 학생을 찾으면 메시지를 출력하고 반복문을 끝내.
CONTINUE로 반복 건너뛰기
반복문 안에서 특정 반복만 건너뛰고, 다음 반복으로 넘어가고 싶을 때가 있어. 예를 들어, "필요 없는" 데이터를 무시하거나, 어떤 조건에 해당하는 경우만 건너뛰고 싶을 때 유용하지.
CONTINUE는 "이 조건은 별로니까, 그냥 다음 반복으로 넘어가자"라는 의미야.
CONTINUE는 EXIT랑 비슷하게 동작하지만, 반복문을 끝내는 대신 현재 반복만 건너뛰고 다음 반복으로 넘어가:
CONTINUE WHEN 조건;
조건이 참이면, 현재 반복은 끝나고 다음 반복으로 넘어가.
예시: 짝수 건너뛰기
이번 예시에서는 1부터 10까지 숫자를 돌면서, 짝수는 무시하고 홀수만 출력해볼 거야.
DO $$
DECLARE
num INT;
BEGIN
FOR num IN 1..10 LOOP
-- 짝수 건너뛰기
IF num % 2 = 0 THEN
CONTINUE;
END IF;
RAISE NOTICE '홀수: %', num;
END LOOP;
END $$;
여기서 CONTINUE는 num % 2 = 0 (즉, 짝수)인 경우 반복을 건너뛰어. 그래서 로그에는 홀수만 출력돼.
EXIT와 CONTINUE 같이 쓰기
EXIT와 CONTINUE를 같이 쓰면 반복문을 더 유연하게 제어할 수 있어. 예를 들어, CONTINUE로 필요 없는 반복을 건너뛰고, 중요한 걸 찾으면 EXIT로 반복문을 끝낼 수 있지.
아래 예시에서는 3의 배수는 건너뛰고, 15에 도달하면 반복문을 끝내볼 거야.
DO $$
DECLARE
num INT;
BEGIN
FOR num IN 1..20 LOOP
-- 3의 배수 건너뛰기
IF num % 3 = 0 THEN
CONTINUE;
END IF;
-- 숫자가 15면 반복문 끝내기
IF num = 15 THEN
RAISE NOTICE '숫자 %에서 멈춤', num;
EXIT;
END IF;
RAISE NOTICE '현재 숫자: %', num;
END LOOP;
END $$;
여기서 반복문은 이렇게 동작해:
- 3의 배수는 건너뜀 (
CONTINUE). - 숫자가 15면 반복문 종료 (
EXIT). - 나머지 숫자는 출력됨.
고급 예시: 잘못된 데이터 건너뛰고, 치명적 에러에서 중단하기
이제 좀 더 현실적인 예시를 들어볼게. 학생 리스트를 처리하면서, 데이터를 검사한다고 해보자. 잘못된 데이터는 건너뛰고, "치명적 에러"가 나오면 처리를 멈출 거야.
DO $$
DECLARE
student RECORD;
BEGIN
FOR student IN
SELECT * FROM students
LOOP
-- 이름이 없는 학생은 건너뛰기
IF student.name IS NULL THEN
RAISE NOTICE 'ID %인 학생 건너뜀: 이름 없음', student.id;
CONTINUE;
END IF;
-- 치명적 에러가 있으면 반복문 중단
IF student.status = 'ERROR' THEN
RAISE EXCEPTION 'ID %인 학생에서 치명적 에러', student.id;
EXIT; -- 사실 RAISE EXCEPTION이 실행되면 이 줄은 필요 없어.
END IF;
-- 학생 처리
RAISE NOTICE '학생 처리 중: %', student.name;
END LOOP;
END $$;
이 예시에서 CONTINUE는 이름이 없는 학생을 건너뛰고, EXIT (그리고 RAISE EXCEPTION)는 심각한 에러가 있으면 반복문을 끝내.
실전 팁 & 흔한 실수
조건문 논리 잘 생각하기. EXIT WHEN이나 CONTINUE WHEN에서 조건을 잘못 쓰면, 반복문이 예상치 못하게 끝나거나 중요한 데이터를 건너뛸 수 있어.
CONTINUE를 너무 많이 쓰지 않기. 코드에 CONTINUE가 너무 많으면, 반복문 로직을 다시 생각해보고 더 단순하게 바꿔보는 게 좋아.
EXIT와 RETURN 헷갈리지 않기. EXIT는 현재 반복문만 끝내고, RETURN은 함수 전체 실행을 끝내.
무한 반복문 조심하기. LOOP를 종료 조건 없이 쓰고 EXIT를 빼먹으면, 반복문이 영원히 돌 수도 있어.
GO TO FULL VERSION