서비스는 특정 액티비디와 상관 없이 백그라운드에서 실행되는 컴포넌트이다. 그래서 화면을 구성하는 레이아웃을 작성할 필요가 없다. 그러므로 지속적으로 장시간 동작해야하는 기능(블루투스, 와이파이 연결, GCM notification listener 등)이 있다면 서비스로 구현 해야한다. 


1
2
3
4
5
6
7
8
9
10
11
12
public class MyService1 extends Service {   
    public void onCreate() {
        Thread t = new Thread() {
            void run() {  }
        };
        t.start();
    }
 
    public void onDestroy() { 
 
    }
}

cs


서비스 클래스를 상속받아서 구현한다.

서비스의 생명 주기는 2가지로 분류가 된다
로컬 서비스를 구현할 때와
원격 서비스를 구현할 때이다


로컬 서비스

onCreate()

서비스가 생성될때 호출된다

onStart()

startService() 메소드에 의해 서비스가 시작될때마다 호출된다

onDestory()

서비스가 종료될때 호출


원격 서비스

onCreate()

서비스가 생성될때 호출된다

onBind()

bindService() 메소드에 의해 서비스가 시작될때 호출된다.

onUnbind()

서비스와 연결이 끊겼을 때 호출된다.

onDestroy()

서비스가 종료 될때 호출된다.




Intent myintent = new Intent(this, (이동할 액티비티 이름).class);

startActivity(myintent);

 

Intent Service = new Intent(this, (실행할 서비스 이름).class);

startService(Service);

 

'Programming > Android' 카테고리의 다른 글

xml include  (0) 2016.09.15
View  (0) 2016.09.07
R  (0) 2016.09.05
안드로이드의 구성요소 요약  (0) 2016.09.05
Thread (백그라운드에서 UI변경)  (0) 2016.09.03
프로그래밍을 하다보면 R.layout...라는 구문을 많이 쓰게된다. 그렇다면 R은 무엇일까?
R은 R.java로 작성되어있는 정적 클래스의 정적 변수를 가르킨다.
R클래스는 안드로이드 빌드 시스템에 의해 자동으로 생성되는 자바 클래스이며,
이 클래스는 리소스를 효율적으로 접근할 수 있도록 리소스를 integer 값으로 관리하는 역할을 한다.
각 파일을 추가할때마다 R에 자동으로 저장이된다.
또한 정적파일이기때문에 어디서든지 사용이 가능하다.

R은 이곳에 위치하고있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public final class R {
    public static final class attr {
    }
    public static final class dimen {
        public static final int activity_horizontal_margin=0x7f050000;
        public static final int activity_vertical_margin=0x7f050001;
    }
    public static final class id {
        public static final int action_settings=0x7f080000;
    }
    public static final class layout {
        public static final int activity_main=0x7f030000;
    }
    public static final class menu {
        public static final int menu_main=0x7f070000;
    }
    public static final class mipmap {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class string {
        public static final int action_settings=0x7f060000;
        public static final int app_name=0x7f060001;
        public static final int hello_world=0x7f060002;
    }
    public static final class style {
        /**  Customize your theme here. 
         */
        public static final int AppTheme=0x7f040000;
    }
}
cs

또한 R의 내용을 보면 이렇다.


그리고 자바코드에서는 리소스 자원을 R.mipmap.icon, R.layout.main, R.string.app_name 처럼 접근할 수 있으며

XML에서는 @mipmap/icon, @string/hello로 접근 할 수 있다. 


참고로 R을 인식하지 못해서 빌드 오류가 생길때가 있는데, 그때는 빌드클린을 하고 다시 빌드를하면된다.


출처 : https://kairo96.gitbooks.io/android/content/ch2.4.html

'Programming > Android' 카테고리의 다른 글

View  (0) 2016.09.07
Service  (0) 2016.09.05
안드로이드의 구성요소 요약  (0) 2016.09.05
Thread (백그라운드에서 UI변경)  (0) 2016.09.03
Toolbar  (0) 2016.09.03




액티비티

사용자 인터페이스 화면을 구성하는 컴포넌트

서비스

백그라운드에서 실행되는 컴포넌트, 시각적인 사용자 인터페이스를 가지지 없음

인텐트

컴포넌트에 액션, 데이터 등을 전달하는 메시지 컴포넌트

인텐트 필터

수신할 수 있는 인텐트를 정의하여 컴포넌트를 정의하는 역할을 하는 컴포넌트

브로드캐스트 리시버

배터리 부족, 언어 설정 변경 등의 특정 브로드 캐스트를 수신하거나 반응하는 컴포넌트, 시각적인 사용자 인터페이스를 가지지않음

콘텐트 프로바이더

애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공하는 컴포넌트

노티피케이션

사용자에게 특정 이벤트를 알리는 컴포넌트

프래그먼트

액티비티 내에서 독자적으로 동작하는 UI 컴포넌트


'Programming > Android' 카테고리의 다른 글

Service  (0) 2016.09.05
R  (0) 2016.09.05
Thread (백그라운드에서 UI변경)  (0) 2016.09.03
Toolbar  (0) 2016.09.03
manifest  (0) 2016.09.02

MySQL설치


npm install mysql --save






사용법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
var mysql = require('mysql');
var client = mysql.createClient({
    user : 'root',
    password : 'passwd'
    database : Company
});
 
client.query('SELECT * FROM products'function(err, result, fields){
    if(err){
        console.log('err');
    }else{
        console.log(result);
    }
});
cs


mysql모듈을 추출하여 createClient로 사용자 이름과 비밀번호를 정의한다. 그리고 database로 사용할 데이터 베이스를 정의한다. 


Client객체의 메서드에는 query가 있어서 쿼리문장을 직접 입력할 수 있다. 쿼리문장을 실행후에 result값으로 리턴해준다.


1
2
3
client.query('INSERT INTO products (name, modelnumber, series) VALUES (?,?,?)',[
'req.body.name''req.body.number''req.body.series'], function(err, result, fields){
 
});
cs


'?'토큰을 사용하여 쿼리문에 변수를 넣을수도 있다.

'Programming > Node.JS' 카테고리의 다른 글

Export / Import  (0) 2016.09.14
지금 현재 서버의 ip를 알고 싶을때  (0) 2016.09.14
Cluster  (0) 2016.09.05
코딩의 관례  (0) 2016.09.05
express.js 구조  (0) 2016.09.05

노드는 싱글 스레드로 동작하기 때문에 멀티 프로세스의 이점을 보지 못한다. IO에 대한 처리는 이벤트 루프를 통해서 좋은 성능을 보여주지만 ,CPU계산양이 많은 부분에서는 성능이 급격하게 떨어진다. 

이부분을 클러스터링을 통해서 상당 부분 해결 할 수있다.


var cluster = require('cluster');


cluster.isMaster()와 cluster.isWorker()로 현재 프로세스가 마스터 프로세스인지 워커 프로세스인지 알수있다.

내부적으로는 process.env.NODE_WORKER_ID === undefined이면 마스터 프로세스로 판단한다.


마스터 프로세스일 경우에는 워커프로세스를 생성하고, 워커 프로세스일 경우에 HTTP 서버를 생성한다.


require('os').cpus().length를 사용하면 CPU의 개수를 알수 있으므로, 프로세스마다 하나의 워커 프로세스를 같게 CPU개수 만큼 cluster.fork()로 워커 프로세스를 생성한다. 

워커 프로세스를 생성할때, 균일하게 생성해 주기 위해서

cluster.schedulingPolicy = cluster.SCHED_NONE; //워커 스케쥴을 OS에 맡긴다.

cluster.schedulingPolicy = cluster.SCHED_RR; //워커 스케쥴을 Round Robin 방식으로 한다.
중 라운드 로빈 방식을 사용하기로 한다.


워커 프로세스가 생성되면 online이벤트 cluster.on('online', founction(worker){ }); 가 생성되어 워커의 정보를 알수있으며,

워커 프로세스가 종료할 때 발생하는 exit이벤트cluster.on('exit')를 주어서 프로세스가 종료할때 프로세스 아이디를 출력해 줬지만, 다시 cluster.fork()를 호출에 다시 프로세서를 생성할 수 도있다.


cluster.on('online', function (worker) {

 console.log('생성된 워커의 아이디 : ' + worker.process.pid);

});

 

cluster.on('exit', function (worker, code, signal) {

  console.log('죽은 워커의 아이디 : ' + worker.process.pid);

  console.log('죽은 워커의 exit code : ' + code);

  console.log('죽은 워커의 signal : ' + signal);

}); 




윈도우에서는 SET NODE_DEBUG=cluster를 실행후, node app.js 를 실행 한다.

그외에서는 NODE_DEBUG=cluster node app.js 를 실행한다.


cluster.fork()로 생성도니 프로세스간에는 메시지를 전달할 수있다.

마스터 프로세스에

worker.on('message', function(msg){});이벤트를 등록해서 워커프로세스의 메시지를 수신하는 부분이다.

werker.send(message)를 통하여 워커프로세스에게 메시지를 보낸다.

워커 프로세스에

process.send({cmd: " "});로 마스터 프로세스에 메시지를 보낼수 있다.

process.on('message', function(msg){ }); 마스터 프로세스로 부터 전송받은 메시지를 처리하는 이벤트


'Programming > Node.JS' 카테고리의 다른 글

지금 현재 서버의 ip를 알고 싶을때  (0) 2016.09.14
mysql 모듈  (0) 2016.09.05
코딩의 관례  (0) 2016.09.05
express.js 구조  (0) 2016.09.05
Express.js 설치하기  (0) 2016.09.05

들여쓰기

공백 2칸


세미콜론

항상 사용


작은따옴표

문자열 등은 큰따옴표 대신 작은 따옴표


중괄호

if(true){

//doSometiong

}


변수와 프로퍼티

소문자로시작하는 카멜 케이스 사용


클래스

대문자로 시작하는 카멜 케이스 사용


상수

모두 대문자


동등비교

==대신 ===사용


콜백

첫파라미터는 에러 파라미터로 사용한다.

callback(err, param1, param2)



콤마

콤마로 여러불 걸쳐 나열 할때는 콤마를 라인 옆에 쓴다.

var a

, b;



***카멜 표기법

  • "camelCase"
  • 각 단어의 첫문자를 대문자로 표기하고 붙여쓰되, 맨처음 문자는 소문자로 표기함
  • 띄어쓰기 대신 대문자로 단어를 구분하는 표기 방식
  • 예시: backgroundColor, typeName, iPhone

***파스칼 표기법

  • "PascalCase"
  • 첫 단어를 대문자로 시작하는 표기법
  • 예시: BackgroundColor, TypeName, PowerPoint


'Programming > Node.JS' 카테고리의 다른 글

mysql 모듈  (0) 2016.09.05
Cluster  (0) 2016.09.05
express.js 구조  (0) 2016.09.05
Express.js 설치하기  (0) 2016.09.05
http모듈  (0) 2016.09.03

express.js 구조


express.js 를 설치하면 다음과 같은 파일들이 폴더내에 설치된다.

살펴보도록하자.

요약

* app.js 익스프레스의 메인 파일로 웹서버 생성, 라우팅 등을 모두 app.js에서 한다.


* package.json 프로젝트의 정보를 담고있는 npm 설정파일이다.


* route/ 라우팅 관련 함수, 즉 URL에 따라 호출될 함수를 모아두는 디텍토리다. 라우팅에 있는 파일들을 app.js 에서 불러

와 웹서버에 라우팅을 연결한다.


* public/ css, 자바스크립트, 이미지 등의 정적 파일을 모아두는 리렉토리이다. 기본적으로 style.css가 생성되어있다.


* views/ 뷰 파일이 위치하는 디렉토리이다. 자바라면 JSP파일이 위치하는 디렉토리와 같고, 여기선 ejs템플릿을  사용 하므

로*.ejs파일이 존재한다


package.json


package.json에서는 프로그램 이름, 버전등 노드의 정보를 기술하는 곳이다.

또한 npm install로 설치시에 이 패키지를 참조하여 해당 버전에 맞는  npm을 설치하게 된다. 

npm install 시에 사용하고자 하는 모듈 입력후 --save를 입력하면 자동으로 package.json에 입력이 된다.




bin/www


서버구동을 위한 코드가 기록되어있다. express 서버설정 코드가 기록된 app.js 파일을 가져와서 노드의 http객체와 연동하는 작업이 이루어 지는 부분이다. 실제 서버를 구동하는 파일이다.


app.js


bin/www에서 사용되는 이 파일은 express 설정파일이 담겨있는 핵심 부분이다. express 객체를 생성하고 환경 설정을한다.

라우팅설정을 정희하고, 다향한 모듈을 추출하여 사용한다.



morgan : http 요청에 대해 로깅하는 모듈이다.

body-parser : http 요청중 POST 요청의 데이터에 접근하기 위한 모듈이다. (request.body사용을 위함)

cookie-parser : http로 요청한 클라이언트 쿠키 정보에 접근하기 위한 모듈이다. (set-Cookie : { })



app.set은 특정 키에 값을 설정할때 사용하고, app.use는 익스프레스에서 사용할 미들웨어를 결정한다.

app.set을 이용하여 views키에 views파일의 경로를 지정하고, view의 템플릿 엔진을 ejs로 정의하는 부분이다.



logger('dev')에서 dev는 morgan이 지원하는 로그 포맷이다. 지원 포맷으로는 default, short, tiny, dev가 있다.

이에 대해서는 다음에 자세히 알아보도록하자


여기서 익스프레스는 기본적으로 요청의 바디를 처리하지 않으므로, express.bodyParser()를 사용하여 application/json의 바디를 파싱해 req.body 변수에 할당한다.


urlencodede 의 exteneded를 true로 고치면, UTF-8 인코딩을 사용하여 parsing 하겠다는 뜻이다.

그리고 cookieParser()를 사용하여 Header에 쿠키 부분을 추가하는 부분이며


__dirname/public 의 경로를 전역으로 사용하여서 CSS나 자바스크립트 같은 정적 파일이 있는 위치를 지정한다.



express초기에 설치되지는 않았지만, REST스러운 웹사이트를 구축하려면 GET, POST이외에 PUT, DELETE메소드를 사용해야한다. 하지만 웹브라우저에서는 GET과 POST만 지원하는데 프론트에서 <form> 태그에 다음과 같은 <input>태그를 두어 PUT 이다 DELETE 메소드를 지정한다.


 <input type = 'hidden' name ='_method' value = 'PUT'>



methodOverride설치법

 

npm install method-override --save로 설치하고 

var methodOverride = require('method-override');

app.use(methodOverride({'_method'})); 



그리고 route를 위한 코드이다.

app.use('/', routes); routes폴더내에 있는 index(default 값)를 찾는다

해당 url로 접속하는 것을 routes/index로 보내어서 그안에서 각각의 요청(GET/ POST)을 통해 처리한다

routes 폴더 내에있는 해당 미들웨어를 찾는 것이다


routes/index.js



express 를 추출하고 express.Router()를 사용하여  라우터 객체를 생성하였다.

그리고 router.get부분은 해당 url로 get요청이 들어왔을때, 생기는 이벤트를 처리하는 루프로써,

여기서는 indes.ejs 화면을 출력한다.

그리고 module.exports = router를 사용하여 이 모듈을 외부에서 참조 할수있게 만들었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (app.get('env'=== 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}
 
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});
cs


또한 error 처리는 app.get('env') === 'development'이면 스택트레이서를 출력해주고

그렇지 않으면 스택트레이서를 출력하지 않는다.

기본값은 Development로 지정되어있는데 이를 변경하고 싶다면

NODE_ENV=production node app.js 로 실행하면된다

윈도우에서 실행할때는 set NODE_ENV = production인 변수를 지정해주면된다.

이상으로 express.js의 기본적인 구조에 대하여 알아보았다.

'Programming > Node.JS' 카테고리의 다른 글

Cluster  (0) 2016.09.05
코딩의 관례  (0) 2016.09.05
Express.js 설치하기  (0) 2016.09.05
http모듈  (0) 2016.09.03
Event개념 이해  (0) 2016.09.03

설치




express [옵션] [경로]

옵션에는 세션, 템플릿, CSS엔진을 선택 할 수 있다


cmd 창을 열어서


npm install -g express-generator

express nodeSample -ejs


를 차례로 입력한다.


템플릿을 ejs로 만들기위해 -ejs 옵션을 주었다.

그러면 다음과 같은 화면이 출력된다.



그후 다음을 입력하여 express.js 를 설치한다.

여기서 nodeSample은 만들고자하는 폴더 명이니, 사용하고싶은 이름으로 사용하도록하자.


 cd nodeSample && npm install



설치 완료된 화면이다.



npm install -g nodemon --save 하면 nodemon을 실행시킬수있다!


'Programming > Node.JS' 카테고리의 다른 글

코딩의 관례  (0) 2016.09.05
express.js 구조  (0) 2016.09.05
http모듈  (0) 2016.09.03
Event개념 이해  (0) 2016.09.03
기본 내장 모듈  (0) 2016.09.03

+ Recent posts