인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

스프링 시큐리티

6) 웹 기반 인가처리 실시간 반영하기

UrlSecurityMetadataSource 클래스의 reload() 메서드 질문이 있습니다!

작성

·

304

0

좋은 강의 잘 보고 있습니다. 감사합니다.

섹션 5. "실전프로젝트 - 인가 프로세스 DB 연동 웹 계층 구현"의 "6) 웹 기반 인가처리 실시간 반영하기"

강의를 보다 의문이 생겨 질문을 남기게 되었습니다.

UrlSecurityMetadataSource 클래스에 다음과 같은 reload() 함수가 있습니다.

여기서 "securityResourceService.getResourceList()"의 반환값과 "requestMap"의 타입이 똑같으니

requestMap = securityResourceService.getResourceList();

으로 바로 객체를 할당하면 될 것 같았는데,

Iterator를 사용하여 put 하시는 것이 성능상의 문제나 다른 이슈가 있어서 이렇게 작성을 하신건지 의문이 들었습니다.

새로운 List를 바로 할당하지 않고, 기존 List 객체를 유지하신 이유가 궁금합니다!

감사합니다.

// UrlSecurityMetadataSource 클래스
public void reload() {
	LinkedHashMap<RequestMatcher, List<ConfigAttribute>> reloadedMap = securityResourceService.getResourceList();
	Iterator<Map.Entry<RequestMatcher, List<ConfigAttribute>>> iterator = reloadedMap.entrySet().iterator();

	requestMap.clear();

	while (iterator.hasNext()) {
		Map.Entry<RequestMatcher, List<ConfigAttribute>> entry = iterator.next();
		requestMap.put(entry.getKey(), entry.getValue());
	}
}

 

답변 1

-1

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

UrlSecurityMetadataSource 클래스의 reload() 메서드 내부에서 새로운 List를 할당하지 않고, 기존에 존재하는 List 객체를 유지한 이유는 성능과 관련된 문제 때문입니다.

만약에 새로운 List 객체를 생성하여 할당한다면 참조하는 위치가 다르기 때문에, 기존에 할당되어 있던 List 객체가 가비지 컬렉션이 되어야 하고, 이 때문에 성능에 영향을 미칠 수 있습니다.

하지만 기존에 존재하는 List 객체 내에서 새로운 데이터를 추가하는 경우에는 가비지 컬렉션이 발생하지 않아서, 성능 상의 이점을 가져올 수 있습니다.

따라서 UrlSecurityMetadataSource 클래스에서 Iterator를 사용하여 기존 List 객체 내에서 새로운 데이터를 추가한 것입니다.

제가 도움을 드린 것이 맞는지요? 추가로 궁금한 점이 있으시면 얼마든지 물어봐주세요. 감사합니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기