여행을 개발하다

$(document).ready(function(){}) 본문

FrontEnd/JQuery

$(document).ready(function(){})

yhtragramming 2019. 5. 31. 22:50

개발 실무에서 처음 제이쿼리를 접했을 때, 모든 페이지에서 관행처럼 쓰이는 코드가 있었습니다.

"$(document).ready(function(){})"

 

저는 기본적인 알고리즘과 C++, 자바, 파이썬의 기본 로직만 알고 있는 상태였구요.

어딘가 자바랑 많이 닮은 듯 하지만 문법과 기호들이 생소했고, 그 뜻을 이해하기보단 그저 눈에 익숙해지는데 집중했어요.

 

하지만 프론트와 백엔드를 두루 알아야했기에 조금씩 자바스크립트, 제이쿼리를 공부하기 시작했습니다.

 

자바스크립트를 조금더 편하게 사용하고자 만들어진 것이 제이쿼리입니다.

(그런데 제이쿼리에 먼저 익숙해지고 자바스크립트를 이해하려고 했던 것 같아요.)

 

이러한 스크립트 언어를 자바와 결합하여 사용하자, 구현할 수 있는 화면 및 로직의 범위는 기하급수적으로 늘어났습니다.

 

제 주관적인 생각으로, 스트립트 언어는 매우 직관적입니다.

여기서 직관적이란, 개발자가 짠 코드를 그저 '순서'에 맞게 따라서 문서 객체를 로드하고 화면상에 표현한다는 점입니다.

 

사족이 길었습니다.

다음과 같은 html 소스를 호출한다는 예제를 들어보죠.

컴퓨터는 첫 번째 줄인 '<!DOCTYPE html>' 부터 '</html>까지 그저 순서대로 읽으며 화면을 로드합니다.

 

이해를 돕기 위해 양념을 조금 치겠습니다.

 

<script>태그 안에는 'alert("안녕하세요");'를,

body 태그 안에는 'startText'라는 id를 가지고 있는 '<input id="startText" type="text">'를 포함시켜 로드해보죠.

 

당연히 순서는 alert → input로 문서 객체가 읽힐꺼에요.

 

화면에서 확인해봐도, alert가 먼저 나타납니다.

실행결과 1

 

alert의 확인 버튼을 누르자, 이제 다음 순서의 input 박스가 나타납니다.

실행결과 2

그런데 문제가 하나 생겼습니다.

input 박스는 그대로 가져가되, '안녕하세요'라고 텍스트를 넣어서 로드하려고 해요.

 

그래서,

 

'$("#startText").val("안녕하세요");'

 

'$("#startText")       =  startText라는 id를 가진 선택자를 찾아,
.val("안녕하세요")  =    value를 "안녕하세요"로 설정해준다.

 

를 추가하여 로드해봅니다.

 

그런데 input 박스에는 '안녕하세요'라고 세팅되어 있지 않습니다.

 

로직이 잘못된건가요?

아니면 문서 객체를 로드하면서, 컴퓨터가 자기 맘대로 해당 코드를 읽지 않은 것일까요?

 

하지만 컴퓨터는 그저 시키는대로 일했을 뿐입니다.

그 이유는 문서객체를 읽어들이는 순서가 

'$("#startText").val("안녕하세요");' → '<input id="startText" type="text">'이라는 점입니다.

 

제이쿼리는 아이디가 startText인 것을 찾아 value를 '안녕하세요'로 넣어주고 싶었습니다.

하지만  해당 val()라는 메소드가 실행되는 시점에는, id가 'startText'인 input 박스가 정의되어 있지 않았기 때문에 값을 넣어줄 수 없었습니다.

 

이럴 때 사용하는 것이 바로 "$(document).ready(function(){})"입니다.

 

메소드명도 스크립트 언어 답게 매우 직관적입니다.

말 그대로 '문서가 준비되면 실행되는 함수'입니다.

 

즉, 문서 객체가 모두 로드된 다음에 실행될 코드들을 $(document).ready(function(){}) 안에 기술해줘야 합니다.

이렇게 바꾼 코드를 실행하자, 아무런 문제없이 'startText'라는 id를 가진 input 박스에

'안녕하세요'가 세팅되어 나타납니다.

지금까지 '$(document).ready(function(){})'의 의미에 대해 알아보았습니다.

 

감사합니다.

 

 

 

Comments