• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

try문에서 return시 chain.doFilter 동작이유..:)

23.07.28 19:39 작성 23.07.28 20:07 수정 조회수 322

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

 

안녕하세요.

아래의 그림부분에서 이해가 안되서, 글남깁니다.!!

제가 학습하기로는 return문이 실행될 경우에는 메서드단위 자체를 종료하는 것으로 알고 있는데요!

만약 미인증 사용자가 items에 요청이 들어올 경우 sendRediect메서드가 실행됨과 동시에 return으로 doFilter 메서드가 종료될 것으로 예상됩니다.

그럼에도 불구하고, 아래의 try문에 log와 chain.dofilter가 실행되는 이유가 무엇인가요..?

스크립트 상에는 필터를 더이상 진행하지 않는다고 하고있습니다.

만약, 위의 코드에서 chain.doFilter를 제거할 경우에는 빈화면의 http://localhost:8080/login?redirectURL=/items페이지가 나옵니다.

 

(현재의 return시에는,try문의 내부.. if문까지만의 종료로 보입니다.!)


 

자문자답해봅니다.. :)

너무 이해가 안되서, 흐름을 다시한번 정리했더니 이해가 되네요.

결론은 스크립트와 동일하게 동작하네요!

필터의 경우에는 모든 HTTP요청에 대해서 필터가 실행되기때문에

  1. items url 요청 -> 필터 실행 -> if문에 걸려서 redirect 후 리턴 (다음 필터 실행 X ) , finally문은 실행

  2. 여기서 다시 login url 요청 -> 필터 실행이 되기때문에

    만약, chain.doFilter가 없는 경우, 해당 스텝에서 다음필터로 진행이 안되기때문에.. 이후 동작이 안 이루어진거였습니다.!!

 

 

답변 2

·

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2023.07.31

안녕하세요. 조현화님, 공식 서포터즈 y2gcoder입니다.

스스로 잘 해결하셨습니다 :) 

강의 수강 중 강의 관련 궁금한 사항은 언제든 질문 남겨주세요^^

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.30

안녕하세요, 인프런 AI 인턴이에요.

try문에서 return문이 실행되면 메서드 자체가 종료되는게 맞습니다. 그런데 try-catch문에서 return이 호출되면 해당 메서드가 종료되기 전에 finally 블록이 실행됩니다. 그래서 finally블록에서 chain.doFilter() 메서드가 호출되는 이유입니다.

try문 안에서 chain.doFilter() 메서드를 호출하고 return문이 실행되면, catch문이나 finally 블록에서 다른 처리를 하더라도 chain.doFilter() 메서드는 더 이상 실행되지 않게 됩니다. 반면에 return문이 실행되기 전에 chain.doFilter() 메서드를 호출하면, catch문이나 finally블록에서 return문이 실행되어도 chain.doFilter() 메서드는 정상적으로 실행됩니다.

즉, try-catch-finally 블록에서 chain.doFilter() 메서드를 실행하면서 return문이 실행되면, catch문이나 finally 블록의 처리가 완료된 후에 해당 메서드가 종료됩니다.

이처럼 finally 블록은 try문 내에서 예외 발생 여부와 상관없이 항상 실행되는 블록으로, 자원의 해제 등의 작업을 할 때 유용하게 사용됩니다.

해당 부분에서 try문 내에 log와 chain.doFilter() 메서드가 실행되는 이유는, try문에서 발생하는 예외를 catch문이나 finally 블록에서 처리하기 위해서입니다.

더 궁금한 사항이 있으면 언제든지 물어보세요. 좋은 공부되세요!