JAVA 프로그래밍을 할 때, 제일 자주 보는 Exception이 NullPointException이지 않을까?
Exception 발생 코드를 보면 또 이렇게 생각하곤 한다.
"아..? 이런 걸 놓쳤다고?"
❔ 방어적 프로그래밍
방어적 프로그래밍(Defensive programming)은 예상치 못한 입력에도 한 소프트웨어가 계속적 기능 수행을 보장할 수 있도록 고안된 방어적 설계의 한 형태이다. - 위키백과
방어적 프로그래밍은 방어 코딩이라고도 하며,
일반적으로 개별 메서드에 대한 입력을 확인하여 원하는 값(=정답)이 나올 수 있도록 프로그래밍한다.
❔ 그러니까 이게 무슨 말이지?
우리는 프로그래밍을 할 때, 쉽게 오류에 빠진다.
1. 발생하지 않을 일라고 생각하며 넘어가거나
ex: 사용자가 이름 입력하는 곳에 길이가 만단 위 넘는 문자열을 입력하는 경우
2. 예외 상황을 판단하여 테스트를 거쳤기 때문에 완벽하다고 확증 편향(confirmation bias)에 빠진다거나
ex: 버튼을 여러 번 클릭하여 발생하는 중복 주문에 대해 테스트를 했지만, 주문 완료 후 뒤로가기로 중복 주문이 발생 가능하는 경우
등등 많은 경우가 있다.
✔ 프로그래머가 문제를 예상하고 이를 처리하는 코드를 작성하는 것이 바로 방어적 프로그래밍이다.
ex: 입력문자열에 제한, 특정 페이지에서 뒤로가기 기능 막기, null 값에 대해 유효성 확인
❗ 방어적 프로그래밍을 위해, 생각해 볼만한 문제들
1. 외부 소스나 매개변수로 받는 값
-. 올바른 데이터 범위 내에 존재하는지, 올바른 데이터 유형인지 확인한다.
-. 날짜값은 특정 날짜 범위 내에 존재하는지, 입력받은 데이터가 null이 아니면서 유형이 문자열인지 확인 등
2. 공유 메모리 또는 스레드
-. 의도하지 않게 덮어 쓰이거나 데드락 발생하지 않도록 한다.
3. 변수 활용 : 간섭 및 범위
-. 전역 변수와 지역 변수 간의 간섭, 범위 등에 대해 최소 단위 등을 신경 쓴다.
4. 개발자 규칙
-. 일찍 실패하고 자주 실패하자
: 오류 발생 시점과 오류 인지 시점이 시공간적으로 멀어질수록 문제 해결을 위해 더 많은 시간과 노력이 필요하다.
-. 버그를 가정문과 테스트로 변환하자
: 하나의 실수가 근처 또는 다른 로직 아니면 비슷한 코드 변경 시 동일하게 발생할 수 있다.
이전 문제가 다시 발생하지 않도록 가정문과 테스트로 작성하여 방지하고
유지보수 시(미래의 나를 포함하여) 까다로운 코드의 경우 경고를 주는데도 도움이 된다.
5. 테스트 주도 개발(Test-Driven Development)
-. 각자 지향하는 개발이나 처한 환경에 따라 개발 방법론이 다르겠지만,
-. 방어적 프로그래밍의 궁극적 형태 중 하나가 테스트 주도 개발이라고 생각하기 때문에
-. TDD의 개념 및 구현도 좋은 경험이 될 것이다.
# 참고 사이트
-. https://en.wikipedia.org/wiki/Defensive_programming
-. https://www.linkedin.com/pulse/defensive-programming-hassan-elseoudy
-, http://aispiration.com/xwmooc-sc/novice/python/05-defensive.html
'IT용어 > 다양한' 카테고리의 다른 글
[footprint] 풋프린트 뜻, 의미 (0) | 2022.08.23 |
---|