postgresql commands

SQL Shell (psql) 에서 명령
postgreql 처음 써보는 데 사용한 명령어 및 커넥션 설정 정리

psql

psql commands
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 데이터베이스 생성
CREATE DATABASE student;

-- 유저 생성
CREATE USER sung WITH PASSWORD '1234';

-- 권한 부여
GRANT ALL PRIVILEGES ON DATABASE student TO sung;

-- 특정 유저로 데이터베이스 접속
\c student sung

-- 데이터베이스 목록 보기
\l

-- 테이블 목록 보기
\d
\dt

-- 테이블 칼럼 보기
\d "User"

-- select query
-- 릴레이션을 못 찾았다고 하면 테이블명에 따옴표 붙이기
select * from "User";
  • 대소문자 구분은 안 해도 된다

connection

application.properties
1
2
3
4
5
6
7
spring.datasource.url=jdbc:postgresql://localhost:5432/student
spring.datasource.username=sung
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.format_sql=true

jdbc

pgAdmin

  • GUI로 DBMS 다루기

참고

eclipse command palette

Ctrl 3

  • vscode에서 명령 팔레트를 자주 쓰는데, 이클립스에서도 같은 기능이 있는지 확인해보았다
  • 이클립스에서 빠르게 파일을 열어보고 싶은데 vscode에서 Ctrl P 같은 명령어가 있는지 확인해보았다

이클립스 유용한 단축키

  • Ctrl Shift R ; Open resource ; 파일 빠르게 열기
  • Alt Shift L ; extract local variable ; 리팩토링
  • Alt Shift R ; rename ; 리팩토링
  • Ctrl Alt T ; terminal ; 터미널 열기

참고

yarn create

terminal
1
2
3
4
5
# npx create-react-app my-app
yarn create react-app my-app

# npx create-electron-app my-app
yarn create electron-app my-app
  • 보통 보일러플레이트로 프로젝트를 시작할 때 npx를 사용한다
  • yarn createcreate로 시작하는 패키지를 설치할 때 npx와 동일하게 동작한다

npx vs. npm i -g

  • 보일러플레이트로 시작할 때 크게 두 가지 방법이 있는데,
  • npx로 시작하는 방법과, 글로벌 설치 후 cli로 시작하는 방법이 있다
  • 보통 보일러플레이트 패키지는 npx를 권장하는데, 이유는 npx는 항상 최신 버전으로 설치해준다
  • 반면 글로벌로 설치해서 사용하는 경우, 시간이 지나면 구버전이 되고, 업데이트는 하려면 수동으로 해줘야 한다

참고

powershell로 환경변수 추가하기

1
2
3
4
5
# 사용자 변수로 추가
[Environment]::SetEnvironmentVariable("GH_TOKEN","<YOUR_TOKEN_HERE>","User")

# 시스템 변수로 추가 (관리자 권한 필요)
[Environment]::SetEnvironmentVariable("GH_TOKEN","<YOUR_TOKEN_HERE>","Machine")
  • 파워쉘 명령어 한 줄로 환경변수를 쉽게 추가할 수 있다

참고

js coercion

  • 서로 다른 타입끼리 연산을 할 때, 타입 캐스팅이 일어난다
  • js에서는 이를 coercion 이라고 부르는 것 같다
  • 조금 더 정확히는, 타입 캐스팅을 암시적으로(implicitly) 해주는 것
  • js에서 서로 다른 타입 간의 연산을 하더라도 웬만하면 에러가 안 뜬다
  • 어느 한쪽을 기준으로 자동 캐스팅되어서 js를 처음 배울 때 너무 편했다
  • 이런 강제 형변환이 직관적이라고 생각할 때도 있지만, 가끔 실수할 때가 있다
  • 나는 처음 js를 배울 때 var보다는 const, let
  • ==보다는 ===를 사용하라고 배워서 그냥 그런가 보다 하고 따랐었는데,
  • 특히 조건문에서 강제 형변환은 예상하지 못한 동작들을 많이 만들어내는 것 같다
  • ===, !==를 사용함으로써 강제 형변환 없이 비교해 볼 수 있다

참고

js fetch 요청 취소, 중단하기

example.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let controller;

const fetchData = async (pram) => {
try {
console.log(`fetchData`);
if (controller) controller.abort();
controller = new AbortController();
const { signal } = controller;

const res = await fetch(`${API_END_POINT}/${pram}`, { signal });

if (!res.ok) {
throw new Error('no ok error');
}

return await res.json();
} catch (error) {
throw new Error('server error');
}
};
  • AbortController를 사용해서 기존에 요청이 있으면
  • 취소하고 새로운 요청을 보내는 예제이다
  • 버튼을 눌러서 fetchData를 실행시킨다고 하자
  • 유저가 빠르게 버튼 10번을 눌러서 fetchData가 10번 실행되었다
  • 이런 입력에 대한 아무런 방지를 않았으면, fetch 결과에 대한 콜백이 10번 실행될 것이다
  • AbortController을 사용하면 버튼을 연속적으로 누르더라도 콜백이 마지막 결과에 대해서만 한번 동작할 것이다
  • 하지만 AbortController를 사용한다고 해서 API를 콜하는 비용이 덜 드는 것은 아니다
  • 단순히 해당 fetch에 대한 결과를 핸들하지 않겠다는 것이기 때문에,
  • 지금의 예처럼 동일한 API를 중복해서 호출하는 것을 막기 위해서는
  • 최초에 버튼을 누르면 버튼을 비활성화하는 것이 좋다

참고

깃허브 템플릿 저장소 만들기

템플릿 레포를 만들어보자

  • 리액트 프로젝트를 진행할 때, CRA 같은 보일러플레이트로 프로젝트를 시작할 수 있다
  • 근데 자신만의 린트 설정이나, 따로 설치하는 패키지들이 있다
  • 이런 것들을 매번 새로운 프로젝트를 생성할 때마다 해준다면 귀찮을 것이다
  • 이때 깃허브에서는 템플릿 저장소 기능을 활용할 수 있다

템플릿 저장소 하나 만들기

  • 템플릿으로 만들 저장소를 만들고,
  • 원하는 초기 상태를 세팅한다

  • Settings 탭에 들어가면 레포명 설정 아래 바로 템플릿 레포로 지정할 수 있는 체크박스가 있다
  • 체크 박스를 체크하면 템플릿 레포 완성이다

템플릿을 사용해서 새 저장소 생성하기

  • 템플릿으로 설정한 저장소를 선택할 수 있다

다른 사람이 만들어둔 템플릿 사용하기

  • 다른 사람이 만들어 둔 템플릿 레포가 있을 수 있는데,
  • 포크해서 내 저장소로 가져오면 바로 사용이 가능하다

참고

js event loop

https://youtu.be/8aGhZQkoFbQ 을 보고 정리

  • 비동기 코드는 webapi에서 실행된다
  • 실행이 완료되면 큐에 들어간다
  • 큐에서 스택에 아무것도 없기를 기다렸다가
  • 스택에 들어가고 실행된다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 첫 번째로 스택에 들어감
console.log(1);

// 두 번쨰로 스택에 들어가고 바로 webapi로 들어감
setTimeout(
// webapi에서 큐로 던져짐. console.log(3)이 끝나고 스택이 텅텅 비워져서야 네 번째로 스택에 들어감
() => {
console.log(2);
},
0
);

// 세 번째로 스택에 들어감
console.log(3);

// 1 3 2

참고