Props

: 부모에서 자식으로 값을 내려준다. 컴포넌트 간의 정보 교류 방법

⭐props는 반드시 위에서 아래 방향으로 흐른다. 즉, [부모] → [자식] 방향으로만 흐른다(단방향).

⭐props는 반드시 읽기 전용으로 취급하며, 변경하지 않는다

 

props로 값 전달하기

전달하기 - [주체 : 부모]

우리는 컴포넌트 간의 정보를 교류할 때 Props를 사용

이 과정을 “Props 로 정보를 전달했다” 라고 표현

// src/App.js

import React from "react";

function App() {
  return <GrandFather />;
}

function GrandFather() {
  return <Mother />;
}

function Mother() {
	const name = '리액트';
  return <Child motherName={name} />; // 💡"props로 name을 전달했다."
}

function Child() {
  return <div>연결 성공</div>;
}



export default App;

받기 - [주체 : 자식]

function Child(props){
	console.log(props) // 이게 바로 props다.
	return <div>연결 성공</div>
}

Mother가 보내준 정보가 객체 형태로

props란 결국 부모 컴포넌트가 자식에게 넘겨준 데이터들의 묶음

리액트에서는 Props를 통해 부모 컴포넌트로부터 자식 컴포넌트에 데이터를 넘겨줄 수 있다.

 

 

props로 받은 값을 화면에 렌더링 하기

function Child(props){
	console.log(props) // 이게 바로 props다.
	return <div>{props.motherName}</div>
}

props는 object literal 형태이기 때문에 {props.motherName} 로 꺼내서 사용할 수 있습니다. object literal의 key가 motherName 인 이유는 우리가 Child로 보내줄 때 motherName={name}

🤔object literal 란 {key: “value”} 데이터 형태를 의미

 

prop drilling

[부모] → [자식] → [그 자식] → [그 자식의 자식] 이 데이터를 받기 위해선 무려 3번이나 데이터를 내려줘야 한다.

이걸 바로 prop drilling, props가 아래로 뚫고 내려간다. 라고 한다.

 


Props Children

컴포넌트에서 말하는 children

: 자식 컴포넌트로 정보를 전달하는 또 다른 방법!

우리는 이미 그 방법을 ‘props’라고 배웠다. 얘도 props!

 

props를 보내는 방식

<User>리액트 어려워</User> 이렇게 정보를 보내고 있다.

<User hello='리액트 어려워'> 이렇게 props를 보내던 방식과는 조금 다르다. 이것이 children props를 보내는 방식이다.

정보를 받는 방식은 기존과 동일합니다. 대신 그 이름이 children 으로 정해져 있습니다.

import React from "react";


function User(props) {
	console.log(props.children)
  return <div></div>;
}

function App() {
  return <User>리액트 어려워</User>;
}

export default App;

children 값 받아서 렌더링하기

User 컴포넌트에서 props.children을 받아 그대로 렌더링 해준 모습

import React from "react";

function User(props) {
  return <div>{props.children}</div>;
}

function App() {
  return <User>리액트 어려워</User>;
}
export default App;

 


Props 추출

구조분해 할당과 Props

지금까지 props를 사용하는 모든 곳에서 props. 를 붙여줬다.

자바스크립트의 구조 분해 할당을 이용하여 조금 더 짧게 쓰는 방법이 있다. 앞서 설명했듯이 props는 object literal 형태의 데이터이다. 그래서 구조 분해 할당을 이용할 수 있다. 

만약 여러개의 props를 받는다면, { } 안에 여러개의 props를 그대로 써주면 된다.

function Todo({ title, body, isDone, id }){
	return <div>{title}</div>
}

 

defaultProps

: 부모 컴포넌트에서 props를 보내주지 않아도 설정될 초기 값!

Child 컴포넌트 입장에서는 부모 컴포넌트에서 name을 props 정보를 받기 전까지는 name 이 없는 상태.

그래서 부모 컴포넌트에서 props를 받기전까지 임시로 사용 할 수 있는 props를 설정 할 수 있습니다. Child 컴포넌트에서 직접 가능하다!

이후에 부모 컴포넌트에서 name props가 오게되면 설정된 defaultProps는 사라지고 내려 받은 props로 값이 바뀌게 된다.

// components/Child.js

import React from 'react';

function Child({ name }){
	return <div>내 이름은 {name} 입니다. </div>
}

// 이렇게 설정합니다.
Child.defaultProps={
	name: '기본 이름'
}

export default Child

default props 지정하기

defaultProps를 설정하면, 부모 컴포넌트로부터 아직 props 값을 받지 못했더라고 임시로 props의 값을 채울 수 있다.

그리고 부모 컴포넌트로부터 props가 오게되면 defaultProps 값은 진짜 props 값으로 변경된다.

// components/Child.js

import React from 'react';

function Child({ name }){
	return <div>내 이름은 {name} 입니다. </div>
}

// 이렇게 설정합니다.
Child.defaultProps={
	name: '기본 이름'
}

export default Child

 

 

 

 

 

<div ~~~~> 태그 옆에다가 주는 방법

태그 중간에 주는 방법{props.children}

 

나중에 정리하기..

 

'React' 카테고리의 다른 글

React Hooks - useEffect  (0) 2023.04.19
React Component  (0) 2023.04.18
State 불변성  (0) 2023.04.15
State  (0) 2023.04.15
JSX(JavaScript + XML)  (0) 2023.04.14

HTML을 품은 JS ⇒ JSX!

JavaScript를 확장한 문법

JavaScript의 모든 기능이 포함되어 있으며, React Element를 생성하기 위한 문법

// import [패키지명] from [경로] 이 형식으로 불러와요.
import React from 'react'; 
// js 파일 뿐 아니라 이미지도 가능가능!
import logo from './logo.svg';
// css? 가능!
import './App.css';

function App() {
  return (
    <div>
      리액트에서는 딱 하나의 html 파일만 존재한다.
      (public 폴더 아래에 있는 index.html)
    </div>
  );
}

export default App;

지켜야할 것!

- 태그는 꼭 닫아주기 <input />

- 무조건 1개의 엘리먼트를 반환하기

return (
    <div className="App">
      <p>안녕하세요! 리액트 반입니다 :)</p>
      <input type='text'/>
    </div>
  );

- JSX에서 javascript 값을 가져오려면? 중괄호!!!

(값을 가져올 때 뿐만 아니라, map, 삼항연산자 등 자바스크립트 문법을 JSX 안에 쓸 때도 {}를 이용)

function App() {
	const cat_name = 'perl';
    const number = 1;
  return (
    <>
    <div>hello {cat_name}!</div>
    <p>안녕하세요! 리액트 반입니다 :)</p>
     {/* JSX 내에서 코드 주석은 이렇게 씁니다 :) */}
     {/* 삼항 연산자를 사용했어요 */}
     <p>{number > 10 ? number+'은 10보다 크다': number+'은 10보다 작다'}</p>
     < />
  );
}

- class 대신 className!

- 인라인으로 style 주기

// 중괄호를 두 번 쓰는 이유? 객체도 자바스크립트니까요!
// 이렇게 쓰거나,
<p style={{color: 'orange', fontSize: '20px'}}>orange</p>

//혹은 스타일 객체를 변수로 만들고 쓸 수 있어요!
function App() {
  const styles = {
    color: 'orange',
    fontSize: '20px'
  };

  return (
    <div className="App">
      <p style={styles}>orange</p>
    </div>
  );
}

// 위와 같은내용

 

JSX식에는 부모 요소가 하나 있어야 됨 =>

태그로 하나 묶어줘야 함(빈 태그도 가능, 크롬 브라우저에서는 해석 안함)
import React from 'react';

// 자식 컴포넌트
function Child() {
  return <div>나는 딸입니다.</div>
}

// 부모 컴포넌트
function App() {
  return (
    <>
    <Child/>
    <Child/>
    <Child/>
    </>
  )
}
export default App;

👻컴포넌트 이름은 대문자로 시작

import React from 'react';

function Child() {
  return <div>자식</div>
}

function Mother() {
  return <Child/>
}

function Grandfather() {
  return <Mother/>
}

function App() {
  return <Grandfather/>
}
export default App;

App.js에서

rfc : export default 같이 들어감

import React from 'react'

export default function App() {
  return (
    <div>App</div>
  )
}

rfce : function키워드 들어감

import React from 'react'

function App() {
  return (
    <div>App</div>
  )
}

export default App

태그 닫아주기 <~~~~~~~/>

최상위 태그는 하나만! 태그를 하나 더 만들거면 전체를 감싸는 최상위 태그를 만들 것

 

import React from 'react'

function App() {

  let a = 1;
  let b = 2;

  let style1 = {
    color: 'green'
  }

  return (
    <div>
      <p style={style1}>안녕하세요</p>
      <p>{a + b < 10 ? 'true' : 'false'}</p>
    </div>
  )
}

export default App

class 대신 className!

중괄호를 두 번 쓰는 이유 : 객체도 JS

스타일 객체를 변수로 만들고 쓸 수 있음

'React' 카테고리의 다른 글

React Hooks - useEffect  (0) 2023.04.19
React Component  (0) 2023.04.18
State 불변성  (0) 2023.04.15
State  (0) 2023.04.15
Props, Props Children, Props 추출  (0) 2023.04.14

ES

: ECMAScript로 Ecma lnternational ECMA-262 기술 규격에 따라 정의하고 있는 표준화된 스크립트 프로그래밍 언어를 말한다. 자바스크립트를 표준화하기 위해 만들어졌다.

 

자바스크립트에서 변수는 var , let , const 세 가지 방법으로 선언할 수 있다.

var은 예전부터 사용되던 방법이며, let 과 const 는 ECMAScript 6(ES6)에서 새로 도입 된 방법이다.

// var로 변수 선언
var myVar = 'Hello JavaScript'
console.log(myVar) // 'Hello JavaScript'
// let으로 변수 선언
let myLet = 'Hello JavaScript'
console.log(myLet) // 'Hello JavaScript'
// const로 상수 선언
const myConst = 'Hello JavaScript'
console.log(myConst) // 'Hello JavaScript'

ECMAScript 6 (ES6)는 JavaScript의 버전 중 하나로, 2015년에 발표되었어요. ES6는 이전 버전인 ES5에서 새로운 문법과 기능을 도입하여 JavaScript 개발자들이 보다 쉽고 효율적으로 코드를 작성 할 수 있도록 개선했다.

기존에 변수 선언을 위해 존재하던 var 를 대체해서 나온 변수 선언이다.

 

ES6 문법

1.  let, const : 새로 도입

- let : 재할당은 가능하고, 재선언은 불가

- const : 재할당, 재선언이 불가능, 초기값이 없으면 선언 불가능

 

2. 화살표 함수 (Arrow Function) : 처음 소개된 개념

- function 이나 return 키워드 없이 함수를 만드는 방법

- this : function 은 호출을 할 때 this 가 정해지지만, 화살표 함수는 선언할 때 this 가 정해짐

 

3. 삼항 연산자 (ternary operator)

 

4. 구조 분해 할당 (Destructuring)

- 배열 [] 이나 객체 {} 의 속성을 분해해서 그 값을 변수에 담을 수 있게 해주는 문법

 

5. 단축 속성명 (property shorthand)

- 객체의 key와 value 값이 같다면, 생략 가능

 

6. 전개 구문 (Spread)

- 배열이나 객체를 전개하는 문법. 구조분해할당과 함께 정말 많이 사용됨

 

7. 나머지 매개변수(rest parameter)

 

8. 템플릿 리터럴 (Template literals)

- 여러 줄로 이뤄진 문자열과 문자 보간기능을 사용하게 만들어 주는 문자열 리터럴 표현. 백틱( ` ) 과 ${} 로 표현

 

9. named export vs default export

- default Export

- named export

'JavaScript' 카테고리의 다른 글

JavaScript 메소드  (0) 2023.04.09
JavaScript 형 변환  (0) 2023.04.08
JavaScript 데이터 타입  (0) 2023.04.08
JavaScript 연산자  (0) 2023.04.08

1. 객체 메소드

-  Object.keys() : 객체의 속성 이름을 배열로 반환

let fruit = {
name: 'apple',
clolr: 'red'
}
let keys = Object.keys(fruit)
console.log(keys)   // ['name', 'clolr']

-  Object.values() : 객체의 속성 값들을 배열로 반환

let fruit = {
name: 'apple',
clolr: 'red'
}
let values = Object.values(fruit)
console.log(values)   // ['apple', 'red']

-  Object.entries() : 객체의 속성 이름과 속성값들을 2차원 배열로 반환

 

-  Object.assign() : 기존 객체를 복사하여 새로운 객체를 만듦

let fruit = {
name: 'apple',
clolr: 'red'
}
let newFruit =  Object.assign({}, fruit, { clolr: 'red' })
console.log(newFruit)   // {name: 'apple', clolr: 'red'}

 

2. 배열 메소드

- push() : 배열의 끝에 요소를 추가

- pop() :  배열의 마지막 요소를 삭제

- shift() : 배열의 첫 번째 요소를 삭제

- unshift() :  배열의 맨 앞에 요소를 추가

- splice() : 배열의 요소를 삭제하거나, 새로운 요소를 추가

let country = ["한국", "호주", "미국"]
country.splice(1, 2, "파리") // (시작, 끝-삭제, 추가)
console.log(country) // ["한국", "파리"]

- slice() :  배열의 일부분을 새로운 배열로 만듦

let country = ["한국", "호주", "미국"]
let slicedCountry = country.slice(0, 1)
console.log(slicedCountry) // ["한국"]

- forEach() : 배열 numbers의 모든 요소를 출력.  배열의 각 요소에 대해 콜백 함수를 실행

- map() : 배열의 각 요소에 대해 콜백 함수를 실행하고, 그 결과를 새로운 배열로 반환

let numbers = [1, 4, 6, 8, 9]
let squaredNumbers = numbers.map(function(number) {
return number * number
})
console.log(squaredNumbers) // [1, 16, 36, 64, 81]

- filter() : 배열의 각 요소에 대해 콜백 함수를 실행하고, 그 결과가 true인 요소만 새로운 배열로 반환

let numbers = [1, 4, 6, 8, 9]
let evenNumbers = numbers.filter(function(number) {
return number < 8
})
console.log(evenNumbers) // [1, 4, 6]

- reduce()

let numbers = [1, 2, 3, 4, 5];
let sum = numbers.reduce(function(accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
console.log(sum);

- find() :  배열의 각 요소에 대해 콜백 함수를 실행하고, 그 결과가 true인 첫 번째 요소를 반환

- some() : 배열의 각 요소에 대해 콜백 함수를 실행, 그 결과가 true인 요소가 하나라도 있는지 확인

- every() : 배열의 각 요소에 대해 콜백 함수를 실행하고, 그 결과가 true인 요소가 모든 요소인지 확인

- sort() : 메소드는 배열의 요소를 오름차순으로 정렬

- reverse() : 배열의 요소를 역순으로 정렬. 순서를 뒤집는다

 

새로 알게되는 메소드

 


.splice() 메소드 이해하기

https://www.freecodecamp.org/korean/news/javascript-splice-method/

.reduce() 메소드 이해하기

https://bigtop.tistory.com/69

'JavaScript' 카테고리의 다른 글

JavaScript의 ES란?, ES5/ES6 문법 차이  (0) 2023.04.09
JavaScript 형 변환  (0) 2023.04.08
JavaScript 데이터 타입  (0) 2023.04.08
JavaScript 연산자  (0) 2023.04.08

다양한 자료형을 다룰 수 있다. 이 자료형들은 서로 형변환이 가능(형태 > 바꾼다)

 

1. 암시적 형 변환(implicit coercion)

: 자바스크립트에서 자동으로 수행되는 형 변환이며, 일반적으로 연산자를 사용할 때 발생

1-1. 문자열 변환

: 문자열과 다른 데이터 타입이 더하기 연산자로 만나면 문자열이 우선 시 된다

  { }, null, nuderfined + '1' => 문자열

console.log(1 + "2") // "12"
console.log("1" + true) // "1true" // 더하기 연산자, 두가지 타입을 결합함
console.log("1" + {}) // "1[object Object]"
console.log("1" + null) // "1null"
console.log("1" + undefined) // "1undefined"

1-2. 숫자 변환

: 다른 연산자(-, / ,,,)가 나왔을 때는 항상 숫자가 우선 시 된다

:  문자열을 숫자로 변환. 이때, 빈 문자열("")이나 공백 문자열(" ")은 0으로 변환

console.log(1 - "2") // -1
console.log("2" * "3") // 6
console.log(4 + +"5") // 9

 

2. 명시적 형 변환(explicit coercion)

: 개발자가 직접 자료형을 변환

2-1. 불리언 변환

:  Boolean() 함수를 사용하여 불리언 값으로 변환

   0, 빈 문자열(""), null, undefined, NaN은 false로 변환. 그 외의 값은 true로 변환

console.log(Boolean(0)) // false
console.log(Boolean("")) // false
console.log(Boolean(null)) // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN)) // false
console.log(Boolean("false")) // true
console.log(Boolean({})) // true // 객체는 값이 비어있더라도 true

2-2. 문자열 변환

: String() 함수를 사용하여 다른 자료형을 문자열로 변환

console.log(String(123)) // "123"
console.log(String(true)) // "true"
console.log(String(false)) // "false"
console.log(String(null)) // "null"
console.log(String(undefined)) // "undefined"
console.log(String({})) // "[object Object]"

2-3. 숫자 변환

console.log(Number("123")) // 123
console.log(Number("")) // 0
console.log(Number(" ")) // 0
console.log(Number(true)) // 1
console.log(Number(false)) // 0

'JavaScript' 카테고리의 다른 글

JavaScript의 ES란?, ES5/ES6 문법 차이  (0) 2023.04.09
JavaScript 메소드  (0) 2023.04.09
JavaScript 데이터 타입  (0) 2023.04.08
JavaScript 연산자  (0) 2023.04.08

1. 숫자(Number)

- 정수형 숫자(Integer)

let num1 = 27
console.log(num1) // 27
console.log(typeof num1) // 'number'

- 실수형 숫자(Float)

let num2 = 1.997
console.log(num2) // 1.997
console.log(typeof num2) // 'number'

- 지수형 숫자(Exponential)

let num3 = 2.7e8 // 2.7 x 10^8
console.log(num3) // 270000000
console.log(typeof num3) // 'number'

- NaN(Not a Number)

: 숫자가 아님을 나타내는 값. 수학적으로 정의되지 않는 계산, 숫자가 아닌 값을 숫자로 변환하려고 할 때 발생

let num4 = 'nminy' / 2
console.log(num4) // NaN
console.log(typeof num4) // 'number'

- Infinity : 무한대를 나타내는 숫자 값

let num6 = -1 / 0
console.log(num6) // -Infinity
console.log(typeof num6) // 'number'

2. 문자열(String)

: 문자의 나열. 작은 따옴표(' '), 큰 따옴표(" ")로 표현

- 문자열 길이(length)

let str = 'Apples are delicious!'
console.log(str.length) // 21

- 문자열 결합(concatenation)

let str1 = "WONPIL, "
let str2 = "행운을 빌어 줘"
let result = str1.concat(str2)
console.log(result) // "WONPIL, 행운을 빌어 줘"

- 문자열 자르기(substr, slice) 

let str = "Hello, world!";
console.log(str.substr(7, 5)); // "world" //시작위치부터 몇개까지 자를건지
console.log(str.slice(7, 12)); // "world" //시작위치부터 끝 위치까지

- 문자열 검색(search)

let str = "Hello, world!"
console.log(str.search("world")) // 7

- 문자열 대체(replace)

let str = "Cherries are delicious!"
let result = str.replace("Cherries", "JavaScript")
console.log(result) // "JavaScript are delicious!"

- 문자열 분할(split)

let str = "apple, banana, cherry"
let result = str.split(",")
console.log(result) // ["apple", "banana", "cherry"]

3. 불리언(Boolean)
: 불리언은 참(true)과 거짓(false)을 나타내는 데이터 타입.

let bool1 = true
console.log(bool1) // true
console.log(typeof bool1) // "boolean"

let bool2 = false
console.log(bool2) // false
console.log(typeof bool2) // "boolean"

: 조건문(if, else, switch 등)과 논리 연산자(&&,||, !)와 함께 사용

let x = 10
let y = 5
if (x > y) {
console.log("x is greater than y")
} else {
console.log("x is less than or equal to y")
}
let a = true
let b = false
console.log(a && b) // false
console.log(a || b) // true
console.log(!a) // false

4. undefinde

: 값이 할당되지 않은 변수

let x
console.log(x) // undefined

5. null : 값이 존재하지 않음을 의미. nudefined와는 다름

let y = null
console.log(y) // null

6. 객체(Object)💛

: 매우 중요한 역할!!! 속성과 메소드를 가지는 컨테이너. 중괄호{ }를 사용하여 객체 생성

let person = { name: 'Pororo', age: 9 }
person.name // 'Pororo'
person.age // 9

7. 배열(Array)

: 여러 개의 데이터를 순서대로 저장하는 데이터 타입. 대괄호[ ]를 사용하여 배열을 생성

let numbers = [1, 2, 3, 4, 5]
let color = ['red', 'green', 'blue']

'JavaScript' 카테고리의 다른 글

JavaScript의 ES란?, ES5/ES6 문법 차이  (0) 2023.04.09
JavaScript 메소드  (0) 2023.04.09
JavaScript 형 변환  (0) 2023.04.08
JavaScript 연산자  (0) 2023.04.08

1. 산술연산자

+ (더하기) : 문자열 우선순위

- (빼기) : 숫자 우선순위

* (곱하기) : 숫자 우선순위

/ (나누기) : 숫자 우선순위

% (나머지) : 숫자 우선순위 console.log (5%2) //1

 

2.할당연산자

= (등호연산자) : 변수에 값을 할당

+= (더하기 등호연산자) : 변수에 값을 더함

-= (빼기 등호연산자) : 변수에서 값을 뺌

*= (곱하기 등호연산자) : 변수에 값을 곱함

/= (나누기 등호연산자) : 변수에서 값을 나눔

%= (나머지 등호연산자) : 변수에서 값을 나눈 나머지

 

3. 비교연산자

=== (일치 연산자) : 두 값이 같은지 비교, 자료형까지 비교

!== (불일치 연산자) :두 값이 다른지 비교, 자료형까지 비교

< (작다 연산자) : 두 값 비교. 숫자와 문자열 함께 사용할 경우, 자동으로 숫자 변환

> (크다 연산자) : 두 값 비교. 숫자와 문자열 함께 사용할 경우, 자동으로 숫자 변환

<= (작거나 같다 연산자) : 두 값 비교. 숫자와 문자열 함께 사용할 경우, 자동으로 숫자 변환

>= (크거나 같다 연산자) : 두 값 비교. 숫자와 문자열 함께 사용할 경우, 자동으로 숫자 변환

 

4. 논리 연산자

&& (논리곱 연산자) : 두 값 비교. 두 값이 모두 true일 경우에만 true를 반환

|| (논리합 연산자) : 두 값 비교. 두 값 중 하나라도 true일 경우에만 true를 반환

! (논리부정 연산자) : 값을 반대로 바꿈. true를 false로, false를 true로 바꿈

 

5. 삼향 연산자

?: (삼향 연산자) : 조건에 따라 값을 선택. 조건식 ? true일 때의 값 : false일 때의 값 형태로 사용

let x = 7
let result = (x > 10) ? '크다' : '작다'
console.log(result) // '작다'

6. 타입 연산자

typeof 연산자 : 값의 자료형을 확인. 원시 자료형의 경우, 해당 자료형의 이름을, 객체나 함수의 경우, 'object' or 'tunction'을 반환. typeof null의 경우 'object'를 반환하는 버그가 있음!

console.log(typeof null) // 'object'
console.log(typeof {}) // 'object'
console.log(typeof fuction(){}) // 'fuction'

'JavaScript' 카테고리의 다른 글

JavaScript의 ES란?, ES5/ES6 문법 차이  (0) 2023.04.09
JavaScript 메소드  (0) 2023.04.09
JavaScript 형 변환  (0) 2023.04.08
JavaScript 데이터 타입  (0) 2023.04.08

1.수업내용정리

-flask 프로젝트의 폭더 구조는 정해져있다~ 잊지마~~!!

*폴더 안 app.py 파일 생성 > 폴더안에 templates 폴더 생성 > templates 폴더 안 index.html 파일 생성

-가상환경, 패키지 설치(가상환경 왜 잡아? 남이 만든 라이브러리 다운로드, 다운받을 통이 있어야하는데 그게 가상환경)

*새터미널 > python -m venv venv 엔터하고 파이썬 버전 venv로 변경 > (venv)라고 뜨면 활성화 완료

*터미널 > pip install flask pymongo dnspython(여러개 쓸 때는 띄어쓰기)/+크롤링필요할때 requests bs4 총 5개

-app.py, index.html 뼈대 만들기

불러오기랑 저장하기 중 저장하기 먼저 만들어라

GET : 데이터 조회(나중에 불러오기)

POST : 데이터 생성, 변경, 삭제 요청할 때 쓰임(먼저 서버 만들기 ex.app.py) : 완성하면 DB 확인하기

-og태그

 

static 폴더 아래에 이미지 파일을 넣고,

각자 프로젝트 HTML의 <head>~</head> 사이에

아래 내용을 작성하면 og 태그를 개인 프로젝트에 사용할 수 있습니다.

 

 

 

 

 

<meta property="og:title" content="내 사이트의 제목" />
<meta property="og:description" content="보고 있는 페이지의 내용 요약" />
<meta property="og:image" content="이미지URL" />

-AWS Elastic Beanstalk으로 배포

*배포 명령어

- 터미널 준비하기 - 
mkdir deploy
cp app.py deploy/application.py
cp -r templates deploy/templates
pip freeze > deploy/requirements.txt
cd deploy

- application.py 세팅하기 - 
application = app = Flask(__name__)
app.run()

- 패키지 설치하기 - 
pip install awsebcli

- 보안 자격증명 - 
eb init

- 초기 설정 - 
eb create myweb

- 코드 수정 & 업데이트 - 
eb deploy myweb

cd deploy하기 전에 clear하기

ed init

Select a default region : 10 (seoul)

AWS Access Key ID [None]: 발급된 액세스 키 ID (복사 붙여넣기)
AWS Secret Access Key [None]: 발급된 비밀 액세스 키 (복사 붙여넣기)

Enter Application Name (default is "deploy") : enter
It appears you are using Python. Is this correct? : Y
Select a platform branch (default is 1) : enter

Do you want use Codecommit? : N
---
Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
Do you want to set up SSH for your instances? : Y

Select a keypair : [Create new Keypair]

Type a keypair name : enter
Enter passphrase : enter
Enter same passphrase again : enter

서버배포 실패해서 삭제하고 다시 만들고 하니까(3번정도,,ㅋ) 마스터한 느낌이다.. 

 

2.참고 자료, 해당 내용이 활용되는 부분


3. 오늘 새로 배운 내용


4. 개발 중 발생한 이슈/고민 또는 이를 해결한 내용

고민은 메모장에 적었다.. 지금은 이게 문제가 아니다..삭제버튼 만들러가야한다..

1.수업내용정리

-Flask

*서버만들기

1.폴더와 파일 생성

폴더 안에 app.py 파일 생성(변경가능, 라이브러리 이름과 같으면 안됨)

폴더 안에 templates 폴더 생성(반드시 고정!)

templates 폴더 안에 index.html 파일생성

2.가상환경venv

새터미널 > 터미널이 bash로 생성

(bash가 아닌 것 이 뜨면 python -m venv venv

3.venv 활성화하기

app.py 파일을 클릭 > VS Code 오른쪽 아래의 파이썬 버전(예: 3.9.6)을 클릭한 뒤, 화면 위쪽에서 venv가 쓰여있는 파이썬 버전을 클릭 > 터미널에서 오른쪽의 십자버튼(➕) > 터미널에서 (venv) 라고 뜨면 가상환경이 활성화 

4.Flask 패키지 설치하기

터미널에 pip instal flask 엔터

*flask 시작 코드 ( 터미널 창에서 ctrl + c 누르면 서버 종료)

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
   return 'This is Home!'

if __name__ == '__main__':  
   app.run('0.0.0.0',port=5000,debug=True)

*html 파일 불러오기

간단한 index.html 파일을 templates 안에 만들고 html 파일 불러오기(flask 내장함수 render_template 이용)

from flask import Flask, render_template
app = Flask(__name__)

## URL 별로 함수명이 같거나,
## route('/') 등의 주소가 같으면 안됩니다.

@app.route('/')
def home():
   return render_template('index.html')

if __name__ == '__main__':
   app.run('0.0.0.0', port=5000, debug=True)

-화성땅 공동구매/스파르타피디아

*프로젝트 설정(flask 폴더 구조 만들기 > 가상환경 생성, 패키지 설치

* POST 연습(포스팅하기)

* GET 연습(보여주기) : 데이터 조회는 GET방식~~!!!

*완성코드(순서대로 app.py, index.html)

from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

from pymongo import MongoClient
client = MongoClient('내 mongoDB URL')
db = client.dbsparta

import requests
from bs4 import BeautifulSoup

@app.route('/')
def home():
    return render_template('index.html')

@app.route("/movie", methods=["POST"])
def movie_post():
    url_receive = request.form['url_give']
    comment_receive = request.form['comment_give']

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get(url_receive, headers=headers)

    soup = BeautifulSoup(data.text, 'html.parser')

    ogimage = soup.select_one('meta[property="og:image"]')['content']
    ogtitle = soup.select_one('meta[property="og:title"]')['content']
    ogdesc = soup.select_one('meta[property="og:description"]')['content']


    doc = {
        'image':ogimage,
        'title':ogtitle,
        'desc':ogdesc,
        'comment':comment_receive
    }

    db.movies.insert_one(doc)

    return jsonify({'msg':'저장완료!'})

@app.route("/movie", methods=["GET"])
def movie_get():
    all_movies = list(db.movies.find({},{'_id':False}))
    return jsonify({'result':all_movies})

if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)
<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
        crossorigin="anonymous"></script>

    <title>스파르타 피디아</title>

    <link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">

    <style>
        * {
            font-family: 'Gowun Dodum', sans-serif;
        }

        .mytitle {
            width: 100%;
            height: 250px;

            background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('https://movie-phinf.pstatic.net/20210715_95/1626338192428gTnJl_JPEG/movie_image.jpg');
            background-position: center;
            background-size: cover;

            color: white;

            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }

        .mytitle>button {
            width: 200px;
            height: 50px;

            background-color: transparent;
            color: white;

            border-radius: 50px;
            border: 1px solid white;

            margin-top: 10px;
        }

        .mytitle>button:hover {
            border: 2px solid white;
        }

        .mycomment {
            color: gray;
        }

        .mycards {
            margin: 20px auto 0px auto;
            width: 95%;
            max-width: 1200px;
        }

        .mypost {
            width: 95%;
            max-width: 500px;
            margin: 20px auto 0px auto;
            padding: 20px;
            box-shadow: 0px 0px 3px 0px gray;

            display: none;
        }

        .mybtns {
            display: flex;
            flex-direction: row;
            align-items: center;
            justify-content: center;

            margin-top: 20px;
        }

        .mybtns>button {
            margin-right: 10px;
        }
    </style>
    <script>
        $(document).ready(function () {
            listing();
        });

        function listing() {
            fetch('/movie').then((res) => res.json()).then((data) => {
                let rows = data['result']
                $('#cards-box').empty()
                rows.forEach((a)=>{
                    let comment = a['comment']
                    let title = a['title']
                    let desc = a['desc']
                    let image = a['image']

                    let temp_html = `<div class="col">
                                        <div class="card h-100">
                                            <img src="${image}"
                                                class="card-img-top">
                                            <div class="card-body">
                                                <h5 class="card-title">${title}</h5>
                                                <p class="card-text">${desc}</p>
                                                <p>⭐⭐⭐</p>
                                                <p class="mycomment">${comment}</p>
                                            </div>
                                        </div>
                                    </div>`
                    $('#cards-box').append(temp_html)
                })
            })
        }

        function posting() {
            let url = $('#url').val()
            let comment = $('#comment').val()

            let formData = new FormData();
            formData.append("url_give", url);
            formData.append("comment_give", comment);

            fetch('/movie', { method: "POST", body: formData }).then((res) => res.json()).then((data) => {
                alert(data['msg'])
                window.location.reload()
            })
        }

        function open_box() {
            $('#post-box').show()
        }
        function close_box() {
            $('#post-box').hide()
        }
    </script>
</head>

<body>
    <div class="mytitle">
        <h1>내 생애 최고의 영화들</h1>
        <button onclick="open_box()">영화 기록하기</button>
    </div>
    <div class="mypost" id="post-box">
        <div class="form-floating mb-3">
            <input id="url" type="email" class="form-control" placeholder="name@example.com">
            <label>영화URL</label>
        </div>
        <div class="form-floating">
            <textarea id="comment" class="form-control" placeholder="Leave a comment here"></textarea>
            <label for="floatingTextarea2">코멘트</label>
        </div>
        <div class="mybtns">
            <button onclick="posting()" type="button" class="btn btn-dark">기록하기</button>
            <button onclick="close_box()" type="button" class="btn btn-outline-dark">닫기</button>
        </div>
    </div>
    <div class="mycards">
        <div class="row row-cols-1 row-cols-md-4 g-4" id="cards-box">
            <div class="col">
                <div class="card h-100">
                    <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                        class="card-img-top">
                    <div class="card-body">
                        <h5 class="card-title">영화 제목이 들어갑니다</h5>
                        <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                        <p>⭐⭐⭐</p>
                        <p class="mycomment">나의 한줄 평을 씁니다</p>
                    </div>
                </div>
            </div>
            <div class="col">
                <div class="card h-100">
                    <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                        class="card-img-top">
                    <div class="card-body">
                        <h5 class="card-title">영화 제목이 들어갑니다</h5>
                        <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                        <p>⭐⭐⭐</p>
                        <p class="mycomment">나의 한줄 평을 씁니다</p>
                    </div>
                </div>
            </div>
            <div class="col">
                <div class="card h-100">
                    <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                        class="card-img-top">
                    <div class="card-body">
                        <h5 class="card-title">영화 제목이 들어갑니다</h5>
                        <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                        <p>⭐⭐⭐</p>
                        <p class="mycomment">나의 한줄 평을 씁니다</p>
                    </div>
                </div>
            </div>
            <div class="col">
                <div class="card h-100">
                    <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                        class="card-img-top">
                    <div class="card-body">
                        <h5 class="card-title">영화 제목이 들어갑니다</h5>
                        <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                        <p>⭐⭐⭐</p>
                        <p class="mycomment">나의 한줄 평을 씁니다</p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>

</html>

 

2.참고 자료, 해당 내용이 활용되는 부분

- 모르면 구글링 하자


3. 오늘 새로 배운 내용

-숫자를 별로 표시하기

구글링 > 자바스크립트 문자 반복 > repeat()

let start = a['star']
let star_repeat = '⭐'.repeat(star)

let temp_html = `<div class="col">
                  <div class="card h-100">
                      <img src="${image}"
                           class="card-img-top">
                      <div class="card-body">
                          <h5 class="card-title">${title}</h5>
                          <p class="card-text">${desc}</p>
                          <p>${star_repeat}</p>
                          <p class="mycomment">${comment}</p>
                      </div>
                  </div>
	              </div>`


4. 개발 중 발생한 이슈/고민 또는 이를 해결한 내용

-주고 받는 관계?app.py, index.html를 좀 이해하면 괜찮을 것 같다 

아직은 따라하는 느낌이라 잘 모르겠다

숫자를 이모티콘으로 표시하는 방법이 있다는 것을 생각해야겠다..어제 애먹은게 4주차에 있었고만,,ㅎ

+ Recent posts