Broker(Mosquitto)설치 하는데 그렇게 어렵지 않습니다.

Mosquitto 설치 명령어

sudo apt-get install mosquitto

잘 설치 됐나 확인하는 방법도 있습니다.

mosquitto

port 번호가 나옵니다. 

백그라운드에서 잘 실행되고 있나 확인도 해보겠습니다.

netstat -anv | grep LISTEN

0.0.0.0:1883이 바로 mosquitto 입니다.

client는 우분투서버에서 같이 할 수 있지만 Node.js나 다른 걸로 조금 더 보기 편한 걸로 하겠습니다.

이런것까지 해볼줄 몰랐다...

밑에 링크에서 다운 받을 수 있다. 

다운로드 URL : http://jmeter.apache.org/download_jmeter.cgi

 

Apache JMeter - Download Apache JMeter

Download Apache JMeter We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be ava

jmeter.apache.org

링크에서 받았는데 플러그인도 추가가 하기 힘들다.

그렇기 때문에 다른 블로그들 보고 하기 어려웠다. 밑에서 TPS하면서 플러그인 추가가 있다.

우선 다운로드 받은 후 압축을 풀어주고, /bin 폴더 하위에 있는 jmeter.bat 파일을 실행해주면 프롬프트 나오면서 조금 기다리면 된다.

기본 구성일 것 같다. 사실상 HTTP Request 밑에부턴 테스트 지표라고 할 수 있다. 

Test Plan(우클릭) -> Add -> ThreadsGroup 을 눌러 추가시켜준다.

1. ThreadGroup(우클릭) -> Add -> Sampler -> Http Request을 눌러준다.
2. ThreadGroup(우클릭) -> Add -> Listener -> View Results Tree
3. ThreadGroup(우클릭) -> Add -> Listener -> Summary Report
4. ThreadGroup(우클릭) -> Add -> Listener -> Transaction Per Second

문제는 TPS가 난 없었다. 그래서 따로 다운받아서 추가시켜줬다.

밑에 링크에서 받아서 lib 폴더를 합쳤다.

jmeter-plugins.org/wiki/TransactionsPerSecond/

폴더안에 넣어주고 재시작을 하게되면 생겨있다. 

스레드 설정화면을 보면

Number of Threads(users)

가상의 생성자를 몇 명으로 설정할건지에 대한 값이다. (= 몇 개의 쓰레드를 생성할 것인지의 값이다)

이 값이 커질수록 당연히 서버는 많은 부하를 받을 것이다.

Ramp-up Period(in seconds)

한번의 실행을 몇초 동안 완료 시킬것인지에 대한 설정값

Loop Count

반복하고자 하는 횟수

 

HTTP Request 설정을 보자

Protocol, IP or Server Name, method, Path, Body Data, Param을 Postman 처럼 입력하면 된다.

이번엔 백그라운드에서 서버 실행하려고 합니다.

왜 그러려고 하냐? 다른 명령어도 사용해야하는데 js파일 하나만 할 순 없으니깐

vscode에서도 npm server.js를 실행하면 코드를 입력할 수 없고 request에 의해서 콘솔이 찍힐 뿐이죠...

저거를 취소하는 순간 서버가 꺼진 것과 다름이 없죠. 

그렇기 때문에 백그라운드 실행을 하려고 합니다.

우선 forever 설치를 합니다.

$>npm install forever -g

 

그 후 실행할 파일 디렉토리로 이동한 수 forever를 이용해서 node.js 파일을 실행합니다.

$>forever start server.js

 

백그라운드 실행이 되고 있는지 확인하고 싶다면 

$>forever list

그럼 이렇게 사진처럼 나옵니다

그런데 여기서 root권한이 없는 상태로 명령어를 입력한다면 밑에 사진처럼 아무것도 나오지 않는다.

forever은 사용자 권한을 구분하여 정보를 반환한다.

 

해당 파일을 종료하고 싶다면 list 명령어로 확인한 pid를 X에다 넣어서 실행시키면 된다.

$>forever stop X

그럼 밑에 사진처럼 forever stopped process가 나올 것 이다.

 

해당 프로세스의 로그를 실시간으로 확인하고 싶으면 logs 또는 list 명령어의 logfile 주소를 아래의 명령어와 조합을 하면된다.

단순 확인은 cat, vi 등으로 확인할 수 있다.

 

$ > tail -f /home/user/.forever/dke.log

예시이기 때문에 사람마다 user 명과 log 파일명이 다르다. 

java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/20201021_135624.jpg: open failed: EACCES(Permission denied)

테스트 도중 이런 에러가 발생했습니다. 파일 업로드 중에 발생했는데 이유를 알아보니 파일 생성 시 저장소에 관한 내용이었습니다.

앱을 삭제해도 앱 파일들은 삭제되지만 외부저장소에 있는 파일들은 앱 제거시 삭제가 되지 않는다는 것입니다.

즉 안드로이드는 앱을 제거해도 내부에 파일이 남기 때문에 구글은 이것을 보안하려고 하는 것 같습니다.

아직까지 이 부분에 대해서 많은 개발자들이 코드를 적용하지 못한 거 같아서 당장 없애진 않았네요 구글도 이 부분을 인지하고 아직 방법을 남겨 뒀습니다.

manifest에 requestLegacyExternalStorage 속성을 true로 해줍니다.

<application 
...
    android:requestLegacyExternalStorage="true" ... >
        

developer.android.com/training/data-storage/files/external-scoped

 

앱을 잘 만들고 있는 도중 에러가 발생했다.

network security policy 라고 하는 것 보니깐 네트워크 보안 정책이 바뀐 것 같다.

잘은 모르지만 기본적으론 HTTP 통신을 기본으로 허용했지만 결론적으로 HTTP 통신을 차단을 했습니다.

MANIFEST 속성이 하나 추가됐습니다. 바로 android:usesCleartextTraffic 입니다.

이 속성이 누가 버전부터 추가된 모양입니다. 저 속성은 기본 값이 FALSE 인듯 합니다.

 

그래서 가장 쉬운 해결방법은 API의 URL을 HTTP에서 HTTPS로 변경하면 됩니다.

사실 이게 쉬웠으면 좋겠지만 안드로이드 개발자 입장에서 쉽다고 할 수는 없겠죠...

다른 해결방법도 있습니다.

네트워크 보안 구성 파일 (newwork_security_config)을 만들어줍니다.

res/xml/network_security_config.xml

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">insecure.example.com</domain>
        <domain includeSubdomains="true">insecure.cdn.example.com</domain>
    </domain-config>
</network-security-config>

그리고  manifest에 추가 해줍니다. 

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">

 

android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html

 

이런 방법도 있는데 정말 간단한 방법도 있더라고요. 그렇지만 공식 문서에서는 추천하지 않고 있습니다.

<application
    ...
   android:usesCleartextTraffic="true">

문제는 없었는데 보안상에는 안좋다고 나와있네요.

developer.android.com/guide/topics/manifest/application-element#usesCleartextTraffic

 

 

android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html

developer.android.com/guide/topics/manifest/application-element#usesCleartextTraffic

아래처럼 2개의 컬럼이 있는데 2번 idx를 삭제하고 insert를 하게되면 그 다음 번호인 3번부터 추가가 됩니다.

다시 1번부터 쓰기 위해선 초기화를 해줘야 합니다.

쿼리도 그렇게 어렵지 않습니다.

ALTER TABLE 테이블명 AUTO_INCREMENT=바꾸고 싶은 값;

이렇게 하시면 됩니다. 

안드로이드 개발 도중 android.content.res.Resources$NotFoundException:String resource ID #0x1 라는 에러가 발생했습니다.

TextView에 setText() 함수를 사용할 때 integer 타입의 데이터를 넣어서 발생하는 에러입니다.

보통은 에러가 발행하면 바로 코드에 빨간 밑줄이 발생합니다.

그렇지만 다른 함수에서 리턴을 받는 경우는 빨간 밑줄 그러니깐 에러가 발생하지 않습니다.

해결 방법은 엄청 간단합니다. 

Int 값을 String 값으로 바꿔주면 간단합니다.

개발을 하다보니 쿼리문에서 인젝션에 대한 문제들이 나오기 시작했습니다. 

그래서 쿼리문에 ? 물음표를 넣어두고 query() 함수의 두번째 파라미터 자리에 변수를 넣어줍니다.

이런식으로 사용할 수 있겠죠?

그렇다면 2개 이상은 어떻게 해야될까요?

[] 괄호를 사용하여 2번째 파라미터를 묶어주면 됩니다.

이런식으로 묶어주면 됩니다.

다른 쿼리들도 이렇게 많이 사용하는데 insert문이 조금 특이합니다.

insert into values가 보통입니다만

var sql = 'INSERT INTO table (name, email, age) VALUES(?, ?, ?)';
var params = ['hyun','94onad@naver.com','26']
connection.query(sql, params, function(err, rows, fields){

 

보통은 이렇게 많이들 쓰실텐데 INSERT문은 SET을 사용하기도 합니다. SET을 사용하게 되면 컬럼 전체를 넣어야합니다. 

  var users = {
    userid: req.body.userid,
    pwd: req.body.pwd,
    name: req.body.name,
    email: req.body.email,
    phone: req.body.phone,
    created: today,
    modified: today,
  };
  connection.query("INSERT INTO user SET ?", users, function (error, results, fields)

 

직접 쿼리문 안에 넣어주는 분들도 계시는데 이럴경우 escape() 함수를 사용하는 방법도 있습니다.

var sql = 'SELECT * FROM CLUB WHERE CLUB_SN = ' + mysql.escape(clubSn) + '; ';

 

+ Recent posts