반응형

Flutter PATH error

Could not find a Flutter SDK. Please ensure flutter is installed and in your PATH ( you may need to restart ).

분명Mac ./zshrc 파일에 PATH경로가 제대로 연결되어 있는데, 갑작스레 경로 관련 에러가 떳다.

 

문제점을 보아하니 VS Code확장은 PATH대부분의 사람들이 Dart / Flutter를 사용하고 있기 떄문에, 환경변수를 검색하는데, 가끔 PATH경로를 VS Code가 볼 수 없는 방식으로 설정이 되어버린다고 한다.

:: ) 터미널 시작 스크립트에서 설정을 했지만, DOC에서 VS Code를 시작하면 이를 상속하지 않을 수가 있다.

 

해결 : Locate SKD를 클릭하고, 플러터 경로 [ ./flutter/bin ]를 선택해주면 문제없이 실행된다.

반응형

'Flutter > Flutter Dart Tip' 카테고리의 다른 글

[ Flutter ] buildContext 의미  (0) 2022.02.13
반응형

nodeJS 시작하기

 

필요한 플러그인

$ npm install express

 

있으면 좋은 플러그인

$ npm install nodemon

 

nodemon : 디렉토리의 파일 변경이 감지되면 노드 응용 프로그램을 자동으로 다시 시작해서 NodeJS기반 응용프로그램을 개발하는데 도움이 되는 플러그인

 

프로젝트 생성

원하는 위치에 프로젝트 디렉터리 생성하고 프로젝트 폴더에서 커맨드 실행하기 ( VSCode or Terminal )

npm init

npm은 nodeJS에서 패키지들을 설치하고 관리할 때 사용되는 패키지 매니저

package.json 파일 생성된다.

package.json의 dependency부분에 설치한 패키지들의 이름과 버전이 입력된다.

내가 추가한 플러그인 => express, nodemon

app.js

const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);

app.get('/', (req, res) => {
    res.json({
        success: true,
    });
});

// SERVER
const port = 8080;
app.set('port', port);
server.listen(port, () => {
    const message = `
        [ Test Server ]
        Running Port : localhost:${port}
        Start Time : ${Date()}
    `;
    console.log(message);
});

localhost:8080으로 접속해보면

{"success":true}

라는 문구가 나온다.

 

이로써 첫 서버 구동을 시켜보게 되었다.

반응형
반응형

네이티브 앱 ( Native App )

네이티브 앱이란 Android와 iOS 모바일 기기에 최적화 된 언어로 개발된 '애플리케이션'을 말합니다.

Android는 Java와 Kotlin / iOS는 Objective-C와 Swift로 나뉩니다.

 

네이티브 앱의 장점

- 성능이 모바일웹 앱, 하이브리드 앱에 비해 성능이 가장 좋다.

- 각각의 모바일 운영체제에서 제공하는 툴과 언어 등에 따라서 기능들을 최대한으로 살리기 때문에, 높은 사양의 그래픽, 성능을 자랑하면서 구동 속도까지 빠르다.

- 네이티브 API를 호출하여 사용함으로써 플랫폼과 밀착되어 있다.

- 해당 언어에 익숙한 사용자라면 좀 더 쉽게 접근할 수 있다.

 

네이티브 앱의 단점

- Android와 iOS의 호환이 이루어지지 않기 때문에 각각 플랫폼을 제작해야한다.

- 플랫폼에 한정적이다.

- 해당 플랫폼에서 요구하는 언어에 제약적이며, 해당 언어와 플랫폼의 API를 다루는데 익숙해야 한다.

- 직접 플랫폼을 제작하지 않는 이상 많은 비용이 들며, 의뢰를 맡기면 제작 비용또한 가장 많이 든다.

 

네이티브 앱을 사용해야 할 때

- 3D게임이나 애니메이션을 제작할 때

- 어떤 장치의 특별한 기능을 적용시키고 싶을 때

- 앱 기능이 상당히 많고 복잡한데, 성능이 확실하게 나오는 것을 원할 떄

 

하이브리드 앱 ( Hybrid App )

하이브리드 앱이란 네이티브 앱과 모바일 웹앱의 강점을 합친 앱을 말합니다. ( 네이티브 앱 + 모바일 웹앱 )

일반적으로는 네이티브 웹에 웹 뷰를 띄워서 웹앱을 실행시키는 것이 보편적이며 양쪽의 API를 모두 사용할 수 있습니다.

 

하이브리드 앱의 장점

- 네이티브 API와 브라우저 API를 이용해서 다양한 개발이 가능하다.

- 웹개발 기술을 사용해서 앱을 개발할 수 있다.

- 한번의 개발로 Android와 iOS에 대응 할 수 있다.

- 의뢰를 맡길때 제작 비용에 유리하다.

 

하이브리드 앱의 단점

- 네이티브 기능에 접근하기 위해 네이티브 개발 방법이 결국에는 필요하게 된다. ( 한계가 있다. )

- 웹뷰에서 앱을 실행하기 때문에 앱의 성능이 곧 브라우저의 성능이다.

- UI프레임워크 도구를 사용하지 않는다면 개발자가 UI를 제작해야 한다.

- UX디자인이 네이티브 플랫폼에서 적절하게 실행되도록 하려면 일반적으로 상당한 노력이 필요하기 때문에 의뢰를 할 경우 총 비용이 네이티브급으로 높아질 수 있다.

 

하이브리드 앱을 사용해야 할 때

- 다양한 플랫폼( 모바일이나 웹 )을 통한 사용자층이 넓을 때

- 복잡한 기능이 없을 때

- 시간은 촉박한데, 여러 기기에서 실행되어야 하는 앱을 만들어야 할 때

- 프로젝트 아이디어를 간단하게 MVP모델로 테스트해 보고 싶을 때

 

모바일 웹앱 ( Mobile Web App )

모바일 웹앱이란 모바일웹과 네이티브앱을 결합한 형태로 모바일웹의 특징을 가지면서 네이티브앱의 장점을 갖습니다.

모바일웹보다 조금 더 모바일에 최적화 된 앱을 의미하며, 모바일웹처럼 웹기술로 개발됩니다.

 

모바일 웹앱의 장점

- 웹사이트를 보는 것이기 때문에 설치할 필요가 없으며, 브라우저에서도 접근이 가능하다.

- 별도의 승인과정이 필요하지 않기 떄문에 유지보수가 쉽다.

 

모바일 웹앱의 단점

- 플랫폼 API( 카메라, QR 등 )을 사용할 수 없으며, 오로지 웹브라우저 API만 사용할 수 있다.

- 친화적인 앱을 개발하기 번거롭다.

- 브라우저 내에서 검색을 통해서 들어가야 하기 때문에 네이티브 앱, 하이브리드 앱보다 실행하기가 불편하다

 

모바일 웹앱을 사용해야 할 때

- 모바일 기기 기능이 전혀 필요없을 때

 

크로스 플랫폼 앱 ( Cross Platform Application )

크로스 플랫폼 앱은 하이브리드 앱처럼 한번에 개발로 Android와 iOS 양쪽에 대응이 가능합니다. 대신 네이티브 코드가 아닌 코드로 작성을 한 후 각각의 운영체제가 이해할 수 있는 코드로 변환시켜서 대응을 시켜줍니다.

 

크로스 플랫폼 앱의 장점

- 한번의 개발로 Android와 iOS에 대응 할 수 있다.

- 다양한 배경의 개발자( Back-End, Java 등 )를 끌어 모을 수 있다. 

- 크로스 플랫폼 앱도 한번의 개발로 두가지를 대응할 수 있기 때문에 유지보수가 쉽다.

 

크로스 플랫폼 앱의 단점

- 네이티브가 아닌만큼 퍼포먼스를 100% 끌어올릴 수 없으며, 변환작업이 필요하다.

- 실무에 적용된 것이 그리 길지 않기 때문에 숙련자를 찾는데 어려움이 있을 수 있다.

 

크로스 플랫폼 앱을 사용해야 할 때

- 프로토타입을 빠르게 개발하거나, 개발 기간 자체가 짧을 때

- Android와 iOS 크로스 플랫폼을 지원하는 앱일 때

 

 

결론 : 요즘 앱들은 종류도 다양하고 기능도 다양하기 때문에, 각각에 맞는 방식을 찾아서 개발을 시도하는 것이 좋다고 생각됩니다.

 

반응형
반응형

BODY 구성

<body>
    <h1>Header 1</h1>
    <h1 id="target">Header 2</h1>
    <h1>Header 3</h1>
    
    <script>
        $(document).ready(function() {
            $('#target').css('color', 'orange');
        });
    </script>
</body>

HTML웹 표전에 따르면 id속성은 HTML페이지 내에서 유일한 값을 가져야 한다. 즉, 위 구성에서 id속성으로 target은 무조건 한개만 존재해야 합니다. ( 실제 실행에서는 2개 이상이어도 문제는 없습니다. )

 

h1태그 중 id속성이 target인 문서 객체 선택하기

<script>
    $(document).ready(function() {
        $('h1#target').css('color', 'orange');
    });
</script>

클래스 선택자

<body>
    <h1 class="item">Header</h1>
    <h1 class="item select">Header 1</h1>
    <h1 class="item">Header 2</h1>
</body>

<script>
    $(document).ready(function() {
        $('.item').css('color', orange');
        $('h1.item').css('background', 'red');
    });
</script>

두 class속성이 모두 있는 문서 객체만 적용하기

<script>
    $(document).ready(function() {
        $('.item.select').css('color', 'orange');
    });
</script>

현재 body태그에서 두 class속성이 모두 있는 문서 객체는 두번째 위치한 h1태그 이므로, 두번째 h1태그에만 스타일이 적용이 됩니다.

반응형
반응형

1. 전개 연산자를 활용한 배열 합치기 ( Spread Operator(...) )

전개 연산자를 사용한 배열 병합

<script>
    const arrayA = [1, 2, 3, 4, 5];
    const arrayB = [52, 273, 99, 100, 101];
    
    const newArray = [...arrayA, ...arrayB];
    
    console.log(newArray); // [ 1, 2, 3, 4, 5, 52, 273, 99, 100, 101 ]
    
</script>

 

전개 연사자를 사용한 배열 병합 2

<script>
    const originalArray = [52, 273, 55, 45];
    
    const newArrayA = [1, 2, 3, 4, 5, ...originalArray];
    const newArrayB = [...originalArray, 1, 2, 3, 4, 5];
    
    console.log(newArrayA); // [ 1, 2, 3, 4, 5, 52, 273, 55, 45 ]
    console.log(newArrayB); // [ 52, 273, 55, 45, 1, 2, 3, 4, 5 ]
    
</script>

...originalArray처럼 전개연산자는 originalArray의 원소들을 쪼개어 개별요소로 리턴합니다.

 

2. .push()를 사용한 배열 합치기

<script>
    const array1 = [1, 2, 3, 4, 5];
    const array2 = [6, 7, 8, 9, 0];
    
    array1.push(array2);
    
    console.log(array1.length); // 6
    console.log(array1[5]); // [ 6, 7, 8, 9, 0 ]

</script>

.psh()를 사용하여 배열을 합치면 파라미터로 전달된 배열을 하나의 원소로 처리가 됩니다.

그러므로, 합쳐진 array1의 length는 10이 아닌 6이 되고, array1[5]의 원소는 [ 6, 7, 8, 9, 0 ]이 출력됩니다.

 

3. 전개 연산자와 .push()를 활용한 배열 합치기

<script>
    const array1 = [1, 2, 3, 4, 5];
    const array2 = [6, 7, 8, 9, 0];
    
    array1.push(...array2);
    
    console.log(array1.length); // 10
    console.log(array1[5]); // 6

</script>

전개 연사자는 배열의 원소들을 쪼개어 개별요소로 리턴한다고 했습니다.

그렇기 때문에 2번처럼 하나의 원소가 아닌 개별원소로 처리가 됩니다.

그러므로, array1의 length는 10이 되며, array1[5]의 원소는 6이 출력됩니다.

 

4. .concat()을 사용한 배열 합치기

<script>
    const array1 = [1, 2, 3];
    const newArray = array1.concat('a', 'b', ['c', 'd'], 'e');
    
    console.log(newArray.length); // 8
    console.log(newArray); // [ 1, 2, 3, 'a', 'b', 'c', 'd', 'e' ]
    
</script>

.concat()은 array1과 전달받은 파라미터들을 합쳐서 새로운 배열을 생성하여 리턴합니다.

이 때, 파라미터가 배열일 경우 배열 안의 원소들을 뽑아서 새로운 배열에 추가합니다.

그러므로, [ 'c', 'd' ] 배열이 하나의 원소로 취급되지 않아서 newArray.length가 7이 아닌 8이 됩니다.

 

반응형
반응형

SSD란 ?

SSD는 Solid-State Drive 라고해서 반도체를 이용하여 정보를 저장하는 장치입니다.

 

HDD란 ?

HDD는 Hard Disk Drive 라고해서 순차접근이 가능한 컴퓨터의 보조 기억 장치입니다.

 

SSD와 HDD의 차이점

동영상, 사진, 게임, 파일 등등의 데이터를 저장하는데 필수적인 장비를 SSD와 HDD라고 합니다.

 

:: HDD 장점

HDD는 저렴한 가겨에 구입할 수 있는 장점이 있습니다.

데이터 용량도 SSD에 비해(동일 가격으로 봤을 경우) 크기 때문에 가격 대비 성능이 우수합니다.

 

:: HDD 단점

HDD는 구조상 충격에 약한 점이 있습니다. 또한 데이터를 읽고 쓰는 속도가 느리기 때문에 시간이 걸리고, 데이터를 읽거나 기록할 때 물리적인 움직임 때문에 소음이 발생한다는 단점이 있습니다.

 

:: SSD 장점

SSD는 데이터의 읽고 쓰는 속도가 매우 빠르기 때문에 자주 데이터를 옮기거나, 사용할 때 시간을 효율적으로 사용할 수 있습니다. 또한, 충격에 강해서 데이터가 망가질 가능성도 HDD보다 낮으며, 물리적인 움직임이 없기 때문에 소음도 없고 전력소모도 적다는 장점이 있습니다.

 

:: SSD 단점

SSD는 HDD에 비해 가격이 높습니다. 또한 갑작스레 경고없이 고장이 날 가능성이 있습니다. 파일을 저장하는데 문제가 있거나, 저장하는데 비정상적으로 오랜 시간이 걸리는 경우, 일반적으로 SSD에 오류가 발생하려고 하거나 오류가 진행중인 상황이라고들 합니다. ( SSD는 데이터를 읽을때는 문제가 없지만, 기록하면 기록할수록 수명이 깎여나갑니다. 보통 TBW[ Tera(or Total) Byte Written ]라고 몇 테라까지 쓰기가 가능한지 알려줍니다. )

오래된 SSD의 상태를 모니터링하지 않으면 갑작스레 사용할 수 없게 될 수도 있다고 합니다. ( 보통 수년간 사용 후에 발생합니다. )

 

종류 HDD SSD
속도 처리속도가 빠르지 않습니다. 처리속도가 매우 빠릅니다.
가격 저렴한 편입니다. 옛날 만큼은 아니지만 여전히 조금 비싼 편입니다.
수명 기록에 강합니다. 기록에 약합니다.
소음 움직임이 있기 때문에, 소음이 있습니다. 움직임이 없기 때문에, 소음이 없습니다.
발열 발열이 높은편입니다. 발열이 적은편입니다.
내구성 충격에 취약합니다. 실제 구동하는것이 없기 때문에 충격에 강합니다.
무게 SSD보다 상대적으로 무겁습니다. HDD보다 상대적으로 가볍습니다.

 

HDD 이런사람들에게 추천합니다.

- 대용량의 데이터를 저장하는 사람

- 저장해두고 오랫동안 열어보지 않는 파일들을 기억해 둘때 적합합니다.

 

SSD 이런사람들에게 추천합니다.

- 자주 데이터를 열어봐야하는 사람

- 작은 용량의 파일이나, 설치파일등의 용도로 사용할 때 적합합니다.

 

반응형
반응형

VueJS 라이프사이클 다이어그램

위 이미지는 인스턴스 라이프사이클에 대한 다이어그램입니다. 

:: 외울필요는 없지만 한번 봐두면 좋은 내용입니다.

출처 : VueJS 공식문서

 

:: setup()을 이용한 라이프사이클은 제외하고 정리해둔 내용입니다.

 

1. beforeCreate :

beforeCreate는 인스턴트가 생성되고 나서 가장 처음 실행되는 라이프 사이클 단계입니다.

컴포넌트를 생성하기 전에 호출이 되기 때문에 DOM이 세팅되지 않는 시점입니다.

즉, DOM에 접근하려는 시도를 이 시점에 하면 에러가 팡팡 터져 나오게 됩니다.

:: DOM => Document Object Model(문서 객체 모델)은 HTML이나 XML에 접근하기 위한 일종의 인터페이스

 

2. created :

created는 컴포넌트에 data속성과 methods속성이 정의된 상태입니다. 두 속성값에 접근하는 로직은 구현되어도 문제없이 작동되는 상태입니다.

하지만 화면 요소에 인스턴스가 세팅되지 않는 상태이기 때문에 template속성에 정의된 DOM요소에 접근하면 에러가 발생합니다.

 

3. beforeMount :

beforeMount는 템플릿과 렌더 함수들이 컴파일된 이후 첫 render()함수가 일어나기 직전 시점입니다.

created이후 속성에 지정한 마크업 속성을 render()함수로 변환 후 el속성에 지정한 화면 요소에 인스턴스를 세팅하기 직전에 호출되기 때문에, 화면이 나오기 이전에 호출해야 할 코드를 구현합니다.

 

4. mounted :

mounted는 화면 요소에 인스턴트 세팅이 된 후 호출됩니다.

template속성에 정의한 화면 요소에 접근이 가능하므로 화면 요소를 제어하는 코드를 구현합니다.

조심해야 할 점은, 컴포넌트에서 본인이 생각한 순서대로 mounted가 진행되지 않을수가 있습니다. 부모의 mounted가 자식의 mounted보다 먼저 실행되지 않습니다.

 

5. beforeUpdate :

beforeUpdate는 컴포넌트의 데이터가 변하여 업데이트 사이클이 시작될 때 호출됩니다.

이렇게 데이터가 변경되면 가상 DOM을 활용해서 화면에 새로 보여지게 됩니다. 이 때, 보여지기 직전에 호출되는 것이 beforeUpdate입니다.

즉, 변경 예정인 데이터의 값을 이용해서 구현해야 할 때 이 단계에서 진행합니다.

또한 그 데이터 값을 변경하는 로직을 구현해도 다시 화면에 보여지지 않습니다.

 

6. updated :

updated는 beforeUpdate가 끝나고 화면이 나타나면 호출됩니다.

데이터가 변경되고 화면 요소들을 제어하고 싶을때 이 단계에서 구현하면 됩니다.

조심해야 할 점은, beforeUpdate => updated => beforeUpdate => updated => ... 이런식으로 무한루프에 빠지게 될 수 있습니다.

그렇기에 데이터값을 변경하는 로직은 위 beforeUpdate에서 처리를 해주어야 합니다.

 

7. beforeDestroy :

beforeDestroy는 뷰 인스턴스가 해체되기 직전에 호출됩니다.

이 단계에서는 아직 인스턴스가 없어지지 않은 상태이기 때문에 접근이 가능하며 이벤트, 뷰 인스턴스 데이터 등을 삭제하거나 하는 용도로 사용하면 됩니다.

 

8. destroyed :

destroyed는 뷰 인스턴스가 해제되고 난 후에 호출됩니다.

뷰 인스턴스에 정의한 속성들이 제거되고 하위에 선언했던 인스턴스들 역시 모두 해체됩니다.

 

 

반응형
반응형

Flutter 개요

플러터는 iOS와 안드로이드 앱 두가지를 한번에 개발할 수 있는 크로스 플랫폼입니다.

 

Flutter 공식 홈페이지

Flutter공식홈페이지

 

VScode

Flutter 개발을 하기 위한 여러 툴중 한가지입니다.

다른 툴을 사용하고 있지 않다면, VScode를 사용하는것을 추천합니다.

VScode설치하러가기

 

Android Studio

Flutter로 안드로이드 앱을 배포하기 위해서 필요한 프로그램입니다.

또한, Flutter로 안드로이드 앱을 개발할 수 있습니다.

Android Studio 설치하러가기

 

Xcode

Flutter로 iOS ㅇ애블 배포할 때 필요한 프로그램입니다.

또한, Flutter로 iOS 앱을 개발할 수 있습니다.

Xcode 설치하러가기

:: Xcode는 App Store에서 설치 할 수 있습니다.

 

Flutter SDK

Flutter로 개발하기 위해서 설치해야하는 Flutter SDK입니다.

FlutterSDK 설치하러가기

 

플러터 설치하기

1. 위 링크로 들어가서 flutter_macos_....zip을 다운받습니다.

2. 원하는 위치에 파일의 압축을 풀어줍니다.

3. .bash or .zshrc등에 경로를 추가해줍니다.

$ export PATH="$PATH:`pwd`/flutter/bin"

:: pwd => Print Working Directory ( 현재 작업중인 디렉터리의 이름 )

즉, 경로를 입력해주면 됩니다.

 

4. 플러터닥터를 실행해줍니다.

$ flutter doctor

 

:: flutter doctor 실행시 문제 발생

Flutter doctor 실행시 문제발생

이런 안드로이드 라이센스 경고창이 뜨게됩니다.

이를 해결하기 위해 flutter doctor --android-licenses를 실행시켜서 해결하려 하지만

flutter doctor --android-licenses 실행시

이런식으로 sdkmanager를 찾을수 없고, cmline-tools가 설치되어 있는지를 확인하라고 알려줍니다.

 

:: 해결방법

1. 안드로이드 스튜디오를 실행시켜줍니다.

Android Studio

2. Configure -> SDK Manager를 선택합니다.

SDK Manager 선택

3. Android SDK -> SDK Tools -> Android SDK Command-line Tools, Android SDK Platform-Tools를 선택한 후 OK를 눌러주면 설치가 됩니다.

SDK Tools

:: 가끔 버전 때문에도 에러가 뜨는 경우가 있습니다. 그럴때는 오른쪽 아래 Show Package Detail를 활성화 한 뒤에 Android SDK Build-Tools 32의 버전을 낮춰서 인스톨 시켜줍니다.

 

4. flutter doctor --android-licenses를 터미널에 다시 실행시켜 줍니다.

$ flutter doctor --android-licenses

그럼 서명하는 내용이 나오는데 모두 y를 선택해줍니다.

 

5. flutter doctor를 다시한번 실행시켜 줍니다.

$ flutter doctor

flutter doctor 실행완료

그러면 이렇게 경고없이 flutter doctor가 실행이 완료됩니다.

 

플러터 실행 확인하기

플러터 생성하기

flutter create my-app

앱 실행시키기

cd my-app
flutter run

Flutter 실행

flutter run을 하면 이렇게 앱이 실행됩니다.

 

이렇게 플러터로 개발하기 위한 준비과정이 끝났습니다. 이제 dart를 배우고 플러터로 앱을 개발합니다.

반응형

+ Recent posts