일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JPA
- 데드락
- @controller
- 성능테스트
- jdbc
- Git
- awspring
- MySQLTransactionRollbackException
- assert
- spring
- AWS
- 동시성
- N + 1
- Batch
- fetch join
- OIDC
- @Transaction(readOnly=true)
- ngrinder
- Hibernate
- injellij
- spring-cloud-starter-aws
- Cache
- batch insert
- Cannotacquirelockexception
- mockito
- @RequestMapping
- Convention
- oauth2.0
- 정적 팩터리 메서드
- 이펙티브 자바
- Today
- Total
정리정리
[Java] assert 알아보기 본문
Assert란
assert 조건식; //기본 형식
assert 조건식 : 에러 메시지; //메시지 포함 형식
assert age >= 0;
assert age >= 0 : "나이는 음수일 수 없습니다";
assert는 jdk 1.4에서 추가된 키워드로, 코드가 논리적으로 올바르게 작동하는지 확인하는 데 사용합니다.
Assert, Exception 차이
1. assert의 쓰임새
어떻게 보면 if - exception의 간결한 표현이라고 생각할 수 있지만 둘의 쓰임새는 많이 다릅니다.
마틴 파울러의 리팩토링 책에서도 assert의 사용법에 대해 다음처럼 언급합니다.
• 코드에서 기본적으로 가정하고 있는 조건들을 주석이 아닌 Assertion을 사용해서 보다 명시적으로 나타낼 수 있다.
• Assertion은 '반드시 참이어야 하는' 가정을 검사할 때 사용한다.
• Assertion이 없어도 프로그램 기능의 정상 동작에 아무런 영향을 주지 않도록 작성돼야 한다.
• Assertion은 프로그램이 어떤 상태를 가정하는지 다른 개발자에게 알려주는 훌륭한 의사 소통 도구이다.
이 부분만 보더라도 exception처럼 비정상적인 흐름을 정상적인 흐름으로 돌리거나 하는 방식과는 쓰임새가 조금 다르다는 것을 알 수 있습니다.
2. 컴파일 옵션
assert는 exception과는 다르게 기본적으로 비활성화 되어있습니다.
이는 jdk 1.4 이전 버전에서는 변수나 메서드 등에 assert라는 단어를 사용할 수 있었기 때문에, JVM에서는 assert를 추가하면서 이전 버전과 호환성을 맞추기 위해 해당 키워드를 비활성화시켜놓았다고 합니다.
따라서 assert 키워드를 활성화하기 위해서는 컴파일 옵션에 -ea (enable assertions)을 추가하여 사용해야 합니다. (어쩌면 이런 이유 때문에 assert는 개발용, 디버깅용으로만 사용되는 것 같기도 하네요)
3. Assert는 Error
3번은 1번의 연장선으로, assert는 Exception이 아닌 Error라는 점에서 차이점이 있습니다.
assert에서 검증을 실패하면 AssertionError가 발생합니다.
Java를 공부하면 Exception과 Error의 차이를 꼭 한 번쯤은 들어보게 됩니다.
보통 Exception은 프로그램에 비정상적인 흐름이 발견되거나, 잘못된 값이 넘어오는 경우에 사용합니다. 대표적으로 비즈니스 로직의 예외를 잡아내는 데 사용하죠.
그에 반면, Error는 StackOverFlowError나 OutOfMemoryError처럼 복구가 불가능한 치명적인 오류가 발생했을 때 사용됩니다. 그렇기 때문에 assert는 1번에서 언급한 것처럼 '반드시 참이어야 하는' 부분에서만 사용해야 하며, 이를 복구시키려는 코드를 작성을 권장하지 않는다고 합니다.
하지만 assert는 다른 Error보다 개발자의 실수로 발생하기 더 쉽고, 이를 처리할 코드가 없다면 시스템이 종료되기 때문에 assert는 개발 단계나 디버깅 모드에서만 주로 사용합니다.
정리
assert와 exception의 쓰임새가 많이 다르고, 실제 운영 단계에서는 assert를 사용하지 않도록 옵션을 끈다고 합니다.
그래도 assert를 꼭 사용하고 싶다! 하시면 Spring의 Assert에 대해서도 한 번 알아보시는 것을 추천드립니다.
'Java' 카테고리의 다른 글
정적 팩토리 메서드 장점 (0) | 2023.05.07 |
---|