JAVA Setting with STS

사전준비

  • VSCord 설치

visual studio 추가 설치

  • extension → 검색:markdown → 다음 확장 프로그램 3가지 설치

Untitled

  • 우측 위 돋보기 모양 클릭 → 마크다운 preview 참고하며 작성하자

Untitled

node.js

: 웹 브라우저가 아닌 환경에서 자바스크립트를 실행시킬 수 있는 런타임 환경

  • 웹브라우저에서 동작하는 ‘프로그래밍 언어’는 only 자바스크립트뿐이다 O
    • 단, 다른 언어로 웹에서 동작하는 프로그래밍을 할 수 있다. —> 결국 자바스크립트로 변환
  • 자바스크립트는 only 웹브라우저에서만 동작할 수 있다. O??
    • NODE JS가 이 문제의 답을 X로 만들었다.

node.js 설치

  • 구글링하여 설치
  • 설치 확인 : 명령 프롬프트에서 node -v

Untitled

code runner 설치

  • node.js 설치된 상태에서 설치해야 한다.
  • visual studio → extension → 검색 : code ruuner
  • 설치 후 visual studio 재부팅
  • 우측 상단에 동영상 재생 마크와 유사하 것이 생성됨 = 코드 러닝 버튼

Untitled

run code사용

  • 코드 작성 후 run code 버튼 클릭

Untitled

  • 결과

Untitled

STS 설치

구글링 : sts4

https://spring.io/tools

  • 가장 아래에 window로 설치

Untitled

JDK - 1.11 다운로드

Untitled

  • 다음 경로를 참고해서 설치

Untitled

버전 확인

  • 다음 코드로 버전을 확인했을 때 11버전이 출력되어야 한다
  • java -version
  • javac -version
    • javac = java 컴파일러

Untitled

다른 버전이 출력될 경우

검색창 : 변수 → 환경변수 → JAVA_HOME 을 편집으로 바꾼다

  • 없다면 설정한다
  • java 경로로 변경한다
    • C:\Program Files\Java\jdk-11.0.15
  • 다시 버전 확인한다

STS 설치

  • 파일 이름 길이가 너무 길기 때문에 줄인다
    • 예시) spring-tool-suite-4.jar

Untitled

  • spring-tool-suite-4.jar → contents.zip 앞축을 풀고 들어간다

  • contents → sts-4.14.1.RELEASE 폴더를 안전한 경로에 복사 붙여넣기

  • string-tool-suite4를 복사하여 백업본을 만들어둔다

  • 우클릭 : string-tool-suite4 → 메모장으로 열기

  • 메모장에서 메모리를 수정

  • 램 용량을 표시

  • 내 컴퓨터 → 속성

  • 램 용량 확인 = 본인은 8G

Untitled

  • 본인 RAM의 1/8, 1/4 이 되도록 표시

  • 8G의 8/1 = 1G = 2^10 = 1024

  • 8G의 4/1 = 2G = 2*2^10 = 2048

  • 즉, -Xms1024m
    -Xmx2048m

  • 이후 저장한다

Untitled

Spring Tool Suite4 실행

  • sts-4.14.1.RELEASE 폴더 → sprinttoolsuite4.exe 를 작업표시줄에 고정
  • sprinttoolsuite4.exe 실행
    • workspace 설정을 요구할 것이다

Untitled

  • sts-4.14.1.RELEASE 있는 경로에 폴더 생성 : workspace_seoulAI
  • 해당 경로에 경로 설정

Untitled

Spring Tool Suite에서 추가 설치

  • Help → eclipse Marketplace → 검색 : Java and Web developer tool → 설치

Untitled

UTF-8 설정

  • window→preference → encoding 검색
  • java class file, text, text→java Properties File 이 3개에 대해서 utf-8 추가한다
  • 추가 방법
      1. Content types: 에서 3개 중에서 설정할 것을 선택
    • 2.다음과 같이 하단에 utf-8 적고 Update
    1. 3개 모두 같은 방법으로 utf-8을 추가해준다

Untitled

  • General - Workspace → 설정 : utf-8

Untitled

  • 다음 그림의 좌측에 보이는 모든 메뉴에 들어가서 설정 변경
  • 설정 변경 : utf-8

Untitled

추가 설정

  • Window → preference → 검색 : installed → add

Untitled

  • Standard VM 더블 클릭

Untitled

  • directory 선택

Untitled

  • jdk-11 선택

Untitled

  • 11버전이므로 아래 2개중에서 아래 것을 체크
  • 13버전 이상일 때만 다음 그림과 다르게 체크
  • finish → 다음 페이지에서 위에 항목을 체크 → Apply and Close
  • *이후에 코드 실행하여 Linkage… 에러가 생기면 이 설정을 변경해보자

Untitled

프로젝트 생성

  • 기본 화면에서 좌측 workspace의 Create Java project를 클릭
  • Create Java project → 다음 그림 참고하여 체크 → 생성한다

Untitled

  • 다음과 같이 생성되었다

Untitled

JDK

  • JDK는 자바 개발도구(Java Development Kit)의 약자이다
  • JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다

Untitled

Hello World

  • 우클릭 : src → New → class

Untitled

  • Main 이라고 명명

Untitled

  • 코드 작성
    • 팁 : ctrl + space바
1
2
3
4
5
6
7
8
package variable;

public class Main {
public static void main(String[] args) {
System.out.println("헬로 월드");
}

}
  • 저장한 후에 실행한 결과

Untitled

Java Script 기초

사전작업

  • 살행할 폴더 우클릭 : git bash here

  • VSCord 작동 : code .

  • 폴더, 파일 생성

  • PROJECT 아래에 생성

    • 폴더 생성 : step03_js_basic
    • 파일 생성 : index.html
    • 파일 생성 : main.js

JavaScript 작성

  • index.html 에 다음 내용 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ko">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width">
<title>Document</title>
<script src="./main.js"></script>
</head>

<body>
<h1>자바스크립트 연습</h1>
</body>

</html>
  • main.js에 다음 내용 작성
1
2
// hello world
console.log("hello!")
  • step03_js_basic 폴더에서 index.html을 오픈
  • 다음과 같이 페이지가 출력된다.

Untitled

시스템 로그

  • main.js 에 다음 내용 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// hello world
console.log("Hello!!!");

// 변수명 작성 스타일
// camel Case : numOne

const myName = "kmk";
const email = "abc@gmail.com";
const hello = '안녕 ${myName}!';

// print()
console.log(myName);
console.log(email);
console.log(hello);
  • html 페이지에서 우클릭 → 검사
  • 다음과 같이 시스템 로그가 출력되었다.

Untitled

key-value

  • key-value를 비롯한 여러 변수를 호출해본다.
  • main.js 에 다음 내용 작성
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// hello world
console.log("Hello!!!");

// 변수명 작성 스타일
// camel Case : numOne

const myName = "kmk";
const email = "abc@gmail.com";
const hello = '안녕 ${myName}!';

// print()
console.log(myName);
console.log(email);
console.log(hello);

// 숫자
const number = 123;
console.log(number)

// Boolean
let checked = true;
let isShow = false;
console.log(checked)
console.log(isShow)

//undefied
let abc;
console.log(abc);

//null
let name = null;
console.log(name);

//재할당
name = 'kmk';
console.log(name);

// 파이썬 딕셔너리와 비슷
// key-value
const user = {
name: 'kmk',
age: 20,
isValid: true
}

console.log(user.name);
console.log(user.age);
console.log(user.isValid);
// console.log(user.user.city); undefined
  • 다음과 같이 시스템 로그가 출력된다.

Untitled

사칙 연산

  • main.js 에 다음 내용 추가
1
2
3
4
5
6
7
// 사칙 연산
const a=2;
const b=5;
console.log(a + b);
console.log(a - b);
console.log(a * b);
console.log(a / b);
  • 연산 결과가 시스템 로그에 출력된다.

Untitled

함수 선언과 호출

  • main.js 에 다음 내용 추가
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
26
27
28
29
// 함수의 선언과 호출
function helloFunc() {
console.log(1234);
}

helloFunc();

function returnFunc() {
return 123;
}

const fun_result = returnFunc();
console.log(fun_result);

function sum(a, b){
return a + b;
}

const sum_a = sum(1, 2);
console.log(sum_a);

const sum_b = sum(4,5)
console.log(sum_b);

// anonymous(익명 함수)
const world = function(){
console.log("We are the world");
}
world();
  • 결과가 시스템 로그에 출력된다.

Untitled

조건문

  • main.js 에 다음 내용 추가
1
2
3
4
5
6
7
// 조건문
const isDone = false;
if (isDone) {
console.log('done!')
} else {
console.log('Not Yet')
}
  • 결과가 시스템 로그에 출력된다.

Untitled

html & css

사전작업

  • 살행할 폴더 우클릭 : git bash here

  • VSCord 작동 : code .

  • 폴더, 파일 생성

  • PROJECT 아래에 생성

    • 폴더 생성 : step02_hello
    • 파일 생성 : index.html
    • 파일 생성 : main.css

CSS 작성

  • index.html 에 다음 내용 작성
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>돈까스집</title>
<link rel="stylesheet" href="./main.css" >
</head>
<body>
<div>Hello World</div>
</body>
</html>
  • main.css 에 다음 내용 작성
1
2
3
4
5
div {
width: 400px;
height: 200px;
background-color: blue;
}
  • step02_hello 폴더에서 index.html을 오픈
  • 다음과 같이 페이지가 출력된다.

Untitled

이미지 업로드

  • step02_hello 아래에 폴더 생성 : img
  • 사진을 img폴더 경로에 다운로드 : rainday
  • index.html 에 다음 내용 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>돈까스집</title>
<link rel="stylesheet" href="./main.css" >
</head>
<body>
<div class = "weather_title">
<h1>오늘의 날씨</h1>
<p>오늘은 비가 많이 내릴 예정입니다. ~~</p>
<img src="./img/rainday.webp" alt="rain">
</div>
</body>
</html>
  • main.css 에 다음 내용 작성
1
2
3
4
5
6
7
8
9
10
11
div {
width: 200px;
height: 200px;
background-color: blue;
}

p{
color: navy;
text-indent : 30px;
text-transform: uppercase;
}
  • 지정한 이미지가 업로드되었다.

Untitled

div 클래스

  • div를 이용하여 글을 작성한다.
  • index.html 에 다음 내용 작성
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
26
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>돈까스집</title>
<link rel="stylesheet" href="./main.css" >
</head>
<body>
<div class = "weather_title">
<h1>오늘의 날씨</h1>
<p>오늘은 비가 많이 내릴 예정입니다. ~~</p>
</div>
<div class = "fruits">
<ul>
<li>사과</li>
<li>바나나</li>
<li>수박</li>
<li>오렌지</li>
</ul>
</div>
<div id="song">
<span>노래~~가사~~</span>
</div>
</body>
</html>
  • main.css 에 다음 내용 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
div {
width: 200px;
height: 200px;
background-color: blue;
}

div.fruits {
width: 500px;
height: 300px;
background-color: orange;
}

#song {
width: 500px;
height: 300px;
background-color: rgb(205, 235, 135);
}

p{
color: navy;
text-indent : 30px;
text-transform: uppercase;

}
  • 다음과 같이 차례로 출력된다.

Untitled

Label, Table

  • 라벨과 테이블을 사용해본다.
  • index.html 에 다음 내용 작성
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>돈까스집</title>
<link rel="stylesheet" href="./main.css" >
</head>
<body>
<div class = "weather_title">
<h1>오늘의 날씨</h1>
<p>오늘은 비가 많이 내릴 예정입니다. ~~</p>
</div>
<div class = "fruits">
<ul>
<li>사과</li>
<li>바나나</li>
<li>수박</li>
<li>오렌지</li>
</ul>
</div>
<div id="song">
<span>노래~~가사~~</span>
</div>

<br>
<input type = "text" value = "hello" />
<input type = "text" placeholder = "이름을 입력하세요"/>

<label>
<input type="checkbox" />사과
<input type="checkbox" checked/>바나나
</label>

<table>
<tr>
<th>항목명1</th>
<td>내용이 들어갑니다.</td>
</tr>
<tr>
<th>항목명2</th>
<td>내용이 들어갑니다.</td>
</tr>
<tr>
<th>항목명3</th>
<td>내용이 들어갑니다.</td>
</tr>
</table>

</body>
</html>
  • main.css 에 다음 내용 작성
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
26
27
28
div {
width: 200px;
height: 200px;
background-color: blue;
}

div.fruits {
width: 500px;
height: 300px;
background-color: orange;
}

#song {
width: 500px;
height: 300px;
background-color: rgb(205, 235, 135);
}

p{
color: navy;
text-indent : 30px;
text-transform: uppercase;

}

input:focus {
background-color: blue;
}

Untitled

Ctrl + A 후 전체정렬

전체 정렬 : Ctrl + Alt + L

추가 공부

https://www.inflearn.com/course/html5

  • 해당 링크에서 필요한 강의를 찾아서 듣기
  • 최종적으로 홈페이지가 제작되는 강의나 책을 선택해야 한다.

참고 자료

html 기초

사전작업

  • 바탕 화면에 폴더 생성 : project
  • 폴더 우클릭 : git bash here
  • VSCord 작동 : code .

Untitled

  • 폴더, 파일 생성
  • PROJECT 아래에 생성
    • 폴더 생성 : step01_intro
    • 파일 생성 : index.html

html 작성

  • 코드 작성
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
</head>
<body>
aaa
</body>
</html>
  • 저장 후 폴더에서 html파일 열기
  • 다음과 같이 작서한 내용이 출력되어 있다.

Untitled

링크 첨부

  • Naver 주소를 복사하여 다음과 같이 작성한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>돈까스집</title>
</head>
<body>
<a href="https://www.naver.com/">NAVER</a>
<br>
<br>
<div>Hello World</div>
</body>
</html>

Untitled

이미지 추가

  • project/step01_intro 경로에 폴더 생성 : img
  • 아무 사진이나 다운받아서 폴더에 넣는다.
    • 사진을 다른 이름으로 저장 : temp
  • 여기까지 설정하고 다음과 같이 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>돈까스집</title>
</head>
<body>
<a href="https://www.naver.com/">NAVER</a>
<br>
<br>
<div>Hello World</div>
<br>
<img src="./img/temp.jpg" alt = "ball">
</body>
</html>

Untitled

이미지 주소로 추가

  • 이미지 우클릭 : 이미지 링크 복사
  • 다음과 같이 링크를 붙여넣고 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>돈까스집</title>
</head>
<body>
<a href="https://www.naver.com/">NAVER</a>
<br>
<br>
<div>Hello World</div>
<br>
<img src="./img/temp.jpg" alt = "ball">
<img src="https://img.animalplanet.co.kr/news/2020/01/07/700/tbg4j63622z4545z51af.jpg" alt = "fox">
</body>
</html>

Untitled

페이지 이동

  • 링크로 페이지 이동하기
  • 우선 step01_intro 아래에 폴더 생성 : about
    • about 아래에 파일 생성 : index.html
  • about/index.html에 다음 내용 작성
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>About</title>
</head>
<body>
<a href="../">Home</a>
About 페이지입니다.
</body>
</html>
  • index.html에 about/index.html 경로 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=devie-width, initial-scale=1.0">
<title>돈까스집</title>
</head>
<body>
<! -- 키워드: 상대경로, 절대경로 -->
<a href="https://www.naver.com/">NAVER</a>
<a href="./about/index.html">About</a>

<br>
<br>
<div>Hello World</div>
<br>
<img src="./img/temp.jpg" alt = "ball">
<img src="https://img.animalplanet.co.kr/news/2020/01/07/700/tbg4j63622z4545z51af.jpg" alt = "fox">
</body>
</html>

Untitled

  • 다음 설정으로 코드 가독성을 높일 수 있다.
    • VSCord → 메뉴바 → 보기 → 자동 줄 바꿈

FrontEnd 세팅

웹개발을 위한 VS Code 기본 세팅 (notion.site)

  • VSCord → extention 에서 필요한 프로그램을 다운로드

Untitled

  • Korean 다운로드

→ restart

Untitled

  • beautify 다운로드

Untitled

  • ‘기능 기여도’ 탭

→ 명령 칸에서 다음 내용 복사

→ 복사 : HookyQR.beautify

Untitled

  • 검색 창 열기 : crl+ shift + p
  • 검색 : 바로가기 키

→ 기본 설정 : 바로 가기 키 열기

Untitled

  • 검색 : 앞서 복사했던 HookyQR.beautify 를 붙여 넣는다.
    • Beautify Selection을 클릭한다.

Untitled

  • 키 바인딩 조합 정의 : ctrl + alt + L

Untitled

  • live server 설치

Untitled

html

CSS

JavaScript

JavaScript 실습1

JavaScript 실습2

JavaScript 실습3

Airflow 실습03

Elastic search 질의

  • 실무 예제로 배우는 데이터 공학 83p

관리자 권한으로 실행 : Ubuntu

→ 경로 이동 : …airflow/

source venv/bin/activate

code .

→ VSCord가 자동 실행된다

→파일 생성 : e_query.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pandas as pd
from pandas.io.json import json_normalize
from elasticsearch import Elasticsearch

# Elasticsearch 객체 생성
es = Elasticsearch()

# 일래스틱서치에 보낼 문서 본문(질의 요청) JSON 객체를 만든다.
# Matchall 검색 사용
doc = {"query" : {"match_all": {}}}
res = es.search(index="users", body = doc, size = 500)
# print(res['hits']['hits'])

# 루프로 문서를 훑으면서 각 문서의 _source 필드만 출력한다.
# for doc in res['hits']['hits']:
# print(doc['_source'])

# 질의 결과를 pandas DataFrame에 넣는 것도 가능
df = json_normalize(res['hits']['hits'])
print(df.head())
print(df.info())

print(df['_source.city'].value_counts())

postgreSQL → Elastic search 데이터 전송

  • 교재 88p
  • Elastic search 가동된 상태에서 진행

→ 선행 학습 링크 참고 : postgreSQL 실습 (notion.so)

  • pgAdmin 준비된 상태에서 진행

→ 다음과 같이 출력되는 상태여야 한다.

Untitled

  • VSCord 에서 작업
  • 교재 88p

dags 폴더 아래에 파일 생성

→ 파일 생성 : airflodb.py

→ 코드 작성

import datetime as dt

from datetime import timedelta

from airflow import DAG

from airflow.operators.bash import BashOperator

from airflow.operators.python import PythonOperator

import pandas as pd

import psycopg2 as db

from elasticsearch import Elasticsearch

print("Hello")

→ 경로 이동 : (venv) kmk3593@DESKTOP-LNQ780K:/mnt/c/airflow-test/dags$

→ 실행

→ Hello 가 출력되었으므로 성공.

Untitled

  • 코드 추가 작성
  • 다음 내용을 airflodb.py에 작성한다.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import datetime as dt
from datetime import timedelta
from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator

import pandas as pd
import psycopg2 as db
from elasticsearch import Elasticsearch

# queryPostgresql 지정
def queryPostgresql():
conn_string="dbname='dataengineering' host='localhost' user='postgres' password='postgres'"
conn=db.connect(conn_string)
print("DB connecting....", conn)

# 데이터 추출
df = pd.read_sql("select name, city from users", conn)
df.to_csv("postgresqldata.csv")
print("----Data Saved----")

# insertElasticSearch
def insertDataElasticsearch():

# Elastic 인스턴스 생성
es = Elasticsearch()

# 데이터 불러오기
df = pd.read_csv("postgresqldata.csv")
for i, r in df.iterrows():
doc = r.to_json()
res = es.index(
index="frompostgresql"
, doc_type="doc", body=doc
)
print(res)

# DAG를 위한 인수들을 지정
default_args = {
'owner' : 'human',
'start_date' : dt.datetime(2022, 4, 18),
'retries' : 1,
'retry_delay': dt.timedelta(minutes = 5)
}

with DAG('MyDBdag',
default_args = default_args,
schedule_interval = timedelta(minutes=5), # '0 * * * * ',
) as dag:

getData = PythonOperator(
task_id = "QueryPostgreSQL"
, python_callable=queryPostgresql
)

insertData = PythonOperator(
task_id = "InsertDataElasticsearch"
, python_callable = insertDataElasticsearch
)

getData >> insertData
  • Airflow 가동

→ 저장 후 실행

python3 airflodb.py

→ airflow 실행

airflow db init

→(재시도할 경우, 실행 : airflow db reset )

→ Terminal 2개 준비하고 다음 명령 실행

airflow webserver -p 8080

airflow scheduler

→ 다음 주소로 진입

http://localhost:8080/

→ Dags

→ 활성화 : MyDBdag

→ 더블 클릭 : MyDBdag

Untitled

→ Tree

→ Update

→ 다음과 같이 출력되면 성공

Untitled

  • Reference : 실무 예제로 배우는 데이터 공학

Airflow 실습02

데이터베이스를 위한 아파치 에어플로 데이터 파이프라인 구축

실무 예제로 배우는 데이터 공학 87 ~ 91p

관리자 권한으로 실행 : ubuntu

→ elasticsearch 가동하기

Untitled

→ Kibana 가동하기

Untitled

  • 경로 이동, 가상 환경 진입

cd ..cd ..cd mnt/c/airflow-test

source venv/bin/activate

  • 교재의 elastic search 버전을 참고하여 설치

pip3 install elasticsearch==7.17.2

Untitled

  • 교재 80p
  • 일단 vi 대신에 code . 를 사용한다.

code .

( 안 될 경우, Ubuntu를 다시 시작한다)

→ 코드 실행 시, VSCord가 자동으로 시작된다

Untitled

  • 폴더 생성

→ 폴더 생성 : chapter04

→ 파일 생성 : e_search.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from elasticsearch import Elasticsearch
from elasticsearch import helpers
from faker import Faker

fake=Faker()
es = Elasticsearch() #or pi {127.0.0.1}

doc={"name": fake.name(),"street": fake.street_address(), "city": fake.city(),"zip":fake.zipcode()}

res=es.index(index="users",doc_type="doc",body=doc)
print(res)

doc={"query":{"match":{"_id":"pDYlOHEBxMEH3Xr-2QPk"}}}
res=es.search(index="users",body=doc,size=10)
print(res)
  • 가상환경 가동 후 실행

→ 저장

→ 터미널

source venv/bin/activate

cd chapter04/

python3 e_search.py

  • 교재 81p

→ 파일 작성 : e_search02.py

→ 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from elasticsearch import Elasticsearch
from elasticsearch import helpers
from faker import Faker

fake=Faker()
es = Elasticsearch() #or pi {127.0.0.1}

actions = [
{
"_index": "users",
"_type": "doc",
"_source": {
"name": fake.name(),
"street": fake.street_address(),
"city": fake.city(),
"zip":fake.zipcode()}
}
for x in range(998) # or for i,r in df.iterrows()
]

response = helpers.bulk(es, actions)
print(response)

→ 저장 후 실행

python3 e_search02.py

→ 다음과 같이 (998,[]) 출력되면 성공

Untitled

  • Kibana 페이지 실행

→ 주소창에 입력 : localhost:5601/

→ 메뉴바

→ Stack Management

Untitled

→ Index Patterns

Untitled

→ Create index pattern

→ 이름 : users

Untitled

→ Create index pattern

Untitled

→ 햄버거 메뉴바 열기

→ Discover

Untitled

→ 앞에서 추가한 index의 문서를 확인할 수 있다.

Untitled

데이터 저장소

  • RDBMS

— 종류 : Oracle, PostgreSQL, MySQL, 빅쿼리(구글),…

— 표준 SQL (하나를 잘 알면, 거의 비슷!)

  • NoSQL

— 종류 : Elasticsearch, 몽고 DB (무료 버전)

어려운 것 조회 하는 방법이 RDMBS ≠ NoSQL 다름 (완전 다름!)

Airflow 재설치 및 데이터 파이프라인 구축

Setting up Apache-Airflow in Windows using WSL2 - Data Science | DSChloe

Airflow 데이터 파이프라인 구축 예제 - Data Science | DSChloe

  • 체크포인트
  1. 가상환경을 만들 수 있는냐 (virtualenv 라이브러리)

  2. 경로 이동이 자유로운가? cd 사용

  3. 환경 변수를 이해하고 잡을 수 있는가?

    vi 편집기를 자유자재로 쓸 수 있는가?

  4. 파이썬 라이브러리를 가상환경에 자유자재로 설치 할 수 있는가?

  5. 가상 환경에 자유롭게 출입할 수 있는가?

  • 사전 준비

VSCord 의 airflow.cfg 에서 진행

→ 내용 변경 : load_examples = TrueFalse

→ c드라이브 → airflow_test → dags와 chapter03, chapter04 를 배경화면에 빼둔다.

Untitled

  • airflow-test 내용물 삭제

Ubuntu 의 airflow 경로에서 진행

deactivate

sudo rm -rf *

  • 다시 가상환경 생성

virtualenv venv

ls

  • 필요한 내용이 작성되어 있는지 확인

vi ~/.bashrc

→ 내용 확인 : export AIRFLOW_HOME=/mnt/c/airflow-test

source ~/.bashrc

echo $AIRFLOW_HOME

pwd

  • 가상환경 on

source venv/bin/activate

  • 라이브러리 설치

pip3 install 'apache-airflow[postgres, slack, celery]'

  • db 설정

airflow db init

  • 계정 등록
  • firstname이 실행 결과에 영향을 주는가

airflow users create --username airflow --password airflow --firstname evan --lastname airflow --role Admin --email your_email@some.com

  • VSCord 에서 진행

→ 폴더 생성 : ( file → open folder → airflow-test )

→ airflow.cfg 파일

→ 내용 변경 : load_examples=TrueFalse

Untitled

  • Ubuntu 에서 진행

airflow db reset

→ 가상 환경 상태에서 다음 코드 실행

airflow webserver -p 8080

Untitled

→ ctrl + c 로 빠져나온다.

데이터 파이프라인 구축

개요

  • 이번에는 CSV-JSON으로 데이터를 변환하는 파이프라인을 구축하도록 한다.

Step 01. Dags 폴더 생성

  • 프로젝트 Root 하단에 Dags 폴더를 만든다.

    • dags 폴더를 확인한다.
  • dags 파일 생성

mkdir dags

ls

Step 02. 가상의 데이터 생성

  • 라이브러리 설치

→ 가상 환경에서 진행

pip3 install faker pandas

  • 폴더, 파일 생성

mkdir data

cd data

vi step01_writecsv.py

→ 코드 작성.

+ 앞으로는 이런 방식으로 코드를 작성한다.

+실무에서 필요한 습관이다.
  • faker 라이브러리를 활용하여 가상의 데이터를 생성한다. (파일 경로 : data/step01_writecsv.py)

Untitled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from faker import Faker
import csv
output=open('data.csv','w')
fake=Faker()
header=['name','age','street','city','state','zip','lng','lat']
mywriter=csv.writer(output)
mywriter.writerow(header)
for r in range(1000):
mywriter.writerow([fake.name(),
fake.random_int(min=18, max=80, step=1),
fake.street_address(),
fake.city(),
fake.state(),
fake.zipcode(),
fake.longitude(),
fake.latitude()])
output.close()
  • 코드를 실행한다.
  • VSCord에서 data.csv 파일이 생성되어야 한다.

python3 step01_writecsv.py

ls

cat data.csv

Step 03. csv2json 파일 구축

  • 이번에는 CSV와 JSON 변환 파일을 구축하는 코드를 작성한다. (파일 경로 : dags/csv2json.py)\
  • 주요 목적 함수 csvToJson()의 역할은 data/data.csv 파일을 불러와서 fromAirflow.json 파일로 변경하는 것이다.
  • DAG는 csvToJson 함수를 하나의 작업으로 등록하는 과정을 담는다. 작업의 소유자, 시작일시, 실패 시 재시도 횟수, 재시도 지연시 시간을 지정한다.
  • print_starting >> csvJson 에서 >> 는 하류 설정 연산자라고 부른다. (동의어 비트 자리이동 연산자)

cd ..

cd dags

vi csv2json.py

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
26
27
28
29
30
31
32
33
34
import datetime as dt
from datetime import timedelta

from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator

import pandas as pd

def csvToJson():
df=pd.read_csv('data/data.csv')
for i,r in df.iterrows():
print(r['name'])
df.to_json('fromAirflow.json',orient='records')

default_args = {
'owner': 'human',
'start_date': dt.datetime(2020, 3, 18),
'retries': 1,
'retry_delay': dt.timedelta(minutes=5),
}

with DAG('MyCSVDAG',
default_args=default_args,
schedule_interval=timedelta(minutes=5), # '0 * * * *',
) as dag:

print_starting = BashOperator(task_id='starting',
bash_command='echo "I am reading the CSV now....."')

csvJson = PythonOperator(task_id='convertCSVtoJson',
python_callable=csvToJson)

print_starting >> csvJson
  • 코드를 실행한다.
  • VSCord에서 json 파일이 생성되어야 한다.

python3 csv2json.py

Step 04. Airflow Webserver 및 Scheduler 동시 실행

  • 이제 웹서버와 스케쥴러를 동시에 실행한다. (터미널을 2개 열어야 함에 주의한다.)

VSCord 에서 WSL 터미널을 2개 띄운다.

airflow webserver -p 8080

airflow scheduler

Untitled

  • error 발생할 경우 대처

airflow.cfg의 endproint_url = 8080 체크

airflow db reset

airflow webserver -p 8080

airflow scheduler

→ 이 과정을 반복

→ 그래도 안 되면 airflow 지우고 다시 시작

이제 WebUI를 확인하면 정상적으로 작동하는 것을 확인할 수 있다

Step 05. 작업 결과물 확인

  • 최초 목적인 fromAirflow.json 로 정상적으로 변환되었는지 확인하도록 한다.

    • fromAirflow.json 파일이 확인된다면, 정상적으로 작업이 끝난 것이다.

    ls

    → 다음 내용이 출력되면 성공

    airflow-webserver.pid airflow.cfg airflow.db dags data fromAirflow.json logs venv webserver_config.py

    human@DESKTOP-V24TVMS:/mnt/c/airflow$ export AIRFLOW_HOME="$(pwd)"

    human@DESKTOP-V24TVMS:/mnt/c/airflow$ echo $AIRFLOW_HOME

  • Reference : 실무 예제로 배우는 데이터 공학

VSCord Install

VSCode Remote WSL

VSCode Remote WLS 연동 - Data Science | DSChloe

  • eclipse 보다 가볍다

VSCode 설치

Untitled

  • 설치 시, 환경 변수 체크란 잘 확인한다.

Untitled

  • 설치가 다 끝난 후에는 재부팅을 실시한다.
  • 관리자 권한으로 실행 : visual studio

Remote WSL 연동

  • 좌측 탭에서 Extension 버튼을 클릭한다.

Untitled

  • 검색 창에서 Remote WSL을 검색 후, 설치를 진행한다.

Untitled

  • 모두 클릭 후, Mark Done을 선택한다.

Untitled

  • Open Folder를 클릭한다.

Untitled

  • WSL에서 설치했던 airflow-test 폴더를 선택한다.

file → Open Folder → c 드라이브 → airflow_test 열기

Untitled

  • 메뉴 바에 Terminal 선택 후, 화면 하단에서 WSL이 있는지 확인한다.
  • Terminal 열어서 Ubuntu 실행한다.

Terminal

→ new terminal

→ 우측의 + 버튼으로 Ubuntu(WSL) 열기

Untitled

사용법

  • 해당 메뉴를 클릭하면 아래와 같이 터미널이 변경된 것을 확인할 수 있다.
  • 이번엔 서버를 가동해본다.

source venv/bin/activate

airflow webserver -p 8081

  • 사용해본다.

which python3

라이브러리 설치

  • 앞으로 ubuntu를 키지 않고 VScode에서 사용한다.
  • 라이브러리를 설치한다.

pip3 install faker

pip3 install pandas

실습

  • 파이썬 사용

폴더 생성 : 폴더 그림+ 버튼

→ chapter03 폴더 생성

→ 파일 생성 : 파일 그림+ 버튼

hello.py 파일 생성

→ 내용 작성 : print(”Hello World!”)

→ save ( ctrl + s)

Untitled

wsl Terminal 에서 다음 내용 작성

cd chapter 03/

python3 hello.py

hello.py 실행되면 성공

Untitled

  • 가상파일 만들기

파일 생성 : step01_writecsv.py

→ 코드 작성 : 실무 예제로 배우는 데이터 공학 44p

from faker import Faker import csv output=open('data.csv','w') fake=Faker() header=['name','age','street','city','state','zip','lng','lat'] mywriter=csv.writer(output) mywriter.writerow(header) for r in range(1000): mywriter.writerow([[fake.name](http://fake.name/)(),fake.random_int(min=18, max=80, step=1), fake.street_address(), fake.city(),fake.state(),fake.zipcode(),fake.longitude(),fake.latitude()]) output.close()

→ 저장 후 실행 : python3 step1_writecsv.py

→ data.csv 파일이 생성된다.

파일 생성 : step02_readcsv.py

→ 코드 작성 : 실무 예제로 배우는 데이터 공학 44 ~ 45p

import csv

with open('data.csv') as f:

myreader = csv.DictReader(f)

headers = next(myreader)

for row in myreader:

print(row['name'])

→ 저장 후 실행 : python3 step2_readcsv.py

→ 여러 사람의 이름이 출력되면 성공

파일 생성 : step03_pandas.py

→ 코드 작성 : 실무 예제로 배우는 데이터 공학 p

import pandas as pd

df = pd.read_csv('data.csv')

df.head(10)

df.to_csv('fromdf.csv', index=False)

→ 저장 후 실행

→ data.csv 파일 내용과 동일한 fromdf.csv 파일이 생성된다.

파일 생성 : step04_writejson.py

→ 코드 작성 : 실무 예제로 배우는 데이터 공학 48p

from faker import Faker

import json

output = open('data.json', 'w')

fake = Faker()

alldata = {}

alldata['records'] = []

for x in range(1000):

data = {

"name"   : fake.name(),

"age"    : fake.random_int(min=18, max=80, step=1),

"street" : fake.street_address(),

"city"   : fake.city(),

"state"  : fake.state(),

"zip"    : fake.zipcode(),

"lng"    : float(fake.longitude()),

"lat"    : float(fake.latitude())}

alldata['records'].append(data)

json.dump(alldata, output)

→ 저장 후 실행

→ data.json 이 생성된다.

데이터 불러오기

파일 생성 : step05_readjson.py

→ 코드 작성 : 실무 예제로 배우는 데이터 공학 49p

import json

with open('data.json', 'r') as f:

data = json.load(f)

print("Data Type is ", type(data))

print(data['records'][0]['name'])

→ 저장 후 실행

→ 사람 이름이 출력된다.

파일 생성 : step06_pandas.py

→ 코드 작성 : 실무 예제로 배우는 데이터 공학 49p

import pandas.io.json as pd_JSON

import pandas as pd

f = open('data.json', 'r')

data = pd_JSON.loads(f.read())

df = pd.json_normalize(data, record_path='records')

print(df.head(2))

print(df.head(2).to_json())

print(df.head(2).to_json(orient='records'))

→ 저장 후 실행

→이름, 거리, 도시 등이 출력된다.

전처리 순서

CSV —> 데이터 프레임 변환 —> 오라클 or PostgreSQL

비정형 데이터

-이미지 / 텍스트

JSON —> Pandas 데이터 프레임 변환 —> 전처리

—> JSON(NoSQL) —> ElasticSearch —> 시각화(Kibana)

파일 생성 : step07_airflowcsv.py

→ 코드 작성 : 실무 예제로 배우는 데이터 공학 51 ~ 54 p

→ 저장 후 실행

톱니바퀴 모양의 ‘airflow’를 연다

→ 다음 그림과 같이 경로가 잡혀있다.

Untitled

이 부분은 일단 넘어간다.

폴더 생성 : airflowcsv.py

→ 파일 복사 붙여넣기 : data.csv

  • Apache-Airflow 세팅 참고하여 진행

-Setting up Apache-Airflow in Windows using WSL2 - Data Science | DSChloe

airflow dbinit

airflow users create --username airflow --password airflow --firstname evan --lastname airflow --role Admin --email your_email@some.com

airflow webserver -p 8081

source venv/bin/acivate

airflow scheduler

로그인

아이디 :airflow

비번 :

cd dags

airflow dbinit

aiflow us,,,,

airflow webserber -p 8081

PSQL Install

PostgreSQL Installation on WSL2 and Windows

PostgreSQL Installation on WSL2 and Windows - Data Science | DSChloe

(password : 2016*****)

( 서버 password : postgres )

개요

  • WSL2에서 PostgreSQL을 설치한다.
  • pgAdmin은 Windows에 설치한다.

터미널 업그레이드

  • 먼저 WSL 터미널을 열고, Ubuntu 패키지를 모두 업데이트 및 업그레이드를 한다.

Windows Terminal → wsl bash

또는

Ubuntu → ..cd → ..cd

sudo apt update

sudo apt-get upgrade

PostgreSQL Installation in WSL2

  • 이번에는 WSL2에서 PostgreSQL을 설치한다. 설치가 종료되면, 반드시 버전을 확인한다.

sudo apt install postgresql postgresql-contrib

psql --version

  • 설치 이후에는 Database를 접근 가능하도록 활성화해야 한다.
    • 포트가 활성화 되어 있지 않다면 아래와 같은 메시지가 나타날 것이다.

sudo service postgresql status

  • 이번에는 활성화를 해보도록 한다. 온라인이라는 메시지가 나타난다면 활성화가 되었다는 것을 의미한다.

sudo service postgresql start

sudo service postgresql status

이번에는 활성화된 데이터베이스를 종료시킨다

sudo service postgresql stop

sudo service postgresql status

사용자 계정 Password 설정

  • 기본적으로 admin 사용자로 등록이 되어 있다. 보통 DB 초기 세팅 시에는 패스워드를 입력받아야 한다. ( password : 2016***** )

sudo passwd postgres

• 여기까지 했다면, WSL2에서 추가로 설정할 것은 더 없다.

pgAdmin Installation on Windows

  • 이번에는 pgAdmin을 설치한다. (최신버전 설치, pgAdmin 4 v6.8)웹사이트 : https://www.pgadmin.org/download/pgadmin-4-windows/
  • 설치 할 때는 관리자로 실행하며, 아래 그림과 나타난다면, install for all users를 선택한다.

Untitled

  • 설치가 완료된 뒤에는 pgAdmin 이 검색되는지를 확인한다.
  • WSL2 에서 PostgreSQL 서비스를 활성화 해야 한다.
  • 처음 실행 시 나타나는 화면에 나오는 Password 설정
  • WSL2에서 설정한 Password를 입력한다. (password : 2016*****)
    • 이번에는 서버를 설정하도록 한다 ( 서버 password : postgres )

Untitled

server 우 클릭

→ register → server

→ 내용 작성

→ General Tab 의 Name에 입력 : test

Untitled

  • connection tab 에서 작성

→ host 에 입력 : 127.0.0.1

→ Password는 WSL2에서 입력했던 Password를 입력한다.

Untitled

서비스를 활성화한다.

sudo service postgresql start

다음과 같이 Password를 설정하도록 한다

sudo -u postgres psql -c "ALTER USER postgres PASSWORD '<new-password>';"

sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"

  • 위 설정이 끝난 후, 재 접속하면 정상적으로 접근이 되는 것을 확인할 수 있다.
  • 비밀번호가 postgres 로 변경되었다.

DB 생성 및 확인

  • test 서버에 접속을 했다면, 이제 DB생성을 해본 후, pgAdmin과 WSL2에서 각각 확인을 한다.
  • 먼저, Database에서 마우스 우클릭 후, 아래와 같이 순차적으로 클릭한다.

Databases 우클릭

→ create → database..

→ 새로운 데이터베이스명은 dataengineering으로 명명한다.

Untitled

  • 이번에는 아래 그림과 같이 dataengineering 데이터베이스의 노드 중 shemas를 확장하고 다시 public을 확장한다.

Untitled

dataengineering

→ shemas

→ public

→ tables 우클릭

→ Create → Table

→ General 탭 Name 입력 : users

→ Column 탭에서는 아래와 같이 테이블 열을 추가한다

→ 우측의 + 버튼을 이용한다.

Untitled

wsl2 가상환경 : postgresql 서버 & DB

윈도우 : GUI - pgAdmin

  • 이번에는 psql에 접속 후 dataengineering DB와 생성된 테이블을 조회하는 쿼리를 실행한다.

    • dataengineering 테이블이 조회되는지 확인한다.

    Untitled

    sudo -u postgres psql (psql 접속 명령)

    → postgres=# 형태의 프롬프트가 출력된다.

    → 그림 맨 밑줄처럼 \l 을 입력하고 enter

    → dataengineering 이 출력되면 성공

이번에는 생성된 dataengineering DB에 연결 후, 테이블을 조회한다

sudo -u postgres psql ( psql에 접속)

→ postgres=# 형태의 프롬프트가 출력된다.

\c dataengineering

→ (dataengineering DB에 연결되어

dataengineering=# 형태로 바뀐다. )

\dt

→ users 테이블이 출력 되면 성공

\q 하여 빠져나온다.

sudo service postgresql stop 하여 DB 종료

→ 반드시 종료하자

Refefence

SQLAlchemy : 반드시 사용하자.

나중에라도 파이썬에 연결하여 사용한다.

https://www.sqlalchemy.org/

postgreSQL 실습

postgreSQL 실습_2