반응형

 

자바스크립트 기초 문법 정리.

 

참고 강좌 영상 : https://youtu.be/b1tZWuLAcQU

 

위 강좌 #8 ~ #11 을 참고하였다.

 

 


 

반복문

 

for문

for(let i = 0; i < 10; i++){
  console.log(i);
}
// i=0에서 시작해서 반복마다 i에 1을 더하며, i가 10 미만인 경우 다시 반복하고 아니면 종료한다.

for(변수; 조건; 실행){

    반복할 코드

}

의 구조로 이루어져 있다.

 

값이 변하는 변수 i가 for문 안에서 let으로 정의되었다.

 

 

while문

let i = 0;

while(i<10){
  console.log(i);
  i++;
}

//i가 10 미만인 경우 계속 반복한다.

while(조건){

    반복할 코드

}

의 구조로 이루어져 있다.

 

반복할 코드 안에 '조건'를 종료시킬 수 있는 코드를 작성해야 한다.(예컨대 i++)

그렇지 않으면 조건에 아무런 변화가 없이 늘 true라서

무한루프가 실행된다.

 

 

do.. while문

let i = 0;

do {
  console.log(i)
  i++;
} while(i<10)

// do문 안의 코드를 while의 조건이 만족하는 한 계속 반복한다.

while문 과의 차이는,

while의 조건 판별보다 do문 실행이 먼저이므로

최소한 do문을 1번은 실행한다는 것이다.

 

 

break, continue

break : 실행 즉시 반복문을 빠져나온다.

continue : 실행 즉시 다음 반복을 실행한다.

// break문

while(true){
  let answer = confirm('계속 할까요?');
  if(!answer){
    break;
  }
}
// confirm 대화상자의 '확인' 클릭 시 반복, '취소' 클릭 시 '!answer == true'가 되어 break 실행.
// 반복문을 빠져나온다.
// continue문

for(let i = 0; i < 10; i++){
   if(i%2){
     continue;
   }
  console.log(i)
}

// i%2==0(false) 즉, 짝수이면 continue가 무시되고 console.log 실행.
// i%2==1(true) 즉, 홀수이면 continue가 실행되고 다음 반복으로 넘어감.

 

Tip!

for문 : 명확한 횟수가 정해져 있을 때.

while문 : 명확한 횟수가 정해지지 않았을 때.

사용하면 좋다.

 

 

 

 

switch문

if else문으로도 작성할 수 있는 switch문.

하지만 case가 몇가지로 분류될 때 간결한 코드 작성을 위해 사용할 수 있다.

 

잘못된 switch문의 사용부터 알아보자.

//잘못된 switch문
switch(fruit){
  case '사과' :
    console.log('100원 입니다.');
  case '바나나' :
    console.log('200원 입니다.');
  case '키위' :
    console.log('300원 입니다.');
  case '멜론' :
    console.log('500원 입니다.');
  case '수박' :
    console.log('500원 입니다.');    
}

// 해당 case 이하 모든 코드를 실행한다.

해당하는 case로 이동하는 것은 성공하지만, 그 이하 모든 코드를 실행한다.

따라서 해당하는 case의 코드만 실행하고 싶다면, 코드에 break문을 추가해야 한다.

 

올바른 switch문 사용 + default 사용(예외처리)

let fruit= prompt('무슨 과일을 사고 싶나요?');

switch(fruit){
  case '사과' :
    console.log('100원 입니다.');
    break;
  case '바나나' :
    console.log('200원 입니다.');
    break;    
  case '키위' :
    console.log('300원 입니다.');
    break;     
  case '멜론' :
  case '수박' :
    console.log('500원 입니다.');    // 가격이 같은 과일 묶기
    break;     
  default  :
    console.log('그런 과일은 없습니다.');
}

모든 case에 해당하지 않는 경우에 실행할 코드는 'default'로 작성한다.

 

 

 

 

함수

반복해서 실행하는 코드를 묶어서 '함수'로 정의할 수 있다.

 

function sayHello(a, b, c)

    console.log(`Hello, ${a}, ${b}, and ${c}!`);

}

 

function : 함수 정의

sayHello : 함수명

a, b, c : 매개변수(인자)

 

 

매개변수가 있는 함수 작성

function sayHello(name){
  let msg = `Hello, ${name}`;
  if(name){
    msg += name;
  }
  console.log(msg);
}

sayHello() // "Hello"
sayHello("Woojin") // "Hello, Woojin"

매개변수를 입력하지 않으면 name == undefined가 되어 if문이 실행되지 않는다.

 

* msg라는 변수는 함수 안에서 선언된 '지역 변수'이다.

함수 외부에서는 정의되지 않는다.

 

 

전역 변수와 지역 변수

 

반대로 함수 밖에서 정의되는 변수는 '전역 변수'로, 함수 내부에서 사용할 수 있다.

전역 변수를 함수 내부에서 재정의하면, 함수 밖에서도 적용된다.

 

let은 중복 선언이 불가능하고 재정의(수정)만 가능했다.

그런데

전역으로 let a = 1;

지역으로 let a = 2;

라고 작성하면

전역변수 a와 지역변수 a가 각각 선언되며, 서로 간섭하지 않는다.

 

매개변수 또한 지역변수로, 전역변수로 같은 이름의 변수가 선언되어도 영향을 받지 않는다.

 

Tip!

전체 서비스에서 공통적으로 사용하는 변수 외에는 '지역 변수'로 사용하는 것이 좋다.

 

 

result (결과값 반환)

함수의 결과값을 반환할 때는 result를 사용한다

function add(num1, num2){
  return num1 + num2;
}

console.log(add(1,2)); // 3

함수를 실행하면 return에 해당하는 값을 반환한다.

 

function showError(){
  alert('에러가 발생했습니다.');
}

console.log(showError()); // undefined

return을 정의하지 않은(또는 return만 적혀 있으면) 함수는 undefined를 반환한다.

return; 을 종료 목적으로 작성할 수도 있다.

 

Tip!

- 함수는 한 번에 한 작업만

- 읽고 파악하기 쉽게 네이밍 (JS는 카멜 표기법 사용 -> 낙타처럼 getName 대문자로 구분)

 

 

 

 

함수 표현식 & 화살표 함수

 

호이스팅

sayHello():

funtion sayHello(){
	console.log('Hello');
}

이 함수는 동작한다.

왜냐하면, Javascript는 코드 실행 시 선언된 모든 함수 코드를 먼저 실행하고 나머지 코드를 실행하기 때문이다.

이를 호이스팅(hoisting)이라고 한다.

 

이 순서를 거스를 수 있는 방법이 '함수 표현식' 이다.

 

 

함수 표현식

let sayHello = function(){
	console.log('Hello');
}

위와 같은 코드를 '함수 표현식'이라고 한다.

호이스팅에 걸리지 않고, 해당 코드에 도달해야 함수가 선언된다.

 

귀찮으니 그냥 함수 선언문을 사용하자.

 

 

화살표 함수

//함수 선언문
function sayHello(name){
  let msg = `Hello, ${name}`;
  if(name){
    msg += name;
  }
  console.log(msg);
}

//화살표 함수
const sayHello = (name) => {	// 매개변수 1개는 괄호 생략 가능
  let msg = `Hello, ${name}`;
  if(name){
    msg += name;
  }
  console.log(msg);
}

 

return문이 한 줄인 경우 더 간단하게 축약이 가능하다.

//함수 선언문
function add(num1, num2){
	result = num1 + num2;
}

//화살표 함수
const add = (num1, num2) => {
	return = num1 + num2;
}

//화살표 함수(더 축약)
const add = (num1, num2) => num1 + num2;

 

 

반응형
반응형

 

 

공부했던 C와 python과는 사뭇 다른 JS의 문법.

기초 강좌를 보고 정리해보자.

 

참고 강좌 영상 : https://youtu.be/P0FY8k916e0

위 영상 #1 ~ #7 까지의 내용을 참고하였다.

 

 

 

변수

// let은 중복 선언 불가, 재정의 가능
let num = 1;

console.log(num) // 1
let num = 2; // error

num = 2;
console.log(num) // 2

// console.log는 print 역할

let은 중복 선언 불가, 재정의 가능

 

// const는 중복 선언 불가, 재정의 불가
const NUM = 1;

console.log(NUM) // 1
const NUM = 2; // error

const = 2;
console.log(NUM) // error

Tip!

- 변수 선언은 웬만하면 const로 하고, 변경 필요한 변수를 let으로 바꾼다.

- const로 선언한 변수명은 대문자로 한다.

 

 

 

 

자료형

// 숫자형
const age = 30;

// 문자형
const name1 = "Mike";
const name2 = 'Mike';
const name3 = `Mike`;

message = `My name is ${name1}`;

console.log(message) // "My name is Mike";

// 논리형
const a = 1;
console.log(a == 1) // true

// null 과 undefined
let a;
let b = null;

typeof a // undefined
typeof b // object --> null인데 오류임

참조가 필요한 경우 백틱을 사용한.

Windows는 '~'를 shift 없이 누르면 나오는 문자를 사용한다.

MacOS도 마찬가지인데, ₩가 백틱으로 변환되어 나온다.

typeof 는 자료형의 타입을 알 수 있는 연산자이다.

 

 

 

 

대화상자

기본 대화상자에 대해 알아보자.

alert("message") // message를 포함하는 단순 alert 모달 발생.
prompt("message") // message를 포함하여 사용자의 입력을 받는 모달 발생.
confirm("message") // message를 포함하여 사용자가 확인/취소를 누를 때 true/false 입력을 받는 모달 발생.

prompt("message", "default") // default가 사용자 입력 디폴트 값으로 뜬다.

 

 

 

 

형변환

String() : 문자형으로 변환

Number() : 숫자형으로 변환

Boolean() : 불린형으로 변환

 

* prompt로 입력 받은 숫자는 '문자형'으로 저장된다.

  이때, 문자형으로 저장된 '숫자'에 사칙연산을 실행하면 숫자가 된다.

const a = prompt("input1") // 1
const b = prompt("input2") // 2

console.log(a + b) // 12
console.log((a+b)/2) // 6

 

평균을 구하고 싶다면 각 input에 Number() 연산자를 사용하면 된다.

const a = Number(prompt("input1")) // 1
const b = Number(prompt("input2")) // 2

console.log(a + b) // 3
console.log((a+b)/2) // 1.5

 

불린형으로 변환에서

0, '', null, undefined, NaN --> false

나머지 --> true

 

여기서 ''는 false이지만, ' '는 공백이 포함된 문자열로 true가 됨에 유의하자.

 

 

 

 

기본 연산자

+ : 덧셈

- : 뺄셈

* : 곱셈

/ : 나눗셈

 

% : 나머지 연산

// : 몫 연산

** 제곱

 

수학 연산 순서와 같이 제곱, 곱셈/나눗셈, 덧셈,뺄셈 순서로 연산이 실행된다.

따라서 적절한 괄호의 사용이 필요하다.

 

 

 

 

비교 연산자

비교 연산자의 결과는 불린형으로 반환된다.

const a = 1;
const b = 2;

a == b // 동등 연산자, false
a > b // false
a < b // true
a >= b // false
a <= b // true
a != b // true

const c = String(a);
a == c // true
a === c // 일치 연산자로 타입까지 비교함, false

 

 

 

 

조건문

if, else, else if 의 사용을 알아보자.

const age = 30;

// if만
if(age > 19){
	console.log('환영합니다.');
}

// if, else if, else
if(age > 19) {
	console.log('환영합니다.');
} else if(age === 19) {
	console.log('수능 잘 보세요!');
} else {
	console.log('안녕히 가세요.');
}

 

 

 

 

논리 연산자

AND : &&

OR : ||

NOT : !

 

const a = 1;
const b = 2;

a === 1 && b === 2 // true
a === 1 || b === 3 // true

console.log(!a) // false (1은 boolean에서 true로 변환됨)

 

AND와 OR의 중첩에서 'AND 연산이 우선'됨에 유의하자.

 

const a = 1;
const b = 1;
const c = 1;

console.log(a == 1 || b == 0 && c == 0) // true

연산이 순서대로 진행된다면 true || false 에서 true가 되고 다시 true && false 에서 false가 되어야 한다.

하지만 && 가 먼저 계산되므로 false && false에서 false, 다시 true || false에서 true가 된다.

 

Tip

AND(&&)는 false가 나오면 연산을 종료한다.

OR(||)은 true가 나오면 연산을 종료한다.

 

AND를 사용할 때,

'운전면허가 있는 여군' 보다는

'여군이면서 운전면허소지' 가 연산 최적화에 알맞다.

'여군' 이라는 조건에서 더 많은 case는 false를 반환하고 연산을 종료할 것이기 때문.

 

조건문을 사용할 땐 연산 최적화를 고려하자.

 

 

 

 

 

1편 끝 ~

 

 

 

 

 

 

반응형
반응형

* 공부 과정에서 작성한 글로, 설명이 정확하지 않을 수 있습니다.

 

drf_yasg 라이브러리를 활용하면 Django 프로젝트의 API 리스트를 자동으로 생성할 수 있다.

단, generics나 Viewset을 활용한 CBV(Class Based View)여야 한다.

 

APIView를 사용하거나, generics, Viewset에서도 View 내부에서 커스터마이징한 메서드에 대해서는 제대로 된 명세를 작성해주지 않는다. 이 경우에는 직접 코드 내부에 명세에 관한 내용을 기입해야 한다.

 

(나는 대부분의 View가 APIView 또는 커스터마이징된 메서드이기 때문에 코드가 너무 지저분해질 것을 염려하여 Swagger에 직접 작성하기로 했다.)

 

 

 

패키지 설치 및 적용

(venv) % pip install drf-yasg
# settings.py

INSTALLED_APPS =
[	
	...
	'rest_framework',
    'myapp',
    'drf_yasg'
    ...
]

 

 

 

swagger 엔드포인드 추가

from django.contrib import admin
from django.urls import path, re_path
from django.conf import settings
#from django.conf.urls import url
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

schema_view = get_schema_view( 
    openapi.Info( 
        title="Swagger Study API", 
        default_version="v1", 
        description="Swagger Study를 위한 API 문서", 
        terms_of_service="https://www.google.com/policies/terms/", 
        contact=openapi.Contact(name="test", email="dhkep03@gmail.com"), 
        license=openapi.License(name="Test License"), 
    ), 
    public=True, 
    permission_classes=(permissions.AllowAny,), 
)

urlpatterns = [
    path('admin/', admin.site.urls),
]

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name="schema-json"),
        re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
        re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),    ]

 

 

 

 

적용 후 서버 실행하면 다음 주소에 접속이 가능하다.

 

 

 

http://localhost:8000/swagger/

 

 

 

http://localhost:8000/redoc/

 

반응형
반응형

NameError: name '_mysql' is not defined

 

장고 프로젝트와 MySQL을 연동하고 makemigrations 하는 중 발생한 오류.

구글링해서 나온 웬만한 링크들 전부 따라해보아도 안됐는데,

 

나의 경우 아래 방법으로 해결했다.

 

1) 터미널에(프로젝트에 사용 중인 가상환경 접속 필수)

pip install mysql-connector-python

 

2) 장고 my_settings에서

'ENGINE': 'django.db.backends.mysql',

으로 수정

반응형
반응형

 

"detail": "JSON parse error - Expecting property name enclosed in double quotes:

 

참고 링크 : https://stackoverflow.com/questions/62347538/json-parse-error-expecting-property-name-enclosed-in-double-quotes-line-11-co

 

JSON parse error - Expecting property name enclosed in double quotes: line 11 column 5 (char 257)"

I am following a course on the Django Rest Framework. I seem to have copied the code verbatim, however, there seems to be some error which I am unable to zero down on. What possibly could be causin...

stackoverflow.com

 

### 잘못된 JSON 형식
{
"mbti_fourth": "J",
}

### 올바른 JSON 형식
{
"mbti_third": "T",
"mbti_fourth": "J"
}

장고는 아니고 JSON 형식에 대한 에러이다.

마지막에 콤마(,)를 지우지 않아서 발생한 에러.

복수 항목이 있는 경우 모두 끝에 콤마를 붙여주고, 마지막 항목에만 지워줘야 한다.

반응형
반응형

 

No changes detected in app ‘polls’

 

여기서 'polls'는 django 튜토리얼에 나오는 앱의 명칭이다.

에디터와 터미널이 동기화되지 않아서 생기는 현상으로, 각 파일을 저장해주고 기다리면 해결된다.

 

*초보자들에게

에디터(필자는 vscode)사용 시,

각 파일을 편집하고 저장하지 않는 경우가 있었다.

 

반드시 수정한 파일마다 저장을 해주어야 한다. 에디터에 열려있는 폴더 전체가 한 번에 저장되는 것이 아님에 명심하자.

반응형
반응형

 

 

모델(model) : 데이터가 저장되어 있는 모델

클래스 1개 = 테이블 1개

클래스 안의 1줄 = 1개 컬럼 정의

 

 

 

마이그레이션(migration) : 모델의 변경사항을 저장하는 방법으로, 디스크 상의 파일로 존재

마이그레이션 관련 python 명령어 정리

- python manage.py makemigrations : 마이그레이션 파일을 만든다

- python manage.py migrate : 저장된 마이그레이션 파일을 실행하여 변경을 DB에 적용한다

 

초기상태에서는 makemigrations를 건너뛰고 migrate을 실행한다 --> 기본 앱에 대한 모델이 작성된다.

 

 

 

뷰(view) : request를 받아서 response를 내보내는 로직, 함수

Http response, JSON response 등의 response를 내보내거나 다른 url등으로 render할 수 있다.

request를 최종 전달받아 처리하는 곳.

 

 

 

url : url 경로들을 view로 매핑시켜준다.

request가 들어오면 urls.py 라는 파일로 가서 url에 매핑되는 view를 찾아 이동시켜준다.

 

 

템플릿(template) : client의 화면에 보여지는 부분. DRF(Django-Rest_Framework) 사용 예정이라 그만 알아보자.

 

반응형
반응형

 

 

참고 커맨드

cd : 디렉토리 이동

cd - : 이전 디렉토리로

ls : 현재 디렉토리 하위 항목 리스트업

mkdir : 폴더(디렉토리) 생성

 

 

 

 

in terminal,

 

1. 폴더(디렉토리) 생성

mkdir djangoProject

 

2. 생성된 디렉토리 이동

cd djangoProject

 

3. 가상환경 생성

python -m venv myvenv

(myvenv : 가상환경명)

 

4. 생성된 가상환경 디렉토리로 이동

cd myvenv

 

5. ls로 하위 항목 확인

ls

(bin, include, lib, pyvenv.cfg 가 뜨면 정상)

 

6. 가상환경 활성화

source ./bin/activate

(비활성화는 deactivate)

 

7. 장고 상태 확인

python -m django —version

(미설치라면 pip install django)

 

8. 장고 프로젝트 설치를 위해 루트디렉토리로 이동

cd djangoProject

 

9. mysite 디렉토리 생성

mkdir mysite

 

10. 생성한 mysite 디렉토리로 이동

cd mysite

 

11. 장고 프로젝트 설정

django-admin startproject first_app .

 

12. manage.py가 있는 mysite에서 서버 구동

python manage.py runserver

위 이미지와 같은 메세지가 뜨면 성공

 

13. 서버 구동 확인

http://127.0.0.1:8000/ 접속

위 이미지처럼 뜨면 정상

 

14. mysite/config/settings.py 파일을 아래와 같이 변경 (한국 기준으로 변경)

(언어와 시간대를 수정)

반응형

+ Recent posts