1. Props란

 

부모 컴포넌트에서 자식 컴포넌트로 data를 전달할 때 쓰인다.

 

예를 들어, 

App.js(부모) / MyName.js (자식 Component)가 있다고 해보자

 

App.js

import React, {Component} from 'react';
import MyName from './MyName'

class App extends Component {
  render() {
    return (
      <div>
        <MyName name="이름" />
      </div>
    );
  }
}

export default App;

## 작업순서!

1) 자식 컴포넌트를 import 한다. import Myname from '파일위치'

2) name(내려보내고 싶은 key)="입력하고 싶은 값" 을 태그 안에 넣어서 자식 컴포넌트에 보내면 된다.

 

MyName.js

import React, {Component} from 'react';

class MyName extends Component {
    static defaultProps = {
        name: '기본이름'
    } // this.props.name의 기본값을 설정할 수 있음
    render() {
        return (
            <div>
                안녕하세요! 제 이름은 {this.props.name} 입니다.
            </div>
        )
    }
}

## 작업 순서

{this.props.name}의 형식으로 사용하면된다

만약에, props 값을 전달받지 않아도 사용할 수 있도록 기본값을 설정하고 싶다면

 

static defaultProps = { name: '기본이름'} 의 형식으로 사용해도 된다

2. State

 

state는 객체의 형태로 해당 Component 내에 존재한다. vue의 data와 유사하다

import React, {Component} from 'react';

class Counter extends Component {
    state = {
       number: 1
    }
    handleIncrease = () => {
        /*this.state.number++; 
        이렇게 하면 컴포넌트가 이 state가 업데이트 되었는지를 모름 이렇게 쓰면 안됨
        */
        this.setState({
            number: this.state.number+1
        })
    }
    handleDecrease = () => {
        this.setState({
            number: this.state.number-1
        })
    }
    render() {
        return (
            <div>
                <h1>카운터</h1>
                <div>값 : {this.state.number}</div>
                <button onClick={this.handleIncrease}>+</button>
                <button onClick={this.handleDecrease}>-</button>
            </div>
        )
    }
}

export default Counter

 

## 작업 시 주의할 점

 

1. state 값을 갱신할 때는 반드시, this.setState() 사용

 

this.setState({

    numer: this.state.number++;

}) 처럼 this.setState()내에서 state의 상태를 갱신해주어야 한다

단순히,  this.state.number++; 로만 함수 내에서 선언하면 React가 바뀐 값을 rerendering 하지 않는다

 

2. 이벤트 리스너를 실행할 때는

onClick={this.함수이름} 와 같은 형식을 엘리먼트 내에 선언해준다

 

3. component내에 함수를 생성할때 화살표 함수를 쓰는 것이 좋다.

물론, 화살표 함수를 쓰지 않아도 되지만

/* 왜 화살표 함수로 작성하냐면, 함수가 this를 인식하지 못함 */
constructor(props) {
  super(props);
  this.handleIncreate = this.handleIncreate.bind(this);
}

/* 이런 식으로 constructor 함수에서 선언을 해주어야 함
귀찮으니 그냥 화살표 함수를 쓰자
*/

constructor(props){}를 인자로 받는 함수를 따로 선언

->  super(props);로 props를 상속

-> this.함수이름=this.함수이름.bind(this);를 선언해주어야 한다.

 

이렇게 3단계나 거쳐야 하므로, 그냥 화살표 함수를 쓰도록 하자

 

# 함수형 컴포넌트

컴포넌트를 만들떄 위처럼 Class로 만들수도 있지만, 함수형 컴포넌트를 만들 수도 있다.

import React from 'react';

const MyName = ({name}) => {
        return (
            <div> 안녕하세요 제 이름은 {name}입니다
            </div>
        );
    };
MyName.defaultProps = {
    name: '기본이름'
 }
 export default Myname

함수형 컴포넌트의 장점/특징

- import {Component}를 하지 않아도 된다

- 코드를 더 간결하게 짤 수 있다

- 초기 마운트 속도가 미세하게 더 빠르다

- 메모리도 덜 차지한다.

- 단, state, lifecycle이 없다

 

### 참고

function sayHello({name, age}) {
	console.log(name+age)'
}
// 함수 () 내 {}의 사용과 의미
sayHello({name:'리액트', age:'몰라'})
// 와 같이 사용된다. {}객체 내부의 name, age값을 가져온다

 

 

'개발이야기 > react' 카테고리의 다른 글

JSX 기본 문법 알아보기  (0) 2020.03.19

1. 꼭 태그는 닫혀있어야 한다

 

 ex. <input type=text /> 

 

2. 두개 이상의 엘리먼트는 하나의 엘리먼트로 감싸져 있어야 한다. (vue.js 와 동일)

 

 - fragment 태그를 이용하면 불필요하게 div 엘리먼트를 생성할 필요가 없음.

import React, { Component } from 'react';

class App extends Component {

	render() {
    return (
    	<div>
        	<input type=text />
        </div>
        );
     }
 }
 
 export default App;

 

3. const vs let vs var

 

var : Es6에서는 더이상 사용하지 않음

const: 한번 선언 후 고정적인 값

let: 유동적인 값 - block 구역

 

4. 함수 선언 후 실행

 

function을 정의해준 뒤 -> ()로 함수를 감싸고 -> (func(){}) ()  처럼, ()를 옆에 붙여준다. 

import React, {Component, Fragment} from 'react';

Class App extends Component {
	render() {
    	const value = 3;
        return (
        	<div>
            {
            	(function() {
					if(value != 3) return <div>3이 아니다</div>
                    return <div>3이다</div>
                
                })()
                
             }
             </div>
        );
     }
  }
  
  export default App;

 

5.  CSS 스타일 작성하기 / Class 이름 적용하기

 

1) Css 스타일

 

카멜케이스로 style 속성 작성, style은 변수에 넣어서 선언해준다.

그리고 적용하고 싶은 element에 style={변수이름} 을 추가해준다 

 

2) Class 이름 적용하기

 

className="클래스이름" 이라고 element 내에 선언하기

import React, { Component } from 'react';

Class App extends Component {
	render() {
    	const style = {
        backgroundColor: 'black',
        padding: '16px',
        color: 'white',
        fontSize: '36px'
        };
        return (
        <div style={style} className="클래스이름">
        안녕하세요!
        </div>
        );
     }
  }
  export default App;

 

6. 주석작성하기

 

import React, {Component} from 'react';

class App extends Component {

	render() {
    	return (
        	<div>
            {// 이렇게 브라켓에 감싸서 주석 작성}
            <h1
            	className="클래스이름" // 이런식으로 태그 내에도 주석 작성 가능
            ></h1>
            </div>
        );
     }
 }
 export default App;
 

'개발이야기 > react' 카테고리의 다른 글

Props && State란  (0) 2020.03.19

02_자료구조

본 게시글의 모든 내용은 https://github.com/JaeYeopHan/Interview_Question_for_Beginner를 참고하여 작성되었습니다.

Array vs Linked List

Array

특징

- 논리적 저장순서와 물리적 저장 순서가 일치
- 인덱스로 해당 원소에 접근(O(1))
- random access가 가능

단점

- 삭제 또는 삽입의 과정에서 해당 원소에 접근해(O(1)) + 한가지 작업을 더 해줘야함

-> 시간이 더 걸림(O(n))

예를 들어, 배열의 원소 중 어느 원소를 삭제하면, 배열의 연속적인 특징이 깨지게 되어 빈공간이 생기게 된다. 그래서 삭제한 원소보다 큰 인덱스를 갖는 원소들을 shift 해주저야 한다.

Linked List

특징

- 각자의 원소들은 자기 자신 다음에 어떤 원소인지만을 기억
- 삽입과 삭제를 O(1)로 해결가능
- 트리 구조의 근간

단점

- 논리적 저장순서와 물리적 저장 순서가 일치하지 않기 떄문에 Search에서 O(N) 시간이 걸림
- 결국 linked list는 search에 O(N)+ 삽입/삭제에도 O(N) [search를 2번하니까..]

Stack vs Queue

Stack : 선형 자료 구조의 일종(LIFO)

`Last in First Out`

Queue : 선형자료구조의 일종(FIFO)

`First in First out`

Java Collection에서 Queue는 인터페이스이다. `priority queue`등을 사용할 수 있다.

TREE

트리는 스택이나 큐와 같은 선형 구조가 아닌 비선형 구조.`계층적 관계`를 표현

구성요소

- 노드(Node): 트리를 구성하고 있는 각각의 요소
- 간선(Edge): 트리를 구성하기 위해 노드와 노드를 연결하는 선
- 루트노드(Root Node): 트리 구조에서 최상위에 있는 노드
- Terminal Node(=leaf Node, 단말노드): 하위에 다른 노드가 연결되어 있지 않은 노드
- Internal Node(내부노드, 비단말노드): 단말노드를 제외한 모든 노드, 루트노드를 포함

특징

- 각 층 == 레벨(루트노드(0)부터 시작~루트의 최고 레벨(height(높이)))

Binary Tree(이진트리)

루트노드를 중심으로 두개의 서브 트리로 나뉘어진다. 또한 나뉘어진 두 서브 트리도 모두 이진트리

특징

- 나누어진 서브 트리도 이진트리 예)공집합, 노드가 1개인 트리

- 노드의 개수 :N

- root가 1에서 시작할때, i번째 노드에 대해서

  • parent(i) = i/2

  • left_child = 2i

  • right_child= 2i+1

    의 index 값을 갖는다.

종류

- `포화이진트리(Perfect binary tree) `: 모든 레벨이 꽉찬 이진 트리
- `완전 이진트리(Complete binary tree)`: 위에서 아래로, 왼쪽에서 오른쪽으로 순서대로 차곡차곡 채워진 이진트리
- `정 이진 트리(Full binary tree)`: 모든 노드가 0개 혹은 2개의 자식 노드만을 갖는 이진 트리

BST(Binary Search Tree)

특징

- 시간복잡도 : `O(log n)`, 트리의 높이를 하나씩 더해갈수록 노드의 수가 2배씩 증가 O(h)라 보아도 됨.
- `편향트리(skewed tree)`가 될 경우, 저장 순서에 따라 한쪽 노드만 추가되기 때문에 최악의 경우 시간 복잡도가 O(n), 배열보다 많은 메모리 사용

  • 이 문제 해결을 위해, `Rebalancing기법` 등장. 균형을 잡기 위한 트리구조의 재조정
  • 종류: Red-Black Tree

- 어떻게 찾을 것인가만을 고민하는 것이 아니라, 효율적인 탐색을 위한 저장방식이 무엇인가를 고민해야한다.

데이터를 저장하는 규칙

규칙1. 이진 탐색 트리의 노드에 저장된 키는 유일

규칙2. 루트 노드의 키가 왼쪽 서브 트리를 구성하는 어떠한 노드의 키보다 크다

규칙3. 루트 노드의 키가 오른쪽 서브트리를 구성하는 어떠한 노드의 키보다 작다.

규칙4. 왼쪽과 오른쪽 서브트리도 이진탐색 트리이다.

Binary Heap

특징

- tree의 형식
- 배열에 기반한 Complete Binary tree(완전 이진 트리)
- 루트노드 1부터 시작
- 시간 복잡도: O(1)
- random access 가능

- heapify 과정을 거쳐 heap구조를 유지하면, 시간 복잡도 O(log n)

힙 종류

- 최대 힙: 각 노드의 값이 해당 children의 값보다 크거나 같은 Complete Binary tree
- 최소 힙: 각 노드의 값이 해당 Children의 값보다 작거나 같은

Red Black Tree

특징

- 시간복잡도 : O(log n) -- 탐색, 삽입, 삭제
- 동일한 노드의 개수일 때, depth를 최소화하여 시간복잡도를 줄이는 것
- 동일한 노드의 개수일 떄, depth가 최소가 되는 경우의 tree: complete binary tree
- 루트 노드 부터 leaf 노드까지 모든 경로중 최소경로와 최대 경로의 크기 비율은 2보다 크지 않다. (balanced 상태)
- 노드의 child가 없을 경우, child를 가리키는 포인터는 NIL 값을 저장한다.

정의

  1. 각 노드는 red, black 색을 가짐

  2. leaf node는 black

  3. 어떤 노드의 색이 red면, children의 색은 모두 black

  4. 각 노드에 대해서 노드로 부터 descendant leaves까지의 단순 경로는 모두 같은 수의 black nodes들을 포함하고 있다. 이를 해당 노드의 black-height라고 한다.

삽입

- 삽입된 노드의 색깔은 red -> black-height 변경을 최소화하기 위함.
- 삽입 결과 RBT의 특성 위배(violation)시 노드의 색깔을 조정, Black-Height 가 위배되었다면 rotation을 통해 height를 조정
- RBT의 동이랗ㄴ height에 존재하는 internal node 들의 Black-hieght가 같아지게 되고 최소 경로와 최대 경로의 크기 비율이 2미만으로 유지된다.

삭제

BST의 특성을 유지하면서 해당 노드를 삭제. 삭제될 노드의 child의 개수에 따라 rotation방법이 달라지게 된다. 지워진 노드의 색이 Black이면 black-hieght가 1감소한 경로에 black node가 1개 추가되도록 rotation 하고 노드의 색깔의 조장한다, 지워진 노드의 색이 red면, violation이 발생하지 않으므로 RBT가 유지된다.

java collection에서 ArrayList/ HashMap에서 seperate chaining에서도 사용

Hash Table

hash는 내부적으로 배열을 사용해 데이터를 저장하기 때문에, 빠른 검색속도

특징

- 배열을 이용해 데이터 저장
- 시간복잡도 : O(N)
- 인덱스로 저장되는 key 값이 불규칙
- 특별한 알고리즘을 이용해 저장할 데이터와 연관된 고유한 숫자를 만들어 낸뒤 이를 인덱스로 사용한다.

Hash Func

hash method또는 해시 함수라고 하며, 이 메소드에 의해 반환된 데이터의 고유 숫자의 값을 hashcode라고 한다. 저장되는 값들의 key값을 hash func를 통해 **작은범위의 값들**로 바꿔준다.

collision: 서로 다른 2개의 키가 같은 인덱스로 hashing되면 같은 곳에 저장할 수 없게 된다.

hash func의 조건

- 키 전체를 참조해 해쉬값을 만들어 내는 것.
- 1:1로 무조건 바꾸는 것보다, collision을 최소화하는 방향으로 설계하는 것이 중요하다. 1:1대응으로 hash func을 만들면 메모리를 너무 차지할 뿐
- Collosion이 많아지면 시간복잡도가 O(1) -> O(n)에 가까워진다.

resolve confilct

  1. open Address(개방 주소법)

    해시 충돌이 발생하면, 다른 해시 버킷에 해당 자료를 삽입하는 방식.

    방법1. Linear probing 순차적으로 탐색하며 비어있는 버킷을 찾을 때까지 계속 진행

    방법2. Quadratic probing 2차 함수를 이용해 탐색할 위치를 찾음

    방법3. Double hashing probing 하나의 해쉬 함수에서 충돌일 발생하면 2차 해쉬함수를 이용해 새로운 주소를 할당한다. 많은 연산량을 요구

  1. Separate Chaining 방식(분리연결법)

​ 자바 7은 separate chaining 방식을 이용해 hashmap을 구현하고 있다.

​ 구현 방식

> 연결리스트를 사용하는 방식
>
> - 장점: 시간복잡도 줄어듬
> - 단점 : 연결리스트의 오버레드 증가, 테이블 확장을 늦출 수 있다.

> 트리를 사용하는 방식(RBT)
>
> 데이터가 많을 때 사용 (key-value값이 6/8이하인 경우)

Open Address vs Seperate Chaining

두 방식 모두 Worst Case: O(M)

개방 주소법은 연속된 공간에 데이터를 저장해서 캐시 효율이 좋다.데이터 개수가 적다면 개방주소법을 사용해서

**보조 해시함수**

key의 해시 값을 변형하여 해시 충돌가능성을 줄이는 것. seperate chaining 방식을 사용할 때 함께 사용되며ㅡ 보조 해시 함수로 worst case에 가까워지는 경우를 줄일 수 있다.

해시버킷 동적 확장(Resize)

해시 버킷의 개수가 적다면 메모리 사용을 아낄 수있지만 해시 충돌로 인해 성능상 손실이 발생

hashmap은 key-value 쌍 데이터 개수가 일정 개수 이상이되면 해시 버킷의 개수를 두배로 늘린다. 해시 충돌로 인한 성능 손실 문제를 어느정도 해결할 수 있다.

해시 버킷 크기를 두배로 확장하는 임계점을 데이터의 개수가 해시 버킷 개수의 75%, load factor `0.75`

Graph

구현방식

인접행렬 : 시간복잡도 O(1)

인접리스트: 시간복잡도 O(E+V)

DFS : 깊이 우선 탐색

시간복잡도 : O(V+E), V:vertext, E:edge

BFS : 너비 우선탐색

minimum spanning tree

spanning tree 중 edge weight 합이 최소인 spanning tree를 말한다. 그래프 모든 vertex가 cycle없이 연결된 상태

최소신장트리(MST)

Kruskal Algo

초기화 작업으로 edge 없이 vertex들만으로 그래프를 구성. weight가 제일 작은 edge부터 검토. edge set을 non-decreasing으로 sorting해야한다.

시간복잡도 O(eloge)

순서

  1. 간선들의 가중치 오름차순 정렬
  2. 사이클을 형성하는 간선 제외
  3. N-1개의 간선 생성 종료

https://gmlwjd9405.github.io/images/algorithm-mst/kruskal-example2.png

Prim Algo

시간복잡도 : O(ElogV)

순서

  1. 정점 선택을 기반으로 하는 알고리즘

  2. 인접 점정점 중 최소 간선으로 연결된 정점 선택

  3. N-1개의 간선이 생성되면 종료

https://gmlwjd9405.github.io/images/algorithm-mst/prim-example.png

사이클을 형성하는지 체크하는 것이 중요

'개발이야기 > 전공 기초' 카테고리의 다른 글

1. 개발 상식 정리  (0) 2020.03.16

해당 게시글의 모든 내용은 https://github.com/JaeYeopHan/Interview_Question_for_Beginner/blob/master/Development_common_sense/README.md 를 참고하여 작성되었음을 밝히는 바입니다.

객체 지향 프로그래밍이란 무엇인가?

인간 중심적 프로그래밍 패러다임으로, 현실세계를 프로그래밍으로 옮겨와 프로그래밍을 하는 것.

현실세계의 사물 = 객체

개발하고자 하는 애플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는 것 = 추상화

즉, 현실세계의 사물을 추상화해 프로그래밍 하는 것이다.

장점

  • 이미 작성한 코드에 대한 재사용성이 높다.

  • 로직을 라이브러리로 만들면 계속해서 사용할 수 있으며, 신뢰성 확보 가능

  • 개발자의 사소한 실수를 컴파일 단계에서 잡아 버그 발생이 줄어든다

  • 라이브러리 제공 기능을 사용할 수 있기 때문에 생산성이 높아진다.

  • 객체단위로 코드가 나누어지기 때문에 디버깅 용이 & 유지보수 용이

  • 데이터 모델링할 때 객체와 매핑하는 것이 수월해 요구사항을 명확히 반영

단점

  • 객체간 정보교환이 모두 메세지 교환을 통해 일어나 overhead 발생함

  • 객체가 상태를 갖게되어 변수를 통해 객체가 예측할 수 없는 상태를 갖게 되어 애플리케이션 내부에서 버그를 발생 (-> 함수형 패러다임이 주목받는 이유)

객체지향적 설계 원칙

클래스는 단 하나의 책임을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다.

OCP(Open-Closed Principle) 개방-폐쇄 원칙

확장에는 열려있어야 하고 변경에는 닫혀있어야 한다.

LSP(Liskov substitution Principle) 리스코프 치환 원칙

상위 타입의 객체를 하위 타입의 객체로 치환해도 상위타입을 사용하는 프로그램은 정상적으로 동작해야한다.

ISP(interface segregation principle) 인터페이스 분리 원칙

인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야한다.

DIP(dependency inversion principle) 의존 역전 원칙

고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.

SRP(single responsibility principle) 단일 책임 원칙

함수형 프로그래밍

immutable datafirst class citizen으로서의 function

immutable vs mutable

immutable: 말그래도 변경 불가능함을 의미. 객체가 가지고 있는 값을 변경할 수 없는 객체. 값이 변경될 경우, 새로운 객체를 생성하고 변경된 값을 주입하여 반환해야 한다.
mutable: 해당 객체의 값이 변경될 경우 값을 변경

first-citizen

함수형 프로그래밍 패러다임을 따르고 있는 언어에서의 함수(func)는 일급객체(first class citizen)으로 간주된다

  • 변수나 데이터 구조 안에 함수를 담을 수 있어서 함수의 파라미터로 전달할 수 있고, 함수의 반환값으로 사용할 수 있다
  • 할당에 사용된 이름과 관계없이 고유한 구별 가능
  • 함수를 리터럴로 바로 정의 가능

Reactive Programming

반응형 프로그래밍(reactive programming)은 선언형프로그래밍(declarative programming)이라고도 불리며, 명령형 프로그래밍(imperative programming)의 반대말이다. 반응형 프로그래밍은 기본적으로 스트림(stream)으로 본다. 스트림이란 값들의 집합으로 볼 수 있으며 제공되는 함수형 메서드를 통해 데이터를 immutable하게 관리할 수 있다.

RESTful API(REpresentational State Transfer)

월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식으로 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반에 대한 패턴

Resource Oriencted Architecture로 API 설계의 중심에 자원이 있고 HTTP Method를 통해 자원을 처리하도록 설계하는 것

6가지 원칙

  • uniform interface

  • stateless

  • caching

  • client-server

  • Hierarchical system

  • code on demand

RESTful하게 API를 디자인 한다는 것의 의미

1) 리소스(자원)은 URI로 표현됨. 리소스가 가리키는 것은 명사로 표현되어야 함
행위는 HTTP Method로 표현하고,

-   GET(조회)
    -   POST(생성)
    -   PUT(기존 entity 전체 수정)
    -   PATCH(기존 entity 일부 수정)
    -   DELETE(삭제)

2) Message는 Header와 Body를 명확하게 분리해서 사용

body: entity에 대한 내용  
header: 애플리케이션 서버가 행동할 판단의 근거가 되는 컨트롤 정보인 API 버전 정보, 응답받고자 하는 MIME 타입등  
분리 방법

```
 - http header/ http body
 - http header/ json
```

-   환경은 항상 변하기 때문에 API의 signature가 변경될 수 있음에 유의해야한다.

-   특정 API를 변경할 때는 반드시 하위호환성을 보장해야한다.

4) 서버와 클라이언트가 같은 방식을 사용해서 요청하도록 한다.
  • 3) API 버전 관리

  • 1) 리소스(자원)과 행위를 명시적/직관적 분류

  • URI가 플랫폼 중립적이어야 한다.

  • 장점

  • Open API 제공이 쉽다

  • 멀티플랫폼 지원 및 연동이 가능하다.

  • 원하는 타입으로 데이터를 주고받을 수 있다.

  • 기존 웹 인프라(HTTP)를 그대로 사용할 수 있다.

    단점

  • 사용할 수 있는 메서드가 4가지

  • HTTP 통신 모델에서만 지원

TDD

Test-Driven Development는 매우 짧은 개발 사이클의 반복에 의존하는 소프트웨어 개발 프로세스
개발자는 요구되는 새로운 기능에 대한 자동화된 테스트 케이스를 작성하고 해당 테스트를 통과하는 가장 간단한 코드를 작성한다. 일단 테스트 통과 코드를 작성하고 상황에 맞게 리팩토링하는 과정을 거치는 것.

테스트가 코드 작성을 주도하는 개발방식이다.

장점

  • 개발자가 코드를 작성하기 전에 보다 요구사항/명세에 집중할 수 있도록 도와줌(새로운 기능을 추가하기 전 테스트를 먼저 작성하기 때문)

  • 테스트 코드는 refactor code의 중심이 되어 리팩토링 속도와 코드 퀄리티를 향상시킨다.
    -> 보다 객체지향적인 코드/확장가능한 코드/재설계 시간을 단축하는 코드/디버깅 시간이 단축되는 코드 작성

    단점

    • 코드 퀄리티보다 빠른 생산성이 요구되는 경우(테스트 코드까지 작성해야하기 때문에 코드량이 늘어난다)
    • 팀원 전체가 테스트코드에 익숙해져야 한다.
    • 어떤 부분을/어떻게/무슨 프레임워크를 사용해 테스트 해야할지 정하는데 시간과 비용이 든다.
    • 테스트 코드에도 예상치 못한 예외가 있을 수 있다.

MVC 패턴

MODEL(모델) - CONTROLLER(컨트롤러) - VIEW(뷰)

1) CONTROLLER [조정자]

  • 클라이언트 요청을 받았을 때, 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트 호출

  • 클라이언트가 보낸 데이터는 모델에 전달하기 쉽게 데이터 가공

  • 결과를 뷰에 전달

    2) MODEL [역할]

  • 비즈니스 로직을 구현하는 영역, 데이터를 처리하는 부분

  • DB 연결, 데이터 추출/저장/삭제/업데이트/변환 등 작업

    3) View [출력]

  • 사용자에게 브라우저에 출력할 화면을 만드는 일을 한다.

    [https://ssup2.github.io/images/theory_analysis/MVC_MVP_Pattern/MVC_Pattern_Model1_with_JSP.PNG]

    참조

    GIT

    • VSC(version control system) : 버전 관리 시스템

'개발이야기 > 전공 기초' 카테고리의 다른 글

02_자료구조 정리  (0) 2020.03.16

1. OS에 맞는 docker 설치

https://www.docker.com/products/docker-desktop

 

2. 에러 발생?

window 10 home과 같은 경우 도커는 

 

위와 같은 에러가 나는 경우 2번 참조

 

2. Window 10 Home edition 에서 Docker 설치

 

도커는 리눅스에서 사용 가능한 가상화 컨테이너. 오라클 버추얼박스(VirtualBox) 등의 저수준 가상화 소프트웨어로 리눅스 운영체제를 가진 가상 컴퓨터를 만들거나 docker의 Docker Toolbox(Legacy desktop solution)를 설치하면 사용할 수 있다.

 

Docker Toolbox(Legacy desktop solution)를 설치

https://github.com/docker/toolbox/releases

 

docker/toolbox

The Docker Toolbox. Contribute to docker/toolbox development by creating an account on GitHub.

github.com

DockerToolbox-19.03.1.exe 를 설치한다.

 

# 설치 과정

ORM(Object Relational Mapping)이란?

Object(객체)와 Relation(관계형 데이터베이스)간의 불일치 문제를 해결하기 위한 도구

 

자바는 데이터베이스 서버에 접속해서 쿼리를 수행하고, 그 결과를 프로그램 상에서 사용할 수 있도록 JDBC(java database connectivity) API를 제공한다. 자바로 데이터 베이스 프로그래밍을 할 수 있는 API이자 명세다. ORM을 사용하지 않아도 제어가 가능하다

 

그럼에도 ORM을 쓰는 이유는?

- 코드의 반복을 줄일 수 있다.

- 객체 중심의 설계에 집중해서 개발을 진행할 수 있다.

 

1. Spring Data JPA

  JPA Spring Data Spring Data JPA
특징

관계형 데이터베이스 매핑이 대상

NoSQL 지원 x

Spring Data의 추상화된 인터페이스를 통해서 NoSQL, RDBMS 등 다양한 저장소 활용 가능

Spring Data 프로젝트의 하위 프로젝트, Spring을 쓰고있는 환경에서 적용이 쉽고, 추상화가 잘 되어있다.

 

의존성 추가

 

build.gradle에 spring-boot-starter-data-jpa 추가

 

 

2. Spring Data JPA의 Repository 구조

 

스프링을 사용할 때 자바 클래스 들을 'ApplicationContext'를 사용 -> Bean으로 등록, Context를 통해 제어 

ORM을 사용할 때는 Entity Manager로 영속성 콘텍스트를 제어 -> 자바 Object와 DB간 데이터 통신/동기화 제어 수행

 

1) Repository 인터페이스: base 역할

 - 아무 Method가 없다

 

2)  CrudRepository[상속받음: Repository] 

- save, find, delete 같은 db 조작 method 선언

 

3)  PagingAndSortingRepository[상속받음: CrudRepository]

- paging 처리할 수 있도록 find method의 Parameter에 sort객체와 pageable 객체 추가

 

4) JpaRepository[상속받음: PagingAndSortingRepository]

- db와 Object간 동기화를 할 수 있는 save, saveAndFlush Method 추가한 Interface

 

--> JpaRepository 인터페이스를 상속받으면 대부분의 기능을 구현할 수 있다. 

SpringData JPA의 각 인터페이스들은 공통적으로 @noRepository 가 선언되어 있다. 이 어노테이션은 사용자가 정의한 사용자가 정의한 Repository와 SpringData Repository인터페이스들을 구분해서 사용하기 위함.

 

노인인구증가에 따른 연령기준 상향 찬반논의 배경

 

 

: 우리나라가 초고령 사회로 돌입하는 것을 앞두고 노인연령의 기준을 높여야 한다는 목소리가 곳곳에서 나오고 있다. 최근 대법원에서 만 60세였던 육체노동자의 정년을 65세로 올리는 판결을 내리면서 노인연령의 기준도 상향해야한다는 목소리가 커지고 있다.

 

 

노인 연령의 기준을 올리자는데 찬성하는 입장 주요 논거 : 경제적 비용의 문제

 

 

1. 국민들에게 지속가능한 복지정책을 제공하려면 장기적인 관점에서 비용문제를 고민해보아야한다. 현재, 출산율을 줄어 노인들을 부양할 인구는 줄고 있는데 반해 초고령화사회로 진입하는 속도는 전세계에서도 손에 꼽히는 빠른 속도이다. 따라서, 지속적으로 복지정책을 유지하기 위해서는 단계적으로 연령 기준 상향을 진행해 재정적인 부담을 낮추어야 한다.

 

 

2. 현재 노인연령의 기준은 만65세는 현 시대적 기준에 맞지 않다. 노인연령이 만 65세로 정해진 시기는 1890년대 독일에서 처음 시행된 기준이다. 그 당시, 독일인의 기대 수명이 40세였던 것을 비교해보면, 오늘날에도 동일하게 해당 기준을 적용하기에는 무리가 있다. 오늘날 건강수명은 71세로 근로가 충분히 가능하다.

 

 

노인 연령 기준 상향에 반대하는 입장 주요 논거 : 노인의 기본권 보장

 

1. 노인 빈곤 문제 심각 : 노인 연령 기준을 만 70세로 올리게 되면 그 타켓이 되는 세대는 베이비부머세대일 것이다. 하지만 해당 새대는 국가도 해결하지 못하는 가난한 전후세대에 태어나 젊을 때는 부모를 봉양하고 자식 뒷바라지에 대부분 자금을 투자했다. 때문에, 노후 대비가 부족한 상태이다. 그런데, 자금이 부족할 것 같으니 연령을 올리면 노인빈곤 문제가 더 심각해질 것

 

2. 정책의 일관성이 떨어진다. 국가정책은 국민의 생애주기에 맞추어 제공되어야 하며, 그 과정에서 일관성이 필요하다. 국민들은 국가정책을 기반으로 자신의 생애 계획을 짜는 경우가 많기 때문이다. 그런데, 복지 수혜 연령이 되었을 때 갑작스럽게 연령을 상향하는 것은 문제가있다. 심한 경우 국민이 국가 정책을 신뢰하지 않게 될 수도 있다.

 

3. 노인들은 현 경제성장을 이끄는데 기여했기에 보상을 받아야한다. 현 노인세대들은 말그대로 전후 폐허상태였던 대한민국을 오늘날 경제대국 10위로 성장시키는데 큰 기여를 했던 산업의 역군이었다. 노인이 된 지금 베이비부머 세대에게 그 성과를 나누어주어야한다.

 

4. 노인 연령 기준 상향 말고 재정적인 문제를 해결할 수있다. 현 노인 세대를 위한 복지정책은 대부분 보편적 복지정책이다. 이를 재산, 소득등 선택적 복지정책으로 바꾸는 방법으로 재정적인 부담을 줄일 수있다.

 

5. 노인 연령 상향은 부익부빈익빈을 더욱 부추길 수있다. 국가 정책으로서 노인 정책을 시행할때 소요되는 비용은 세금이다. 이때, 세금은 소득에 따라 누진적으로 부과되기 때문에 가난한 사람들은 노인정책을 시행하더라도 부담하는 비용은 적다. 그러나 노인 기준 연령을 상향하게 되어 국가정책대상이 아니게되면, 노인의 자식들이 소득과 재산에 상관없이 실질적으로 노인 부양 비용을 부담하게 된다.

 

와나나베 부인이란 일본의 '잃어버린 20년'으로 불리는 경기불황기 속에서 해외 투자로 눈길을 돌린 투자가들을 이르는 말입니다. 최근 이와 비슷한 추세가 대한민국에서도 '김선생과 김여사'의 모습으로 나타나고 있습니다. 오늘 글에서는 해외투자가들이 증가하고 있는 요인에 대해 알아보고자 합니다.

 

 

 

 

 

 

아침 뉴스에서 미국이 너무 뜨겁지도 너무 차갑지도 않은 이른바 '골디락스 존'에 경기가 안착했다는 기사가 나왔습니다. 미국은 반세기만에 최저 실업률과 저 물가상승으로 역대급 경제호황을 누리고 있습니다. 이에, 미국의 주가가 상승하고 기업의 성장률 역시 높아지면서 주주에게 지급하는 배당금 역시 증가하고 있습니다.

 

 

 

더불어, 최근 미중무역전쟁, 대북 리스크 등으로 원화가치는 하락하여(환율 상승) 해외 투자시 환차익까지 누릴 수 있다는 점은 투자가의 눈길을 사로잡는 또 하나의 요인일 것입니다.

 

 

 

반면, 국내 증시는 국내 투자자의 눈길을 사로잡기는 부족해보입니다. 최근 수출부진으로 주식시장 역시 부진을 겪고 있으며, 장기적인 저금리 기조로 국내 투자가들에게 그 매력이 떨어지기 때문입니다. 

 

 

 

 

한국판 와나타베부인 '김선생과 김여사'는 해외에서 국내 투자자들이 주주로 활약할 수 있다는 긍정적인 요인도 찾을 수도 있지만, 국내에 투자되어야 할 자금이 해외로 빠져나가고 있다는 것을 의미한다는 점에서 문제가 발생할 수 있을 것입니다. 때문에, 현 현상이 씁쓸하게 느껴지기도 합니다.

 

 

+ Recent posts