728x90

이미 React-Native를 위한 제법 많은 라이브러리가 등장했다.

푸시, 페이스북 로그인 등 묵직묵직한 라이브러리부터 부분적인 컴포넌트에 해당하는 라이브러리까지

수많은 라이브러리들의 홍수속에 자신의 프로젝트에 알맞는, 쓸만한 라이브러리를 찾는것 또한 개발자의 역량이다.

 

나 역시도 라이브러리 선택에 몇차례 실패한 경험이있다.

원하는 것이 아니었거나, 퍼포먼스가 만족치 못하거나. 그럴때가 있었다.

그렇게 직접만들게된 라이브러리가 몇몇있다.

예를들어, 커스터마이징된 Silder, Modal, Alert, Gallery, View 등등

 

그럼 본론으로 돌아와 몇몇 핵심적인 라이브러리를 소개하고자 한다.

React-Native로 앱을 개발하게 되면 필수적으로 선택해야되는 라이브러리가있다.

바로 화면전환. Routing과 관련된 라이브러리다

react-navigation, react-navigation-tabs 가 대표적이다

 

나는 그 중 react-navigation을 선택하였다.

솔직히 별다른 이유는 없었다. 더 많은 사용자가 선택하였고, Issue에 대한 피드백이 좀 더 좋아보였기 때문이다.

선택할때 비교해보지는 않았지만 Docs도 상당히 잘되어있다.

Docs를 보지않고 사용한다면 바보 소리를 들어야 할 정도로 잘되어있다.

 

다음으로 소개할 라이브러리는 react-native-vector-icons이다.

Web에서 아주 유용하게 사용했던 Fontawesome의 아이콘을 사용할 수 있을까? 에서 출발한 생각이 react-native-vector-icons에 이르게 했다. Fontawesome외에도 수 없이 많은 아이콘을들 쓸수 있게되었다. 이 아이콘들은 폰트로써 설치되며 빈번히 사용되는 이미지를 써야되는 경우 이미지를 대체하기위해 사용하게 되었다.(용량 혹은 서버에서의 호출하는 비용을 아끼기위해) 아래의 링크에서 아이콘 목록을 확인할 수 있다.

https://oblador.github.io/react-native-vector-icons/

 

react-native-vector-icons directory

 

oblador.github.io

 

마지막으로 소개할 라이브러리는 Web에서도 자주 사용했던 라이브러리인 AxiosMoment이다.

Axios는 Rest API통신을 위해 사용한다.

BaseUrl등 간단한 설정을 해두면 아주 간편하게 사용할 수 있다.

Moment는 시간과 관련하여 JS진영에서 가장 인기있는 라이브러리이다.

사용법도 아주 쉽고 Docs가 정말 잘되어있다.

 

728x90
반응형
728x90

안녕하세요?

웹개발에서 앱개발로 전향한지 4개월

여러 고비를 넘어 드디어 첫 앱을 세상에 내놓았습니다.

 

바로 전국에 힘들게 공부하는 공시생들을 위한 SNS인

'공무원 시험일정, 공시생 SNS: 공투공' 입니다.

 

'타임라인, 검색, 팔로우'는 물론, 일반 SNS들과는 다르게 '시험일정, 메모, 스크랩, 학습관리' 등을 통해 공시생들에게 특화된 SNS환경을 조성해주는것을 목표로 하고 있습니다. 기본적이 사용방법은 기존의 SNS들처럼 #해시태그하고 @언급하는 방식으로 사용할 수 있습니다.

 

사길, 기존에 유사한 형태의 카페들이 다수 존재합니다.

그러나 게시판 형식에 얽매여있는 카페의 구조로는 사용자가 직접 원하는 정보를 찾아가만 합니다. 즉, 원하는 정보를 얻기위해서는 그만큼의 시간과 노력이 필요하죠. 원하는 정보가 있는 게시판에 들어가, 필요한 정보가 올라왔는지 모든 글들을 일일이 확인해보아야합니다.

 

 SNS인 '공투공'은 어떨까요?

관심있는 키워드를 단 한번의 터치로 팔로우 하고, 좋은 게시글을 자주 공유해주는 다른 사용자를 팔로우 하기만 해도 원하는 정보를 개인화된 나만의 타임라인을 통해 확인할 수 있습니다. 멋지고 유익한 나만의 게시판을 하나 갖는셈이죠.

 

늘 시간과의 싸움을 하고있는 공시생 여러분들에게 정보검색의 효율을 높이고, 유용한 정보를 쉽고 빠르게 다량으로 얻을수 있다는것은 정말 반가운일 이 아닐 수 없습니다.

 

또한, SNS인만큼 다른 사용자들과의 교류를 위한 기능들을 충분히 지원하고 있습니다. 특히, 기존의 카페들에서 가장 많이 올라오는 글 중에 하나인 스터디 모집을 SNS에서 한다면, 관심있어 하는 사용자들에게 별다른 노력없이 노출시키고 쉽게 인원을 모집할 수 있을것입니다. 

 

구글 플레이스토어, 애플 앱스토어에서 모두 다운받을 수 있습니다.

공시생님들의 건승을 빕니다. 감사합니다.

 

[관련 이미지]

[소개글]

공시생에서 공무원으로 가는 여정의 첫 번째 준비물

공무원 시험 일정, 시험 과목, 스터디 모임 등 필요한 모든 소식을 팔로우 하고 다른 사용자들과 소통해보세요.

 

국내유일 공시생, 공무원을 위한 소셜 네트워크 서비스

시험 일정, 시험과목, 스터디 모임, 고시원 정보 등 수험 생활에 꼭 필요한 핵심 정보부터

스크랩, 해야 할 일 목록, 학습 일지 등 학업 관리에 필요한 모든 도구까지!

 

더 쉽고 편리하게 찾아보세요

- 지금 내게 필요한 정보 검색

- 관심 있는 소식은 팔로우

- 시험 일정 등 중요한 정보는 스크랩

 

공무원 합격을 위한 나만의 학습 관리 도구

- 해야할 일 메모로 매일매일 학습 일정 관리

- 하루 한 줄 학습 일지 작성으로 하루를 돌아보고 스스로를 점검

 

다른 사용자들을 팔로우하고 소통하기

- 수험생활의 다양한 노하우, 정보, 궁금증, 다짐 등을 공유하기

- 수험생활에 필요한 모임, 서로 힘이 되어줄 친구 구하기

- 다른 사용자들의 소식을 확인하고 좋아요, 댓글로 관심 표현하기

 

 

[자세한 내용]

https://baek2sm.github.io/zero_to_gong/web/

728x90
반응형
728x90

npm ERR! git Refusing to remove it. Update manually,

npm ERR! git or move it out of the way first.

 

>> 해당 에러에는 어느 라이브러리에 오류가있는지 함께 나타남

프로젝트 경로에서

rm -rf node_modules/라이브러리/.git

으로 해결가능

728x90
반응형
728x90

다른사람들의 소스코드를 읽다보면 종종 눈에띄는 코드가 있다.

'...'

이라는 부분이다.


전개연산자 (Spread Operator)


전개연산자는 자바스크립트에서 축약코딩을 하기위한 하나의 기법이다

배열이나 객체에서 나머지... 의 느낌으로 사용된다.

아래의 예시들을 통해서 개념을 익혀본다.


const spreadOperatorTestInArray = [4, 5, 6];

const useCase1 = [1, 2, 3 ,...spreadOperatorTestInArray];
// 결과 [1, 2, 3, 4, 5, 6]
// 배열을 결합

const useCase2 = [1, ...spreadOperatorTestInArray, 2, 3, ...spreadOperatorTestInArray];
// 결과 [1, 4, 5, 6, 2, 3, 4, 5, 6]
// 배열을 결합

const { a, b, c, ...z } = {
a: 1,
b: 2,
c: 3,
d: 4,
e: 5,
f: 6
};
// console.log(z) >>> d: 4, e: 5, f: 6
// 잔여 값 비구조화 할당(자동)

let obj = {
a: 1, b: 2, c: 3
};

obj = {
...obj,
other: 4
};
// console.log(obj) >>> a: 1, b: 2, c: 3, other: 4


728x90
반응형
728x90

솔직히 개발을 하며 언어가 가지고있는 모든 내장함수를 외우고 있을수는 없다.


상황에 따라 다양한 언어를 사용해야 하기에 외우고 있는것이 매우 피곤함은 물론 너무 많은 메서드를 알아 언어가 헷갈릴수도 있다(는 핑계)


하지만, JS를 주력으로 하는 개발자라면 배열의 주요 메서드들의 원리는 확실이 이해하고 있어야 한다.


필자는 얼마전까지도 reduce의 사용이 유연하지 못했다. 그리도 중요한 reduce이거늘...


그래서 배열 메서드에 대해서 간단히 정리하며 다시 한번 정리해보고자한다.


순서는 다음과 같다.

1. forEach

2. map

3. filter

4. reduce

5. Object.keys

6, some, every



1. forEach

forEach는 이름에서도 알수있듯이 for문 처럼 반복에 사용된다.

어떤 반복이냐. 배열의 길이만큼 반복하며 배열의 요소를 순서대로 다룬다.

let arrNumbers = [3, 2, 19, 1];
arrNumbers.forEach((nowVal, index) => {
console.log('현재 arrNumbers['+index+']의 값: '+ nowVal);
});


아주 간단하다. forEach는 첫번째 인자로 콜백메서드를 받는다.

그 콜백 메서드의 첫번째 인자로는 배열의 현재값, 두번째 인자로는 현재 인덱스가 온다.

세번째 인자로 현재 사용중인 배열이 오기는 하나 필자는 잘 쓰지 않는다.


※ forEach문은 for문과 달리 break, continue등의 키워드를 사용할 수 없다. 마찬가지로 return을 하여도 반복을 중단할 수 없다.

※ forEach문은 사이드 이펙트, 즉 forEach문 외부에 영향을 미치는 경우가 많으니 주위에서 사용하자.



2. map

map은 필자가 가장 사랑하는 배열 내장함수다.

배열의 요소를 순차적으로 처리(가공)한 후 처리된 값을을 다시 하나의 배열로 반환한다.


const arrNumbers = [1, 3, 5, 7, 9];
const doubleNumbers = arrNumbers.map((nowVal, index) => {
console.log("현재 arrNumbers["+index+"의 값: "+nowVal);
return 2 * nowVal
});
// 결과 arrNumbers >> [2, 6, 10, 14, 18]


map은 첫번째 인자로 콜백 메서드를 받는다.

그 콜백 메서드의 첫번째 인자로는 배열의 현재값, 두번째 인자로는 현재 인덱스가 온다.


※ map도 for문과 달리 break, continue등의 키워드를 사용할 수 없다. return을 하면 현재의 요소처리를 끝내고 다음 요소의 처리로 넘어간다.



3. filter

filter도 상당히 유용하다. 다만 필자는 사용 빈도수가 높지는 않다.(매우 주관적)

filter는 배열의 요소를 반복하며 return의 값(boolean 형)에 따라 true이면 반환, false이면 반환하지 않는다.

즉, return의 값에 의해 필터링된 새 배열(true값을 반환한 요소들만으로 만들어진)을 반환한다.


const arrChar = ['가', '나', '다', '라', '마'];
const newArrChar = arrChar.filter((nowVal, index) => {
console.log("현재 arrChar["+index+"의 값: "+nowVal);
return index % 2 == 0;
});
// 결과 newArrChar >> ['나', '라']


filter는 첫번째 인자로 콜백 메서드를 받는다.

그 콜백 메서드의 첫번째 인자로는 배열의 현재값, 두번째 인자로는 현재 인덱스가 온다.


※ filter도 for문과 달리 break, continue등의 키워드를 사용할 수 없다. return의 값에 따라 각 요소들을 처리한 후 새로 만들어질 배열에 값을 반환하기도 안하기도 한다.



4. reduce

reduce는 JS개발자들이 아주 즐겨쓰는 배열 내장함수이다.

자기가 잘 사용하지 않더라도, JS관련 서적을 보려면 다른 JS개발자들과 co-work하려면 반드시 알아두어야 한다.


const arrNumbers = [1, 2, 3, 4, 5];
const examNum = arrNumbers.reduce((prevReturnVal, nowVal, index) => {
return prevReturnVal + nowVal;
});
// 결과 examNum >> 15


const examArr = arrNumbers.reduce((prevReturnVal, nowVal, index) => {
console.log("i:" +index, "prevReturnVal:"+prevReturnVal);
prevReturnVal.push(nowVal * index);
return prevReturnVal;
}, []);
// 결과 examArr >> [0, 2, 6, 12, 20]


reduce는 다른 메서드들과  조금 다르니 자세히 들여다 보자.

reduce는 첫번째 인자로 콜백 메서드가 온다.

그 콜백 메서드의 첫번째 인자는 이전 프로세스에서 return된 값이다.

두번째 인자는 현재 요소의 값, 세번째 인자는 index이다.

그리고 reduce의 두번째 인자로 initialValue를 설정할 수 있다.

이 initialValue는 위 예시의 prevReturnVal의 초기 값이 된다.( 최초에는 이전에 return된 값이 없는데, 그것을 대신함)


※ reduce도 for문과 달리 break, continue등의 키워드를 사용할 수 없다. return으로 프로세스를 마친 최종결과를 반환한다. 그 형태는 무엇이든 될 수 있다.




5. Object.keys

Object.keys는 새로 추가된 문법이다. (es7이었던가...)

아무래도 for in 만으로는 부족하다고 판단하여 Object를 더욱 잘 다루기 위해 추가된것으로 생각된다.

단도직입적으로 Object.keys는 JS말하는 객체 {} 에서 key만을 분리해내어 배열로 반환하는 메서드이다.


const obj = {
kim: "노룩패스",
lee: "4대강",
mun: "최저임금"
};

const arrObjProperties = Object.keys(obj);
// 결과 arrObjProperties >> ['kim', 'lee', 'mun']


아주 심플하다. 그리고 강력하다.

우리는 Object.keys가 등장하여 object를 보다 아주 잘 다룰수 있게 되었다.

object를 배열 메서드들로 다룰 수 있게된 것이다.



6. some, every

some과 every 역시 종종 쓰이는 배열의 내장함수이다.

filter와도 유사한 부분이 있는 some과 every.


some은 배열을 요소들을 순차적으로 처리하며, 

하나라도 return이 true일 경우 true를 반환한다. (아니면 false)

const oneValueDiff = [1, 1, 2, 1, 1, 1];
const result2 = oneValueDiff.some((nowVal, index) => {
console.log("some: "+index);
if (oneValueDiff.length == index+1) {
return true;
}
return nowVal != oneValueDiff[index+1];
});
// 결과 result1 >> true | console결과 >> 0,1


some에서 true가 발견된 후 더이상 반복순회가 일어나지 않는다. 즉, break된것이다.

여태까지의 배열메서드들과는 확실히 다른 부분이다.



every는 배열의 요소들을 순차적으로 처리하며,

모든 요소의 처리결과 return이 true일 경우 true를 반환한다. (아니면 false)

const everyValuesOne = [1, 1, 1, 1, 1, 1];
const result1 = everyValuesOne.every((nowVal, index) => {
console.log("every: "+index);
if (everyValuesOne.length == index+1) {
// 마지막 요소 >>> 비교대상 x
return true;
}
return nowVal == everyValuesOne[index+1];
});
// 결과 result1 >> true | console결과 >> 0,1,2,3,4,5


728x90
반응형
728x90
3장. 연산자
 - 5 / 2 는 2.5이다

 - 5 // 2는 2이다

 - 5 % 2는 0.5이다

 - print('문자' *5)는 '문자'를 5번 출력한다

 - print('문자'+5)는 에러이다

 - print('문자'+str(5))는 '문자5'를 출력한다

 - int()에는 숫자만 와야하며 엉뚱한 문자가 있다면 에러로 처리한다

 - int('10', 8)과 같이 형변환 및 진법을 설정할 수 있다

 - 컬렉션끼리도 서로 형태를 바꿔가며 변환할 수 있다. 다음에 다뤄본다.
728x90
반응형
728x90

지난 3개월 동안 cafe24의 node.js호스팅을 사용하며 느낀 점들을 소개할까 합니다.

장단점이 있었습니다.


1. 장점

 - 가벼운 홈페이지 운영정도를 생각한다면 저렴한 가격으로 구축 가능하다는 것

 

 - 무엇보다 장점은 다른 세팅없이 node.js프로젝트만 구축해서 올리면 된다는 것

( 다른 세팅이라 하면, 포트포워딩이나 nginx설정 등 기타 작업들을 말합니다.)


 - 안정적인 서버를 저렴하게 구축할 수 있다는 것


2. 단점

 - 서비스 확장을 위해서는 상위 가격의 제품을 써야만 한다는 것(cafe24에 의존적)

(nginx 설정 등을 통해, 직접 load balancing등을 구현하는 것은 불가능 합니다. 일반적인 웹호스팅이라고 보시면 됩니다.)


 - 치명적인 단점으로 .env를 통해 환경변수에 접근할 수 없다는 것

(cafe24에서 자체적으로 사용해서 저희는 쓸수 없다고 하네요)


 - 보통 클라우드 서비스나, 서버호스팅과 달리 node_modules 폴더를 푸시할때 같이 올려야 한다는 것

(push하는데 엄청난 시간이 소요됩니다. 거의 뭐 5분... node_modules를 올리지 않으면 당연히 에러가 발생합니다 npm install같은 행위는 저희가 할수 없기 때문입니다.)


 - 디렉토리 구조에서 web.js(http혹은 https서버를 실행시키는 스크립트파일) 를 반드시 root directory에 위치시켜야 한다는 것




저는 앞으로 정말 가벼운 서비스를 운영할 때는 이용할지도 모르겠습니다만, 글쎄요...

개인적인 의견으로는 node.js는 aws서비스를 이용하시는것이 아무래도 정신건강에 이로운것 같습니다.



ps. cafe24의 고객센터 서비스는 정말 응답이 빠릅니다.  이 부분은 서비스 이용간 가장 만족스러운 부분이었습니다.

728x90
반응형
728x90
12장. 창발성
 - 코드 구현에 있어서 다음의 네가지를 준수해보자. (중요도 순이다)
1) 모든 테스트를 실행한다.
2) 중복을 없앤다.
3) 프로그래머 의도륵 표현한다.
4) 클래스와 메서드 수를 최소로 줄인다.

 - 계속해서 강조하는 만큼 중요하다. 테스트 케이스를 만들어 실행하라. 낮은 결합도와 높은 응징력이 자연스럽게 따라온다.

 - 점진적으로 리팩터링 해라. 리팩토링에있어 코드 품질을 높이는 기법이라면 무엇이든 적용해듀 좋다. 응집도를 높이고, 결합도는 낮추고, 관심사를 분리하고, 시스템 관심사를 모듈로 나누고, 함수와 클래스 크기를 줄이고, 더 나은 이름을 선택하라.

 - 중복은 없애라
728x90
반응형
728x90

11장. 시스템

본 장은 필자가 이해에 있어 가장 어려움을 겪고있는 장이다. 핵심이 빠질수 있으며, 요약내용의 전달력이 떨어질 수 있으니 양해바랍니다.


 - 시스템을 제작하는 것과 사용하는 것은 아주 다르다. 이 의미를 여러번 곱씹어 생각해보길 바란다.


 - 시스템을 생성과 사용을 분리하는 한가지 방법으로는, 생성과 관련한 코드는 main(프로그램 실행시 돌아가는)이나 main이 호출하는 모듈로 옮기고, 나머지 시스템은 모든 객체가 모든 의존성이 연결시킨다. 그리고 애플리케이션은 그저 객체를 사용하면 될 뿐이다. 애플리케이션은 main이나 객체가 생성되는 과정을 전혀 모른다.


 - TDD와 리팩토링으로 얻어지는 깨끗한 코드는 코드 수준에서 시스템을 조정하고 확장하기 쉽게 만든다.하지만 시스템 아키텍처는 사전 계획이 필요하다. 단순한 아키텍처를 복잡한 아키텍처로 조금씩 키우는건 불가능한 것이 현실이다.


 - 코드 수준에서 아키텍처 관심사를 분리할 수 있다면, 진정한 TDD아키텍처 구축이 가능해진다. 그때그때 새로운 기술을 채택해 단순한 아키텍처를 복잡한 아키텍처로 키워갈 수 있다. BUDF(구현 전 모든 사항을 설계하는 기법)를 추구할 필요가 없다.


 - 아주 단순하면서도 멋지게 분리된 아키텍처로 소프트웨어 프로젝트를 진행해 결과물을 재빨리 출시한 후, 기반 구조를 추가하며 조금씩 확장해 나가도 괜찮다.


 - 반드시 그런것은 아니나 결정을 마지막 순간까지 미루는 방법은 최선이다. 게으르거나 무책임해서가 아니라, 최대한의 정보를 모아 최선의 결정을 내리기 위함이다. 성급한 결정은 불충분한 지식으로 내린 결정이다. 너무 일찍 결정하면 고객 피드백을 더 모으고, 프로젝트를 더 고민하고, 구현방안을 더 탐험할 기회가 사라진다.



[출처] 클린코드 - 로버트C.마틴 지음

728x90
반응형
728x90

10장. 클래스

 - 클래스를 만들 때 첫번 째 규칙은 크기다. 클래스는 작아야 한다. 두번째 규칙은 더 작아야 한다.


 - 클래스의 이름은 클래스의 책임을 기술해야 한다. 실제로 작명은 클래스의 크기를 줄이는 첫 관문이다. 클래스를 표현할 간결한 이름이 떠오르지 않는다면 필경 클래스의 크기가 너무 커서 그렇다. 혹은 클래스의 이름이 모호하다면 클래스의 책임이 너무 커서 그렇다.


 - 단일책임원칙(SRP)를 잊지말자. 클래스나 모듈을 변경할 이유는 단 하나뿐이어야 한다.


 - 도구상자를 어떻게 관리하고 싶은가? 작은 서랍을 많이 두고 기능과 이름이 명확한 컴포넌트를 나눠 넣고 싶은가? 아니면 큰 서랍 몇개를 두고 모두를 던져넣고 싶은가?


 - '함수를 작게, 매개변수 목록을 짧게'라는 전략을 따르다 보면 때때로 몇몇 메서드만이 사용하는 인스턴스 변수가 아주 많아진다. 이는 십중팔구 새로운 클래스로 쪼개야 한다는 신호다.


- OCP도 잊지말자. 클래스는 확장에 개방적이고 수정에 폐쇄적이어야 한다.


 - 클래스에는 구체적인 클래스와 추상 클래스가 있다. 구체적인 클래스는 상세한 코드를 포함하며, 추상 클래스는 개념만 포함한다. 추상클래스 및 인터페이스를 사용해 구현이 미치는 영향을 격리시키자.



[출처] 클린코드 - 로버트C.마틴 지음

728x90
반응형