몽고디비 username/ password 가 생각이 안날때가 있다. 


당황하지말고 아래 단계를 천천히 따라 가보자.

 

먼저 username을 알아 내야한다. 

 

1. mongod.conf에 authorization: disabled로 변경

 

알아내기 위해서는 몽고디비 접속 시 인증을 꺼주어야한다.

아래 경로에 파일을 아래와 같이 수정해준다.(mac 기준)

 

vi /usr/local/etc/mongod.conf

security:
  # authorization: enabled
  authorization: disabled

 

 

2. 설정파일 적용위해 몽고디비 재실행

//stops mongodb server
brew services stop mongodb-community

//starts mongodb server
brew services start mongodb-community

 

3. 몽고디비 실행하여 user 정보 확인

 # mongo
 > use admin
 > db.system.users.find()

조회한 user에 "계정명"을 확인한 뒤 아래 명령어로 비밀번호 재설정 해준다.

 

4. 비밀번호 재설정

> db.changeUserPassword("계정명", "새비밀번호")

5. 1번에 바꿔주었던 설정 되돌리기

security:
  authorization: enabled

6. 설정파일 적용을 위해 몽고디비 재실행

//stops mongodb server
brew services stop mongodb-community

//starts mongodb server
brew services start mongodb-community

 

7. 몽고디비 접속

# mongo admin -u 계정명 -p 새비밀번호

출처: 자바의정석(http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788994492032&orderClick=LAG&Kc=)

 

1.1 지네릭스란?

 지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다.

객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.

타입 안정성을 높여준다는 것은 의도하지 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 잘못 형변환되어 발생할 수 있는 오류를 줄여준 다는 뜻이다.

 예를 들어, ArrayList와 같은 컬렉션 클래스는 다양한 종류의 객체를 담을 수 있기는 하지만 보통 한 종류의 객체를 담는 경우가 더 많다.

그런데도 꺼낼 때 마다 타입체크를 하고 형변환을 하는 것은 아무래도 좀 불편할 수 밖에 없다. 게다가 원하지 않는 종류의 객체가 포함되는 방법이 없다는 것도 문제이다. 이러한 문제들을 지네릭스가 해결해 준다.

지네릭스의 장점
 1. 타입 안정성을 제공한다.
 2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.

간단히 얘기하면 다룰 객체의 타입을 미리 명시해줌으로써 번거로운 형변환을 줄여준다는 얘기다.

7.3.1 동등비교(==)는 결과를 예측하기 힘들다.

 

안티패턴(가독성, 성능, 유지보수 등에 부정적인 영향을 줄 수 있어 지양하는 패턴) 예제.

'0' == ''; //false
0 == ''; //true
0 == '0'; //true
false == 'fasle'; //false;
false == '0' //true
false == null //false
false == undefined //false

 

7.3.1 일치비교(===) 연산자는 좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한하여 true를 반환.

 

 주의사항으로는 NaN이 있다. NaN은 자기 자신과 일치하지 않는 유일한 값이다.

따라서 숫자가 NaN인지를 판별하려면 Number.isNaN 함수를 사용한다.

NaN === NaN; //false

Number.isNaN(NaN); // true
Number.isNaN(10); // false
Number.isNaN(1 + undefined); //true

 

7.4 삼항 조건 연산자

조건식? 조건식이 true 일 때 반환할 값 : 조건식이 false 일 때 반환할 값

var result = score >= 60 ? 'pass' : 'fail';

Tip) if...else 문과 형식이 유사하나 삼항 조건 연산자 표현식은 값처럼 사용할 수 있어 장점을 갖는다.

if..else문은 표현식이 아닌 문이다. 따라서 if..else 문은 값처럼 사용할 수 없다.

삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식인 문이다. 따라서 삼항 조건 연산자 표현식은 값처럼 다른 표현식의 일부가 될 수 있어 유용하다. 하지만 조건에 따라 수행해야할 문이 하나라가 아니라 여러 개라면 if..else 문의 가독성이 더 좋다.

 

7.5 논리연산자

 논리부정(!)연산자는 언제나 불리언 값을 반환한다. 만약 피연산자가 불리언값이 아니면 불리언타입으로 암묵적 타입 변환 된다.

 

 

7.8 typeof 연산자

 typeof 연산자로 null 값 조회시 null이 아닌 object 로 조회된다는 점을 주의해야한다. 자바스크립트 첫번째 버전에 버그. 따라서 값이 null 타입인지 확인할 때는 일치연산자(===)를 사용한다.

 

7.9 지수연산자(**)

 지수연산자는 ES7에서 도입. 좌항의 피연산자를 밑으로 우항의 피연산자를 지수로 거듭제곱하여 숫자값을 반환한다.

지수연산자가 도입되기 이전에는 Math.pow 메서드를 사용했다.

2 ** 2; // 4
2 ** 2.5; // 5.65685424949238
2 ** 0; // 1
2 ** -2; // 0.25

Math.pow(2,2) // 4
Math.pow(2 ** 2.5) // 5.65685424949238
Math.pow(2 ** 0) // 1
Math.pow(2 ** -2) // 0.25

//다음과 같은 경우 Math.pow보다 가독성이 좋다
Math.pow(2, Math.pow(3, 2));
2 ** (3 ** 2);

//음수의 거듭제곱을 계산하려면 다음과 같아야한다.
(-5) ** 2; // -25

//지수연산자는 이항연산자 중에서 우선순위가 가장 높다.
2 * 5 ** 2; // 50

 

7.11 연산자의 부수효과

 대부분의 연산자는 다른 코드에 영향을 주지 않는다. 다만 할당연산자(=), 증/감 연산자(++/--), delete 연산자는 부수효과가 있다.

 

8.2.1 if...else 문

 if 문의 조건문은 불리언 값으로 평가되어야한다. 만약 if문의 조건식이 불리언 값이 아닌 값으로 평가되면 자바스크립트 엔진에 의해 암묵적으로 불리언값으로 강제 변환되어 실행할 코드블록을 결정한다.

 

8.2.2 switch 문

switch(표현식) {
	case 표현식1:
     switch문의 표현식과 표현식1이 일치하면 실행될 문;
     break;
    case 표현식2:
     switch문의 표현식과 표현식2이 일치하면 실행될 문;
     break; 
    default:
     switch문의 표현식과 일치하는 case문이 없을 때 실행될 문;
}

 break 문이 없다면 폴스루(fall through)가 발생. -> break 처리를 잘해주어야함. default 부분은 switch 문의 맨마지막에 실행되므로 별도의 break가 필요없다. 

 break 문을 생략한 폴스루가 유용한 부분도 있다. 예제로 살펴보자

var year = 2020;
var month = 3;
var days = 0;

switch (month) {
	case 1: case 3: case 5: case 7: case 8: case 10: case 12:
     days = 31;
     break;
    case 4: case 6: case 9: case 11:
     days = 30;
     break;
    case 2:
     //윤년계산 알고리즘
     days = ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0))? 29: 28;
     break;
    default:
     console.log('invalid month');
}

console.log(days); //31

 

8.3.2 while문

  while문은 주어진 조건식의 평가 결과가 참이면 코드블록은 반복해서 실행한다. for문은 반복 횟수가 명확할 때 주로 사용하고 while문은 반복횟수가 불명확할 때 주로 사용된다. 주의할 점은 조건식의 평가가 언제나 참이면 무한루프가 된다.

 

9.1 타입변환이란?

 개발자가 의도적으로 값의 타입을 변환하는 것은 명시적 타입 변환 또는 타입 캐스팅이라고 한다.

반대로 개발자의 의도와 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 변환되기도 한다.

이를 암묵적 타입 변환 또는 타입 강제 변환이라고 한다.

 

9.2.3 불리언 타입으로 변환

 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값(거짓으로 평가되는 값)으로 구분한다. 즉, 제어문의 조건식과 같이 불리언 값으로 평가되어야 할 문맥에서 Truthy 값은 true로 Falsy 값은 false로 암묵적 타입 변환된다.

 

9.3.1 문자열 타입으로 변환

 - String 생성자 함수를 new 연산자 없이 호출 하는 방법

 - Object.prototype.toString 메서드를 활용하는 방법

 - 문자열 연결 연산자를 이용하는 방법

 

9.3.2 숫자 타입으로 변환

 - Number 생성자 함수를 new 연산자 없이 호출하는 방법

 - parseInt, parseFloat 함수를 사용하는 방법(문자열만 숫자타입으로 변환 가능)

 - +단항 산술 연산자를 이용하는 방법

 - * 산술 연산자를 이용하는 방법

 

9.3.3 불리언 타입으로 변환

 - Boolean 생성자 함수를 new 연산자 없이 호출하는 방법

 - ! 부정 논리 연산자를 두 번 사용하는 방법

 

 9.4 단축평가

 논리합(||), 논리곱(&&) 연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가된다. 이처럼 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환한다. 이를 단축평가라고 한다. 단축 평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가가정을 생략하는 것을 말한다.

 

단축평가를 사용하면 if문을 대신하는 것이 가능하다.

//논리곱(&&)
var done = true;
var message = '';

if (done) message = '완료';

//if문을 단축 평가로 대체
message = done && '완료'; // '완료' 할당
console.log(message); // 완료
//논리합(||)
var done = false;
var message = '';

if (!done) message = '미완료';

//if문을 단축 평가로 대체
message = done || '미완료'; // '미완료' 할당
console.log(message); // 미완료
//삼항조건연산자
var done = true;
var message = '';

if (done) {
	message = '완료';
} else {
	message = '미완료';
}

//if..else를 대체
message = done? '완료' : '미완료';
console.log(message); // 완료

'Study' 카테고리의 다른 글

모던자바스크립트 Deep Dive - 1일차  (0) 2022.03.30

4.1 변수는 왜 필요할까?

 먼저, 메모리에 대해서 알아야한다. 메모리는 메모리셀의 집합체이다. 메모리 셀 하나의 크기는 1byte로 8bit에 해당한다. 그래서 1바이트 단위로 데이터를 저장하거나 읽어 들이는 것이다.

 

그림1 메모리/ 출처: http://www.tcpschool.com/c/c_pointer_intro

 각 셀을 고유 주소를 가진다. 메모리 주소는 메모리 공간의 위치를 나타내며 , 0부터 시작하여 메모리 크기만큼 정수로 표현된다.

 메모리 주소에 직접적으로 접근하는 것은 치명적인 오류가 발생할 가능성이 크다. 왜냐하면 메모리주소는 코드가 실행될 때 메모리 상황에 따라 임의로 결정되기 때문이다. 또한 코드가 실행되기 전에는 값이 저장된 주소도 알 수 없다.

그래서 프로그래밍 언어는 기억하고 싶은 값을 기억하고, 저장된 값을 읽어 들여 재사용하기 위해 변수라는 매커니즘을 제공한다.

 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.

 

6. 자바스크립트는 7개의 데이터타입을 제공한다. 7개의 데이터 타입은 원시타입과 객체타입으로 분류가능하다.

 

원시타입

- number: 정수와 실수 구분없이 하나의 숫자타입만 존재

- string: 문자열

- boolean: 논리적 참(true), 거짓(false)

- undefined: var 키워드로 선언된 변수에 암묵적으로 할당되는 값

- null: 값이 없다는 것을 의도적으로 명시할 때 사용하는 값

- symbol: ES6에 추가된 7번째 타입

 

객체타입

- 객체, 함수, 배열 등..


6.1 number - 숫자 타입

 ECMAScript 사양에 따르면 숫자타입의 값은 배정밀도 64비트 부동소수점 형식을 따른다. 즉, 모든 수를 실수로 처리하며, 정수만 표현하기 위한 데이터 타입은 별도로 존재하지 않는다.

 

 

 

 

'Study' 카테고리의 다른 글

모던자바스크립트 Deep Dive - 2일차  (0) 2022.03.31

[예제1]

console.log(score); //undefined

var score; // 변수 선언문

  변수 선언문 보다 앞서 변수를 참조하는 코드가 있다. 자바스크립트 코드는 인터프리터에 의해 한줄씩 순차적으로 실행되는 console.log(score)가 먼저 실행되고, 순차적으로 다음 줄에 코드를 실행한다. 따라서, score에 변수 선언이 실행되지 않았으므로 참조 에러가 발생할 것으로 예측된다. 하지만 참조 에러가 발생하지 않고 undefined가 출력된다.

 그 이유는 변수 선언이 소스코드가 한줄 씩 순차적으로 실행되는 시점 보다 먼저 실행되기 때문이다.

 

 자바스크립트는 엔진은 소스코드를 한 줄씩 순차적으로 실행하기에 앞서 변수선언을 포함한 모든 선언문을 소스코드에서 찾아서 먼저 실행한다. 이러한 평가과정이 끝나면 변수선언을 포함한 모든 선언문을 제외하고 소스코드를 한 줄씩 순차적으로 실행한다. 즉, 자바스크립트 엔진은 변수 선언이 소스코드의 어디에 있던 상관없이 다른 코드보다 먼저 실행한다.

 이는 예제1 코드에서 undefined이 출력되는 것, 변수 선언이 런타임 이전 단계에서 먼저 실행된다는 증거이다. 이처럼 변수 선언문이 코드의 선두로 끌어 올려진(hoisting) 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라고 한다.

변수는 왜 필요할까?

 먼저, 메모리에 대해서 알아야한다. 메모리는 메모리셀의 집합체이다. 메모리 셀 하나의 크기는 1byte로 8bit에 해당한다. 그래서 1바이트 단위로 데이터를 저장하거나 읽어 들이는 것이다.

 

그림1 메모리/ 출처: http://www.tcpschool.com/c/c_pointer_intro

 각 셀을 고유 주소를 가진다. 메모리 주소는 메모리 공간의 위치를 나타내며 , 0부터 시작하여 메모리 크기만큼 정수로 표현된다.

 메모리 주소에 직접적으로 접근하는 것은 치명적인 오류가 발생할 가능성이 크다. 왜냐하면 메모리주소는 코드가 실행될 때 메모리 상황에 따라 임의로 결정되기 때문이다. 또한 코드가 실행되기 전에는 값이 저장된 주소도 알 수 없다.

그래서 프로그래밍 언어는 기억하고 싶은 값을 기억하고, 저장된 값을 읽어 들여 재사용하기 위해 변수라는 매커니즘을 제공한다.

 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.

1. 함수와 함수의 호출

const add = (a, b) => a + b;

function calculator(func, a, b) {
	return func(a, b)
}

add (3, 5);

calculator(??, a, b);

calculator 함수의 파라미터 ??에 적절한 것은 무엇일까?

1) add

2) add()

 

Tip) 함수호출이 아닌 함수가 와야한다. 선언된 함수 뒤에 ()라는 호출을 붙이게 되면, 위와 같은 경우는 undefined + undefined 라는 리턴값이 온다고 생각하면 헷갈리지 않는다.  ex) calculator(undefined + undefined , a, b)

 


2. 고차 함수

const onClick = () => () => {
	console.log('foo');
}

위에 onClick 함수는 고차함수의 예시이다.

헷갈릴때는 아래와 같이 바꿔줄 수 있어야한다.

const onClick = () => {
	return () => {
    	console.log('foo');
    }
}

Tip) 고차함수의 경우 함수를 리턴하기 때문에 addEventListener안에 onClick()형태로 함수호출하는 것이 가능하다.

파라미터가 존재할때, 더 헷갈리는 경우가 생긴다. event 파라미터로 위치 또한 신경써야하는 부분이다.

 

나쁜예

const onClick = (event) => () => {
	console.log('bar');
}

document.querySelector('#header').addEventListener('click', onClick());

//onClick 리턴 값을 직접 넣어본다.
//event가 들어오지 않는다.
//잘못됨 확인
document.querySelector('#header').addEventListener('click', () => {
	console.log('bar');
});

 

좋은예

const onClick = () => (event) => {
	console.log('bar');
}

document.querySelector('#header').addEventListener('click', onClick());

document.querySelector('#header').addEventListener('click', (event) => {
	console.log('bar');
});

'Javascript & Typescript' 카테고리의 다른 글

자바스크립트 호이스팅(hoisting)  (0) 2022.03.30

인텔리제이 개발할때 필요한 단축키 정리해보도록 하겠습니다.

꾸준하게 업데이트 할 예정입니다.

 

cmd + n : 디렉터리, 패키지, 클래스 등 생성 목록 보기
cmd + shift + enter : 현재 구문 완성 (Complete Current Statement)

 

 

추가)

- 가장 많이 사용되는 IntelliJ IDEA 단축키 15개

https://blog.jetbrains.com/ko/2020/03/11/top-15-intellij-idea-shortcuts_ko/

+ Recent posts