드디어 기다리던 수강 첫 시간이 왔습니다. 첫 시간인 만큼 교육생들에 대해 알아보는 시간은 간단하게 가졌는데요.
수강생들이 우아한테크러닝에 지원한 이유와 고민들을 Q&A를 통해 알아보는 시간을 가졌습니다.
첫번째로는 네트워킹 인프라였습니다. 우아한 테크러닝에 지원한 현업 개발자 및 학부생들은 이끌어주는 주변에 소통 할 개발자들이 많이 없다는 것이 공통점이였습니다.
특히 스타트업 같은 경우 적은 인원으로 기업을 이끌어 나가야 하기 때문에 주니어 개발자라 하더라도 자신이 작성한 코드가 곧 바로 회사의 프로덕션으로 출시가 되기 때문에 자신이 작성한 코드에 대한 책임감과 더불어 자신이 작성한 코드에 대해 의문을 해소 시켜줄 시니어가 없었습니다. 그렇기 때문에 다양한 인프라를 가져 소통 할 수 있는 장을 이번 기회에 얻고 싶다는 의견이 있었습니다.
저 또한 학부생입장에서 정말 공감되는 고민이였습니다.
이러한 네트워킹 인프라를 우아한 형제들 Dev Relation팀에서 슬랙을 통해 다양한 활동 및 소통을 할 수 있도록 환경 조성을 해주셨습니다.
두번째로는 코드 품질 아키텍처, 적정 기술에 대한 고민입니다. 여러 수강생들이 위에도 얘기 했었지만 스타트업 개발자 규모가 크지않은 개발자들이 많았고 자신의 작성한 코드가 곧 회사의 프로덕션으로 출시 및 배포가 되기 때문에 자신이 작성한 코드 품질에 대한 의구심을 가지고 있었습니다. 그렇기 때문에 유니콘 기업인 배달의 민족에서의 교육을 통해 코드 품질에 대해 배우고 해소를 하고 싶은 교육생이 많았습니다.
배달의 민족에서 어떠한 도구를 통해 개발을 진행 하는지 React&TypeScript를 사용 하는 데에는 어떠한 도구를 통해 개발을 진행 하는지에 대해 다양한 고민이 있었습니다.
앞으로의 포스팅에서는 React&TypeScript에 대해 배운 점과 느낀 점 위주로 포스팅 진행하겠습니다.
let foo = 10;
위와 같이 JavaScript
와 동일하게 코드 작성 할 수 있다.
타입추론
을 통해 TypeScript
또한 별다른 오류를 발생시키지 않는다.
let foo = 10;
foo = false;
하지만 위와 같이 다른 타입의 값을 대입할 경우 문제가 발생한다.
foo
변수에 10
이라는 number
타입 값이 지정 되면서 다른 타입의 값은 대입할 수 없다.
변수명: 타입
과 같이 사용해 타입을 명시할 수 있다.
let foo:number = 10;
foo = false;
다른 타입의 값을 대입할 경우 타입추론을 통한 타입 지정과 동일하게 오류가 발생한다.
읽는 사람을 위한 코드는 명시적이 좋다.
let age: number = 10;
let weight: number = 72;
age
와 weight
변수는 number
타입으로 별 문제없이 사용할 수 있다.
하지만 코드의 가독성을 위해 아래와 같이 타입별칭을 이용해 타입을 지정할 수 있다.
type Age = number; //실질적으로 컴파일이 될때 사라진다.
let a: Age = 10;
여기서 type Alias는 실질적으로 컴파일이 될때 사라진다.
변수 a
는 Age
와 동일하게 number
타입이지만 Age
라는 타입 별칭을 사용해 가독성을 증가시킨다.
Type Alias를 통해 보다 깔끔한 명시적 추론이 가능하다.
객체의 타입은 아래와 같이 type
키워드를 사용해 정의할 수있다.
type Foo = {
age: Age;
name: string;
}
const foo: Foo = {
age: 10,
name: 'yoonjangwon',
}
객체 타입을 정의하는 다른 방법으로 interface
키워드가 존재한다.
interface Bar {
age:Age;
name: string;
}
const bar : Bar = {
age: 10,
name: 'yoonjangwon'
}
type
키워드로 선언한 객체 타입과 동일하게 interface
를 이용해 객체 타입을 선언할 수 있다.
type
을 이용한 타입 선언 방식과 interface
를 이용한 타입 선언 방식은 차이가 존재한다.
npm
패키지의 create-react-app
을 이용해 간단하게 프로젝트 생성을 할 수 있다.
yarn create react-app <app_name> --template typescript
npx create-react-app <app_name> --template typescript
아래와 같이 function
키워드를 이용해 함수 컴포넌트를 생성할 수 있다.
src/index.tsx
import React from "react";
import ReactDom from "react-dom";
function App() {
return (
<h1>Jangwon Hello!</h1>
);
}
ReactDom.render(
<React.StricMode>
<App/>
</React.StrictMode>,
document.getElementById("root")
)
ReactDom
의 render
함수는 virtualDom(가상돔)에 컴포넌트를 그리는 함수이며 두 개의 인자를 받는다.
첫 번째인자는 렌더링될 컴포넌트며 두 번째 인자는 렌더링된 컴포넌트를 넣을 HTML 요소다.
작성한 App
컴포넌트는 babel
이라는 트랜스파일러를 통해 아래와 같이 변환된다.
변환 전 App
컴포넌트
function App(){
return <h1 id='header'>Jangwon Hello!</h1>;
}
변환 후 App
컴포넌트
function App() {
return /*@__PURE__*/ React.createElement(
"h1",
{
id: "header",
},
"Hello Tech"
);
}
작성한 jsx코드가 위와 같이 React의 createElement함수로 변환된다.
아래와 같이 App
컴포넌트에서 외부에서 가지고 있는 값을 필요로하는 경우가 생길 수 있다.
ReactDom.render(
<React.StricMode>
<App title="Tech Hello?" color="red"/>
</React.StrictMode>,
document.getElementById("root")
)
<App title="Tech Hello?" color="red"/>
와 같이 넘어간 값은 객체 타입으로 전달된다.
fucntion App(props) {
return <h1 id="header">{props.title}</h1>;
}
jsx
내부에서 JavaScript
코드를 사용하기 위해서는 {}
를 내부에 작성하면 된다.
interface AppProps {
title: string;
color: string;
}
function App(props: AppProps) {
return <h1 id="header">{props.title}</h1>;
}
interface를 이용해 App 컴포넌트가 받을 속성의 객체 타입인 AppProps를 정의할 수 있다.
App 컴포넌트에서 받을 속성 객체의 타입을 함수 컴포넌트의 매개변수에 명시할 수 있다.
제가 만든 이미지 이름만 짤라서 쓰셨네요...