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

이동현님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

회원 서비스 개발

validateDuplicateMember 부분 질문입니다

21.07.13 01:44 작성

·

269

1

안녕하세요. 요즘 강사님 덕분에 재밌게 공부하고 있습니다 ^^ 강의 듣다가 궁금한 부분이 생겨서 질문 남기게 되었습니다.

강의 5: 10초 부분에서 findMembers.size() > 0 으로 바꾸는게 좀 더 최적화 될 수 있다고 말씀하셨는데

isEmpty()의 시간복잡도가 O(1)이고 size()는 O(n)으로 알고 있습니다. 

그래서 isEmpty()를 주로 썼었는데 단순히 조건에서의 효율만 말씀하신 것이 아니라는 생각이 드네요. 

혹시 실제 실무에서는 저런 경우 어떤식으로 최적화 하는지 대략적으로라도 알 수 있을까요? 

답변 1

1

codesweaver님의 프로필 이미지

2021. 07. 14. 20:27

안녕하세요. 이동현님, 공식 서포터즈 codesweaver 입니다.
.

List의 구현체가 보통은 ArrayList일 텐데 이 떄 size() 메서드는 필드에서 관리되고 있는 사이즈 값을 그대로 리턴하기에 O(1)의 동작속도를 갖습니다.

.

'그리고 최적화가 될 수 있겠다'는 의미를 저는 이렇게 받아들였습니다.

.

현재는 중복되는 회원이 있는지 없는지를 판단하기 위해 전체 멤버 객체들을 콜렉션에 담아서 그 콜렉션이 비었는지 체크하고 있습니다. 쿼리문으로 치면 'select * from member where name=:name' 인 상태 입니다.

.

그러나 우리가 알고픈 것은 중복되는 사람이 있는지만 알면 됩니다. 쿼리로 치면 다음과 같아집니다.  'select count(*) from member name=:name' 그리고 이 카운트 값만 받아와서 이 값이 0보다 큰지 체크하면 됩니다. 객체와 콜렉션 같은 무거운 아이들을 이용하지 않아도 구현할 수 있는 로직이기에 최적화가 가능하다고 말씀하신것 같습니다.

.
감사합니다.

이동현님의 프로필 이미지
이동현
질문자

2021. 07. 18. 17:37

size는 갖고 있는 모든 요소의 갯수를 확인해야해서 O(n)이라는 글을 봤었는데 잘 못 된 지식 이었나보네요

count(*) 부분을 생각을 못하고있었습니다

양질의 답변 감사합니다