<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jeon_131.log</title>
        <link>https://velog.io/</link>
        <description>개발공부📚</description>
        <lastBuildDate>Tue, 28 Jun 2022 15:05:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jeon_131.log</title>
            <url>https://velog.velcdn.com/images/jeon_131/profile/e5822b6b-7413-4275-b4f5-83e43dd1ef31/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jeon_131.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jeon_131" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JPA란 무엇일까? - (JPA의 개념, 사용 이유)]]></title>
            <link>https://velog.io/@jeon_131/JPA%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-JPA%EC%9D%98-%EA%B0%9C%EB%85%90-%EC%82%AC%EC%9A%A9-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@jeon_131/JPA%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-JPA%EC%9D%98-%EA%B0%9C%EB%85%90-%EC%82%AC%EC%9A%A9-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Tue, 28 Jun 2022 15:05:40 GMT</pubDate>
            <description><![CDATA[<h2 id="-jpa의-개념"># JPA의 개념</h2>
<blockquote>
<p>JPA는 Java Persistance API로 현재 자바 진영의 ORM 기술 표준입니다. 자바 애플리케이션과 JDBC 사이에서 동작하며 쿼리를 자동으로 생성해줍니다.
<span style="color:#ff4d4d; font-size: 10pt;">ORM: Object-relational mappin(객체 관계 매핑)으로 객체와 관계형 DB를 매핑해주는 프레임워크입니다.</span></p>
</blockquote>
<h2 id="-jpa-사용의-이유"># JPA 사용의 이유</h2>
<p>JPA를 사용하기 이전에 개발자들은 SQL문을 일일히 작성해줘야하는 번거로움이 있었습니다. 한 객체를 만들면 그 객체의 CRUD 쿼리를 모두 작성해줘야했는데, 이때 객체가 수십개로 늘어난다면 그만큼 개발자가 작성해야 할 쿼리문이 늘어나 개발 효율이 떨어지게 됩니다. 이런 불편함을 해결해주는 것이 JPA입니다.</p>
<ul>
<li><p>SQL중심 개발에서 <strong>객체 중심 개발</strong>을 하여 생산성을 높일 수 있습니다.</p>
<ul>
<li>저장: jpa.persist(객체)</li>
<li>조회: jpa.find(객체_id)<ul>
<li>수정: 객체.setName(&quot;변경할 이름&quot;)<ul>
<li>삭제: jpa.remove(객체)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>기존에는 필드 변경 시 모든 쿼리를 수정해야했지만, JPA를 사용하면 JPA가 자동으로 쿼리를 수정하기 때문에 <strong>유지보수가 용이</strong>합니다.</p>
</li>
<li><p>패러다임의 불일치 해결
<em>해당 내용은 아래에서 더 자세히 다루겠습니다.</em></p>
</li>
</ul>
<h2 id="-패러다임-불일치-해결"># 패러다임 불일치 해결</h2>
<p>데이터베이스는 데이터를 중심으로 구조화 되어있습니다. 따라서 객체의 상속 및 다형성과 같은 개념이 없습니다. 즉, 객체와 데이터베이스가 지향하는 점이 다른데, 이를 객체와 데이터베이스의 패러다임 불일치라고 합니다. <br/>
이를 JPA가 대신 해결해줍니다.</p>
<h4 id="-상속">* 상속</h4>
<p><img src="https://velog.velcdn.com/images/jeon_131/post/f8a7f83e-c885-4bdd-a5e5-9cfc0eeb15b6/image.png" alt=""></p>
<p>예를 들어 위와 같은 상속 관계를 가지는 객체와 DB가 준비되어있습니다.</p>
<pre><code class="language-java">// 저장.
jpa.persist(album);
// INSERT INTO ITEM ...
// INSERT INTO ALBUM ...

// 조회.
jpa.find(Album.class, albumId);
// SELECT I.*, A.*
//   FROM ITEM I
//      JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID</code></pre>
<p>위와 같이 jpa를 이용해 작업을 진행하면 jpa가 객체의 상속 등 관계에 따라 여러 개의 쿼리를 보내거나 복잡한 쿼리를 만들어 보냅니다.</p>
<h4 id="-연관-관계">* 연관 관계</h4>
<p>객체를 테이블에 맞게 모델링 하는 경우와 객체 지향에 따라 모델링하는 경우에 따라 다른 문제가 나타납니다.
객체를 테이블에 맞게 모델링하는 경우, 객체지향이라는 특징을 잃게 되며 모델링이 복잡해집니다.
반대로 객체 지향에 따라 모델링하는 경우, 서로 다른 모양의 객체가 만들어지며, 이를 맞춰가는 코드를 또 한번 작성해야 하는 비용이 요구됩니다.</p>
<pre><code class="language-java">// 객체를 테이블에 맞게 모델링.
class Member {
 String id; //MEMBER_ID 컬럼 사용
 Long teamId; //TEAM_ID FK컬럼 사용
 String username; //USERNAME 컬럼 사용
}

class Team {
 Long id; //TEAM_ID PK사용
 String name; //NAME 컬럼 사용
 }

// 객체지향 모델링.
class Member {
 String id; // MEMBER_ID 컬럼 사용
 Team team; // 참조로 연관관계를 맺음
 String username; // USERNAME 컬럼 사용

 Team getTeam() {
   return team;
  }
}

class Team {
 Long id; // TEAM_ID PK 사용
 String name; // NAME 컬럼 사용
 } 
 -&gt; 두 객체를 연결하기 위한 추가적인 코드가 많이 필요함.</code></pre>
<p>하지만 JPA를 사용한다면 객체 지향 모델링을 사용하며 두 객체의 관계를 쉽게 맺을 수 있습니다.</p>
<pre><code class="language-java">member.setTeam(team);
jpa.persist(member);
</code></pre>
<h4 id="-객체-그래프-탐색">* 객체 그래프 탐색</h4>
<p>아래와 같은 객체 그래프가 있습니다.
<img src="https://velog.velcdn.com/images/jeon_131/post/d56c39a8-cac8-4c2c-83f1-ee74623c0d2e/image.png" alt="">
객체 그래프는 서로 연관된 객체를 참조해서 사용할 수 있어야합니다. 즉, 주문이 멤버와 배달을 참조하여 사용할 수 있어야 한다는 의미입니다.</p>
<p>하지만 SQL을 직접 다루면 처음 실행하는 SQL문에 따라 그래프 탐색이 한정됩니다. JPA는 객체 그래프를 마음껏 탐색할 수 있습니다.</p>
<hr>
<p>아직 개념만 본 상태고 직접 코드를 작성해보지 않아 모든 개념이 완벽하게 와닿지 않은 느낌을 많이 받은 상태로 정리하고, 정리한걸 보고 작성한 글이라 미숙한 부분이 많습니다..😥</p>
<p>앞으로 JPA에 대해 공부해나가며 더 자세한 개념과 코드 작성법에 대해 정리해나갈 예정입니다🤗</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Express와 Nest.js]]></title>
            <link>https://velog.io/@jeon_131/Express%EC%99%80-Nest.js</link>
            <guid>https://velog.io/@jeon_131/Express%EC%99%80-Nest.js</guid>
            <pubDate>Sat, 25 Jun 2022 16:20:21 GMT</pubDate>
            <description><![CDATA[<p>지난 프로젝트를 진행할 때 express를 이용했고, 이번엔 nest.js를 사용해보게 되어 두 개의 차이점에 대해 짚고 넘어가고싶어 포스트를 작성해봅니다. 스스로 공부해보고 작성한 글이기 때문에 정확하지 않을 수 있습니다. 잘못된 정보가 있다면 댓글로 알려주세용😌</p>
<h2 id="-node-js"># Node js</h2>
<blockquote>
<p>node js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다. node js의 등장으로 JavaScript를 브라우저뿐만 아니라 서버에서도 사용할 수 있게 되었습니다.
<span style="color: #ff6666; font-size: 12px"><em>*런타임 : 특정 언어로 만든 프로그램을 실행할 수 있는 환경</em></span></p>
</blockquote>
<p>node js는 웹 서버와 같이 <strong>확장성 있는 네트워크 프로그램</strong>을 개발하기 위해 만들어졌습니다. 또한 HTTP 서버 라이브러리 등을 포함하고 있어 <strong>아파치 등의 별도의 프로그램 없이</strong> 동작할 수 있습니다.</p>
<h2 id="-express"># Express</h2>
<p><a href="https://expressjs.com/ko/">https://expressjs.com/ko/</a></p>
<blockquote>
<p>express는 웹 및 모바일 어플리케이션을 위한 일련의 강력한 기능을 제공하는 간결하고 유연한 node js 프레임워크 입니다. HTTP 메소드 및 미들웨어를 통해 쉽게 API를 만들 수 있습니다.</p>
</blockquote>
<p>express는 현재 <strong>가장 많이 사용되고 있는 node js 프레임워크</strong>입니다. 가장 많이 사용되는 프레임워크인만큼 구글링을 통한 레퍼런스 서치가 용이합니다. 또한 서버를 빠르게 구현하기 위해 개발 시 <strong>구조의 자유도</strong>가 높습니다. typescript를 지원하긴 하지만 json파일을 따로 만들고 세팅해줘야한다는 번거로움이 있습니다.</p>
<h2 id="-nestjs"># Nest.js</h2>
<p><a href="https://docs.nestjs.com/">https://docs.nestjs.com/</a></p>
<blockquote>
<p>nest js는 효율적이고 확장 가능한 node js 서버를 구축하기 위한 프레임워크입니다. Progressive Javascript를 사용하며, 기본적으로 Typescript를 지원하고 빌드됩니다. 또한, OOP(Object Oriented Programming), FP(Functional Programming) 및 FRP(Functional Reactive Programming) 요소를 결합합니다.
<span style="color: #ff6666; font-size: 12px"><em>*Reactive Programming : 비동기 데이터 스트림으로 프로그래밍을 하는 것</em></span></p>
</blockquote>
<p>nest.js는 기본 언어로 <strong>타입스크립트</strong>를 채택하고 있으며 <strong>Express를 래핑</strong>하여 동작하는 node js 프레임워크입니다. <strong>IoC</strong>(Inversion of Control, 제어 역전), <strong>DI</strong>(Dependency Injection, 의존성 주입) 및 <strong>AOP</strong>(Aspect Oriented Programming, 관점 지향 프로그래밍)와 같은 객체 지향 개념을 도입하고 있습니다.</p>
<hr>
<h2 id="-express와-nestjs의-차이점"># Express와 Nest.js의 차이점</h2>
<h4 id="-코드-구조의-차이">* 코드 구조의 차이</h4>
<p>express는 개발의 자유도가 높아 사람마다, 혹은 팀마다 아키텍처 디자인 스타일이 다르다면 커뮤니케이션 비용이 커집니다. 반면에 nest js는 프레임워크 자체에서 어느정도 아키텍처 디자인을 제공하기 때문에 정해진 양식에 맞게 개발을 하게 됩니다.</p>
<h4 id="-라우팅">* 라우팅</h4>
<ul>
<li><p>express</p>
<pre><code class="language-javascript">app.use(&#39;/employee&#39;, require(&#39;./employeeRouter&#39;))
app.use(&#39;/company&#39;, require(&#39;./companyRouter&#39;))</code></pre>
</li>
<li><p>nest.js</p>
<pre><code class="language-typescript">@Module({
imports: [
  TypeOrmModule.forFeature([EmployeesRepository])
],
exports: [TypeOrmModule],
providers: [EmployeesService],
controllers: [EmployeesController],
})
export class EmployeesModule {}</code></pre>
</li>
</ul>
<p>express는 app.use 함수를 이용해 라우터를 등록하지만, nest.js는 각 모듈별로 라우팅을 해서 사용합니다.</p>
<h4 id="-컨트롤러">* 컨트롤러</h4>
<ul>
<li><p>express</p>
<pre><code class="language-javascript">router.route(&#39;/&#39;).get((req,res) =&gt; {
// 로직.
});</code></pre>
</li>
<li><p>nest.js</p>
<pre><code class="language-typescript">// controller
export class EmployeesController {
constructor(private readonly employeesService: EmployeesService) {}

@Get()
findAll() {
  return this.employeesService.findAll();
}
}
</code></pre>
</li>
</ul>
<p>// service
@Injectable()
export class EmployeesService {
  constructor(
      @InjectRepository(Employees)
    private readonly employeeRepository: Repository<Employees>) {}</p>
<p>  findAll(): Promise&lt;Employees[]&gt; {
    return this.employeeRepository.findAll();
  }
}</p>
<pre><code>
- express는 위와 같이 컨트롤러 정의와 비즈니스 로직을 한 파일에 한 번에 작성해도 되고, 파일을 따로 분리해도 됩니다. 하지만 nest.js는 클라이언트에서 요청이 들어오면 controller -&gt; service -&gt; repository순서로 동작하기 때문에 controller파일과 service파일로 분리해서 개발해야합니다.

---

## # 정리

제가 글을 쓰고 정리해보며 느낀 점에 대해 정리해보겠습니다.

우선 express는 개발자 마음대로 구조를 설계할 수 있고, nest.js는 아키텍처를 어느 정도 정의해준다는 점이 가장 큰 차이점인것 같습니다. 또한 TypeScript를 사용하기엔 기본적으로 TypeScript를 빌드 언어로 지원하는 nest.js가 적합할 것 같다고 느꼈습니다.

너무 당연한 이야기지만 좋고 나쁜 프레임워크를 찾는 것 보다, 자신이 진행할 프로젝트에 맞는 프레임워크를 적절하게 사용하는 것이 좋아보이네용🤗

</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[GraphQL과 REST]]></title>
            <link>https://velog.io/@jeon_131/GraphQL%EA%B3%BC-REST</link>
            <guid>https://velog.io/@jeon_131/GraphQL%EA%B3%BC-REST</guid>
            <pubDate>Thu, 23 Jun 2022 14:55:11 GMT</pubDate>
            <description><![CDATA[<p>작년 이맘때 쯤 GraphQL, Prisma, Express를 사용해서 웹 백엔드 개발을 진행했습니다. 그런데 왜 이제와서 다시 이 개념을 정리하려 하냐, 하시면 현재 회사에서 nest js와 TypeORM, RESTful api를 이용해 개발을 하고있기 때문에 그 차이와 장단점을 명확하게 짚고 넘어가고 싶어 글을 써보려고 합니다.</p>
<hr>
<h2 id="-grapql"># GrapQL</h2>
<blockquote>
<p>GraphQL은 메타(전 facebook)에서 만든 API(Application Programming Interface)를 위한 쿼리 언어로 클라이언트로부터 쿼리를 전달받아 요청받은 데이터만을 반환해줍니다.</p>
</blockquote>
<p>메타에서는 GraphQL을 개발 한 이유를 다음과 같이 설명했습니다.</p>
<ul>
<li>RESTful API로는 다양한 기종에서 필요한 정보들을 일일히 구현하는 것이 힘들었습니다. 예를 들어 iOS와 Android에서 필요한 데이터가 조금씩 달랐고, 다른 부분마다 새로운 API를 개발하는 것이 힘들었습니다.</li>
</ul>
<p>GraphQL의 등장으로 백엔드에서 처리해줘야 하는 많은 양의 코드를 프론트엔드와 나누어 작업할 수 있게 되었습니다.</p>
<h2 id="-rest"># REST</h2>
<blockquote>
<p>REST는 REpresentational State Transfer의 약자로 로이 필딩(Roy Fielding)이 2000년도에 웹의 장점을 최대한 활용할 수 있는 아키텍처로써 발표한 개념입니다. </p>
</blockquote>
<p>REST는 모든 자료(Resources)들을 하나의 EndPoint에 연결해두고, EndPoint는 해당 Resource와 관련된 내용만 정리하자는 방법론입니다.</p>
<p>예를 들어 한 User에 대한 정보를 생성, 조회, 편집, 삭제(CRUD)하는 API를 구성한다고 하면 EndPoint는 다음과 같을 것입니다.</p>
<ul>
<li>생성 : (POST) /user</li>
<li>조회 : (GET) /user</li>
<li>편집 : (PUT) /user/{user_id}</li>
<li>삭제 : (DELETE) / user/{user_id}</li>
</ul>
<p><em><del>사실 글만 보고 이해하기 너무 어려워요... 직접 써보면서 알아가는게 베스트...</del></em></p>
<p>REST의 내용을 자세히 다루기엔 내용이 너무 많아 다른 포스트에서 추가로 정리하겠습니다.</p>
<h2 id="-graphql과-rest의-차이점"># GraphQL과 REST의 차이점</h2>
<h3 id="-resource">* Resource</h3>
<p>대부분의 REST api는 결과를 JSON 형태로 반환합니다.</p>
<p>아래의 EndPoint로 접근하여 id가 1인 유저의 정보를 가져온다면 다음과 같은 결과를 받을 수 있을 것입니다.</p>
<ul>
<li>(GET) <code>/employee/1</code></li>
</ul>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;jhon&quot;,
  &quot;age&quot;: 31,
  &quot;company&quot;: {
    &quot;name&quot;: &quot;A_Company&quot;,
    &quot;ceo&quot;: &quot;AAA&quot;
  }
}
// 보통 user와 company를 서로 다른 리소스로 분리합니다.
</code></pre>
<p>위와 같이 REST api는 리소스를 가져오는 방식과 반환하는 리소스의 타입 혹은 형태가 서로 연결되어있습니다. <code>/employee</code>라는 리소스를 요청하면 위와 같은 형태의 JSON 데이터가 반환됩니다.
<br>
위의 방식을 GraphQL로 옮긴다면 다음과 같습니다.</p>
<pre><code class="language-typescript">type Employee {
    id: ID
    name: String
    age: Int
    company: Company
}

type Company {
    id: ID
    name: String
    ceo: String
    emps: [Employee]
}</code></pre>
<p>REST와의 큰 차이점은 리소스의 유형과 리소스를 가져오는 방식이 완전히 분리되어있다는 것입니다.</p>
<pre><code class="language-typescript">type Query {
    employee(id: ID!): Employee
    company(id: ID!): Company
}</code></pre>
<p>GraphQL은 Employee와 Company의 형태를 정의하고, 이를 가져다 쓸 수 있는 Query를 작성하여 사용합니다. 각 Resource마다 endpoint를 정의하지 않고 하나의 엔드포인트만이 존재하며, 원하는 리소스와 해당 리소스에서 원하는 필드만을 요청할 수 있습니다.</p>
<p><code>graphql/query={employee(id:&quot;1&quot;) { name, company { name }}}</code> 로 요청하면 아래와 같은 결과를 받을 수 있습니다.</p>
<pre><code class="language-JSON">{
  &quot;name&quot;: &quot;Jhon&quot;,
  &quot;company&quot;: {
    &quot;name&quot;: &quot;A_Company&quot;
  }
}</code></pre>
<br>

<h3 id="-url-routes-graphql-scheme">* URL Routes, GraphQL Scheme</h3>
<p>REST 방식은 특정 작업에 대한 endpoint가 지정되어 있고 endpoint는 해당 리소스를 가리킵니다. 또한, HTTP Method에 따라 어떤 작업을 진행할지도 구분합니다.</p>
<p>하지만 GraphQL에서는 URL이 아닌 Scheme가 특정 리소스를 특정짓고, Mutation, Query를 통해 작업을 구분합니다.</p>
<p>GraphQL은 한 번의 요청에 여러 리소스에 접근할 수 있지만, REST 방식은 여러 리소스에 접근하기 위해선 요청을 여러 번 보내야합니다.
<br></p>
<h3 id="-route-handler-resolver">* Route Handler, Resolver</h3>
<p>현재 사용하고 있는 node js를 기준으로 한 백엔드를 예시로 들겠습니다.</p>
<ul>
<li><p>REST API</p>
<pre><code class="language-typescript">// &#39;/employee&#39;
@Get(&#39;:id&#39;)
find(@Param(&#39;id&#39;)id: number, @Res()res: Response) {
   // DB.

   const result = {
       &quot;name&quot;: &quot;Jhon&quot;,
       &quot;company&quot;: {
           &quot;ceo&quot;: &quot;AAA&quot;
       }
   }

   res.send(result);
}
</code></pre>
</li>
</ul>
<pre><code>위 엔드포인트는 GET 요청에만 반응합니다. 따라서 클라이언트에서 `/employee/1`로 요청을 보내면 다음과 같은 JSON 데이터 응답을 받을 수 있습니다.

```JSON
{
  &quot;name&quot;: &quot;Jhon&quot;,
  &quot;company&quot;: {
    &quot;ceo&quot;: &quot;AAA&quot;
  }
}</code></pre><ul>
<li><p>GraphQL</p>
<pre><code class="language-typescript">const resolver = {
Query: {
  employee:(parent, args) =&gt; {
    // DB.

    cosnt result = { name: &quot;James&quot; };

    return result;
  },
  company:(parent, args) =&gt; {
    // DB

    const result = {
      name: &quot;B_Company&quot;,
      ceo: &quot;BBB&quot;,
    }

    return result;
  }
}
}</code></pre>
</li>
</ul>
<p>REST와 다르게 특정 엔드포인트에 대한 함수를 제공하는 대신, 특정 필드에 대한 Query 타입의 함수를 제공합니다. 이러한 함수를 Resolver라고 부릅니다.</p>
<pre><code class="language-typescript">query {
  employee(id: 1) {
    name
    company {
      name
      ceo
} } }</code></pre>
<p>위 쿼리를 이용해 아래 데이터를 반환받을 수 있습니다.</p>
<p>서버로 요청이 들어오면 서버는 해당 쿼리를 찾고, 쿼리에 존재하는 필드들의 resolver를 찾아 호출합니다. 그리고 resolver들의 반환 값을 모아 쿼리의 형태와 일치하는 JSON을 만들어 반환합니다.</p>
<p>따라서 아래와 같은 결과가 반환됩니다.</p>
<pre><code class="language-JSON">{
  &quot;employee&quot;: {
    &quot;name&quot;: &quot;James&quot;,
    &quot;company&quot;: {
      &quot;name&quot;: &quot;B_Company&quot;,
      &quot;ceo&quot;: &quot;BBB&quot;
    }
  }
}</code></pre>
<p>REST API는 Client가 각 리소스에 대한 endpoint를 호출하여 원하는 데이터를 얻어옵니다. 하지만 GraphQL은 원하는 리소스를 쿼리로 호출하면 백엔드에서 각 resolver를 호출하여 값을 반환받은 후, 클라이언트에서 요청한 쿼리의 형태에 맞게 값을 반환합니다.</p>
<p><img src="https://velog.velcdn.com/images/jeon_131/post/1509752b-46c9-4114-8136-7ba1244ff83e/image.png" alt="">
[이미지 출처: <a href="https://devopedia.org/graphql%5D">https://devopedia.org/graphql]</a></p>
<hr>
<h2 id="-정리"># 정리</h2>
<ol>
<li>REST API는 각 리소스에 대한 endpoint가 지정되어있고, GraphQL은 리소스와 리소스를 가져오는 방식이 완전히 분리되어있습니다.</li>
<li>GraphQL은 클라이언트가 원하는 데이터만을 가져올 수 있어 편리하고, 여러 리소스에 대해서 하나의 쿼리로 호출할 수 있어 편리합니다.</li>
<li>하지만 고정된 요청과 응답을 처리해야 하는 경우, REST api보다 쿼리의 길이가 훨씬 길어질 수 있습니다.</li>
</ol>
<p>따라서 <code>GraphQL</code>을 사용하는 경우는</p>
<ul>
<li>서로 다른 모양의 다양한 요청에 대응해야할 때</li>
<li>작업이 주로 CRUD에 해당할 때</li>
</ul>
<p>사용하기 적합하고,</p>
<p><code>REST</code>를 사용하는 경우는</p>
<ul>
<li>요청의 구조가 정해져있을 때</li>
<li>File 전송 등, 전송이 단순 Text형태가 아닌 경우</li>
</ul>
<p>에 적합한 것 같습니다.</p>
<hr>
<p>회사에서 프로젝트를 진행하면서 REST api를 더 많이 사용해봐야겠지만,,, 제가 사용해본 결과 GraphQL이 백엔드 개발을 진행할 때는 백엔드가 할 일을 줄여줘서 편리했던 기억이 납니다.</p>
<p><em><del>하지만 그 쿼리를 모두 프론트에 정의해줘야해서 그만큼 프론트 단의 작업이 많아졌다는거...</del></em></p>
<p>아직 웹 개발을 많이 해본 것이 아니라 개념이 많이 부족하다고 느꼈고, 개발할 때 적합한 방법을 찾기 위해서는 사용해본 기능들에 대한 정리가 필요하다고 느꼈습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native - 프로젝트 만들기]]></title>
            <link>https://velog.io/@jeon_131/React-Native-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jeon_131/React-Native-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 06 Apr 2022 12:16:11 GMT</pubDate>
            <description><![CDATA[<h2 id="새로운-react-native-프로젝트-만들기">새로운 React Native 프로젝트 만들기</h2>
<br/>
터미널에 아래 명령어 입력

<pre><code>$ npx react-native init LearnReactNative</code></pre><blockquote>
<p>npx는 Node.js와 함께 설치되는 도구입니다.
Node.js 환경에서 구동되는 CLI 도구들을 간단하게 사용할 수 있게 해줍니다.</p>
</blockquote>
<hr>
<p>생성한 프로젝트를 열어 package.json을 보면 아래와 같은 코드가 있습니다.</p>
<pre><code class="language-javascript">&quot;scripts&quot;: {
    &quot;android&quot;: &quot;react-native run-android&quot;,
    &quot;ios&quot;: &quot;react-native run-ios&quot;,
    &quot;start&quot;: &quot;react-native start&quot;,
    &quot;test&quot;: &quot;jest&quot;,
    &quot;lint&quot;: &quot;eslint .&quot;
  }</code></pre>
<p>스크립트가 설정되면 다음과 같은 명령어를 실행할 수 있습니다.</p>
<pre><code>$ yarn &lt;스크립트 이름&gt;</code></pre><ul>
<li>yarn <code>android</code> : 안드로이드 환경에서 앱 구동</li>
<li>yarn <code>ios</code> : ios 환경에서 앱 구동</li>
<li>yarn <code>start</code> : Metro를 구동</li>
</ul>
<blockquote>
<p>Metro: 프로젝트에 사용된 자바스크립트 파일들을 모두 읽어 하나의 파일로 합쳐주고, 리액트 네이티브 앱에서 실행할 준비를 해줍니다.</p>
</blockquote>
<hr>
<h3 id="안드로이드-스튜디오에서-리액트-네이티브-구동하기">안드로이드 스튜디오에서 리액트 네이티브 구동하기</h3>
<p>안드로이드 스튜디오를 켜고 <code>Open</code>을 눌러 프로젝트를 열어줍니다. 생성된 리액트 네이티브 폴더를 보면 <code>android</code> 폴더가 있는데, 그 폴더를 선택해 열어줍니다.</p>
<p><img src="https://images.velog.io/images/jeon_131/post/76e2fd5c-77c7-406b-a94b-92d1bf8a75bb/image.png" alt=""></p>
<p>안드로이드 스튜디오에서 AVD를 설치합니다.</p>
<p>설치한 후에 비주얼 코드로 돌아와서 다음 코드를 입력합니다.
터미널은 <code>ctrl + `</code> 키를 입력해서 열 수 있습니다.</p>
<pre><code>$ yarn android</code></pre><p>저 같은 경우는 다음과 같은 에러가 났습니다.</p>
<blockquote>
</blockquote>
<p>error Failed to install the app. Make sure you have the Android development environment set up: <a href="https://reactnative.dev/docs/environment-setup">https://reactnative.dev/docs/environment-setup</a>.
Error: Command failed: ./gradlew app:installDebug -PreactNativeDevServerPort=8081</p>
<p>터미널을 살펴보니 안드로이드 Gradle 버전을 업그레이드 해야 한다는 설명이 있었습니다. </p>
<pre><code>* What went wrong:
A problem occurred evaluating project &#39;:app&#39;.
&gt; Failed to apply plugin &#39;com.android.internal.application&#39;.
   &gt; Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.</code></pre><p><img src="https://images.velog.io/images/jeon_131/post/bc0c70a2-4670-4837-89d1-ed222b5111f8/image.png" alt=""></p>
<p>Gradle JDK를 1.8에서 11로 바꿔준 뒤 안드로이드 스튜디오와 비주얼 코드를 재실행해줍니다.</p>
<p><img src="https://images.velog.io/images/jeon_131/post/aa819ecc-f682-484c-8f63-b108624c2e1d/%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%202022-03-31%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.18.43.png" alt=""></p>
<p>그 후에 <code>$ yarn android</code>를 실행하면 다음과 같이 애뮬레이터가 실행됩니다.</p>
<hr>
<h3 id="ios-환경에서-리액트-네이티브-앱-구동하기">iOS 환경에서 리액트 네이티브 앱 구동하기</h3>
<pre><code>$ yarn ios</code></pre><p>위 명령어를 사용하여 구동할 수 있지만 Apple Silicon이 탑재되어 있다면</p>
<pre><code>$ cd ops
$ pod install</code></pre><p>위 두 개의 명령어를 실행해줘야 합니다.</p>
<p><code>$ pod install</code>을 실행했을 때 에러가 나서 아래 블로그를 참고하여 해결했습니다.</p>
<blockquote>
</blockquote>
<p><a href="https://velog.io/@sunhwa508/react-native-pod-install%EC%8B%9C-%EC%98%A4%EB%A5%98-new-Macbook-M1-crash-DiagnosticReports">https://velog.io/@sunhwa508/react-native-pod-install%EC%8B%9C-%EC%98%A4%EB%A5%98-new-Macbook-M1-crash-DiagnosticReports</a></p>
<p><img src="https://media.vlpt.us/images/jeon_131/post/7bcb6ed5-f853-4185-ade7-be94236076e7/image.png" alt=""></p>
<p>위와 같이 ios 환경에서도 잘 실행되는 것을 볼 수 있습니다.</p>
<hr>
<p>프로젝트 개발 환경 세팅이 완료되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native - 개발 환경 설정]]></title>
            <link>https://velog.io/@jeon_131/React-Native-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@jeon_131/React-Native-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Mon, 28 Mar 2022 16:37:49 GMT</pubDate>
            <description><![CDATA[<h2 id="react-native란">React Native란?</h2>
<blockquote>
<p>리액트 네이티브(React Native)는 자바스크립트(JavaScript)와 리액트(React) 라이브러리를 사용해 네이티브 앱을 개발할 수 있게 해주는 기술입니다. 리액트 네이티브를 사용해 만든 앱은 iOS환경, Android환경에서 모두 구동할 수 있습니다.</p>
</blockquote>
<h2 id="작업-환경-준비하기">작업 환경 준비하기</h2>
<pre><code>💡 본 개발환경 설정 글은 MacOS 환경을 바탕으로 작성하였습니다!</code></pre><h3 id="1-nodejs와-npm-설치하기">1. Node.js와 npm 설치하기</h3>
<pre><code>Node.js는 웹 브라우저가 아닌 환경에서도 자바스크립트를 실행할 수 있게 해주는 
Chrome V8 JavaScript 엔진으로 빌드된 런타임입니다.</code></pre><hr>
<h4 id="11-macos에서-설치하기">1.1 MacOS에서 설치하기</h4>
<p><a href="https://github.com/nvm-sh/nvm">https://github.com/nvm-sh/nvm</a>
위 링크로 들어가서 Installing and Updating 부분을 보면</p>
<pre><code>$ curl -o- https://raw.githubsercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash</code></pre><p>다음과 같은 스크릅트가 있습니다.
이 명령어를 입력하고 나서 터미널을 재실행해주세요.</p>
<pre><code>$ nvm install --lts</code></pre><p>위 명령어를 입력하여 Node.js LTS 버전을 설치할 수 있습니다.</p>
<pre><code>$ node -v
v.16.14.2 (실행 결과)
$ npm -v
8.5.0 (실행 결과)</code></pre><p>위 두 명령어를 실행해 노드와 노드를 설치할 때 함께 설치된 npm의 버전을 확인해볼 수 있습니다.</p>
<hr>
<h4 id="12-yarn">1.2 yarn</h4>
<p>yarn은 npm과 같은 패키지 관리 도구입니다.
npm과 역할은 동일하지만, 선응이 개선되어 npm보다 패키지를 더 빨리 설치합니다.
<br/></p>
<pre><code>$ npm install --global yarn</code></pre><p>위 명령어를 터미널에 입력하여 yarn을 설치할 수 있습니다.</p>
<h4 id="13-java-development-kit">1.3 Java Development Kit</h4>
<p>JDK(Java Development Kit)은 안드로이드 앱 개발을 위해 필요한 도구입니다.</p>
<p><code>homebrew</code>가 설치되어 있지 않다면 Homebrew를 설치해야합니다.</p>
<blockquote>
<p><span style="color:#ff9999">homebrew 설치 과정은 추후에 따로 작성할 예정입니다.</span>
<a href="https://eunhee-programming.tistory.com/259">Homebrew 설치과정</a></p>
</blockquote>
<hr>
<h4 id="14-안드로이드-스튜디오-설치-및-환경변수-설정">1.4 안드로이드 스튜디오 설치 및 환경변수 설정</h4>
<p><a href="https://developer.android.com/studio/index.html">https://developer.android.com/studio/index.html</a>
위 링크에서 안드로이드 스튜디오를 설치합니다.</p>
<p>MacOS에서는 <code>$HOME/.zprofile</code> 또는 <code>$HOME/.zshrc</code> 파일을 수정해 환경 변수를 설정합니다. 파일을 열어 최하단에 다음 코드를 삽입합니다.</p>
<pre><code>$ vim $HOME/.zprofile</code></pre><p>터미널 환경에서 파일을 수정할 때는 vim이라는 명령어를 사용하면 됩니다.</p>
<pre><code>export ANDROID_HOME=$ HOME/Library/Android/sdk
export PATH=$ PATH:$ ANDROID_HOME/emulator
export PATH=$ PATH:$ ANDROID_HOME/tools
export PATH=$ PATH:$ ANDROID_HOME/tools/bin
export PATH=$ PATH:$ ANDROID_HOME/platform-tools</code></pre><blockquote>
<p><code>vim</code> 사용이 어렵다면 <code>nano</code>를 사용하면 수월하게 편집할 수 있습니다.</p>
</blockquote>
<hr>
<h4 id="15-vs-code-설치하기">1.5 VS Code 설치하기</h4>
<p><a href="https://code.visualstudio.com">https://code.visualstudio.com</a></p>
<p>React Native 프로젝트를 편집할 Visual Studio Code를 설치합니다.</p>
<hr>
<h4 id="16-xcode와-cocoapods-설치하기">1.6 Xcode와 CocoaPods 설치하기</h4>
<p>Xcode와 CocoaPods는 iOS 프로젝트를 만들기 위해 설치하는 도구입니다.</p>
<p>Xcode는 앱 스토어에서 설치하거나 <a href="https://bit.ly/install-xcode">https://bit.ly/install-xcode</a>에서 설치할 수 있습니다.</p>
<p>CocoaPods는 터미널에서 아래 명령어를 입력해 설치할 수 있습니다.</p>
<pre><code>$ sudo gem install cocoapods</code></pre><hr>
<blockquote>
<p>React Native를 공부하면서 그냥 실습하고 잊지 않고 기억하기 위해 정리하면서 개발하기 위해 작성한 글 입니다. 😀
역시 개발 환경 설정하는 일이 가장 오래 걸리고 번거로운 작업인 것 같습니다.
개발 환경을 설정하며 겪었던 문제들은 추후에 따로 정리할 예정입니다!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Open]]></title>
            <link>https://velog.io/@jeon_131/Open</link>
            <guid>https://velog.io/@jeon_131/Open</guid>
            <pubDate>Thu, 30 Dec 2021 02:53:39 GMT</pubDate>
            <description><![CDATA[<p>Start 2021.12.30</p>
]]></description>
        </item>
    </channel>
</rss>