[Jetpack WebView] shouldOverrideUrlLoading vs shouldInterceptRequest 완벽 정리
2025. 3. 20. 17:09ㆍAndroid/Jetpack
728x90
반응형
Android WebView를 사용할 때, 두 가지 중요한 메서드가 있다.
- shouldOverrideUrlLoading
- shouldInterceptRequest
이 두 가지를 제대로 이해하면, WebView에서 원하는 동작을 제어하고, 네트워크 요청을 최적화 할 수 있다.
하지만, 두 메서드의 차이를 정확히 모르면 잘못된 방식으로 WebView를 컨트롤 하게 될 수도 있다.
1. shouldOverrideUrlLoading란?
“ 웹뷰가 URL을 어떻게 처리할지 결정하는 메서드 ”
(1) 역할
- WebView가 새로운 URL을 로드할 때, 이를 가로채서 직접 처리할지 결정한다.
- 특정 URL을 WebView에서 로드할지, 외부 브라우저에서 열지, 차단할지 등을 제어한다.
(2) 예시
- 특정 링크만 Webview에서 호출하고, 나머지는 브라우저로 열기
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
val url = request.url.toString()
return if (url.startsWith("<https://myapp.com>")) {
false // WebView에서 그대로 로드
} else {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
view.context.startActivity(intent) // 외부 브라우저에서 열기
true // WebView에서 로드하지 않음
}
}
- 광고 사이트나 악성 사이트를 WebView에서 차단하기
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
val blockedUrls = listOf("<https://ads.com>", "<https://malware-site.com>")
return if (blockedUrls.any { request.url.toString().contains(it) }) {
true // 차단 (WebView에서 로드하지 않음)
} else {
false // 정상적으로 로드
}
}
2. shouldInterceptRequest란?
“ 웹뷰의 네트워크 요청을 가로채서 직접 응답을 생성하는 메서드 “
(1) 역할
- WebView가 네트워크 요청을 보내기 전에 요청을 가로채서, 변경하거나 직접 응답을 생성할 수 있다.
- 특정 리소스를 차단하거나, 캐시된 데이터를 활용하는 등의 최적화가 가능하다.
(2) 예시
- 특정 도메인 관련 요청을 차단하여 표시하지 않도록 설정
override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? {
val url = request.url.toString()
return if (url.contains("ads.com")) {
// 광고 차단 (빈 응답 반환)
WebResourceResponse("text/plain", "utf-8", ByteArrayInputStream("".toByteArray()))
} else {
null // 정상적인 요청은 그대로 진행
}
}
- 웹사이트에서 요청하는 이미지가 이미 앱 내부 캐시에 있다면, 바로 로드하도록 개선
override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? {
val url = request.url.toString()
if (url.endsWith(".png") || url.endsWith(".jpg")) {
val cachedFile = File(view.context.cacheDir, url.substringAfterLast("/"))
if (cachedFile.exists()) {
return WebResourceResponse(
"image/png", "utf-8", FileInputStream(cachedFile)
) // 캐시에서 이미지 로드
}
}
return null // 기본 요청 진행
}
3. 핵심 정리
✔ shouldOverrideUrlLoading은 웹이 앱한테 요청하는 걸 앱이 통제
즉, 웹이 앱한테 “이 페이지 열어~” 라고 지시를 내리면 앱은 “음… 이건 웹 브라우저로 열래!” 하는 느낌이다.
✔ shouldInterceptRequest은 웹이 네트워크 연결하기 전에 앱이 가로채버림
웹이 네이버 페이지를 열고, 거기에 있는 이미지를 서버를 통해 로드하려고 하는데
앱이 “어?! 나 그 사진 있는데!!!! 네트워크 통신하지 말고 내 사진 가져다 써!!!!” 하면서
리소스 파일을 전달하는 방식.
즉, 웹이 서버랑 통신하기 전에 앱이 가로채버리는 것.

728x90
반응형
'Android > Jetpack' 카테고리의 다른 글
Compose에서 네비게이션을 통한 데이터 전달 및 savedStateHandle 활용 (0) | 2025.02.26 |
---|---|
Jetpack Compose에서 remember vs rememberSaveable 차이 완벽 정리 (0) | 2025.02.13 |
Android Studio에서 Proto DataStore 설정하는 방법 (gradle kotlin) (0) | 2024.11.07 |
Preference DataStore와 Proto DataStore의 차이 (0) | 2024.11.05 |
[Android/Jetpack]ViewModel + Databinding + LiveData (0) | 2023.02.24 |