<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>2_gyehong.log</title>
        <link>https://velog.io/</link>
        <description>Data!</description>
        <lastBuildDate>Sun, 06 Jun 2021 01:08:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>2_gyehong.log</title>
            <url>https://velog.velcdn.com/images/2_gyehong/profile/207aacef-0b6e-420c-b9cf-b5fb1cbf0547/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 2_gyehong.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/2_gyehong" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[CORS]]></title>
            <link>https://velog.io/@2_gyehong/CORS</link>
            <guid>https://velog.io/@2_gyehong/CORS</guid>
            <pubDate>Sun, 06 Jun 2021 01:08:14 GMT</pubDate>
            <description><![CDATA[<h2 id="cors란">CORS란?</h2>
<p>CORS는 Cross Origin Resource Sharing의 약자로 <strong>도메인</strong> 또는 <strong>포트</strong>가 다른 서버의 자원을 요청하는 메커니즘을 만한다. 하지만 동일 출처 정책(same-origin policy) 때문에 CORS 같은 상황이 발생하면 외부서버에 요청한 데이터를 브라우저에서 보안목적으로 차단한다. 그로 인해 정상적으로 데이터를 받을 수 없다.</p>
<h2 id="해결방법">해결방법</h2>
<p>물론 가장 쉬운 해결방법은 서버와 클라이언트가 같은 도메인과 포트를 사용하면 된다... :)</p>
<p>하지만 저는 localhost:3000 에서 react를 실행하였고 localhost:8080에서 spring을 실행하고 있었기 때문에 포트가 달라 CORS가 발생할 수 있는 상황이였다.</p>
<h3 id="허가방법">허가방법</h3>
<p><strong>1. Access-Control-Allow-Origin respose 헤더를 추가</strong>
간단하게 모든 클라이언트에 요청에 대한 cross-origin HTTP 요청을 허가하는 헤더를 추가해주면 된다. 하지만 RESTapi의 모든 응답에 일일히 추가하기에는 불편함이 있다.</p>
<p><strong>2. spring의 @CrossOrgin 을 추가하기</strong>
@CrossOrgin 어노테이션을 붙여주면 기본적으로 &#39;모든 도메인, 모든 요청방식&#39;에 대해 허용한다는 뜻이다. </p>
<h2 id="마치며">마치며</h2>
<p>CORS는 웹 개발을 할 때 기본이면서 중요한 이슈이다. 이번에 정리하면서 정확히 왜 발생하였는지 어떤 맥락에서 생긴 이슈인지 알게되면서 더 편하게 개발할 수 있을것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] ref : DOM에 이름 달기]]></title>
            <link>https://velog.io/@2_gyehong/React-ref-DOM%EC%97%90-%EC%9D%B4%EB%A6%84-%EB%8B%AC%EA%B8%B0</link>
            <guid>https://velog.io/@2_gyehong/React-ref-DOM%EC%97%90-%EC%9D%B4%EB%A6%84-%EB%8B%AC%EA%B8%B0</guid>
            <pubDate>Sun, 30 May 2021 12:41:45 GMT</pubDate>
            <description><![CDATA[<h2 id="ref-이해하기">ref 이해하기</h2>
<p> HTML에서는 DOM 요소에 이름을 달 때는 id를 사용한다. HTML에서 id를 사용하여 DOM에 이름을 다는 것 처럼 리액트 포르젝트 내부에서 DOM에 이름을 다는 방법이 바로 ref 이다.</p>
<h3 id="1-ref는-어떤-상황에서-사용하는지">1. ref는 어떤 상황에서 사용하는지</h3>
<p>바로 말 하자면** ref는 DOM을 꼭 직접적으로 건드려야 할 때 사용한다.** 이렇게 말하면 이해하기 어려워서 예제코드를 해보았다.
src 밑에 ValidationSample.css와 ValidationSample.js 파일을 만들었다.</p>
<p><strong>ValidationSample.css</strong></p>
<pre><code>.success {
    background-color: lightgreen;
}

.failure {
    background-color: lightcoral;
}</code></pre><p><strong>ValidationSample.js</strong></p>
<pre><code>import React, { Component } from &#39;react&#39;;
import &#39;./ValidationSample.css&#39;;
class ValidationSample extends Component {
    state={
        password : &#39;&#39;,
        clicked : false,
        validated : false
    }

    handleChange = (e) =&gt; {
        this.setState({
            password: e.target.value
        });
    }

    handleButtonClick= ()=&gt;{
        this.setState({
            clicked : true,
            validated : this.state.password === &#39;0000&#39;
        })
    }
    render() {
        return (
            &lt;div&gt;
                &lt;input
                    type=&quot;password&quot;
                    value = {this.state.password}
                    onChange = {this.handleChange}
                    className = {this.state.clicked ? (this.state.validated ? &#39;success&#39; : &#39;failure&#39;) : &#39;&#39;}
                /&gt;
                &lt;button onClick = {this.handleButtonClick}&gt;검증하기&lt;/button&gt;
            &lt;/div&gt;
        );
    }
}

export default ValidationSample;</code></pre><p>input에서는 onChange 이벤트가 발생하면 handleChange를 호출하여 state의 password 값을 업데이트하게 했다. button에서는 onClick 이벤트가 발생하면 handleButtonClick을 호출하여 clicked 값을 참으로 설정했고, validated 값을 검증 결과로 설정했다.</p>
<p><img src="https://images.velog.io/images/2_gyehong/post/839b0e79-35a1-4bad-834d-b2ed0fcb5345/%EB%A6%AC%EC%95%A1%ED%8A%B8.PNG" alt=""></p>
<p>0000을 입력하고 검증하기를 누르면 이런 결과가 나온다.</p>
<h4 id="dom을-꼭-사용해야-하는-상황은">DOM을 꼭 사용해야 하는 상황은</h4>
<ol>
<li>특정 input에 포커스 주기</li>
<li>스크롤 박스 조작하기</li>
<li>Canvas 요소에 그림 그리기 등</li>
</ol>
<p>이 있다. 이럴 때는 어쩔 수 없이 DOM에 직접적으로 접근해야 하는데, 이를 위해 바로 ref를 사용한다.</p>
<h3 id="2-ref-사용하기">2. ref 사용하기</h3>
<h4 id="21-콜백-함수를-통한-ref-설정">2.1 콜백 함수를 통한 ref 설정</h4>
<p>ref를 만드는 가장 기본적인 방법이다. ref를 달고자 하는 요소에 ref라는 콜백 함수를 props로 전달해 주면 된다. 다음은 사용 예시이다.</p>
<pre><code>&lt;input ref={(ref)=&gt;{this.input=ref}} /&gt;</code></pre><h4 id="22-createref를-통한-ref-설정">2.2 createRef를 통한 ref 설정</h4>
<p>또 다른 방법은 리액트에 내장되어 있는 createRef라는 함수를 사용하는 것이다.</p>
<pre><code>input = React.createRef();

handleFocus() =&gt;{
    this.input.current.focus();
}
render(){
    return(
            &lt;div&gt;
                &lt;input ref={this.input}/&gt;
        &lt;/div&gt;
        )
}</code></pre><p>나중에 ref를 설정해 준 DOM에 접근할 때는 this.input.current를 조회하면 된다. 콜백함수와 다른 점은 뒷부분에 .current를 넣어 주어야 하는 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 이벤트 핸들링]]></title>
            <link>https://velog.io/@2_gyehong/React-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%95%B8%EB%93%A4%EB%A7%81</link>
            <guid>https://velog.io/@2_gyehong/React-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%95%B8%EB%93%A4%EB%A7%81</guid>
            <pubDate>Fri, 28 May 2021 16:07:44 GMT</pubDate>
            <description><![CDATA[<h2 id="이벤트-핸들링-이해하기">이벤트 핸들링 이해하기</h2>
<p>사용자가 웹 브라우저에서 DOM 요소들과 상호 작용하는 것을 이벤트 라고 한다.</p>
<h3 id="1-리액트의-이벤트-시스템">1. 리액트의 이벤트 시스템</h3>
<p>리엑트의 이벤트 시스템은 웹 브라우저의 HTML이벤트와 인터페이스와 동일하기 때문에 사용법이 비슷하다. 하지만 주의해야 할 몇 가지 사항이 있다.</p>
<h4 id="1-주의-사항">1) 주의 사항</h4>
<ul>
<li>이벤트 이름은 카멜 표기법으로 작성한다.</li>
<li>이벤트에 실행할 자바스크립트 코드를 전달하는 것이 아니라, 함수 형태의 값을 전달한다.</li>
<li>DOM 요소에만 이벤트를 설정할 수 있다.</li>
</ul>
<h3 id="2-이벤트-핸들링-과정">2. 이벤트 핸들링 과정</h3>
<h4 id="1-컴포넌트-생성하기">1) 컴포넌트 생성하기</h4>
<p>src 밑에 EventPractice.js 파일을 다음과 같이 생성한다.</p>
<pre><code>import React, { Component } from &#39;react&#39;;

class EventPractice extends Component {
    render() {
        return (
            &lt;div&gt;
                &lt;h1&gt;이벤트 연습&lt;/h1&gt;
            &lt;/div&gt;
        );
    }
}

export default EventPractice;</code></pre><h4 id="2-onchange-이벤트-설정">2) onChange 이벤트 설정</h4>
<p>EventPractice.js에 계속하여 작성한다.</p>
<pre><code>import React, { Component } from &#39;react&#39;;

class EventPractice extends Component {
    render() {
        return (
            &lt;div&gt;
                &lt;h1&gt;이벤트 연습&lt;/h1&gt;
                &lt;input
                    type=&quot;text&quot;
                    name=&quot;message&quot;
                    placeholder=&quot;아무거나 입력하세요&quot;
                    onChange={
                        (e)=&gt;{
                            console.log(e.target.value);
                        }
                    }
                    /&gt;
            &lt;/div&gt;
        );
    }
}

export default EventPractice;</code></pre><p><img src="https://images.velog.io/images/2_gyehong/post/851f837c-38ec-409c-a2fa-b4728cea9dee/%EB%A6%AC%EC%95%A1%ED%8A%B8.PNG" alt="">
값이 바뀔 때마다 바뀌는 값을 콘솔에 기록한다.</p>
<p>이제 state에 input 값을 담고 버튼을 누르면 값을 공백으로 설정해보겠습니다. </p>
<pre><code>import React, { Component } from &#39;react&#39;;

class EventPractice extends Component {
    state={
        message:&#39;&#39;
    }
    render() {
        return (
            &lt;div&gt;
                &lt;h1&gt;이벤트 연습&lt;/h1&gt;
                &lt;input
                    type=&quot;text&quot;
                    name=&quot;message&quot;
                    placeholder=&quot;아무거나 입력하세요&quot;
                    value={this.state.message}
                    onChange={
                        (e)=&gt;{
                            this.setState({
                                message: e.target.value
                            })
                        }
                    }
                    /&gt;
                    &lt;button onClick={
                        ()=&gt;{
                            alert(this.state.message);
                            this.setState({
                                message:&#39;&#39;
                            });
                        }
                    }&gt;확인&lt;/button&gt;
            &lt;/div&gt;
        );
    }
}

export default EventPractice;</code></pre><p><img src="https://images.velog.io/images/2_gyehong/post/2521b942-d3cc-483a-a5f0-f6cbbc27efac/%EB%A6%AC%EC%95%A1%ED%8A%B8.PNG" alt=""></p>
<h4 id="3-임의-메서드-만들기">3) 임의 메서드 만들기</h4>
<p>앞에서 살펴본 주의 사항에 <strong>&quot;이벤트에 실행할 자바스크립트 코드를 전달하는 것이 아니라, 함수 형태의 값을 전달한다. &quot;</strong> 라고 했다.
그래서 이벤트를 처리할 때 렌더링을 하는 동시에 함수를 만들어서 전달해 주었습니다. 이번에는 이 방법 대신 함수를 미리 준비하여 전달하는 방식을 해보겠습니다. 성능은 거의 차이가 없지만, 가독성은 훨씬 높습니다.</p>
<pre><code>import React, { Component } from &#39;react&#39;;

class EventPractice extends Component {
    state={
        message:&#39;&#39;
    }
    constructor(props){
        super(props);
        this.handleChange = this.handleChange.bind(this);
        this.handleClick = this.handleClick.bind(this);
    }

    handleChange(e){
        this.setState({
            message: e.target.value
        })
    }
    handleClick(){
        alert(this.state.message);
        this.setState({
            message:&#39;&#39;
        });
    }
    render() {
        return (
            &lt;div&gt;
                &lt;h1&gt;이벤트 연습&lt;/h1&gt;
                &lt;input
                    type=&quot;text&quot;
                    name=&quot;message&quot;
                    placeholder=&quot;아무거나 입력하세요&quot;
                    value={this.state.message}
                    onChange={this.handleChange}
                    /&gt;
                    &lt;button onClick={this.handleClick}&gt;확인&lt;/button&gt;
            &lt;/div&gt;
        );
    }
}

export default EventPractice;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 컴포넌트]]></title>
            <link>https://velog.io/@2_gyehong/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</link>
            <guid>https://velog.io/@2_gyehong/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</guid>
            <pubDate>Wed, 26 May 2021 13:42:55 GMT</pubDate>
            <description><![CDATA[<h2 id="컴포넌트-이해하기">컴포넌트 이해하기</h2>
<p>컴포넌트의 기능은 단순한 템플릿 이상이다. 데이터가 주어졌을 때 이에 맞추어 UI를 만들어 주는 것은 물론이고 컴포넌트가 화면에서 나타날 때, 사라질 때, 변화가 일어날 때 주어진 작업들을 처리할 수 있다.</p>
<h3 id="1-컴포넌트-구조">1. 컴포넌트 구조</h3>
<p>컴포넌트는 함수형 컴포넌트와 클래스형 컴포넌트로 나뉜다.
다음 코드는 함수형 컴포넌트이다.</p>
<pre><code>import React from &#39;react&#39;;
import &#39;./App.css&#39;;

function App() {
  const name=&quot;리액트&quot;;
  return (
    &lt;div className=&quot;react&quot;&gt;{name}&lt;/div&gt;
  );
}

export default App;</code></pre><p>다음은 클래스형 컴포넌트이다. </p>
<pre><code>import React, { Component } from &#39;react&#39;;
import &#39;./App.css&#39;;

class App extends Component{
  render(){
    const name=&quot;리액트&quot;;
    return &lt;div className=&quot;react&quot;&gt;{name}&lt;/div&gt;
  }
}

export default App;</code></pre><p>둘이 구조는 다르지만 역할은 똑같다. 두 구조의 차이점으로는 클래스 컴포넌트의 경우 state 기능 및 라이프사이클 기능을 사용할 수 있다는 것이다. 또한 render함수가 꼭 있어야한다. </p>
<h3 id="2-props">2. props</h3>
<p>props는 properties를 줄인 표현으로 컴포넌트 속성을 설정할 때 사용하는 요소이다.</p>
<h4 id="1-props-사용해보기">1) props 사용해보기</h4>
<p>MyComponent.js 파일을 다음과 같이 새로 만듭니다.</p>
<pre><code>import React from &#39;react&#39;;

const MyComponent = props=&gt;{
    return &lt;div&gt;안녕하세요, 제 이름은 {props.name}입니다.&lt;/div&gt;
}

export default MyComponent;</code></pre><p>App.js도 다음과 같이 수정합니다.</p>
<pre><code>import React, { Component } from &#39;react&#39;;
import MyComponent from &#39;./MyComponent&#39;;

class App extends Component{
  render(){
    return &lt;MyComponent name=&quot;react&quot;&gt;&lt;/MyComponent&gt;
  }
}

export default App;</code></pre><p>그러면 props.name자리에 react가 들어가 &quot;안녕하세요, 제 이름은 react입니다.&quot; 라는 것이 렌더링된 것을 확인할 수 있다.</p>
<h3 id="3-state">3. state</h3>
<p>리액트에서 state는 컴포넌트 내부에서 바뀔 수 있는 값을 의미한다.
반면에 props는 컴포넌트가 사용 되는 과정에서 부모 컴포넌트가 설정하는 값이며, 컴포넌트 자신은 해당 props를 읽기 전용으로만 사용할 수 있다.
props를 바꾸려면 부모 컴포넌트에서 바꾸어 주어야 한다.
리액트에는 두 가지 종류의 state가 존재한다. 하나는 클래스형 컴포넌트가 지니고 있는 state이고, 다른 하나는 함수형 컴포넌트에서 useState라는 함수를 통해 사용하는 state이다.</p>
<h4 id="1-클래스형-컴포넌트의-state">1) 클래스형 컴포넌트의 state</h4>
<p>Counter.js 파일을 src밑에 생성하여 다음과 같이 작성한다.</p>
<pre><code>import React, { Component } from &#39;react&#39;;

class Counter extends Component {

    constructor(props){
        super(props);
        this.state={
            number:0
        };
    }
    render() {
        const {number}=this.state;
        return (
            &lt;div&gt;
                &lt;h1&gt;{number}&lt;/h1&gt;
                &lt;button
                    onClick={()=&gt;{
                        this.state({number:number+1});
                    }}
                &gt;
                    +1
                &lt;/button&gt;
            &lt;/div&gt;
        );
    }
}

export default Counter;</code></pre><p>constructor는 생성자 메소드이다. 클래스형 컴포넌트에서 생성자를 작성할 때는 반드시 super(props)를 호출해 주어야 한다. 이 함수가 호출되면 현재 클래스형 컴포넌트가 상속받고 있는 리액트의 Component 클래스가 지닌 생성자 함수를 호출해 준다.</p>
<p>그 다음에는 this.state 값에 초깃값을 설정해 준다.</p>
<p>render 함수에서  setState라는 함수를 사용했는데 이 함수가 state 값을 바꿀 수 있게 해준다.
<img src="https://images.velog.io/images/2_gyehong/post/c69a5f6a-b5a6-4f88-841b-2d8f8f23162d/%EB%A6%AC%EC%95%A1%ED%8A%B8.PNG" alt="">
버튼을 누르면 1씩 잘 올라간다.
또한 state 객체 안에는 여러 값이 있어도 된다.</p>
<h4 id="2-함수형-컴포넌트에서-usestate">2) 함수형 컴포넌트에서 useState</h4>
<p>src 디렉터리에 Say.js라는 파일을 다음과 같이 작성한다.</p>
<pre><code>import React, {useState} from &#39;react&#39;;

const Say=()=&gt;{
    const[message, setMessage]=useState(&#39;&#39;);
    const onClickEnter = () =&gt; setMessage(&quot;안녕하세요!&quot;);
    const onClickLeave = () =&gt; setMessage(&quot;안녕히 가세요!&quot;);

    return(
        &lt;div&gt;
            &lt;button onClick={onClickEnter}&gt;입장&lt;/button&gt;
            &lt;button onClick={onClickLeave}&gt;퇴장&lt;/button&gt;
            &lt;h1&gt;{message}&lt;/h1&gt;
        &lt;/div&gt;
    );
};
export default Say;</code></pre><p>useState 함수의 인자에는 상태의 초깃값을 넣어 준다.
함수를 호출하면 배열이 반환되는데, 첫 번째 원소는 현재 상태이고, 두번째 원소는 상태를 바꾸어 주는 함수이다. 세터 함수라고 부른다. 
그리고 Say컴포넌트를 App에서 렌더링해 보고 <strong>입장</strong> 버튼과 <strong>퇴장</strong> 버튼을 눌러 본다.
<img src="https://images.velog.io/images/2_gyehong/post/f05a54a5-d783-4973-8bcb-3cb337878141/%EB%A6%AC%EC%95%A1%ED%8A%B8.PNG" alt=""></p>
<p>또한 한 컴포넌트에서 useState를 여러번 사용해도 상관없다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] JSX]]></title>
            <link>https://velog.io/@2_gyehong/React-JSX</link>
            <guid>https://velog.io/@2_gyehong/React-JSX</guid>
            <pubDate>Mon, 24 May 2021 15:49:24 GMT</pubDate>
            <description><![CDATA[<h2 id="jsx-이해하기">JSX 이해하기</h2>
<p>jsx란 자바스크립트의 확장 문법으로 XML과 매우 비슷하게 생겼다. 브라우저에서 실행되기 전에 코드가 번들링되는 과정에서 바벨을 사용하여 일반 자바스크립트 형태의 코드로 변환된다.</p>
<h3 id="1-jsx의-장점">1. JSX의 장점</h3>
<h4 id="11-보기-쉽고-익숙하다">1.1 보기 쉽고 익숙하다.</h4>
<p>일반 자바스크립트만 사용한 코드와 JSX로 작성한 코드를 비교해 봅시다.
JSX를 사용하는 편이 더 가독성이 높고 작성하기도 쉽다고 느껴질 것입니다. 결국 HTML 코드를 작성하는 것과 비슷하기 때문일겁니다.</p>
<h4 id="12-더욱-높은-활용도">1.2 더욱 높은 활용도</h4>
<p>JSX에서는 우리가 알고있는 div나 span같은 HTML 태그를 사용할 수 있을 뿐만 아니라, 컴포넌트도 JSX안에서 작성할 수 있습니다.</p>
<h3 id="2-jsx-문법">2. JSX 문법</h3>
<h4 id="21-감싸인-요소">2.1 감싸인 요소</h4>
<p>App.js를 이렇게 작성해봤다. </p>
<pre><code>import &#39;./App.css&#39;;

function App() {
  return (
    &lt;h1&gt;리액트 안녕!&lt;/h1&gt;
    &lt;h2&gt;잘 부탁해~&lt;/h2&gt;
  );
}

export default App;</code></pre><p>그러면 오류가 뜨는 것을 확인할 수 있다. 이유는 요소 여러 개가 부모 요소 하나에 의하여 감싸져 있지 않기 때문이다. 이 오류를 다음과 같이 해결할 수 있다.</p>
<pre><code>import &#39;./App.css&#39;;

function App() {
  return (
    &lt;div&gt;
      &lt;h1&gt;리액트 안녕!&lt;/h1&gt;
      &lt;h2&gt;잘 부탁해~&lt;/h2&gt;
    &lt;/div&gt;
  );
}

export default App;</code></pre><p><img src="https://images.velog.io/images/2_gyehong/post/636fa875-3c73-4d34-95b2-2adbafd8fc67/%EB%A6%AC%EC%95%A1%ED%8A%B8.PNG" alt=""></p>
<h4 id="22-자바스크립트-표현">2.2 자바스크립트 표현</h4>
<p>자바스크립트 문법 또한 표현할 수 있다. JSX 내부에서 코드를 { } 로 감싸면 된다.
자바스크립트 값을 한번 더 렌더링 해보겠습니다.</p>
<pre><code>import React from &#39;react&#39;;
import &#39;./App.css&#39;;

function App() {
  const myNmae=&quot;계홍&quot;;
  return (
    &lt;div&gt;
      &lt;h1&gt;리액트 안녕!&lt;/h1&gt;
      &lt;h2&gt;난 {myNmae}이야, 잘 부탁해~&lt;/h2&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre><p><img src="https://images.velog.io/images/2_gyehong/post/317a396e-1d8b-4037-a9e3-ffe00e396c9c/%EB%A6%AC%EC%95%A1%ED%8A%B8.PNG" alt=""></p>
<h4 id="23-if문-대신-조건부-연산자">2.3 if문 대신 조건부 연산자</h4>
<p>JSX 내부의 자바스크립트 표현식에서 if문을 사용할 수 없다.
하지만 조건에 따라 다른 내용을 렌더링해야 할 때에 JSX밖에서 if문을 사용하여 사전에 값을 설정하거나, { } 안에 조건부 연산자를 사용하면 된다.</p>
<pre><code>import React from &#39;react&#39;;
import &#39;./App.css&#39;;

function App() {
  const name=&quot;리액트&quot;;
  return (
    &lt;div&gt;
      {name === &#39;리액트&#39;?(
        &lt;h1&gt;리액트입니다.&lt;/h1&gt;
      ):(
        &lt;h2&gt;리액트가 아닙니다.&lt;/h2&gt;
      )}
    &lt;/div&gt;
  );
}

export default App;
</code></pre><p>이렇게 코드를 작성하고 저장하면 브라우저에서 &#39;리액트입니다.&#39;라는 문구를 볼 수 있다. 하지만 name값을 다른 값으로 바꾸면 &#39;리액트가 아닙니다&#39;가 나타날 것입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링부트] 리액트와 연동하기]]></title>
            <link>https://velog.io/@2_gyehong/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%99%80-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@2_gyehong/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%99%80-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 23 May 2021 13:08:48 GMT</pubDate>
            <description><![CDATA[<h2 id="스프링-부트와-리액트-연동하기">스프링 부트와 리액트 연동하기</h2>
<p>리액트에서 요청을 보내고, 스프링 부트에서 데이터와 함께 리액트로 응답을 보내는 실습을 하려고 합니다. </p>
<h3 id="1-스프링-부분">1. 스프링 부분</h3>
<p>연동만 간단하게 확인하기위해 DB연동은 하지 않고, 객체를 하나 만들어서 이것을 DB라고 생각하고 진행하도록 하겠습니다. 
<img src="https://images.velog.io/images/2_gyehong/post/c7b01037-db3f-46ed-bcbd-d1dbfd9c5426/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.47.48.png" alt="">
다음으로 API를 컨트롤하는 코드입니다. &#39;/api/users&#39;라는 주소로 요청이오면 이를 매핑 받아서 객체를 리액트로 리턴합니다.
<img src="https://images.velog.io/images/2_gyehong/post/acbc5352-7ff2-43ba-bb5c-588aa5ae68b7/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.06.22.png" alt=""></p>
<h3 id="2-리액트-부분">2. 리액트 부분</h3>
<p>먼저 리액트 프로젝트 폴더에서 
<em>npm install axios --save
npm install http-proxy-middleware --save</em></p>
<p>package.json으로 가서 잘 설치됐는지 아래와 같이 확인합니다.<img src="https://images.velog.io/images/2_gyehong/post/cdd52eb1-5559-48e8-98d1-e40005ccc217/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.59.30.png" alt=""></p>
<p>그 다음에 setupProxy.js 파일을 하나 만든 후, 아래와 같이 입력합니다.
<img src="https://images.velog.io/images/2_gyehong/post/ae27f8ec-d97c-4e3b-90ce-6fb0c084a2b0/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.02.40.png" alt="">
다음으로 App.js 파일로 가서 axios로 &quot;<a href="http://localhost:8080/api/users&quot;%EB%A1%9C">http://localhost:8080/api/users&quot;로</a> 요청을 보내도록 코드를 작성합니다.
<img src="https://images.velog.io/images/2_gyehong/post/f2bd6e33-b250-4d43-b747-11f230e9d10c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.05.01.png" alt=""></p>
<h3 id="연동-확인하기">연동 확인하기</h3>
<p>스프링 부트와 리액트 연동의 준비가 완료됐습니다. 스프링 부트 서버와 리액트 서버를 실행시킵니다.
<img src="https://images.velog.io/images/2_gyehong/post/e921b93a-8ee4-4035-9eb8-eb4451e84b04/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.07.44.png" alt=""></p>
<h3 id="마치며">마치며</h3>
<p>리액트에서 axios를 활용해 스프링 부트로 요청을 보내고, 스프링 부트에서 요청에 대한 응답한 것을 확인할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링부트] Spring vs SpringBoot]]></title>
            <link>https://velog.io/@2_gyehong/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-Spring-vs-SpringBoot</link>
            <guid>https://velog.io/@2_gyehong/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-Spring-vs-SpringBoot</guid>
            <pubDate>Sat, 22 May 2021 14:30:27 GMT</pubDate>
            <description><![CDATA[<h2 id="1-spring-framework">1. Spring Framework</h2>
<p>스프링 공식 문서에서는 Spring Framework를 아래와 같이 설명한다.</p>
<blockquote>
<p>Spring Framework는 모든 종류의 배포 플랫폼에서 최신 Java 기반 엔터프라이즈 애플리케이션을 위한 포괄적인 프로그래밍 및 구성 모델을 제공합니다.</p>
</blockquote>
<blockquote>
<p>Spring의 핵심 요소는 애플리케이션 레벨에서의 인프라 지원입니다. Spring은 특정 배포 환경에 불필요한 연결 없이 팀이 애플리케이션 레벨 비즈니스 로직에 집중할 수 있도록 엔터프라이즈 애플리케이션 plumbing(규약)에 초점을 맞춥니다.</p>
</blockquote>
<p>이 말을 쉽게 말하자면 우리가 Spring Framework를 사용하여 기업용 애플리케이션을 보다 쉽게 만들 수 있다는 점이다.</p>
<h2 id="2-spring-boot">2. Spring Boot</h2>
<p>스프링부트 공식 문서에서는 Spring Boot를 아래와 같이 설명한다.</p>
<blockquote>
<p>Spring Boot는 단독 실행되는, 상용화 가능한 수준의 스프링 기반 애플리케이션을 쉽게 만들어 낼 수 있습니다. 최소한의 설정으로 스프링 플랫폼과 서드파티 라이브러리들을 사용할 수 있도록 하고 있습니다.</p>
</blockquote>
<p>우리는 SpringBoot를 사용하여 Spring기반 애플리케이션을 쉽게 만들 수 있다는 뜻이다.</p>
<h2 id="3-무엇을-해결하고자-등장했는지">3. 무엇을 해결하고자 등장했는지</h2>
<h3 id="1-spring-framework-1">1) Spring Framework</h3>
<p>   a) Dependency Injection(DI) - 의존성 주입
     - 객체 간 결합을 느슨하게 만든다.
     - 코드 재 사용성 증가 및 단위테스트가 용이
   b) 중복된 코드 제거
     - 비즈니스 로직에만 집중이 가능하다.</p>
<h3 id="2-spring-boot-1">2) Spring Boot</h3>
<p>&nbsp;Spring Framework는 기능이 많은만큼 환경설정 끝내면 반은 끝났다는 말이 있을정도로 환경설정이 복잡하다. 이에 어려움을 느끼는 사용자들을 위해 나온 것이 바로 SpringBoot이다.<br/>&nbsp;SpringBoot는 이러한 설정의 많은 부분을 자동화 하여 사용자가 편하게 활용할 수 있도록 돕는다.
해결하고자 하는 것
a) Auto Configuration 자동 실행
b) 쉬운 의존성 관리
c) 내장 서버</p>
<h2 id="4-두-프레임워크의-기능-차이점">4. 두 프레임워크의 기능 차이점</h2>
<h3 id="1-spring">1) Spring</h3>
<p>POJO 기반의 Enterprise Application 개발을 쉽고 편하게 할 수 있도록 한다.</p>
<ul>
<li>Java Application을 개발하는데 필요한 하부구조를 포괄적으로 제공</li>
<li>Spring이 하부구조를 처리하기 때문에 개발자는 Application개발에 집중 가능</li>
<li>동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공<h3 id="2-spring-boot-2">2) Spring Boot</h3>
스프링 부트는 빠른시간에 애플리케이션이 제품이 되도록 하는 것을 목표로 한다.</li>
<li>Actuator : 애플리케이션을 고수준에서 모니터링하고 추적 할 수 있도록 해준다.</li>
<li>Embedded Server Interarations : 서버가 애플리케이션에 통합되기 때문에 우리는 서버에 설치되는 별도의 서버를 가질 필요가 없다.</li>
</ul>
<h2 id="--마지막으로">- 마지막으로</h2>
<p>Spring과 Spring Boot는 <strong>라이브러리</strong>가 아니고 <strong>프레임워크</strong> 이다. 단순히 코드를 제공하는 것이 아니고 <strong>프로그래밍 방법</strong>을 제공한다. 이렇게 방법을 제공하면 개발자가 그에 맞춰 개발하기 때문에 획일화된 프로그램이 만들어진다고 생각했다. 하지만  이렇게 지원/제공하는 방식으로 개발하지 않는다면  유지보수를 하는데에 어마어마한 비용이 들것이다.
따라서 특정 목적을위한 프로그램을 만드는 데에 있어서 정형화된 방식은 효율성을 극대화 시켜준다. 웹 서비스 구축 경험이 없는 초보자도 Spring Boot를 기반으로 개발한다면 정말 빠르고 간편하게 서비스를 만들어서 배포, 운영까지 할 수 있을 것이다.</p>
]]></description>
        </item>
    </channel>
</rss>