전체 글 (165)

07
05

1. DOM?

  • HTML은 그저 구조를 흩뿌려 놓은 데이터이다.
  • 그러므로, 컴퓨터는 데이터를 렌더링 할 뿐이지 어떤 데이터가 들어 있는지는 알 수 없다.
  • 이것을 자바스크립트로 옮겨 컴퓨터가 데이터를 알게 해 주는 것이 Document Object Model, DOM이다.

2. 각 엘리먼트에 접근하기

  •  HTML도 자바스크립트와 같이 '트리구조'로 이루어져 있다.
  • 그래서 서로의 부모와 자식 요소에 접근이 가능하다.
  • document.children [원하는 요소의 index]를 사용해서 자식 요소에 접근한다.
  • document.children [원하는 요소의 index]. parentNode부모 요소에 접근한다.
  • 변수로 각 요소의 주소를 할당할 수 있다. document 어쩌고 하면서 적는 것보다 빠르고 간단하다.
    • Ex) (콘솔 창에서) head = document.children [0]. children [0] =>  head만 입력해도 됨.
  • 위의 예시를 이용해 다른 방법으로 요소에 접근할 수 있는 방법들을 더 알아보겠다.
    • head.firstElementChild => head의 첫 번째 자식 요소
    • head.lastElementChild => head의 마지막 자식 요소
    • head.nextElementSibling => head의 다음에 올 형재 요소
    • head.previousElementSibling => head의 이전에 올 형재 요소 ( 정상적 파일에서는 head 이전의 형재 요소는 없다. 뜻만 이해 하자. )

3. 요소 추가와 삭제

  • 요소에 접근하여 수정하는 것은 물론 가능하고, 새로운 요소를 추가할 수도 있다.
  • document.createElement('추가할 요소의 element 이름')
    • Ex) document.createElement('div') => 기존의 요소와 아무 상관(형재나 부모 자식 같은 관계가 없는) div요소를 하나 만든다.
  • 위에서 만들어진 element를 기존의 element들과의 관계를 설정한다.
    • Ex) testDiv = document.createElement('div') => element를 새롭게 만들면서 변수에 할당해 놓는다. 
      document.body.append(testDiv) => body안에 만든 testDiv를 자식으로 넣어준다.
    • append를 appendChild로 바꿔도 똑같이 자식 요소로 넣어준다.
      • appendChild는 오직 Node객체만 받을 수 있고, 다중 문자를 넣을 수 없고, 리턴값이 있다는 점이 다르기는 하나 위의 예시에서는 같은 기능을 하고 있다.

4. 샐렉터를 선택해서 값을 변경하기

  • 요소를 만들고 관계를 설정까지 할 수 있다면, 값을 넣어서 화면에 렌더링 시킬 수 도있다.
  • 이때 우리는 querySelector과 querySelectorAll을 사용한다.
    • Ex) 파일에 class이름이 'user'인 요소가 있을 경우
      document.querySelector('. user') => class이름이 user인 가장 처음에 있는 HTML요소를 '유사 배열'로 가져온다.
    • Ex) 파일에 class이름이 'user'인 요소가 여러 개 있을 경우
      document.querySelectorAll('. user') => class이름이 user인 모든 HTML요소를 '유사 배열'로 가져온다.
  • 선택된 요소를 변수로 담아서 계속 사용하는 것이 유리하다. ( 중요하다고 생각되어 한번 더 넣는다! )
    • Ex) firstUser = document.querySelector('. user')
      이후 div로 userInfo를 첫 번째 user에 만들어 넣고 싶을 경우
      => userInfo = document.createElement('div')
      => firstUser.append(userInfo)
  • 선택된 요소에 textContent를 이용해 문자를 값으로 넣을 수 있다.
    Ex) userInfo.textContent = 'Name: Hendrix'
  • 선택된 요소에 class를 추가할 수 있다.
    Ex) userInfo.classList.add('name')
    • class를 넣어 줌으로써, 앞의 요소들과 묶어 주어 원래 있던 CSS를 적용시킨다거나 하는 일들을 할 수 있다.
  • 선택된 요소를 remove를 이용해 삭제할 수도 있다.
     Ex) userInfo.remove() => 이는 정확히 내가 지울 userInfo가 어디 있는지 알고 있을 때만 사용할 수 있다.
    • 여러 개의 자식 엘리먼트를 다 지우려고 할 경우
      Ex) document.querySelector('. user'). innerHTML = '';
    • 하지만 위의 방법의 경우 전달 내용이 빈 string인 원시 데이터 형태로 들어가기 때문에 보안 위험이 있다.
    • 그래서 반복문과 같은 원래 HTML에 포함된 메서드를 이용하는 것이 옳다.
      Ex) while(body.firstChild) {body.removeChild(body.firstChild);} => body의 첫 번째 자식 요소가 있다면, 그것을 제거한다.
      • 혹은, 반복문의 조건을 body.children.length > 1과 같이 조절하여 요소가 몇 개 남을 때까지(지금은 1개가 남을 때까지) 삭제를 할 수도 있다.
      • 혹은, 배열로 요소를 가져오는 것을 생각해 본다면, 고차 함수를 이용하거나, for... of 구문을 이용하여 삭제하길 원하는 클래스 이름을 가진 모든 요소를 삭제할 수 도 있다.
COMMENT
 
07
05

누르면 tp-link 홈페이지로 이동합니다.

1. 문제의 발단

  • 원래 있던 공유기와 거리가 멀어 방에서 와이파이가 잘 잡히지 않았다.
  • 안 쓰고 있던 공유기를 하나 받아와서 연결하기로 했다.

2. 어떻게 하는가

  1. 컴퓨터를 하나 준비한다. 혹은, 휴대폰도 상관없다. 하지만 확실히 컴퓨터가 편하다.
  2. 모든 인터넷을 끊고, 준비한 공유기( tp-link archer c60 모델을 사용했다. )와 연결한다.
    • 공유기의 전원을 넣고, 렌선을 Ethernte( 색이 혼자만 다른 부분인 internet 부분이 아니다. )에 꽂고 인터넷이 안 되는 기기에 연결한다. 휴대폰이라면 와이파이를 잡으면 된다.
  3. 공유기의 설정을 맞춰주기 위해 초기화 시킨다. 샤프 같은 걸로 작은 버튼을 5초에서 10초간 누르면 LED가 깜박이면 버튼을 땐다.
  4. 인터넷 창을 켜고 http://192.168.0.1/ (혹은, http://tplinkwifi.net/)을 주소창에 입력해 관리자 설정창으로 간다.
  5. 아이디는 초기설정은 admin 그리고 비밀번호는 admin 혹은 공유기 뒤에 pin 번호가 적혀있다.
  6. 무선 설정에서 네트워크 이름을 원하는 것으로 바꾼다. 5G 도 같이 설정한다.
  7. 네트워크 => LAN => IP 주소의 마지막 숫자를 기억할 수 있는 것으로 바꿔준다. ( 3자리 숫자까지 가능하다. )
    • IP 주소가 원래 사용하던 공유기와 같으면 충돌이 일어난다.
  8. 다시 바꿔준 주소를 입력해 관리자 설정창으로 다시 간다.
  9. 고급 => 설정에 가서 조금 스크롤을 내리면 WDS 설정이 있다. 켜서 원래 사용하던 와이파이를 선택해 준다.
  10. 마지막으로 DHCP 설정에 가서 DHCP 사용을 중지한 후 저장하고 오른쪽 위에 재시작을 눌러준다.
    • DHCP는 원래 사용하던 공유기를 가져와서 사용하기 때문에 지금 설정할 공유기에는 필요가 없다. 이 과정을 마지막에 해 주는 것을 권장한다. 중간에 하면 설정창 접속이 끊긴다.
IP TIME 설정과 조금 다른 설정창을 가지고 있어서 올바르게 설정하는데 시간이 꽤 걸렸다. 하지만 결국, 원리는 같다.
잘 읽어보고 하면 모든 공유기에 연결을 할 수있다.
참고한 동영상을 아래에 남겨놓겠다. 설명이 부족하다면 참고하면 좋다. 비록 영어도 아닌 알 수 없는 언어로 설명하고 있지만 충분히 도움이 될 것이라고 예상된다.
만약 너무 어렵다면, 휴대폰으로 TP-Link Teher 애플리케이션을 마켓에서 다운로드하여서 설정을 하면 조금 더 직관적이다.
그래도 모르겠다면 댓글에 남겨 주시면 답변을 드리도록 노력해 보겠습니다.
https://www.youtube.com/watch?v=lQx1OtvVpzc

 

'Coding > How to Fix' 카테고리의 다른 글

oh-my-zsh Update Error  (0) 2022.01.18
mysql의 sql 파일이 실행이 안될때  (0) 2021.08.27
우분투 20.04 블루투스 연결 문제 공략집  (0) 2021.06.29
COMMENT
 
07
04

1. printKeyValue

  • 객체를 입력받아  string 타입으로 key: value의 형식으로 리턴한다.
  • 각 키와 값의 사이에 줄바꿈으로 다른 요소라는 것을 표시한다.
function printKeyValue(obj) {
  let result = ''; // string 타입으로 리턴해야 하기 때문에 빈 스트링을 만든다.
  for(let key in obj) { // for...in 으로 객체를 돌면서 key 값을 구한다.
    result = result + `${[key]}: ${obj[key]}\n` // 벡틱을 이용해 한줄에 알맞은 요소를 넣고 result에 쌓는다.
  }
  return result; // 완성된 result를 리턴한다.
}
  • 줄 바꿈은 '\n' 이다.
  • 만약, Object.keys(obj)를 사용한다면, 모든 키를 받아 버리기 때문에 키 하나하나씩을 선택할 수 없게 된다.

2. arrayInSameKey

  • 배열과 객체를 받아, 배열의 요소가 객체의 키와 같을경우 새로운 객체 안에 넣어서 리턴한다.
  • 같지 않은 요소는 무시한다.
function arrayInSameKey(arr, obj) {
  let result = {}; // 빈 객체를 만든다.
  for(let key in obj) { // 반복문으로 객체안의 Key를 추출한다.
    for(let i = 0; i < arr.length; i++) { // arr를 하나씩 확인하면서,
      if(key === arr[i]) { // 키와 같은 데이터가 있는지 검색한다.
        result[key] = obj[key] // 같은 데이터를 result안에 같은 키와 값은 obj[key]에서 가져와 할당한다.
      }
    }
  }
  return result; // 완성된 객체를 리턴한다.
}
  • 이중반복문이 복잡하다고 생각하고, 쓰지 않고 어떻게든 풀어보려고 했지만 이것이 가장 간단한 방법으로 보인다.
  • 리펙토링도 좋지만, 일단 알고 있는 답을 애써 무시하고 처음부터 다른 방법으로 찾으려 하는 것 보다, 일단, 알고 있는 방식으로 답을 작성 해 놓고 이후, 리펙토링을 통해 코드를 정리할 생각을 해야한다.
COMMENT
 
07
02

1. Spread 및 Rest를 객체에서 사용하기

  • spread는 배열을 그대로 복사하거나, 합치고 객체에서도 사용이 가능하다.
let obj1 = { foo: 'bar', x: 42 };
let obj2 = { foo: 'baz', y: 13 };

let clonedObj = { ...obj1 }; // obj1의 키와 값이 그대로 복사가 된다.
let mergedObj = { ...obj1, ...obj2 }; // obj1과 obj2의 같은 이름의 키인 'foo'가 있으므로 이후에 온 obj2의 foo로 다시 할당된다.
console.log(clonedObj) // {foo: "bar", x: 42}
console.log(mergedObj) // {foo: "baz", x: 42, y: 13} 이때,겹치지 않는 키는 그대로 추가된다.
  • 함수에서도 사용이 가능하다. 주로, 파라미터들을 가져오는 데 사용한다. slice와 같이 원하는 부분을 잘라서 가져올 수 있다.
function myFun(a, b, ...manyMoreArgs) {
  console.log("a", a); // 'a', one
  console.log("b", b); // 'b, two
  console.log("manyMoreArgs", manyMoreArgs); // 'manyMoreArgs', ["three", "four", "five", "six"]
}

myFun("one", "two", "three", "four", "five", "six");
  • Spread 나 Rest는 변동이 있을 수 있는 파라미터를 가진 함수나, 배열에 주로 사용하기 편하다. 아무리 추가, 삭제가 일어나도 그대로 배열을 가지고 올 수 있기 때문이다. 그 이후  sort와 같은 메서드를 이용하기도 매우 유용하다. 변화가 있더라도 변화된 그대로 다음 메서드를 실행시켜 줄 수 있다.

2. 구조 분해 할당

  • 구조 분해 할당은 Spread를 사용한 후, 값을 해체한 뒤에 다시 변수로 할당해 준다.
function f(...[a, b, c]) {
  return a + b + c;
}

f(1)          // NaN (b 와 c 는 undefined)
f(1, 2, 3)    // 6
f(1, 2, 3, 4) // 6 (4번 째 파라미터는 해체되지 않음)
  • 마찬가지로 객체에서도 사용이 가능하다.
const {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}
console.log(a) // 10
console.log(b) // 20
console.log(rest) // {c: 30, d: 40} // 위의 a, b는 값을 리턴하지만, spread로 다시 할당하면 모든 키와 값을 다 가져온다.
  • 객체에서의 구조 분해 할당은 꼭 선언과 함께 해야 한다. 아닐 경우 다른 문법으로 잘 못 읽을 수 있다.
  • 함수에서의 객체 분해를 이용할 수 있다.
function whois({displayName: displayName, fullName: {firstName: name}}){
  console.log(displayName + " is " + name);
}

let user = {
  id: 42,
  displayName: "jdoe", // 위의 whois 함수에서 displayName의 값이 그대로이기 때문에 jdoe을 리턴.
  fullName: {
      firstName: "John", // fullName의 값이 구조 분해 할당으로 firstName을 name을 선언하여 할당하고 있다.
      lastName: "Doe"
  }
};

whois(user) // 결국, displayName은 그대로 "jdoe", name은 firstName이 할당 되어 있으니, "John"
// jdoe is John

 

COMMENT