반응형

에러를 해결하고 추가적으로 stash를 학습하도록 하겠습니다.

 

깃 사용 중 에러가 발생했습니다. 상황은 이렇습니다.

로컬에서 작업 중인 파일 또는 새롭게 생성한 파일들이 존재합니다.

그리고 깃헙으로부터 코드를 pull을 진행했는데 다음과 같은 에러가 발생했어요.

 

error: The following untracked working tree files would be overwritten by merge:

 

기존에 작업 한 파일들이 존재해서 pull이 안되었습니다. 기존 작업한 파일들을 저장하고 pull을 받아오고 싶습니다.

다음과 같은 방법으로 해결하겠습니다.

기존 작업한 파일들을 깃에서 트래킹 할 수 있도록 add 명령어를 실행해주세요.

add 명령어를 수행했다면 stash 명령어를 통해서 현재 작업을 저장해주세요.

다음으로 pull 명령어를 수행해주면 정상적으로 수행이 될 것입니다.

git add *
git stash
git pull

 

stash 명령어를 통해서 pull 이전의 작업을 저장했기 때문에 다시 불러올 수 있도 있습니다.

 

에러도 해결한김에 stash 명령어도 학습하겠습니다.

 

1. git stash <- 작업 저장

git에서 트래킹이 되는 파일들 중 저장된 파일들 임시 저장소에 저장합니다.

우리는 pull 전에 변경한 작업에 대해서 임시로 저장했습니다.

 

2. git stash list <- stash 리스트 확인

현재 stash에 저장된 리스트를 확인할 수 있습니다.

3. git stash apply <- 리스트 맨 위에 있는 리스트 갖고 오기

특정 stash를 불러오길 원할 경우에는 stash를 명시해주세요 e.g) git stash apply stash@{4}

stash apply 명령어를 통해서 이전 파일들을 불러왔는데 conflict가 발생을 했습니다. 이전 로컬에서 한 작업과 pull 파일들이 충돌이 일어났습니다. git status 명령어를 통해서 현재 상태를 보겠습니다.

새로운 파일 하나와, 머지가 안된 파일들이 있습니다. 에디터 툴을 이용해서 파일을 열어보면 아래의 모습이었습니다.

현재 변경과 stashed 된 파일들이 충돌이 일어난 모습인데요.

이제는 필요로 한 부분만 남겨주시고 직접 소스 코드를 정리하시면 완료 됩니다 :)

 

 

반응형
반응형

안녕하세요.

저번 시간에는 리액트 네이티브를 구동하고 기본적인 데이터의 흐름을 살펴봤습니다.

이번 시간에는 리액트 네이티브 화면 구성을 어떻게 하는지 기본적인 스타일과 면적을 결정하는 방법을 보도록 하겠습니다.

Style

모든 코어 컴포넌트들은 style prop를 사용할 수 있습니다. 스타일의 이름과 값은 웹에서 사용되는 css와 동일하지만 다른 점이 있습니다. 표기할 때 낙타 법 표기법으로 사용합니다. 예시를 들자면 background-color대신 backgroundColor를 사용합니다.

예시 코드를 보도록 하겠습니다.

import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';

const styles = StyleSheet.create({
  container: {
    top: 30,
    alignItems: 'center',
  },
  bigBlue: {
    color: 'blue',
    fontWeight: 'bold',
    fontSize: 30,
  },
  red: {
    color: 'red',
  },
});

export default class LotsOfStyles extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.red}>just red</Text>
        <Text style={styles.bigBlue}>just bigBlue</Text>
        <Text style={[styles.bigBlue, styles.red]}>bigBlue, then red</Text>
        <Text style={[styles.red, styles.bigBlue]}>red, then bigBlue</Text>
      </View>
    );
  }
}

Text 컴포넌트 내부에 스타일을 줄줄이 바로 작성할 수도 있습니다. 예제 코드와 무언가 빠르게 확인할 때는 유용합니다. 하지만 가독성과 코드 작성의 편리성을 위해서 styles이라는 배열을 만들어서 컴포넌트에다가 디자인 작업을 진행합니다. 스타일 배열을 만들어 놓고 필요로 하는 스타일을 입혀주시면 됩니다.

View 컴포넌트에는 container 스타일을 줘서 View 내부에 모든 컴포넌트에 적용을 하였고, Text 컴포넌트에는 원하는 스타일만 주는 모습도 보실 수 있습니다.

 

* Text 컴포넌트 스타일 참고자료

http://reactnative.dev/docs/text

 

Height and Width

화면의 면적 크기를 조절할 수 있는 방법들을 배우겠습니다.

크기를 조절하는 방법은 면적을 고정시키는 방법(Fixed Dimensions)과 스크린 크기의 따라 상대적으로 면적을 결정하는 방법(Flex Dimensions)으로 이렇게 2가지 방법이 있습니다. 

어떻게 높이와 너비를 조절할 수 있을지 학습하도록 하겠습니다.

Fixed Dimensions

어떻게 화면의 크기를 고정시킬지에 대한 방법을 보겠습니다.

import React, { Component } from 'react';
import { View } from 'react-native';

export default class FixedDimensionsBasics extends Component {
  render() {
    return (
      <View>
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 100, height: 100, backgroundColor: 'skyblue'}} />
        <View style={{width: 150, height: 150, backgroundColor: 'steelblue'}} />
      </View>
    );
  }
}

View 컴포넌트를 사용해서 블록들을 구분 지어줍니다. 면적을 고정시키기 위해서 width, height 스타일을 직접 명시를 해주시면 됩니다. 블록의 구분을 위해서 배경색도 부여했습니다 :) 크게 어렵지 않죠?

 

Flex Dimensions

우리의 모바일은 수십 가지의 종류가 있습니다. 그렇기에 화면의 크기도 모두 달라지는데요. 컴포넌트별로 상대적으로 크기를 지정해줄 필요성이 있습니다. 위의 방식으로 크기를 고정시켜놓으면 모바일에 따라 스크린이 크던 작던 크기가 고정되어 보입니다. 그럼 사용자는 좋지 않은 UI 구성을 보게 되는데요.

이런 문제를 해결하고자 화면 크기별에 따른 상대적으로 면적을 지정하는 방법이 있습니다. 스타일에 flex라는 속성을 부여해주시면 돼요.

import React, { Component } from 'react';
import { View } from 'react-native';

export default class FlexDimensionsBasics extends Component {
  render() {
    return (
      <View style={{height: 300, top: 50}}>
        <View style={{flex: 1, backgroundColor: 'powderblue'}} />
        <View style={{flex: 2, backgroundColor: 'skyblue'}} />
        <View style={{flex: 3, backgroundColor: 'steelblue'}} />
      </View>
    );
  }
}

쉬운 이해를 위해서 코드와 화면을 같이 보겠습니다. 첫 번째 전체 뷰에는 고정된 높이 300 그리고 화면을 잘 보기 위해서 탑으로부터 떨어질 수 있도록 top 50을 부여했습니다.

전체 뷰 높이를 300으로 고정시켜 놓고 내부에 3개의 뷰 3개를 선언을 해놓았는데요. 이 내부 뷰에는 모두 flex를 부여했습니다. flex는 주어진 스크린의 상대적인 크기를 나눠 갖습니다. 각 뷰들의 비율은 부모 높이 300이라는 크기 안에서 1:2:3이 되는 겁니다.

 

기본적인 flex에 대한 내용을 익혔습니다.

다음 시간에는 조금 더 flex를 잘 사용하기 위한 여러 옵션들을 살펴보도록 하겠습니다.

감사합니다.

 

* 리액트 네이티브 공식 문서

http://reactnative.dev/docs/getting-started

 

반응형
반응형

튜토리얼을 참고하면서 리액트 네이티브 학습을 시작하겠습니다.

이번 시간에는 리액트 네이티브의 기본 틀을 보고 props와 state를 보도록 하겠습니다.

 

1. Hello World

가장 기본적인 Hello World를 보는 코드입니다.

import React, { Component } from 'react';
import { Text, View } from 'react-native';

export default class HelloWorldApp extends Component {
  render() {
    return (
      <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
        <Text>Hello, world!</Text>
      </View>
    );
  }
}

코드는 JS로 작성이 됩니다. RN은 ES2015(ES6-구 JS가 아닌 신 JS버전을 뜻합니다)를 지원합니다. 그렇기에 ES6로 JS 코드로 작성을 해주셔야 됩니다. 익숙지 않은 구조가 보입니다. 리액트를 학습을 하셨다면 아시겠지만 JS에서 사용하지 않는 문법인 JSX 문법이 있습니다. 리턴 안에 보시면 <View><Text>Hello, World!</Text></View> 코드가 있습니다.

JSX는 리액트(네이트브)에서 사용되는 문법으로써 JS에 XML을 사용하는 문법입니다. <View>, <Text>는 흔히 html에서 사용하는 <div>, <span> 사용하는 태그처럼 리액트(네이티브)에서 사용되는 태그들입니다.

HelloWorldApp은 컴포넌트입니다. 리액트는 컴포넌트 기반으로 코드를 작성합니다. 컴포넌트는 화면을 보여주는 하나하나의 구성입니다. 지금은 Hello World! 를 보여주는 컴포넌트입니다. 컴포넌트는 render() 함수를 필요로 하고 이는 JSX를 리턴이 됩니다.

 

2. Props

Bannas라는 컴포넌트를 만들었습니다.

import React, { Component } from 'react';
import { StyleSheet, Text, View, Image } from 'react-native';

class Bananas extends Component {
  render() {
    let pic = {
      uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg'
    };
    return (
      <Image source={pic} style={{width: 193, height: 110}}/>
    );
  }
}

export default function App() {
  return (
    <View style={styles.container}>
      <Text>Hello World!</Text>
      <Bananas />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    backgroundColor: '#fff',
    alignItems: 'center',
    top: 30
  },
});

RN에서 기본적으로 제공이 되는 Image 컴포넌트를 사용해서 Bananas 컴포넌트 코드를 작성하였습니다.

Bananas컴포넌트에는 pic라는 변수를 만들어서 Image에 넘겨주었는데요.

프로퍼티를 줄여서 props라고 부르는데 pic(사진을 갖고 있는 주소 값)를 source라 불리는 props로 값을 넘겨주었습니다.

Image 컴포넌트 내부에서는 source props를 내부에서 사용하여 화면에 출력이 될 것입니다.

여기서 또 알 수 있는 것이 JSX 내부에서는 변수 또는 JS문법을 " {} " 로 감싸서 사용하실 수 있습니다.

 

위에서는 props로 값을 전달을 해주었는데요.

우리의 컴포넌트를 만들어서 직접 props를 사용해보도록 하겠습니다.

import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';

class Greeting extends Component {
  render() {
    return (
      <View style={{alignItems: 'center'}}>
        <Text>Hello {this.props.name}!</Text>
      </View>
    );
  }
}


export default function App() {
  return (
    <View style={styles.container}>
      <Text>Hello World!</Text>
      <Greeting name= "Jun"/>
      <Greeting name= "Alice"/>
      <Greeting name= "Tom"/>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    backgroundColor: '#fff',
    alignItems: 'center',
    top: 30
  },
});

Greeting이라는 컴포넌트를 만들었습니다. name이라는 props를 사용하는 모습을 보실 수 있는데요. Greeting컴포넌트에서는 this.props.name이라는 코드를 사용해서 이름들을 출력을 해줍니다.

props는 호출하는 컴포넌트에(App)서 전달받고, 전달받는 쪽(Greeting)에서는 "this.props"로 전달받게 됩니다.

여기서 또 JSX 내부에서 {}를 씌어 JS를 사용하시는 모습도 보실 수 있으시고요. View는 스타일과 레이아웃을 잡을 때 자주 사용하는 컴포넌트입니다.

이렇게 props를 사용해주시면 컴포넌트를 다른 컴포넌트에서도 재사용하실 수 있습니다. props가 단순히 부모로부터 전달받는 데이터가 아닌 재사용을 위한 프로퍼티라는 의미도 잘 봐주세요 :)

 

3. State

리액트에서 데이터를 다루는 방법은 2가지가 있습니다. 첫 번째로는 위에서 설명드린 props와 두 번째는 이번에 설명드릴 state입니다. props 값은 부모로부터 전달받고 컴포넌트의 생명주기 동안에 값이 고정이 됩니다.

이와 다르게 변화되는 값을 다루기 위해서는 State를 사용하셔야 됩니다. 일반적으로는 state값은 생성자에서 초기화를 하고 setState() 함수를 통해서 값을 변경합니다. state값은 직접 변경하지 않습니다.

예제 코드를 보도록 하겠습니다.

import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';

class Blink extends Component {

  componentDidMount(){
    // Toggle the state every second
    setInterval(() => (
      this.setState(previousState => (
        { isShowingText: !previousState.isShowingText }
      ))
    ), 1000);
  }

  //state object
  state = { isShowingText: true };

  render() {
    if (!this.state.isShowingText) {
      return null;
    }

    return (
      <Text>{this.props.text}</Text>
    );
  }
}

export default function App() {
  return (
    <View style={styles.container}>
      <Text>Hello World!</Text>
      <Blink text='I love to blink' />
      <Blink text='Yes blinking is so great' />
      <Blink text='Why did they ever take this out of HTML' />
      <Blink text='Look at me look at me look at me' />
    </View>
  );
}

(스타일 코드는 위와 동일합니다)

Blink 컴포넌트를 App에서 호출합니다. 이때 text props를 전달해주는 모습도 보실 수 있습니다.

state를 초기화(state = { isShowingText: true })를 해준 이후에 render가 됩니다.

컴포넌트가 마운트 된다면 componentDidMount() 함수가 호출되는데 이때, setInterval 함수를 통해서 isShowingText 값을 스위칭시켜주고 있습니다. setState() 함수를 통해서 말이죠.

setState() 함수가 호출될 때 BlinkApp 컴포넌트는 다시 렌더가 됩니다.

 

다시 렌더가 될 때마다 isShowingText 값이 true인지 false인지 따라서 <Text> 또는 null이 렌더가 됩니다. 그럼 화면이 깜박깜박 되겠죠:)

실제 개발에서는 state변경을 사용자 입력 또는 서버로부터의 응답을 받아서 setState() 됩니다. 이점 참고를 해주세요.

실제 모습은 깜박입니다 :)

 

 

이번 시간에는 React Native의 기본 모습과 props와 state를 학습했습니다.

정말 중요한 개념들이니 꼭 숙지를 해주셔야 됩니다.

감사합니다.

 

 

* 리액트 네이티브 튜토리얼

http://reactnative.dev/docs/tutorial

 

* 리액트 라이프 사이클

https://reactjs.org/docs/react-component.html

 

반응형
반응형

aws 프리티어를 사용하고 있습니다.

기존 용량을 넘치지 않게 조심조심하면서 사용하고 있었는데 조금씩 금액이 오르고 있는 모습을 봤습니다.

 

그렇게 어떤 부분이 사용량이 넘치는지 살펴봤는데요.

아니 아무리 봐도 사용량이 넘치지 않는데 왜... 과금이 되고 있을까요.

 

아래 사진은 정확히 과금이 되는 부분입니다.

USD 0.131 per GB-month of provisioned GP2 storage

RDS 부분에서 스토리지 20GB가를 넘치게 사용하지 않았습니다. 그래서 문의를 했습니다. 분명 스토리지를 저만큼 사용하지 않는데 금액이 나가고 있다고 말이죠.

아마존 답변은 정말 친절하게 이야기를 해줍니다.

바로 "하나의 RDS 인스턴스의 20GB 스토리지가 주어진다"입니다. 사실 하나의 인스턴스를 만든 게 아니고 여러 개의 인스턴스를 만들었습니다.

두 번째 인스턴스부터는 과금입니다. 하나의 RDS 인턴스는 프리티어에 허용범위나 동시에 두 번째 RDS를 설치하고 사용하는 만큼은 금액이 나가는 것입니다. 2개 합쳐서 20GB를 사용하지 않더라도 말이죠.

 

이렇게 과금을 하면서 또 하나 배우게 되었습니다 :)

프리티어를 사용하시면서 조심해야 될 것이 과금의 범위가 생각보다 넓습니다. 정말 기본적인 인스턴스를 하나씩 띄어서 사용하지 않는 이상 잘 살피면서 사용을 하셔야겠습니다.

 

그리고 또 하나 팁으로 말씀드립니다.

처음 aws 사용하실 때 주의하셔야 될 게 있습니다. 바로 지역입니다!!

오른쪽 상단 지역에 따라 서버가 숨겨져?? 있어 이 부분에 대해서 유의를 해주셔야 되는데요. 미국에 서버를 하나 만들어 놓고 잊고 있다가 한국에 만드는 경우가 있습니다. 이런 경우도 과금에 주의해주세요.

 

그래도 이런 과금에 무서워 포기하는 것이 아닌 조심스럽게 하나씩 하나씩 배워나가야겠습니다.

도움이 되셨으면 합니다:)

감사합니다.

반응형
반응형

안녕하세요.

PostgreSql를 설치하고 접속하는 방법을 알아보도록 하겠습니다.

어렵지 않으니 차근차근 설치를 하시면 되겠습니다 :)

 

1. PostgreSQL 설치

아래 홈페이지로 이동해주세요.

https://www.postgresql.org/download/

공식 홈페이지로 들어오셔서 아래 윈도우를 클릭해주세요.

 

12.1 버전인 현재 최신 버전으로 다운로드하도록 하겠습니다.

다운로드를 하으셨다면 파일을 열어주세요.

경로는 기본으로 놓고 Next 버튼을 눌러 넘어가겠습니다.

 

설치 이후에 포스트그레스 디비에 접속을 할 수 있도록 패스워드를 적어주세요.

패스워드는 꼭 기억해주세요 :)

 

포트번호는 기본(디폴트)으로 변경 없이 진행해주세요.

 

지역은 Korean, Korea로 선택을 해주세요.

 

설치를 하기 전 설치 정보입니다. 한번 쓱 봐주시고 Next, Next를 눌러주세요.

 

설치가 진행 중입니다. 설치하는데 시간이 조금 소요되니 참고해주세요.

 

설치가 모두 완료되었습니다. 마지막으로 Stack Builder 추가 관련해서 묻는데 체크박스 선택을 해제하시고

완료를 눌러주세요.

PostgreSQL 설치를 완료하였습니다!!

설치가 잘 되었는지 접속을 해보도록 하겠습니다.

 

2. PostgreSQL 접속 (pgadmin4)

접속을 하는 방법은 2가지가 있습니다. 첫 번째로는 GUI를 제공하는 pgAdmin을 통해서 접속해보겠습니다.

시작 페이지로 이동하셔서 pgAdmin4를 찾아주세요. pgAdmin은 포스트그레스 설치 시 같이 설치가 됩니다:)

설치하신 PostgreSQL 디렉터리에 있습니다. (또는 pgAdmin 검색)

pgAdmin은 웹브라우저 위에서 열립니다. 크롬이나 파이어폭스를 선택해주세요.

 

설치하셨을 때 입력하신 비밀번호를 입력해주세요.

 

왼쪽에 서버를 클릭해주세요. 그럼 아래와 같이 패스워드 입력 창이 열립니다.

접속을 하기 위해서 다시 한번 패스워드를 똑같이 입력해주세요.

 

이제는 아래와 같이 데이터베이스가 정상적으로 설치가 되었고 모니터링이 되는 모습을 보실 수 있습니다 ^^

3. PostgreSQL 접속 (shell)

2번 방법처럼 pgadmin4로 접속을 하셔도 되고 CLI방법이 편하신 분은 shell로 접속을 해주셔서 사용을 하셔도 됩니다 :)

시작페이지로 이동하셔서 SQL Shell(psql)을 찾아주세요.

설치하신 PostgreSQL 디렉터리에 있습니다.

 

 

SQL shell 창이 열립니다. Server / Database / Port / Username 모두 디폴트로 설치를 하셨기 때문에 엔터를 쳐주세요. 그리고 패스워드에서는 설치할 때 입력하신 패스워드를 입력해주시면 됩니다.

 

정상적으로 설치가 되었고 DB에 접속을 하신 모습을 보실 수 있겠습니다 :)

PostgreSql 설치를 알아봤습니다.

설치하시면서 도움이 되셨으면 좋겠습니다.

감사합니다 :)

반응형

+ Recent posts