dev-blackcat의 등록된 링크

키자드에 등록된 총 721개의 포스트를 확인하실 수 있습니다.

Naver Blog

[Python] 모듈, 패키지, __all__, __main__

모듈 모듈은 다른 파이썬 파일에서 불러와서 사용할 수 있는 파일이라고 생각하면 된다. # "module1.py" 파일 def test(value) print("module1.py 파일을 불러와 호출한 값 : {0} 입니다.".format(value)) # main.py 파일 import module1 module1.test("테스트") -> module1.py 파일을 불러와 호출한 값 : 테스트 입니다. # 모듈명이 길때 대체 이름 import module1 as md1 md1.test("테스트") -> module1.py 파일을 불러와 호출한 값 : 테스트 입니다. # 모듈을 전체 불러오는 방법 from module1 import * test("테스트") -> module1.py 파일을 불러와 호출한 값 : 테스트 입니다. # 모듈에서 불러오고 싶은 함수만 불러올 경우 from module1 import test test("테스트") -> module1.py 파일을 불러와 호출한

Naver Blog

[Windows10] WSL2 메모리 및 CPU 제한(Limit)

.wslconfig 첨부파일 ___.wslconfig 파일 다운로드 "C:\Users\사용자이름" 폴더로 이동 후 ".wslconfig" 파일 생성 후 저장 후 WSL 재시작 ※ 혹은 다운로드 파일을 "C:\Users\사용자이름"에 넣어주시면 됩니다. [wsl2] processors=4 # 프로세스(CPU) 제한 memory=3GB # 메모리(RAM) 제한

Naver Blog

[Nginx] 완전삭제하기

완전삭제하기 sudo apt -y remove nginx sudo apt --purge -y remove nginx-* sudo apt purge -y nginx nginx-common sudo rm -rf /etc/nginx sudo apt -y autoremove

Naver Blog

[Flutter] 플러터 SDK 깃 클론 및 다운로드

플러터 SDK 다운로드 Windows install How to install on Windows. flutter.dev # 위의 링크를 접속하여 "flutter_windows_2.2.3-stable.zip" 파일을 다운로드 받아주세요. 이후 "C:\Users\PC유저이름\Documents" 으로 이동 후 받은 압축을 풀어 해당 폴더에 넣어주신후에 안드로이드 스튜디오에서 플러터 SDK를 불러올때 경로를 지정해주시면 됩니다. 플러터 깃으로 받기 # "C:\src" 폴더를 생성하거나 특정 위치를 지정하여 "git clone"을 해주시면 됩니다. 그러면, 매번 다운로드 받을 필요없이 SDK를 교체할 수 있습니다. git clone https://github.com/flutter/flutter.git -b stable

Naver Blog

[MySQL] mysql server during query

타임아웃 늘리기 # "50-server.cnf" 파일을 연후 sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf # 하단쪽 아무곳에다가 타임아웃 값을 넣어줍니다. interactive_timeout = 31536000 wait_timeout = 31536000

Naver Blog

[노트북] 레노버 V15 82C7007JKR 써멀 재도포 및 후기

구매처 레노버 V15 82C7007JKR 레노버 2020 V15 COUPANG www.coupang.com ※ 레퍼럴 링크 아님 내부 구조 내부구조 내장 4GB(2400) + 외장 슬롯 1개로 최대 20GB 램 확장이 가능합니다. 왼쪽 하단이 SSD 자리 입니다. 현재 사진에는 방열판을 끼웠었지만 커버가 잘 닫히지 않아 현재는 써멀패드만 붙여놓은 상태 입니다. 패널 이번에 구매한 노트북은 15.6인치인 레노버 V15 82C7007JKR 모델 입니다. 패널의 경우 TN이기 때문에 시야각이 좋지 않고 또렷하지 못합니다. 어르신들이 쓰시기에는 글자가 잘 보이지 않기 때문에 크게 추천드리지는 않습니다. 물론, 20 ~ 30대 분들에게도 장기간 사용은 추천하지 않습니다. 간단한 작업을 하기 때문에 크게 성능을 맞출 필요가 없다면 최소한 모니터라도 하나 장만하셔서 연결하셔서 사용하시는게 눈건강에 좋을것 같습니다. 마감 전에 구매했던 레노버의 경우도 마감은 좋았습니다. 이번 저가형 노트북도 가격

Naver Blog

[Python] error: invalid command 'bdist_wheel' 오류 해결

패키지 설치 # pip install wheel

Naver Blog

[Python] Nginx 플라스크(Flask) uWSGI

uWSGI How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 20.04 | DigitalOcean In this guide, you will build a Python application using the Flask microframework on Ubuntu 20.04. The bulk of this article will be about how to set up the uWSGI application server and how to launch the application and configure Nginx to act as a fron www.digitalocean.com uWSGI를 이용하여 Nginx에 Flask 연결하기 Jihun's Development Blog cjh5414.github.io Ubuntu 16.04 Flask, django uwsgi 서비스 등록하기 Flask, django로 개발을 마친

Naver Blog

[Python] 플라스크(Flask) SQL injection 방지

SQL injection bobby-tables.com: A guide to preventing SQL injection in {currlang} Python Using the Python DB API , don't do this: # Do NOT do it this way. cmd = "update people set name='%s' where id='%s'" % (name, id) curs.execute(cmd) This builds a SQL string using Python's string formatting, but it creates an unsafe string that is then passed through to the database and execute... bobby-tables.com # 장고는 queryset(ORM)를 통해서 "SQL injection"을 방지할 수 있다. 하지만, 플라스크의 경우 "SQL injection"을 방지하기 위해서는 다른 방

Naver Blog

[TypeScript] 타입스크립트 유니온(Union), 인터섹션(Intersection) 타입

유니온(Union) 타입 # 유니온 타입(Union Type)은 연산자(||)와 같이 'A' 이거나 'B'이다 라는 의미의 타입이다. 즉, 해당 타입은 Null 일 수도 있으면서 다를 수도 있다라는 뜻 입니다. 타입스크립트를 잘 활용하려면 타입을 "any"로 두지 마시고 명확한 타입을 적어줘야 합니다. function logText(text: string | number) { // ... } 인터섹션(Intersection) 타입 # 인터섹션 타입(Intersection Type)은 여러 타입을 모두 만족하는 하나의 타입을 의미한다. interface Person { name: string; age: number; } interface Developer { name: string; skill: number; } type Capt = Person & Developer; # "Capt"의 타입은 아래와 같이 됩니다. & 연산자를 이용해 여러 타입을 하나로 합치는 방식을 인터섹션 타입 정

Naver Blog

[Python] Unable to allocate 메모리 오류

메모리 오류 # 해당 오류는 관련 패키지(라이브러리) 문제일 가능성이 높기 때문에 기존 "venv" 삭제해주시고, 하나씩 패키지들 설치해보시면서 테스트 해야 합니다.

Naver Blog

[MySQL] MySQL 15.1 MariaDB10.5.9 기준 테이블 조회, 생성, 선택, 삭제

테이블 조회 SHOW TABLES; 테이블 생성 CREATE DATABASE 테이블 이름; 테이블 선택 USE 테이블 이름; 테이블 삭제 DROP TABLE 테이블 이름; 참고 링크 MySQL :: 테이블 생성 하기 create table - MySQL 입문 :: EVERDEVEL - 에버디벨 mysql의 테이블을 생성하는 방법, 필드를 삭제하는 방법, 필드를 추가하는 방법에 대해서 학습니다. www.everdevel.com

Naver Blog

[Python] pool.map vs parmap

파이썬 기본 멀티프로세싱 종류 multiprocessing.Process(...) multiprocessing.Pool(...) # Pool 데이터의 양이 기하급수적으로 증가할 수록 결과 값은 많은 차이가 날 것으로 기대 됩니다. Pool은 데이터를 병렬화해서 함수의 결과를 좀 더 빠르게 응답받을 수 있는 장점이 있습니다. # Process Process는 쓰레드와 상당히 유사하며, 일련의 프로세스를 생성 후 작업하므로 시스템의 여러 프로세스의 자원을 충분히 활용할 수 있다는 장점이 있습니다. parmap # "paramap"은 위의 "Process"나 "Pool" 보다 더 나은 방법으로 쉽게 사용 할 수 있다고 하며, 진행바를 볼 수 있다고 한다. 더 자세한 부분은 다음에 다루도록 하겠습니다. # 현재 사용가능한 CPU 개수 파악 import multiprocessing num_cores = multiprocessing.cpu_count() data = [ .... ] def te

Naver Blog

[Docker] 우분투(Ubuntu 18.04) 도커(Docker) 설치 및 컨테이너 생성

도커(Docker) 설치하기 # 도커 설치하기 한줄씩 실행 sudo apt -y install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" sudo apt update sudo apt -y install docker-ce # 도커 실행 확인 sudo service docker status 도커(Docker) 컨테이너 생성 Docker Hub Create a Docker ID. Already have an account? Sign In Send me occasional product updates an

Naver Blog

[Python] FastAPI 패키지 설치 및 셋팅하기

FastAPI 패키지 설치 pip install fastapi pip install uvicorn[standard] FastAPI 베이스 셋팅 from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q} uvicorn 명령어 사용 # "uvicorn"의 "--reload" 옵션은 "hot reloading" 기능으로 소스 코드가 수정되면 서버를 재시작 한다. uvicorn main:app --reload 비동기 처리 방법 async await # 데이터베이스 조회나 I/O를 처리해야 하는 곳에 사용 @app

Naver Blog

[Python] No module named 'pip._internal.cli.main' 오류 해결하기

No module named 'pip._internal.cli.main' # 먼저, CMD 및 "window terminal"을 관리자 권한으로 실행 후 PIP 업데이트 python -m pip install --upgrade pip ----- # 위 방법이 안되면 "get-pip" 재설치 curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python3 get-pip.py --force-reinstall OR curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py ----- # 위 2가지 다 안될경우 프로젝트 내에 "venv" 폴더 지우고 인터셉터 다시 만들기

Naver Blog

[컴퓨터] Asrock Deskmini x300 데스크미니 라이젠 4350G(CPU), 램(메모리) 오버클럭 후기

사양 cpu-z 오버클럭 Asrock Deskmini x300 CPU 전압 : 1.375 클럭: 4200Mhz ※ HWMonitor를 통하여 전압 피크치가 1.38 수준으로 나와서 1.375로 설정 ※ 전압 다이어트 안함 램(메모리) 클럭 3600(IF 1800) 타이밍 24 26 26 50 / 1T 전압 1.35 ※ 웬만하면 3600에 위 타이밍 정도는 그냥 들어갑니다. 온도 온도는 오버클럭 전에 조금 더 낮기는 하지만 크게 차이가 없습니다. 평균 60 ~ 65도 수준 물론 저의 PC는 게임용이 아닌 작업용이고 다중 멀티작업을 하는 수준이고 영상편집 같은 무거운 프로그램을 돌리지는 않습니다. 아참! 에어컨 환경 입니다. 실내 평균 24도 수준 정도 써멀구리스는 MX-5 재도포 해주었습니다. 현재 4.2 클럭에서 70도를 이상 올라간적이 없는것을 보아 크게 문제는 없어 보입니다. ※ 쿨러는 라이젠 기본 쿨러 사용했습니다. 위 뚜겅을 제거하면 케이스 안으로 들어가집니다. 체감 우선은

Naver Blog

[Github] 깃허브 Support for password authentication was removed on

깃 설정 초기화 git config --local --unset credential.helper git config --global --unset credential.helper sudo git config --system --unset credential.helper 깃 계정 입력시 비밀번호 [Git] 토큰 인증 로그인 - remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. 8월 13일 부로 push, clone, pull 시 비밀번호 대신 토큰을 사용하게 변경됨. Personal access token 이용 로그인 방법 정리. 1. https://github.com/ 접속 + 로그인 2. 우측 상단 Profile 클릭 후 Settings 클릭.. firstquarter.tistory.com # "비밀번호" 대신 생성한

Naver Blog

[Github] 깃허브 access token 세션 저장하기

깃 설정 초기화 git config --local --unset credential.helper git config --global --unset credential.helper sudo git config --system --unset credential.helper 깃 세션 저장하기 # "pull/push" 전 입력 후 진행 git config --global credential.helper cache

Naver Blog

[Dart] 다트 언어 소개 및 특징

다트(Dart) 소개 1. 구글이 2011년 웹 프론트엔드 개발을 위해 만든 언어 2. 객체 지향이면서 C언어와 유사한 문법 3. 선택적 타입(optional type) 4. 메모리를 공유하는 thread 대신 독립 메모리를 갖는 isolate를 사용 5. 자바스크립트와 호환 6. 코드 변경시 실행 중인 앱에 즉시 결과를 보여주는 "hot reload"를 통한 생산성 높음 7. AOT 컴파일로 네이티브 코드를 생성하여 높은 속도 기본 문법 1. import - 패키지 내의 라이브러리를 사용하고자 할 때 라이브러리를 가져오기 위해 사용 2. // - 주석처리 3. 함수 선언 - a, b는 모두 타입이 "Integer" add(int a, int b) { return a+b } 4. main() 함수 - 앱 실행을 시작하는 최상위 함수 5. 변수 선언은 var - 타입이 없는 형태로 해당 변수가 참조하는 타입에 따라 결정 6. 콘솔 출력은 print() - 변수를 넣기 위해서는 자바스크

Naver Blog

[Dart] 다트 언어 상수, 타입, 변수

상수 상수 설명 final 런타임 시점에 상수화 const 컴파일 시점에 상수화 # 아래 코드는 문제 없이 작동한다. main() { final int NUMBER = 1; const int PRICE = 1000; final NAME = "KIM"; const COLOR = "RED"; print("NUMBER : $NUMBER"); print("PRICE : $PRICE"); print("NAME : $NAME"); print("COLOR : $COLOR"); } # 하지만, 아래의 경우에는 "final"은 런타임 시점에 "get()"을 가져오기 때문에 오류가 나지 않지만, "const"의 경우에는 컴파일 시점에 "get()"을 가져오려고 하니 가져 올 수 없기 때문에 오류가 난다. 즉, 컴파일 시점에는 "get()"이라는 함수가 정의되지 않았고 가져올려고 하기 때문에 오류가 나는것이다. 더 쉽게 말하면 렌더링 전에 선언되지 않는 함수에 값을 가져올려고 하면 오류가 나는것과 동일

Naver Blog

[Dart] 다트 언어 함수

변수가 함수를 참조 가능 getName() { // 함수 return "홍길동"; } main() { var name = getName(); // 변수가 함수를 참조 } ※ 객체 지향이기 때문에 자바스크립트 처럼 가능하다. 다른 함수의 인자로 함수 전달 가능 int test1(int a, int b) { return a + b; } int test2(int a, int b) { return a - b; } int total(int a, int b) { return a * b; } main() { int a = 10; int b = 5; print("${a + b} * ${a - b} = ${total(test1(a, b), test2(a, b))}"); } 이름 있는 선택 매개변수 String getAddress(String City, {String district, String zipCode = "123456"}) { return "$city시 $district구 $zipCode"

Naver Blog

[Dart] 다트 언어 연산자

산술 연산자 연산자 설명 + 더하기 - 빼기 * 곱하기 / 나누기 ~/ 몫 구하기 % 나머지 값 ++ 현재 값에서 1 더하기 -- 현재 값에서 1 빼기 할당 연산자 연산자 설명 = 현재 값 할당 += 현재 값에서 1 더하기 -= 현재 값에서 1 빼기 *= 현재 값에서 1 빼기 /= ~/= 관계 연산자 연산자 설명 == 같다 ~= > 보다 크다(초과) < 보다 작다(미만) >= 크거나 같다(이상) <= 작거나 같다(이하) 비트 & 시프트 연산자 연산자 설명 & AND | OR ^ XOR (XOR 연산은 입력값이 같지 않으면 1을 출력합니다. 이는 두 입력 중 하나만이 배타적으로 참일 경우에만 일어납니다) ~ NOT << 시프트 값을 한칸 옮김 >> 시프트 값을 한칸 옮김 타입 검사 연산자 연산자 설명 as 다른 타입으로 변환은 되지 않고 상위 타입으로 변환할 수 있다. is 특정 객체가 특정 타입이면 true이다. is! 특정 타입이면 false, 즉 특정 타입이 아니면 true이다.

Naver Blog

[Dart] 다트 언어 조건문 반복문

조건문 # if, if~else if (조건) { ... } if (조건) { ... } else { ... } --------- # switch switch(변수) { case 값1: ... break; case 값2: ... break; default: ... } --------- # assert(debug mode에서만 동작) 조건식이 거짓이면 에러 발생 main() { int a = 10; int b = 20; assert(a > b); // 거짓이므로 디버깅 모드에서 오류 발생 } 반복문 # for for (int i = 1; i < 5; i++) { ... } ---------- # while int a = 0; while(a < 5) { ... a++; } ---------- # do ~ while int a = 0; do { ... } while (a > 0);

Naver Blog

[Dart] 다트 언어 클래스

객체, 멤버, 인스턴스 # 클래스 기본 형태 class Person { String name; getName() { return name; } } ----- # 다른 예제 class Person { String name; int age; getName() { return name; } } main() { var student = new Person(); // new 키워드를 넣어도 되고 생략해도 된다. var teacher = Person(); // new 키워드를 넣어도 되고 생략해도 된다. student = "Kim"; teacher = "Park"; } ※ 클래스를 사용하기 위해서는 객체를 생성해야 한다. C++이나 자바에서는 객체 생성 시 new 키워드를 사용한다. 하지만 플러터는 기본적으로 생략한다. 사용하고 싶으면 사용할 수도 있다.

Naver Blog

[Dart] 다트 언어 생성자

기본 생성자 # 클래스를 구현할 때 생성자를 선언하지 않으면 기본 생성자가 자동으로 제공된다. 기본 생성자는 클래스명과 동일하면서 인자가 없다. 또한 기본 생성자는 부모 클래스의 인수가 없는 생성자를 호출한다. class Person { Person() { ... } } # 예제 아래와 같이 상속하지만 기본 생성자가 있기 때문에 해당 기본 생성자가 호출되는 모습이다. class Person { Person() { print("This is Person Constructor!"); } } class Student extends Person { } main() { var student = Student(); } -> This is Person Constructor! ※ 기본 생성자는 상속되지 않는다. 자식 클래스는 부모 클래스의 생성자를 상속받지 않는다. 앞서 말한 것처럼 자식 클래스에서 아무 생성자도 선언하지 않으면 기본 생성자만 갖는다. 이름 있는 생성자 # 이름이 있는 생성자를 부

Naver Blog

[Dart] 다트 언어 상속

상속 class Parent { String name; String getType() { .... } } class Child extends Parent { @override // 메소드 오버라이딩을 통한 부모의 getType() 함수를 자식의 getType() 함수로 덮어씌움 String getType() { ... } } # 예제 class Person { String name; setName(String name) { this.name = name; } getName() { return name; } showInfo() { print("name is $name"); } } class Student extends Person { int studentID; @override showInfo() { print("name is ${super.getName()} and id is $studentID."); } } main() { Student student = Student(); ...

Naver Blog

[Dart] 다트 언어 접근 지정자

캡슐화 # 객체를 만드는게 캡슐화 class Developer { String name; int age; eat() { print('eat'); } // 캡슐화 sleep() { print('sleep'); } // 캡슐화 coding() { print('This is not bug. It's just feature.'); } // 캡슐화 } 추상화 # 공통된 데이터와 메서드를 묶어서 이름(클래스명)을 부여 하는 것 즉, 사람을 표현할때 성별이 있고, 직업도 있고, 취미도 있을것이다. 이것의 공통적으로 갖는 데이터와 행동을 떠올려 만드는것이 추상화이다. class Person { String name; int age; eat() { } sleep() { } } 접근 지정자 # 기본적으로 "public"으로 접근가능하지만, "private"으로 동일 클래스에서만 접근 가능하게 가능하다. "private"로 선언할때는 앞에 "_" 밑줄 하나 넣어주면 된다. class Person { S

Naver Blog

[Dart] 다트 언어 게터(Getter), 세터(Setter)

게터(Getter), 세터(Setter) # private 멤버 변수인 _name에는 직접 접근이 불가능하지만 public인 getter를 통해서 접근 가능하다. 이때 get name에서 name이 접근할 때 사용할 이름이다. set도 get과 마찬가지로 public이라 _name에 값을 할당하기 위해 접근 가능하며 set name에서 name은 접근할 때 사용되는 이름이다. class Person { String _name; String get name => _name; // 이름 가져오기 set name(String name) => _name = name; // 이름 변경하기 } main() { Person person = Person(); ...name = "Kim"; print(person.name"); } -> Kim

Naver Blog

[Dart] 다트 언어 추상 클래스

추상 클래스 # 메서드 선언은 되어 있지만 바디가 정의되지 않은 형태 추상 클래스는 앞에 "abstract" 키워드를 붙여서 표현 추상 클래스는 미완성 클래스이기 때문에 객체를 생성할 수 없다. 하지만 참조형 변수의 타입으로는 사용이 가능하다. 추상 클래스를 사용하기 위해서는 일반 클래스에서 implements 키워드로 임플리먼트 한 후에 반드시 추상 메서드를 오버라이딩 해야 한다. # 예제 abstract class Person { eat(); } # Developer 클래스는 추상 클래스인 Person를 임플리먼트(implements) 했다. 이때 반드시 추상 클래스 Person의 추상 메서드인 eat()를 오버라이딩(@override) 해야 한다. 꼭 다른 기능으로 사용하기 위한 재정의가 아니더라도 반드시 Developer 클래스 내에 선언되어 있어야 한다. class Developer implements Person { @override eat() { print("Eat");

Naver Blog

[Dart] 다트 언어 컬렉션

List(Array) 프로퍼티 설명 indexOf(요소) 요소의 인덱스 값 add(데이터) 데이터 추가 addAll([데이터1, 데이터2]) 여러 데이터 추가 remove(요소) 요소 삭제 removeAt(인덱스) 지정한 인덱스 삭제 contains(요소) 요소가 포함되어 있으면 true, 아니면 false clear() 리스트 요소 전체 삭제 sort() 리스트 요소 정렬 first 리스트 첫번째 요소 last 리스트 마지막 요소 reversed 리스트 역순 isNotEmpty 리스트가 비어있지 않으면 true, 비었으면 false isEmpty 리스트가 비어있지 않으면 false, 비었으면 true single 리스트에 단 1개의 요소만 있다면 해당 요소 리턴 List<String> colors = ['Red', 'Orange', 'Yellow']; OR List<String> colors = List(); colors.add('Red'); colors.add('Orange');

Naver Blog

[Dart] 다트 언어 제네릭

타입 매개변수 # 제네릭은 타입 매개변수를 통해 다양한 타입에 대한 유연한 대처를 가능하게 한다. 사실 앞서 봤던 컬렉션에서 이미 제네릭을 사용했다. "List", "Set", "Map" 모두에서 <>를 사용했는데 그 부분에 타입 매개변수(Type parameter)를 지정한다. 이렇게 <>에 타입 매개변수를 선언하는 것을 매개변수화 타입(Parameterized type)을 정의한다고 한다. # List 예제 <E>가 존재하기 때문에 타입 매개변수를 사용할 수 있다는 것을 알 수 있다. abstract class List<E> implements EfficientLengthIterable<E> { ... void add(E value); ... } class Person { eat() { print("Person eat"); } } class Student extends Person { eat() { print("Student eat"); } } class Manager<T ext

Naver Blog

[Flutter] 플러터 Android toolchain 해결하기

플러터 SDK 깃 클론 및 다운로드 [Flutter] 플러터 SDK 깃 클론 및 다운로드 플러터 SDK 다운로드 플러터 깃으로 받기 blog.naver.com 플러터 검사하기 cmd # 도스창을 연후 "flutter doctor" 입력 "Android toolchain" 문제 발생시 하단에 "flutter doctor --android-licenses" 입력 cmd android studio # 위와 같은 오류 발생시 안드로이드 SDK 구성요소 중 안드로이드 SDK 커맨드라인 도구 (Android SDK Command-line Tools)가 설치되어 있지 않을때 발생 안드로이드 스튜디오에서 아래와 같이 설치 Appearance & Behavior > System Settings > Android SDK > Android SDK Command-line Tools 설치 cmd # "flutter doctor --android-licenses" 입력 후 라이센스 모두 동의(Y)

Naver Blog

[Flutter] 플러터 Android Studio (not installed) 해결하기

안드로이드 설치 경로 설정하기 # cmd 창에서 아래 명령어 실행 flutter config --android-studio-dir="C:\Program Files\Android\Android Studio" # 검사 확인하기 flutter doctor

Naver Blog

[Python] PyQtWebEngine, QtWebKit 오류 해결하기

PyQt5 재설치 # 기존 패키지 삭제 pip uninstall PyQt5 pip uninstall PyQtWebEngine # 패키지 재설치 pip install PyQt5==5.12.2 pip install PyQtWebEngine

Naver Blog

[Flutter] 플러터 VSCODE 추천 익스텐션

VSCODE 플러터 추천 익스텐션 Pubspec Assist # Pubspec Assist 플러터에서 패키지를 검색하여 패키지 매니저 및 pubspec.yaml에 추가할 수 있습니다. 또한 이름을 쉼표로 구분하여 여러 패키지를 동시에 검색할 수 있습니다. Error Lens # Error Lens 오류 및 경고는 개발 중에는 정상이지만 처리하는 데 사용하는 방법은 고유합니다. VS Code 편집기에서 오류 및 경고는 일반적으로 맨 아래에 표시되며 목록을 스크롤하여 추가 문제가 있는지 확인해야 합니다. Error Lens 확장은 코드의 오류 라인을 강조 표시하고 라인 끝에 오류 세부 정보를 추가합니다. 여백에 오류 아이콘도 표시됩니다. 또한 settings.json 파일에서 오류 강조 표시의 색상을 사용자 지정할 수 있습니다. 이렇게 하면 실수가 더 매력적으로 보일 것입니다. Flutter Tree # Flutter Tree 많은 수의 위젯으로 애플리케이션을 구성할 때 트리에서 위젯을

Naver Blog

[Flutter] 플러터 Flutter failed to delete a directory at &quot;build\flutter_assets&quot; 오류 해결하기

오류 해결하기 # 우선 아래의 문제는 빌드를 하려고 하는데 기존 빌드 파일을 삭제하지 못한것이기 때문에 여러가지 문제일 수 있습니다. 권한(퍼미션) 문제 등등 아무튼 현재 프로젝트 디렉토리에 build 폴더를 삭제해주시면 됩니다. # 추가로 플러터 검사도 해보시면 좋습니다. flutter doctor flutter doctor -v

Naver Blog

[Flutter] 플러터 Dart & Flutter support for Visual Studio Code

편집기 키 바인딩 단축키 설명 CTRL + T (CMD + T) 작업 공간 기호 표시 CTRL + SHIFT + O (CMD + SHIFT + O) 문서 기호 표시 CTRL + SHIFT + P (CMD + SHIFT + P) 명령 팔레트 열기 CTRL + SPACE 오픈 코드 완성 CTRL + . (CMD + .) 빠른 수정 열기 SHIFT + ALT + F (CMD + SHIFT + F) 문서 서식 지정 ALT + SHIFT + O 지시문 구성 SHIFT + F12 참조 찾기 F2 기호 이름 바꾸기 F4 유형 계층 표시 F12 정의로 이동 디버그 키 바인딩 단축키 설명 CTRL + ALT + D Dart DevTools 시작 F5 디버깅 시작 CTRL + F5 디버깅하지 않고 시작 SHIFT + F5 디버깅 중지 CTRL + SHIFT + F5 (CMD + SHIFT + F5) 디버깅 다시 시작(또는 Flutter 앱을 디버깅할 때 Hot Restart) CTRL + F5 Flu

Naver Blog

[Flutter] 플러터 앱의 성능을 향상시키는 방법

앱의 성능을 향상시키는 방법 # Fluter 애플리케이션의 성능을 개선할 수 있는 방법과 관련된 많은 의문과 질문이 있습니다. Fluter는 기본적으로 성능이 우수하지만, 애플리케이션을 훌륭하고 빠르게 실행하기 위해서는 코드를 작성할 때 몇 가지 실수를 피해야 합니다. 이러한 팁으로 프로파일링 도구의 사용을 피할 수 있습니다. 위젯을 메서드로 분할하지 않음 class MyHomePage extends StatelessWidget { Widget _buildHeaderWidget() { final size = 40.0; return Padding( padding: const EdgeInsets.all(8.0), child: CircleAvatar( backgroundColor: Colors.grey[700], child: FlutterLogo( size: size, ), radius: size, ), ); } Widget _buildMainWidget(BuildContext conte

Naver Blog

[Flutter] 플러터 안드로이드 앱 출시하기

체크리스트 확인 # 내용이 길기 때문에 하단 참고링크로 확인해주세요. Google Play | Android Developers 이 체크리스트를 통해 앱이나 게임을 출시하는 데 필요한 모든 단계를 완료했는지 확인하세요. developer.android.com 안드로이드 개발자 계정 결제하기 Google Play Developer Console One account. All of Google. Sign in to continue to Google Play Developer Console Find my account Create account One Google Account for everything Google play.google.com 구글 개발자 계정 생성 구글 개발자 계정 결제 화면 구글 개발자 계정 가입 완료 화면 # 위 링크로 접속하여 정보 입력 후 결제를 하면 개발자 계정이 생성됩니다. 보충 예정...

Naver Blog

[Flutter] 플러터 안드로이드 HTTP 통신 허용하기

AndroidManifest.xml 수정하기 # "android/app/src/main/AndroidManifest.xml" 에서 "android:usesCleartextTraffic" 값을 "true" 변경 및 없으면 추가 ... <application android:label="앱 이름" android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher"> ... network_secure_config.xml 만들기 # "android/app/src/main/res" 위치에서 "xml" 폴더를 만든 후 "network_secure_config.xml" 파일을 만들어 아래의 내용을 넣어주세요. <?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeS

Naver Blog

[Flutter] 플러터 앱 아이콘 변경하기

앱 아이콘 변경 App Icon Generator Generate icons and images for mobile apps, android and iOS. No need to upload or download. Works on your browser appicon.co 출력 후 다운로드 파일 # 상단 앱 아이콘 제네레이터에서 이미지 파일을 업로드하면, 출력할 OS에 맞춰서 파일이 자동으로 생성되어 다운로드 할 수 있습니다. 앱 아이콘 적용 안드로이드 "android\app\src\main\res" 안에 폴더 덮어씌우기 IOS "ios\Runner\Assets.xcassets" 경로 안에 "AppIcon.appiconset" 폴더 덮어씌우기

Naver Blog

[Flutter] 플러터 카카오 로그인 디버그, 릴리즈 해시키 설정

JDK 설치 및 환경변수 Download the Latest Java LTS Free Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts. www.oracle.com # 우선, 도스창(커맨드라인)에서 "keytool"을 찾을 수 없거나 명령이 되지 않으면 "JDK"를 설치해주시면 됩니다. 시스템 환경 변수 # 시스템 환경 변수로 들어가서 설치한 "JDK"를 설치해줍니다. 버젼은 다를겁니다. 현재 기준으로는 16 이었습니다. 이제 "keytool" 명령을 사용할 수 있습니다. OpenSSL 설치 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions Win32/Win64 OpenSSL The Win32/Win64 OpenSSL Installation Project

Naver Blog

[Docker] 우분투(Ubuntu 18.04) 컨테이너 기본 패키지 설치

기본 패키지 설치 # 도커로 우분투 컨테이너를 만들게 되면, 아무것도 설치되어있지 않아서 귀찮은게 한두가지가 아닙니다. 아래 명령어로 기본 패키지를 설치해줍니다. apt update; apt upgrade -y; apt install -y vim curl ssh wget htop iputils-ping net-tools python3 curl git

Naver Blog

[Docker] 도커 로그인 문제 (Got permission denied while trying)

오류 해결하기 sudo chown root:docker /var/run/docker.sock # 위 명령어로 권한을 부여한뒤 로그인 재시도 sudo docker login 참고링크 docker 설치 후 /var/run/docker.sock의 permission denied 발생하는 경우 · Issue #116 · occidere/TIL docker 설치 후 /var/run/docker.sock의 permission denied 발생하는 경우 상황 docker 설치 후 usermod로 사용자를 docker 그룹에 추가까지 완료 후 터미널 재접속까지 했으나 permission denied 발생 (설치 참고: https://blog.naver.com/occidere/221390946271... github.com

Naver Blog

[DataGrip] 데이터 수정시 자동으로 타임스탬프 업데이트

데이터 수정시 자동으로 타임스탬프 업데이트 # MariaDB 컬럼 생성시 TYPE에 timestamp on UPDATE current_timestamp 디폴트 값 "CURRENT_TIMESTAMP" # MySQL 컬럼 색성시 TYPE은 timestamp 디폴트 값 "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"

Naver Blog

[Python] pip --upgrade 액세스가 거부되었습니다

해결방법 # 강제 재설치 pip3 install -U --force-reinstall pip # 강제 재설치가 안될 경우 ex) c:\users\user\appdata\local\programs\python\python37\python.exe -m pip install -U --force-reinstall pip # "No module named 'pip'" 오류가 난다면, 업그레이드시 삭제 후 엑세스가 거부되서 재설치가 되지 않은것으로 "pip"를 다시 설치해주면 된다. curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py 참고링크 Windows 에서 pip 업그레이드 시 엑세스 거부 에러 해결법 · Issue #124 · occidere/TIL Windows 에서 pip 업그레이드 시 엑세스 거부 에러 해결법 증상 python 3.7.6 설치 후 pip3 install --upgrade pip 수행 시

Naver Blog

[Python] FastAPI + uvicorn 서버 실행

패키지 설치 # uvicorn 설치 pip install uvicorn uvicorn 실행 옵션 설명 main main.py와 같은 파이썬 파일을 의미합니다. 만약, 다른 폴더 구성인 경우에는 src.main:app으로 실행하면 됩니다. app main.py 파일 안에 있는 app = FastAPI()을 의미합니다. --reload 핫리로드 --host 전체 접근 0.0.0.0 --port 포트 설정 --log-level 로그 레벨 설정 uvicorn main:app --reload --host=0.0.0.0 --port=8000 참고링크 FastAPI + uvicorn 구성 FastAPI는 표준 Python 유형 힌트를 기반으로 Python 3.6 이상으로 API를 빌드하기위한 최신의 빠른 (고성능) 웹 프레임 워크입니다. 기존 Flask 보다 빨라 AI관련 설치해보자. FastAPI 공식 사이.. sncap.tistory.com

Naver Blog

[Pycharm] Python Typo: In word 없애기(끄기)

설정 변경하기 Pycharm Settings # 파이참 설정 변경하여 "Typo: In word"를 끌 수 있습니다. "File" -> "Settings" -> "Editor" -> "Inspections" -> "Type 검색 후 체크 해제"

Naver Blog

[Docker] 도커 컨테이너 포트 추가 열기

포트 추가로 열기 # 우선은 실행중인 컨테이너를 중단하고, "commit" 하고 다시 생성해야 합니다. sudo docker stop 컨테이너 sudo docker commit 기존이름 새로운이름 EX) sudo docker commit test new_test # 생성된 이미지 확인 sudo docker images # 생성된 이미지로 추가 포트 개방 후 실행 sudo docker run -d -p 80:80 -p 443:443 -itd --name 컨테이너이름 이미지이름 EX) sudo docker run -d -p 80:80 -p 443:443 -itd --name backend new_test 참고링크 실행중인 도커 컨테이너에 추가 포트 오픈하기?! 아쉽지만 docker는 실행중인 컨테이너에 실시간으로 포트를 오픈하는 기능을 제공하지는 않는다. 아래와 같은 방법들로 다시 시작해야 한다. 1. 컨테이너의 변경 사항이 없다면.. stop 후 docker run에 -p 옵션을..

Naver Blog

[React] 리엑트 어드민 템플릿 (react admin template) 추천

CoreUI Free Bootstrap Admin Templates · CoreUI Time is our most valuable asset, that’s why we want to help you save it by creating simple, customizable, easy to learn UI components and Admin Templates which significantly cut development time. CoreUI lets you save thousands of priceless hours because it offers everything you need to create modern... coreui.io # 평가 디자인 활용성 문서 # 기타 CoreUI를 3.4 버젼 이전 부터 사용해봤으나, 솔직히 디자인은 별로입니다. 하지만, 확장성이 용이하고 커스텀하기 좋습니다. 문서도 잘 되어있어 좋습니다. 다만, CoreUI에서 예로들어 3.2 버젼을

Naver Blog

[Nginx] 리엑트 static 폴더 파일 처리

default.conf # "nginx"에 있는 "default.conf"를 수정합니다. "location ~ .(static)/(js|css|media)/(.+)$" 부분을 추가해주시면 됩니다. server { listen 80; server_name localhost; root /root/react-frontend/build; index index.html index.htm; location ~ .(static)/(js|css|media)/(.+)$ { try_files $uri $uri/ /$1/$2/$3; } location / { try_files $uri $uri/ /index.html; } } React Route에서 걸리는 경우 # 리엑트 라우터에서 경로로 잡히는 경우에는 라우터 안에서 전체 경로로 들어온것을 살펴보시고 수정하시면 됩니다.

Naver Blog

[Nginx] 프록시 패스 할때 url 하위 경로(path) 같이 보내기

URL 하위 경로 path 같이 보내기 # "default.conf" 파일 수정 server { listen 80; server_name localhost; # 아래 처럼 URL 경로가 "/api" 시작하는 경우 프록시 패스를 하면서 URL에 따라오는 "/api/v1/signin" 이런 하위 경로까지 같이 전달합니다. location /api/ { rewrite ^/api(/.*)$ $1 break; proxy_pass http://localhost; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; } }

Naver Blog

[Docker] docker-compose 실행시 컨테이너 exit (0) 해결하기

옵션 추가 # "stdin_open", "tty" 옵션을 추가하여 "BASH"로 접근하게 해줌 client: build: context: ./client container_name: client restart: "on-failure" expose: - 3000 volumes: - './client:/app' - '/app/node_modules' environment: - NODE_ENV=development - CHOKIDAR_USEPOLLING=true stdin_open: true tty: true 참고링크 React docker exited with code 0 react를 docker-compose로 구성하기 라는 글을 준비하고 있는데 갑자기.. 예전에 문제 없던 react container가 죽더군요. container의 로그를 보면 아래와 같은데 뭐가 문제 인지 전혀 예측할 수 없었습니다. medium.com

Naver Blog

[Docker] Ubuntu 18.04 도커 컴포즈 설치하기

도커 컴포즈 설치 # 필요한 패키지 미리 설치 sudo apt install apt-transport-https ca-certificates curl software-properties-common # 도커 컴포즈 설치 sudo curl -L https://github.com/docker/compose/releases/download/v2.1.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 권한 수정 sudo chmod +x /usr/local/bin/docker-compose # 버젼 확인 sudo docker-compose --version # 도커 사용 설정 sudo usermod -aG docker $USER 참고링크 [Ubuntu] docker / docker-compose 설치 우분투 18.04.3 LTS 기준 작성입니다. vmware위의 우분투위에 일종의 vm인 도커를 깔다니 ㅎㅎ 1.

Naver Blog

[Docker] docker-compose.yml 파일 및 셋팅하기

docker-compose.yml # "docker-compose"는 여러가지 컨테이너를 한번에 묶어서 실행가능하게 해줍니다. 또한, 브릿지라는 단어로 하나의 컴포즈안에 여러 컨테이너가 있어 내부 네트워킹을 하게 해줍니다. # "docker-compose.yml"을 기본적으로 리눅스 "root" 및 사용자 폴더에 만들어 주시면 됩니다. sudo vi docker-compose.yml # 하단 내용을 넣어 저장한다. 단, 띄어쓰기로 인식하기 때문에 잘 맞춰줘야 합니다. 그리고 버젼마다 옵션이 다르기 때문에 미리 확인해보셔야 합니다. version: "3" services: 실행컨테이너이름: image: 이미지이름:태그 build: # "Build"할때 현재 디렉토리 context: . ports: - "80:80" - "443:443" # 포트 추가시 networks: - 네트워크이름 # 브릿지 : 컴포즈 안에 여러 컨테이너가 맞물리며 사용할 네트워크 이름 # Example "stdi

Naver Blog

[Docker] docker-compose MySQL 타임존 설정

docker-compose.yml # 아래 옵션을 추가로 넣어주면 된다. environment: TZ: "Asia/Seoul"

Naver Blog

[MySQL] 타임존 변경하기

타임존 변경 # "MySQL" 내부로 접속 sudo mysql -u root -p # 타임존 확인 select @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 1 row in set (0.00 sec) -------------------- # 타임존 변경 (한개씩 실행) SET GLOBAL time_zone='Asia/Seoul'; SET time_zone='Asia/Seoul'; +--------------------+---------------------+ | @@global.time_zone | @@s

Naver Blog

[Nginx] [emerg] open() &quot;/etc/nginx/proxy_params&quot; failed 오류 해결하기

오류 해결하기 # 기존 "include proxy_params;" 내용을 아래와 같이 수정 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 예제 server { server_name localhost; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8000; } }

Naver Blog

[Python] SQLAlchemy SSH 터널링으로 데이터베이스 서버 다른 포트로 연결

SSHTUNNEL # 서버 포트가 다른 경우에 SSH 터널링을 통하여 별도로 접속해줘야 한다. from sshtunnel import SSHTunnelForwarder from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 서버 포트가 달라서 별도의 SSH 터널링을 사용하여 접근 server = SSHTunnelForwarder( ("서버 아이피", 포트), ssh_username="서버 아이디", ssh_password="서버 비밀번호", remote_bind_address=("127.0.0.1", 3306) # 바인딩될 데이터베이스 포트 ) server.start() local_port = str(server.local_bind_port) # SQLALCHEMY_DATABASE_URL = "mys

Naver Blog

[Docker] 도커 컨테이너 CPU 할당 및 제한

도커 명령어 # 기본 할당 비율 docker run -d --name cpu_1024 --cpu-shares 1024 ubuntu # 기본 할당 비율 두배 docker run -d --name cpu_1024 --cpu-shares 2048 ubuntu # cpu 1개만 사용하도록 변경 docker update --cpuset-cpus=1 [container_name] # cpu 사용량을 0.5 비율로 사용하도록 변경 docker update --cpu-shares 512 [container_name] # cpu 사용량을 20% 비율로 사용하도록 변경 docker update --cpus=0.2 [container_name] CPU 스트레스 테스트 CPU STRESS TEST # 컨테이너 내부로 접속 apt-get update apt-get install stress stress -c [CPU개수] 참고사항 [Docker] Container CPU 제한 docker run --it

Naver Blog

[Docker] 도커 볼륨(Volume) 사용법

도커 볼륨 만들기 # 볼륨 생성 sudo docker volume create [볼륨이름] # 볼륨 삭제 sudo docker volume rm [볼륨이름] # 볼륨 확인 sudo docker volume ls 도커 볼륨 마운트 sudo docker inspect backend # 도커에서 만든 별도의 볼륨을 컨테이너에 적용 -v [볼륨이름]:/[컨테이너 내부 경로] EX) gunicorn -k uvicorn.workers.UvicornWorker --access-logfile ./gunicorn-access.log src.main:app --bind 0.0.0.0:8001 -v [볼륨이름]:/root/data --workers 4 --daemon # 컨테이너 볼륨 마운트 확인 sudo docker inspect [컨테이너 이름] 참고링크 Docker 컨테이너에 데이터 저장 (볼륨/바인드 마운트) Engineering Blog by Dale Seo www.daleseo.com 도커(

Naver Blog

[Python] Gunicorn으로 실행시키기

명령어 패키지 설치 sudo apt install -y gunicorn pip install gunicorn Gunicorn 실행 # 워커를 4개로 실행시키고 서버에서 처리지연이 있는 경우에는 타임아웃을 길게 잡아야 워커가 중간에 타임아웃되어 멈추지 않는다. gunicorn -k uvicorn.workers.UvicornWorker --access-logfile ./gunicorn-access.log main:app --bind 0.0.0.0:8001 --workers 4 --timeout 3600 # 백그라운드에서 돌릴경우에는 뒤에 옵션 "--daemon"을 추가로 넣어주면 된다. EX) gunicorn -k uvicorn.workers.UvicornWorker --access-logfile ./gunicorn-access.log src.main:app --bind 0.0.0.0:8001 --workers 4 --timeout 3600 --daemon 파이썬 3.10 실행방법 #

Naver Blog

[Docker] MYSQL &quot;mbind: Operation not permitted&quot; 해결방법

해결방법 # mbind는 리눅스 명령어로 메모리 범위에 대한 메모리 정책 설정을 뜻한다. 컨테이너에 CAP_SYS_NICE 기능을 부여하여 컨테이너가 프로세스 좋은 값을 높이고, 실시간 일정 정책을 설정하고, CPU 선호도를 설정하고, 기타 작업을 수행할 수 있도록 합니다. # docker-compose 방법 service: mysql: image: mysql cap_add: - SYS_NICE # 커맨드 실행 방법 "--cap-add=sys_nice" 옵션을 추가해주면 된다. docker run --cap-add=sys_nice -d mysql

Naver Blog

[Svelte] 스벨트란 무엇인가?

https://beomy.github.io/tech/svelte/introduction-svelte/ [Svelte] Svelte 소개 Vue.js, React, Angular를 프론트엔드 프레임워크 3대장이라고 흔히들 말합니다. 이번 포스트에서는 새롭게 등장한 Svelte라는 프레임워크를 소개합니다. 아직 정식 한글 문서를 제공하지 않고 있지만, 프레임워크 3대장이라고 불리는 다른 프레임워크보다 낮은 러닝 커브를 가집니다. beomy.github.io https://im-developer.tistory.com/204 [Svelte] Svelte 첫 시작 - Setting up a Svelte App https://www.youtube.com/watch?v=zojEMeQGGHs&list=PL4cUxeGkcC9hlbrVO_2QFVqVPhlZmz7tO 나는 주로 유투브 영상을 보면서 공부하는 것을 좋아하는데, 스벨트 관련 정말 괜찮은 시리즈가 있어서 위에 첨부했다. 총.. im-deve

Naver Blog

[Basic] SPA, MPA, SSR, CSR 은 무엇인가?

SSR(Server Side Rendering) # 원래의 초기에는 웹사이트는 MPA(Multiple Page Application) 방식으로 되어있었다. MPA는 페이지를 이동할 때마다 새로운 페이지를 요청한다. 모든 템플릿은 서버 연산을 통해서 렌더링하고 완성된 페이지 형태로 응답한다. 이 과정을 "서버 사이드 렌더링(SSR)"이라고 부른다. 서버 사이드 렌더링의 장점은 SEO이다. 전통적인 MPA의 경우 브라우저에서 JavaScript 코드가 동작하기 전에도 완성된 형태의 템플릿 (HTML에 데이터가 삽입된 상태)을 서버로 부터 전달받는다. 이 때문에 검색로봇이 페이지를 크롤링하기에 매우 적합하다. CSR(Client Side Rendering) # CSR 방식은 최초 요청시에 리소스를 모두 다운로드 받는다는 형식이다. 따라서, 최초 요청시에는 리소스를 다운받고 이후에는 서버에 데이터만 전달 받으며, 자바스크립트는 화면만 변경해준다. 이 과정을 "클라이언트 사이드 렝더링(CSR

Naver Blog

[Basic] Nuxt, Next, Nest란 무엇인가?

SSR Framework의 등장 원인 SPA, MPA, SSR, CSR의 정의 [Basic] SPA, MPA, SSR, CSR 은 무엇인가? SSR(Server Side Rendering) CSR(Client Side Rendering) SPA(Single Page Application)... blog.naver.com Nuxt, Next, Nest란 무엇인가? # Nuxt Vue.JS 프레임워크 # Next React.JS 프레임워크 ※ Nuxt, Next 초기에는 서버에서 렌더링 됩니다. 이후에는 클라이언트 렌더링을 사용합니다. 이것이 바로 "범용 렌더링" 입니다. # Nest Node.JS 프레임워크 Nuxt란? # Vue.JS의 SSR을 지원하는 프레임워크가 Nuxt.JS 이다. - SPA(SSR)의 단점을 극복하고자 나온 프레임워크이다. # 특징 핫 리로드(Hot Reload) Vue 파일 쓰기 (*.vue) 코드 분할 자동화 SSR (서버 사이트 렌더링) 비동기 데이터 기

Naver Blog

[Basic] Sass(SCSS)란 무엇인가?

정리 예정 https://heropy.blog/2018/01/31/sass/ Sass(SCSS) 완전 정복! Style(CSS) 작업 시 필수가 되어버린 CSS Preprocessor(전처리기) Sass(SCSS)에 대해서 이해하고, CSS로 컴파일하는 방법부터 자세한 SCSS 문법까지 살펴봅니다. heropy.blog https://fathory.tistory.com/30 CSS 전처리기의 종류와 장단점 CSS 전처리기란? 간단히 말해, CSS의 한계를 뛰어넘기 위해 개발된 새로운 형태의 CSS라고 할 수 있습니다. 내가 CSS를 보다 쉽게 작성할 수 있게 다른 개발자들이 내가 작성한 CSS를 보다 쉽게 이해할 수 있게.. fathory.tistory.com https://velog.io/@eunoia/CSS-%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0%EB%9E%80 CSS 전처리기란? 전처리기의 자신만의 특별한 syntax를 가지고 CSS를 생성하도록 하는

Naver Blog

[Basic] npm, npx, yarn란 무엇인가?

정리예정 https://webruden.tistory.com/275 npx란 무엇일까? 그리고 npm이랑 어떤 차이점이 있을까? 우리는 종종 npx 명령어를 사용해서 패키지를 설치하곤 합니다. 예를 들어 리액트 CRA를 설치할 때 npx create-react-app을 사용하고 , nuxt를 설치할 때 npx create-nuxt-app을 사용하고, 리액트 네이티브를 설치.. webruden.tistory.com https://egg-programmer.tistory.com/227 [Node] npm vs npx vs yarn npm, npx, yarn, bower 등은 모두 Node 프로젝트에서 설치되는 패키지들을 관리해 주는 툴이라고 할 수 있다. 나는 평소 npm을 사용하고, 서버에서 배포할 때는 npx 명령어를 사용했다. npm으로 설치하는 것과 같.. egg-programmer.tistory.com https://ryusm.tistory.com/130 npm, npm, ya

Naver Blog

[Android] path may not be null or empty string. path='null' 오류 해결하기

build.gradle 수정 # "key.properties" 파일을 찾지 못해서 발생되는 문제 디버그 모드 사용시에는 "android/app/build.gradle"에서 주석처리해주면 된다. // signingConfigs { // release { // keyAlias keystoreProperties['keyAlias'] // keyPassword keystoreProperties['keyPassword'] // storeFile file(keystoreProperties['storeFile']) // storePassword keystoreProperties['storePassword'] // } // } // // buildTypes { // release { // signingConfig signingConfigs.release // } // }

Naver Blog

[FastAPI] SQLAlchemy &quot;Lost connection to MySQL server during query&quot; 해결하기

MYSQL wait_timeout 값 변경하기 "/etc/mysql/my.cnf"에서 "wait_timeout" 값을 변경하여 높여(늘려) 줘야 합니다. [mysqld] max_connections = 100 connect_timeout = 5 wait_timeout = 600 max_allowed_packet = 16M thread_cache_size = 128 sort_buffer_size = 4M bulk_insert_buffer_size = 16M tmp_table_size = 32M max_heap_table_size = 32M interactive_timeout = 1000 FastAPI pool_recycle 옵션 주기 DB 연결 이후에 아무런 활동이 없으면 "MYSQL"에서 설정된 "wait_timeout" 이후 연결이 끊기게 됩니다. 따라서, 설정한 "wait_timeout"보다 짧은 주기로 "pool_recycle"을 통해서 지속적으로 DB 연결을 유지해야 합니다.

Naver Blog

[컴퓨터] Asrock Deskmini x300 데스크미니 라이젠 5600G(CPU) 후기

오버클럭 별도의 수동 오버클럭은 하지 못했고, 라이젠마스터로 사용중입니다. 다만, 올코어 4.4로 고정시키게 되면 현재 사무실 내부 온도 등을 고려하여 온도 피크치가 많이 높아지고 약간 불안정 한것 같아서 별도 수동으로 올코어 4.2로 맞춰서 사용중입니다. 그래도 체감 성능으로는 많이 떨어지지 않는것 같고 작은 미니 본체이다보니 내구성에 대한 염려가 되어 4.2로 맞추고 사용중입니다. 그래도 4350G 대비 비교가 안될정도로 빠릿하고 좋습니다. 온도 기존 4350G를 사용하고 5600G로 업그레이드 하면서 별도의 수동 오버클럭은 진행하지 못했습니다. 온도가 생각보다 높게 나옵니다. 물론 데스크미니라는 미니본체 이기 때문에 달 수 있는 쿨러가 한정적이기 때문인것 같습니다. 제 생각에는 5700G는 조금 쓰로틀링이 올 수도 있게다는 생각이 듭니다. 미니본체 라인에서는 5600G가 그나마 한계점이지 않을까 싶습니다. 체감 체감은 정말 많이 차이가 납니다. 아무래도 싱글코어 성능도 차이가

Naver Blog

[Python] 액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했습니다.

해결방법 # 재부팅 하시면 해결됩니다.

Naver Blog

[HTML] html 파일 분리 구조 만들기

디렉토리 구조 - index.html - setting.json - assets - css - js - img - src - component - loader - src - pages HTML <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="modulepreload" href="./assets/js/initalization.mjs" /> <link rel="stylesheet" href="./assets/css/initalization.css" /> <script type="module" src="./assets/js/initalization.mjs"></script>

Naver Blog

[HTML] html 파일 분리하여 PC, MOBILE 구분하기

첨부파일 nkdi.zip 파일 다운로드 디렉토리 구조 - index.html - setting.json - assets - css - js - img - src - component - loader - src - pages - mobile - pc HTML <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="modulepreload" href="./assets/js/initalization.mjs" /> <link rel="stylesheet" href="./assets/css/initalization.css" /> <script type="module" src="./ass

Naver Blog

[FastAPI] SQLAlchemy 두 개의 테이블 및 조인하는 방법

외래 키(ForeignKey) 설정 아래의 예시와 같이 ForeignKey를 설정해 줍니다. ※ 주의할 점은, "Column(타입, ForeignKey())"처럼 타입 뒤인 2번째에 외래 키를 넣어줘야 한다. 이외 옵션은 그 뒤로 넣어주면 됩니다. class User(Base): __tablename__ = 'users' idx = Column(Integer, primary_key=True, index=True, autoincrement=True) # 유저 테이블 인덱스 name = Column(String, nullable=False) # 이름 class History(Base): __tablename__ = "history" idx = Column(Integer, primary_key=True, index=True, autoincrement=True) # 히스토리 테이블 인덱스 user_idx = Column(String, ForeignKey("users.idx"), nullab

Naver Blog

[Pycharm] 파이참 자주사용하는 단축키 모음

액션 단축키 단축키 설명 Ctrl + Alt + L 코드 자동 정렬 Ctrl + Alt + I 줄단위 자동 정렬 Ctrl + Alt + O Import 자동 정리 Ctrl + Alt + P 인자값 즉시 보기 Ctrl + Alt + Q DOC 주석 바로 보기 F2 다음 강조 표시된 오류 Alt + Enter 수정 내용 추천 Alt + F1 에러 내용 확인 에디터 단축키 단축키 설명 Alt + Shift + Up/Down 현재 라인 위아래 이동 Ctrl+ Shift + Up/Down 현재 라인의 메소드, IF 등 블럭 단위로 위아래 이동 Alt + Enter 파이썬 추천 코드 형식으로 리팩토링 제안 Ctrl + Space 1. dic 변수 선언하고 가져다 쓸때, dic_name[ __ ] 상태에서 Ctrl + Space 누르면 Key 값 추천 됨 2. Class 멤버 번수 init에 넣고 메소드에서 사용 할때 self. __ 에서 자동 완성 Ctrl + Shift + Space 스마

Naver Blog

[FastAPI] SQLAlchemy 객체 상태 관리 (expire, refresh, flush, commit, rollback)

함수 flush, commit, refresh, rollback이 자주 사용된다. 함수 설명 Refresh - 객체의 최신 상태 데이터가 필요한 경우 - 만약, 스레드에서 변경이 되어 변경 이전에 데이터를 가져왔을 경우에는 "refresh()"를 통하여 항상 최신 데이터를 가져올 수 있다. Flush - "flush"는 DB 버퍼에 변경된 사항들을 반영하는 것을 의미한다. (DB 반영 X) - "autocommit=True"일 경우 자동 "commit" 된다. - "autocommit=False"일 경우 DB 버퍼에만 저장 후 "commit"이 호출되면 저장한다. ※ "commit" 전 DB에 반영할 사항들을 모아놓는 곳을 DB Transaction buffer라 한다. Commit - 데이터를 저장할 경우 - 버퍼에 올라있던 사항들을 모두 DB에 반영한다. Rollback - 데이터를 이전으로 되돌릴 경우 Merge - 일부 키를 사용하여 동일한 데이터베이스 레코드에 매핑되는 메모

Naver Blog

[React] 주소(URL) 변경 감지

이동 감지 useEffect(() => { return () => { console.log("이동 감지"); } }, []) 경고 모달 새로고침시 감지 const handleBeforeunload = (e) => { e.preventDefault(); e.returnValue = ""; }; useEffect(() => { window.addEventListener("beforeunload", handleBeforeunload); return () => { ... } }, []) 참고링크 React에서 페이지를 떠나기 전에 사용자에게 경고하는 방법 지난주에는 콘서트 방송을 위해 특정 페이지를 떠나기 전에 사용자를 중지하는 방법을 알아 내야했고, 사용자가 탭을 닫거나 다른 페이지로 이동하도록 선택하면 콘서트를 종료하는 API 엔드 포인트에 도달해야했습니다. 사용자가 웹 사이트의 한 페이지를 떠날 수있는 여러 가지 방법이 있고 관련이 없기 때문에 이것은 어려운 문제였습니다. ichi.p

Naver Blog

[Svelte] 스벨트 1장 Introduction

기본 사용법 <h1>Hello world!</h1> Hello world! 데이터 출력 <script> let name = 'world'; </script> <h1>Hello {name.toUpperCase()}!</h1> Hello WORLD! 다이나믹 속성 <script> let src = 'tutorial/image.gif'; let name = 'Rick Astley'; </script> <img {src} alt="{name} dances."> Result 스타일 속성 <p>This is a paragraph.</p> <style> p { color: purple; font-family: 'Comic Sans MS', cursive; font-size: 2em; } </style> This is a paragraph. 다른 파일 임포트 # App.svelte <script> import Nested from './Nested.svelte'; << 다른 파일 임포트 </scr

Naver Blog

[Svelte] 스벨트 2장 Reactivity

카운트 처리 및 동기화 # 이렇게 처리하면 버튼이 생성되면 누르면 카운트가 상승한다. <script> let count = 0; function incrementCount() { count += 1; } </script> <button on:click={incrementCount}> Clicked {count} {count === 1 ? 'time' : 'times'} </button> 카운트 처리 응용 반응형 선언 # Svelte는 구성 요소의 상태가 변경되면 DOM을 자동으로 업데이트합니다. 종종 구성 요소 상태의 일부 부분은 다른 부분(예: 성과 이름에서 파생된 전체 이름)에서 계산되고 변경될 때마다 다시 계산되어야 합니다. 이를 위해 $: 반응형 선언이 있습니다. <script> let count = 0; $: doubled = count * 2; function handleClick() { count += 1; } </script> <button on:click={handl

Naver Blog

[Svelte] 스벨트 3장 Props

Props # 지금까지 우리는 내부 상태만을 다루었습니다. 즉, 값은 주어진 구성 요소 내에서만 액세스할 수 있습니다. 모든 실제 응용 프로그램에서는 한 구성 요소의 데이터를 하위 구성 요소로 전달해야 합니다. 그렇게 하려면 일반적으로 'props'로 축약되는 속성을 선언해야 합니다. Svelte에서는 export 키워드로 이를 수행합니다. Nested.svelte 구성 요소를 편집합니다. <script> export let answer; </script> ※ 이렇게 하면 재사용성이 높아집니다. # App.svelte <script> import Nested from './Nested.svelte'; </script> <Nested answer={42}/> # Nested.svelte <script> export let answer; </script> <p>The answer is {answer}</p> The answer is 42 Props 응용 # props의 기본값을 쉽게 지

Naver Blog

[Svelte] 스벨트 4장 Logic

조건문 # HTML에는 조건문 및 루프와 같은 논리를 표현하는 방법이 없습니다. Svelte는 합니다. 일부 마크업을 조건부로 렌더링하기 위해 if 블록으로 래핑합니다. {#if user.loggedIn} <button on:click={toggle}> Log out </button> {/if} {#if !user.loggedIn} <button on:click={toggle}> Log in </button> {/if} <script> let user = { loggedIn: false }; function toggle() { user.loggedIn = !user.loggedIn; } </script> {#if user.loggedIn} <button on:click={toggle}> Log out </button> {/if} {#if !user.loggedIn} <button on:click={toggle}> Log in </button> {/if} 조건문 ELSE # if us

Naver Blog

[Svelte] 스벨트 5장 Events

DOM 이벤트 # "on:" 지시문을 사용하여 요소의 모든 이벤트를 수신할 수 있습니다. <div on:mousemove={handleMousemove}> The mouse position is {m.x} x {m.y} </div> <script> let m = { x: 0, y: 0 }; function handleMousemove(event) { m.x = event.clientX; m.y = event.clientY; } </script> <div on:mousemove={handleMousemove}> The mouse position is {m.x} x {m.y} </div> <style> div { width: 100%; height: 100%; } </style> 인라인 이벤트 # 이벤트 핸들러를 인라인으로 선언할 수도 있습니다. <div on:mousemove="{e => m = { x: e.clientX, y: e.clientY }}"> The mouse positi

Naver Blog

[Svelte] 스벨트 6장 Bindings

Input 바인딩 # 일반적으로 Svelte의 데이터 흐름은 하향식입니다. 상위 구성 요소는 하위 구성 요소에 props를 설정할 수 있고 구성 요소는 요소에 속성을 설정할 수 있지만 그 반대는 아닙니다. 아래와 같이 "bind:value" 지시문을 사용할 수 있습니다. <input bind:value={name}> ※ 즉, name 값을 변경하면 입력 값이 업데이트될 뿐만 아니라 입력 값이 변경되면 이름도 업데이트됩니다. "Vue.js"의 "v-model"과 동일합니다. <script> let name = 'world'; </script> <input bind:value={name}> <h1>Hello {name}!</h1> Input 타입 (숫자, 범위) # DOM에서 모든 것은 "문자열(String)"입니다. 숫자 입력"(type='number' 및 type='range')"을 처리할 때는 도움이 되지 않습니다. 이는 사용하기 전에 "input.value"를 강제 변환해야 한다

Naver Blog

[Svelte] 스벨트 7장 Lifecycle

onMount # 수명 주기 모든 구성 요소에는 생성될 때 시작되고 소멸될 때 끝나는 수명 주기가 있습니다. 해당 수명 주기 동안 중요한 순간에 코드를 실행할 수 있는 몇 가지 기능이 있습니다. 가장 자주 사용하게 될 "onMount"는 구성 요소가 DOM에 처음 렌더링된 후 실행되는 onMount입니다. 캔버스 요소가 렌더링된 후 상호 작용해야 할 때 이전에 간략하게 접했습니다. 네트워크를 통해 일부 데이터를 로드하는 onMount 핸들러를 추가합니다. <script> import { onMount } from 'svelte'; let photos = []; onMount(async () => { const res = await fetch(`https://jsonplaceholder.typicode.com/photos?_limit=20`); photos = await res.json(); }); </script> ※ SSR(서버 측 렌더링) 때문에 스크립트의 최상위 수준이 아닌 o

Naver Blog

[Vanilla] 자바스크립트(JavaScript) 브라우저 다크모드 감지

다크모드 감지 # 아래의 코드로 다크모드를 "true", "false"로 감지 할 수 있습니다. window.matchMedia('(prefers-color-scheme: dark)').matches 참고링크 JavaScript를 사용하여 다크 모드를 감지하는 방법 JavaScript를 사용하여 다크 모드 감지 및 모드 변경 감지 CSS를 사용하면 prefers-color-scheme 미디어 쿼리를 사용하여 다크 모드를 감지할 수 있습니다. 하지만.. JavaScript를 사용해야 한다면? 페이지에 이미.. jeycon.tistory.com

Naver Blog

[Svelte] 스벨트 8장 Stores

저장소(Store) Writable # 모든 애플리케이션 상태가 애플리케이션의 구성 요소 계층 구조에 속하는 것은 아닙니다. 때로는 관련되지 않은 여러 구성 요소 또는 일반 JavaScript 모듈에서 액세스해야 하는 값이 있습니다. Svelte에서는 "stroes"에서 이를 수행합니다. 저장소(stroes)는 단순히 저장소 값이 변경될 때마다 관심 당사자에게 알림을 제공하는 구독 메서드가 있는 개체입니다. # App.svelte 아래의 예시처럼 각 컴포넌트 별로 더하기, 빼기, 초기화 기능을 담당하고 있고, "stores.js"에서 쓰기 가능한 저장소를 이용하여 데이터를 저장하고 불러올 수 있습니다. <script> import { count } from './stores.js'; import Incrementer from './Incrementer.svelte'; import Decrementer from './Decrementer.svelte'; import Resetter f

Naver Blog

[Svelte] 스벨트 9장 Motion

Tweened 옵션 설명 delay 시작 전 딜레이 duration 지속 시간 easing 효과 (EX: cubicOut) interpolate 사용자 정의(from, to) = t = 임의 값 사이의 보간을 위한 값 함수. 기본적으로 Svelte는 숫자, 날짜, 동일한 모양의 배열과 객체 사이를 보간합니다(숫자와 날짜 또는 기타 유효한 배열과 객체만 포함하는 한). (예를 들어) 색상 문자열이나 변환 행렬을 보간하려면 사용자 정의 보간기를 제공하십시오. <script> import { tweened } from 'svelte/motion'; import { cubicOut } from 'svelte/easing'; const progress = tweened(0, { duration: 400, easing: cubicOut }); </script> <progress value={$progress}></progress> <button on:click="{() => progress.s

Naver Blog

[Svelte] 스벨트 10장 Transitions

전환 효과 FadeIn, FadeOut # 요소를 DOM 안팎으로 우아하게 전환하여 보다 매력적인 사용자 인터페이스를 만들 수 있습니다. Svelte는 "transition" 지시어를 사용하여 이것을 매우 쉽게 만듭니다. <script> import { fade } from 'svelte/transition'; let visible = true; </script> <p transition:fade>Fades in and out</p> # 아래 처럼 옵션값을 설정할 수도 있습니다. "y" 값의 경우 아래에서 위로 올라는 효과를 얻을 수 있습니다. <p transition:fly="{{ y: 200, duration: 2000 }}"> Flies in and out </p> # App.svelte <script> import { fade } from 'svelte/transition'; let visible = true; </script> <label> <input type="check

Naver Blog

[Svelte] 스벨트 11장 Animations

애니메이션 Svelte tutorial undefined / undefined svelte.dev # 이전 장에서 우리는 요소가 하나의 할 일 목록에서 다른 목록으로 이동할 때 모션의 전환을 만들기 위해 지연된 전환을 사용했습니다. 다만, 여기서 "todo"에서 "done"을 이동하는 과정에서 이동 되는 엘리먼트에만 전환 효과가 적용되었고, 기존에 있는 "todo" 리스트 항목들은 효과가 적용되지 않았습니다. 이를 위해 animate 지시문을 사용합니다. 먼저 svelte/animate에서 플립 기능(플립은 'First, Last, Invert, Play'를 의미함)을 가져옵니다. import { flip } from 'svelte/animate'; # 그런 다음 라벨 요소에 추가합니다. <label in:receive="{{key: todo.id}}" out:send="{{key: todo.id}}" animate:flip > # 딜레이 시간을 변경 할 수 있습니다. <label

Naver Blog

[Svelte] 스벨트 12장 Actions

외부 요소 클릭시 이벤트 # 이 앱에서는 사용자가 외부를 클릭할 때 모달이 닫히도록 하려고 합니다. outclick 이벤트에 대한 이벤트 핸들러가 있지만 기본 DOM 이벤트가 아닙니다. 즉, 모달창이 있고 이외 "DOM", "엘리먼트"들을 클릭하면 모달이 닫히는 액션 입니다. # App.svelte <script> import { clickOutside } from "./click_outside.js"; let showModal = true; </script> <button on:click={() => (showModal = true)}>Show Modal</button> {#if showModal} <div class="box" use:clickOutside on:outclick={() => (showModal = false)}> Click outside me! </div> {/if} <style> .box { --width: 100px; --height: 100px; positi

Naver Blog

[Docker] 도커 허브 이미지 pull/push

도커 허브 이미지 PUSH(업로드) # 도커 로그인 sudo docker login # 이미지 확인 sudo docker images -a # 이미지 지정 sudo docker tag [이미지이름] [ID]/[NAME]:[TAG] EX) sudo docker tag abced123456 hksoft/backend:1 # 이미지 푸시 sudo docker push [이미지이름] [ID]/[NAME]:[TAG] EX) sudo docker push abced123456 hksoft/backend:1 ※ 태그에 기본 "latest"인 경우에는 명시하지 않음 도커 허브 이미지 PULL(다운로드) # 도커 로그인 sudo docker login # 이미지 확인 sudo docker images -a # 이미지 풀 docker pull [ID]/[NAME]:[TAG] EX) sudo docker pull hksoft/backend:1 ※ 태그에 기본 "latest"인 경우에는 명시하지 않음

Naver Blog

[Docker] 도커 이미지 삭제

도커 이미지 삭제 # 컨테이너 확인 sudo docker ps # 컨테이너 삭제 sudo docker rm [컨테이너ID] # 이미지 확인 sudo docker images -a # 이미지 삭제 sudo docker rmi [이미지ID]

Naver Blog

[Docker] 도커 이미지 생성

도커 이미지 생성 옵션 설명 -a author를 의미하며 이미지 작성자를 나타내는 메타데이터를 이미지에 포함시킵니다. -m 메세지 # 컨테이너 확인 sudo docker ps # 이미지 확인 sudo docker images -a # 일반 이미지 생성 sudo docker commit [컨테이너이름] [NAME]:[TAG] EX) sudo docker commit 4f63faecbe51 anrisk-backend:1 # 옵션 사용 이미지 생성 sudo docker commit -a "[내아이디]" -m "[메세지]" [컨테이너이름] [NAME]:[TAG] EX) sudo docker commit -a "phongdaegi" -m "First Commit" 4f63faecbe51 anrisk-backend:1 ※ 이미지 생성시 "TAG"를 명시하지 않으면 기본 "latest"로 설정됨

Naver Blog

[Docker] 도커파일(dockerfile) 파이썬(Python) 설정 방법

requirements 생성 # "requirements" 패키지 관리 생성 pip freeze > requirements.txt 파이썬 도커파일 설정 방법 # 프로젝트 내부에 "dockerfile" 생성 이후 "dockerfile" 파일 연 후 아래 내용 추가 # "uvicorn" 실행 방법 FROM python:3.9 WORKDIR / COPY ./requirements.txt /requirements.txt RUN pip install --upgrade pip RUN pip install --no-cache-dir --upgrade -r /requirements.txt COPY ./ /app WORKDIR /app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] # "gunicorn" 실행 방법 나머진 동일하고 "CMD" 부분만 변경하면 된다. CMD ["gunicorn", "-k", "uvicorn.w

Naver Blog

[Docker] nginx + 리엑트(React) 도커파일(dockerfile) HTTP(80) 설정 방법

default.conf # 기본 HTTP(80) 설정 방법 하단 "expires -1"은 지워도 됨 프로젝트 내부에 "default.conf" 파일 생성 이후 "default.conf" 파일 연 후 아래 내용 추가 해당 파일은 "dockerfile"에서 "nginx"에 있는 기본 "default.conf" 파일을 삭제 한 후 대체되는 파일이기 때문에 필수 입니다. ※ 도커 컨테이너에서 "root/build" 형식으로 "root" 경로 안쪽으로 설정하니 퍼미션 문제인지 502 에러가 발생한다. 그렇기 때문에 아예 최상위 디렉토리 루트로 설정하는게 좋을것 같다. server { listen 80; server_name localhost; root /app/build; index index.html index.htm; location ~ .(static)/(js|css|media)/(.+)$ { expires -1; try_files $uri $uri/ /$1/$2/$3; } locati

Naver Blog

[CSS] PostCSS 후처리기

PostCSS란? 2021 CSS 만족도 # "PostCSS"는 후처리기 이며, 브라우저에서 가능한 최상의 결과를 얻을 수 있도록 CSS를 정렬하고 개조합니다. 2021 트렌드에서는 PostCSS가 압도적으로 만족도가 높은 상태 입니다. ※ 전처리기는 CSS로 컴파일되는 언어를 사용하여 다소 쉬운 코드 작성으로 개발 속도를 높여줍니다. PostCSS 사용하기 # "PostCSS"는 일반적인 HTML 환경에서는 사용 할 수 없고 "node"안에서 적용 할 수 있습니다. # "PostCSS" 설치 npm install -D postcss postcss-loader # "webpack.config.js" 설정 "WebPack"과 같이 사용 const path = require('path'); module.exports = { entry: { app: ["./src/index.js", "./src/test.js"] }, output: { filename: "bundle.js", path:

Naver Blog

[React] 리엑트 웹팩(Webpack) 설치하기

Webpack 이란? # "Webpack"은 "모듈 번들링"이라고 불린다. "HTML" 파일에 들어가는 하나의 자바스크립트 파일로 최적화를 거쳐 압축시켜준다. 프론트 개발 영역에서는 필수 요소 이다. Webpack 설치하기 옵션 설명 entry 번들로 합치고 싶은 파일들 지정 output 번들 출력 위치 지정 mode development : 개발용 production : 배포용 # "Webpack" 설치 npm install -D webpack # "Webpack v4" 이상 사용시, cli 설치도 필요 (권장) npm install -D webpack-cli # webpack.config.js const path = require('path'); module.exports={ entry : ['./src/index.js', './src/test.js'], output: { filename : 'bundle.js', path : path.resolve(__dirname + '/bu

Naver Blog

[React] 리엑트 바벨(Babel) 설치하기

Babel 이란? # "ES6"를 "ES5"으로 변환시켜주어 구 버젼에 브라우저에 호환성을 가질 수 있다. Babel 설치 Webpack 과 같이 사용 # 대부분 "Webpack"과 같이 사용함으로 "Webpack" 설정으로 진행 npm i webpack webpack-cli babel-loader # ".babelrc" 파일 생성 후 아래 내용 추가 { "presets": ["@babel/preset-env", "@babel/preset-react"], "plugins": [ "@babel/plugin-proposal-class-properties" ] } # 설치 후 프로젝트 최상위 디렉토리에 "webpack.config.js" 파일을 만든 후 아래 내용을 적용 ("webpack.config.js" 파일이 이미 있는 경우는 수정) const path = require('path') module.exports = { entry : './src/code.js', output : {

1 2 3 4 5 6 7 8