2019년 12월 3일 화요일

QueryDSL 기본 사용법 링크

QueryDSL 사용법

JunYoung Park 님의 블로그에 잘 설명되어 있다.

https://joont92.github.io/jpa/QueryDSL/

2019년 10월 31일 목요일

react-native-webrtc ICE candidates 이상증상

시스템 구성 환경

  1. 서버 : janus-gateway
  2. 클라이언트
    • react-native
    • react-native-webrtc
  3. STUN 서버
    • google
  4. 테스트 Mobile
    • 갤럭시 S9+
    • Android 9


이상 증상에 따른 대처 내용 들

  1. 발견
    • 로컬 로그 분석
    • 서버 로그 분석
    • 분석 결과 onicecandidate 의 데이터가 부족한것으로 확인
    • Android 로그 분석
    • react-native-webrtc 에서 dependency 하고 있는 org.webrtc 에서 오류 뿜뿜
    • ICE candidate 데이터 교환 이상은 org.webrtc 에서 발생 하는 오류로 확인
  2. 처리
    • Unable to obtain permission to request a cellular network. 로그 발생
      • Android 의 시스템 작성 권한이 없어서 발생 하는 로그 로 확인
      • <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 추가해주고 수동으로 앱 설정의 시스템 권한 부여 함으로 해결. 추후 사용자에게 알림 진행 후 설정 화면으로 이동하여 부여 하도록 안내 해야 함.
      • 직접적인 request 후 해당 권한을 부여 할수있는 prcess 가 없음. 안드로이드의 가이드에 의하면 설정화면으로 보내서 사용자에게 수동으로 권한 부여하도록 안내 해야 함.
    • Null interface name for network. 로그 발생
      • 실질적은 문제는 요놈 이었다.
      • org.webrtc.NetworkMonitorAutoDetect.java.java 에 보면 networkToInfo method 가 있는데 name 가져오다 오류 발생 해서 ICE candidate 정보에 누락이 발생 한 것이다.
      • 처리 방법은 뭐 더 찾아 볼 예정.



2019년 10월 16일 수요일

spring boot deploy to jboss issues

상황

  1. spring boot 프로젝트를 jar 디플로이로 생성한다.
  2. 임베디드 톰캣 쓰다가 jboss 로 디플로이를 위해 war 로 변경한다.
  3. war 변경 잘 됐고 jboss 에 war 올려서 테스트 해본다.
  4. 오잉. class 파일 로드가 안된다.
  5. context-path 가 이상한가? index.html 파일로 테스트 해본다. 잘 됨.
  6. 음..뭐지.. spring boot 생성 시 war 디플로이로 선택 해서 해본다.
  7. war 말아서 jboss 올려보니 잘 된다. 뭐징..
  8. pom.xml 및 각종 설정 class 들 다 뒤져서 비교 해본다. 다른데 없다.
  9. 이런 XX 뭐가 잘못 된거야!
  10. jboss 에 디플로이 target 폴더 뒤져 본다.
  11. 잘 돌아가는 놈은 WEB-INF/classes 안에 class 파일들 있다... ㅠㅠ
  12. eclipse 의 .settings 들어가서 설정 파일들 비교 해본다.
  13. 빙고! org.eclipse.wst.common.component 파일에 deploy path 가 다르다!!

처리
  1. 프로젝트 properties -> Deployment Assembly -> java, resources 의 Deploy Path 를 'WEB-INF/classes' 로 변경한다.

깨달은 것

  • 무조건 구글링 하지말고 기초를 생각해자 ㅋ


끝!

이거 찾느라 4시간 걸림 휴..

아참. 임베디드 톰캣 scope 설정하는거나 war 파일 설정하는건 다른 블로그들에 많음

react-native 처음 사용하는 친구들에게

안녕하세요?
React-Native RN 은 처음이지?
CLI 로 할때 오류 나서 접고 싶지?
ㅇㅇ 나도 처음에 힘들었음.
근데 계속 하다보면 무슨 오류인지 보임.

예를 들어 Windows OS 환경에서
react-native run-android 명령 날리면
어쩔때는 한방에 build 되는데 (라이브러리 설치 등의 오류 없다는 가정 하에)
어쩔때는 Could not read path 등
read, delete 못한다고 하면서 안될때 있음.
이럴때는 그냥 무시하고 될때까지
react-native run-android 커맨드 날리샘.
그러다 보면 build 성공 함. ㅋㅋ
음.. build thread 가 한 tread 로 돈다고는 하는데
아마도 폴더에 lock 걸려서 그러는게 아닌가 싶기도 하고..

Mac OS 로 하면 저런 오류 안보이긴 함.

그냥 Mac 사서 하샘. ㅎ

은 아니고 나중에 찾아보니까 android clean 시키는게 있더라
역시 공부 해야 함... 무지했어... ㅋㅋ
project 폴더 내 android 폴더에서
gradlew clean 한번씩 날려주면 windows 에서도 오류 안남.

2019년 10월 14일 월요일

react-native background process

react-native 에서 background 작업을 찾아보면
react-native-backgroud-task 가 많이 나오는데
해당 라이브러리는 Android 28 에서 사용 불가능 하다.

background-fetch 를 사용하는
https://github.com/transistorsoft/react-native-background-fetch
를 사용하도록.

Android, IOS 모두 가능.

단 IOS 는 OS 단에서 사용자 패턴을 분석하여 background fetch 를 하는데
설명에 의하면 그냥 기다리랜다
설치하고 몇일 있으면 잘 작동 한다고... ㅋㅋ


주의사항
1. IOS 에서는 30s 이내에 프로세스 finish 신호가 없으면 자동으로 종료 처리 함.
2. 예제에는 forceReload 옵션 없음. 넣어서 android 테스트 진행.
   android 에서 forceReload deprecated 되었다고 headless 쓰라네
   https://github.com/transistorsoft/react-native-background-fetch/issues/179

react-native app icon, splash image auto make

https://github.com/bamlab/react-native-make

사이즈에 맞게 이미지 생성 후 command 날리면
자동으로 android, ios 만들어줌.
개꿀.

-- 19.10.16 추가
RN cli 0.60 대버전에서 오류남.
1.0.2 버전으로 처리.
yarn add -D @bam.tech/react-native-make@1.0.2


-- 19.10.17 추가
Android 의 패키지를 변경할 경우
android/app/src/main/java/... 하위 폴더가 패키지 명을 따라 변경 되는데
splash screen 설정시 자동으로 react-native project 기본 패키지 명을 찾아가 MainActivity.java 파일을 변경 하려고 한다.
음.. 패키지 변경 하면서 설정값들은 다 바꿔 준것 같은데 해당 라이브러리가 어떤값 참고 하는지를 모르겠네
우선 변경 전 폴더로 MainActivity.java 파일 복사 하고 수정 하게 해준 다음 내용 옮김.
ex)
android/app/src/main/java/com.xxxx.xxxx.test/MainActivity.java 를
android/app/src/main/java/test/MainActivity.java 로 복사 후 수정 하게 해줌.

2019년 9월 30일 월요일

react-native EUC-KR UTF-8 convert

react-native 에서 EUC-KR UTF-8 Convert 에 대해 설명 한다.


  1. 필요 라이브러리
    • rn-fetch-blob
      • react-native 에 fetch 가 내장되어 있으나 blob 형태로 가져올수 없어 자동 convert 중 utf-8 로 변경 됨.
        blob 으로 화면단까지 가져와 처리할수 있도록 해당 라이브러리 사용.
      • yarn add rn-fetch-blob
    • iconv-lite
      • charset converter. 유명한 그것.
      • yarn add iconv-lite
    • buffer
      • 변환 과정에서 buffer  에 담아 변환을 하는데 브라우저에는 내장되어 있으나 react-native 에는 없음.
        이전 작업할때 기억에는 debug 모드로 브라우져 연동시 있는것으로 간주하고 작동 했던 것으로 기억 함.
        하지만 debug 모드 끄면 없다고 오류 뱉음.
      • yarn add buffer
    • base-64
      • base64 encode decode 그것. rn-fetch-blob 의 data 가 base64 로 넘어옴
      • yarn add base-64
  2. 코드
    • request
      1
      2
      3
      4
      5
      6
      7
      8
      9
      makeQuery(obj) {
          var str = [];
          for (var p in obj)
            if (obj.hasOwnProperty(p)) {
              // str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
              str.push(escape(iconv.encode(p, 'EUC-KR').toString('binary')) + "=" + escape(iconv.encode(obj[p], 'EUC-KR').toString('binary')));
            }
          return str.join("&");
        }
      
    • response
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      RNFetchBlob.fetch('POST', this.url,
            {
              'Content-Type': 'application/x-www-form-urlencoded'
              , 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
            }
            , this.makeQuery(param)
          )
          .then((response) => {
            
            if(response.info().status != 200){
              throw new Error('status error');
            }
            let base64Decode = base64.decode(response.data);
          let byteArray = new Uint8Array(base64Decode.length);
          for (var i = 0; i < base64Decode.length; i++) {
            byteArray[i] = base64Decode.codePointAt(i);
          }
      
          let decodedString = iconv.decode(byteArray, 'EUC-KR').toString();
      
          return decodedString;
          })
        }
      
블로그 코드넣기 더럽게 어렵네 ㅡㅡ,

2019년 9월 29일 일요일

react-native 초기 설정 정리

react-native 을 사용하며 공통으로 적용해야 할 내용들에 대해서 정리를 해본다.

  1. react-navigation
    • 설명 : 명칭 그대로 react 의 navigation 을 위한 모듈. 
    • 단순 사용시 설치 package
      yarn add react-navigation
      yarn add react-native-gesture-handler
    • Tab 사용시 추가 설치 package
      yarn add react-navigation-stack
  2. react-native-firebase
    • 설명 : firebase 모듈
    • 선행
      - 패키지 명 변경 : https://stackoverflow.com/questions/37389905/change-package-name-for-android-in-react-native?answertab=active#tab-top
      - firebase 프로젝트 등록 및 필수 파일 다운로드 : https://rnfirebase.io/docs/v5.x.x/installation/initial-setup 
    • package 설치
      yarn add react-native-firebase

2019년 9월 5일 목요일

tiles3 주의사항

definition 설정 중
wild 카드 사용시 순서 및 설정 법에 대하여 항상 잊는 것 같아 기록 함.

- wild 카드 사용

1. 컨트롤러
  return "/test/abcd";

2. tiles 설정파일
  <definition name="/test/*" template="/WEB-INF/tiles/layout/print.jsp">
<put-attribute name="body" value="/WEB-INF/jsp/{0}.jsp" />
  </definition>
  위에서 name 의 test 는 호출하는 controller 의 requestMapping 과는 무관하다.
  단순히 return 하는 jsp 파일의 경로 순서의 패턴을 가리키며
  put-attribute 의 {0} 도 사용한 wild 카드의 순서를 가리킨다.


- 설정 파일 순차 적용
 설정파일을 위에서 부터 읽다가 부합하는 조건이 있으면 xml 하단까지 안가고 해당 설정을 적용 한다.

2019년 8월 27일 화요일

@Retryable

Transaction 처리 중 org.hibernate.exception.LockAcquisitionException 발생 하여 처리 한 내용.


  1. 상황
    • 1개 이상의 Thread 에서 동일한 테이블에 데이터 유무 확인하여 insert 하기 위해 read -> 데이터 유무 체크 -> insert 하는 method 에 Transaction 설정. 이때 'Phantom Read' 발생을 막기 위해 Isolation 은 SERIALIZABLE 로 설정 함.
    • 12 개의 Thread 로 구동 중 JPA 에서 org.hibernate.exception.LockAcquisitionException 발생. 확인 해보니 이미 Lock 이 걸려 있는데 다른 thread 에서 Lock 획득 하려다가 발생한 Exception 으로 확인하고 처리.
  2. 처리
    • 구글링 해보니 retry 하라는 내용이 많은것으로 보아 retry 로 처리 예정. 아직 안해봄. ㅋ
    • Spring-retry 가 처리 방안으로 보임
  3. 참고

@Transactional @Caching 사용시 주의 사항

Spring 에서 @Transactional @Caching 등
Spring AOP(Proxy) 관련 기능 사용중 발생한 문제 처리 중 습득한 지식이다.


  1. spring aop 의 proxy 종류
    • JDK Proxy
      • Interface 를 구현한 경우
    • CGLIB
      • Interface 없이 Class 로 구현한 경우

  2. Spring 의 기본 사항
    • 외부에서 Invocation (호출) 한 method 에만 Proxy 기능 작동
    • public method 에만 Proxy 기능 작동
    • Self-Invocation (Object 내에서 내부 method 호출) 시 Proxy 기능 작동 안함.
  3. 처리 방법
    • AspectJ 사용
      • Spring AOP 의 Weaving 방식을 AspectJ 의 Weaving 방식으로 변경 함으로서 처리함.
    • Self-Invocation 시 직접 method 호출이 아닌 자신의 bean 을 사용하여 method 호출
      • 가장 간단 하지만 private method 호출 불가
      • ex)
      • @Autowired
      • private SomeObject self;
      • self.someMethod();
  4. 참고 사이트

2019년 7월 22일 월요일

IBM websphere 설치 방법


  1. 작성 일자 : 2019-07-23
  2. 목적 : eclipse 에서 websphere 설치 및 구동 
  3. 요약 : 
    • eclipse plugin 설치
    • IBM Installation Manager 설치
    • IBM Websphere repository 등록하여 설치
  4. 안내 : 
    • IBM 사이트를 뒤져봤는데 websphere 8.5 를 직접 다운로드 하는 링크는 없어진듯 하다. IBM Installation Manager 를 통한 repository 설치만 지원 하는것 같음.
  5. 설치 :
    • Eclipse Plugin
      • IBM 의 플러그인 설명에 보면 Oxygen 이상만 가능하다고 함.
      • Eclipse MarketPlace 에서 websphere 검색하면 Developer Tools 가 버전별로 나옴. 맞는 플러그인 설치





      • 확인 클릭
      • IBM Installation Manager 바탕화면의 설치 클릭
      • 추가한 repository 의 설치 파일 클릭 및 설치 실행

    • Eclipse 에서 server add 시 websphere 선택 후 설치 위치 선택
      •  C:\Program Files (x86)\IBM\WebSphere  OR C:\Program Files (x86)\IBM\IMShared 일 것으로 보임
      • 설치 후 Eclipse 에서 연동 아직 안해 봄.

설치 중 Installation Manager 에 Websphere repository 등록 후 developer 버전 설치 하려는 도중 권한 없음 문제가 발생 되었다.
- IBM developer 사이트에 회원가입
- Installation Manager 1.8.9 -> 1.9.0 업데이터
등을 시도 하였으나 불가능...
그냥 trial 버전으로 설치 함. 
developer 버전 설치 할수 있는 권한이 필요해 보이는데 어떻게 해야 하지?? 

2019년 7월 14일 일요일

ubuntu coturn apt-get install

Coturn is an open source TURN and STUN server for VoIP and WebRTC.

Update the system and install Coturn

apt-get update && apt-get install coturn

Edit turnserver config

vi /etc/turnserver.conf
listening-port=3478
cli-port=5766
listening-ip=172.17.19.101

Create  a turn secret

  • either
    xxd -ps -l 32 -c 32 /dev/random
  • or
    openssl rand -hex 32
583bAAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF

Add it to TURN REST API flag section

# This allows TURN credentials to be accounted for a specific user id.
# If you don't have a suitable id, the timestamp alone can be used.
# This option is just turning on secret-based authentication.
# The actual value of the secret is defined either by option static-auth-secret,
# or can be found in the turn_secret table in the database (see below).
#
use-auth-secret

# 'Static' authentication secret value (a string) for TURN REST API only.
# If not set, then the turn server
# will try to use the 'dynamic' value in turn_secret table
# in user database (if present). The database-stored value can be changed on-the-fly
# by a separate program, so this is why that other mode is 'dynamic'.
#
static-auth-secret=583bAAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF

Add Coturn ports to services

vi /etc/services
stun-turn       3478/tcp                        # Coturn
stun-turn       3478/udp                        # Coturn
stun-turn-tls   5349/tcp                        # Coturn
stun-turn-tls   5349/udp                        # Coturn
turnserver-cli  5766/tcp                        # Coturn
Open ports 3478 and 5349 in the firewall.

Start Coturn server as daemon

vi /etc/default/coturn
# Uncomment it if you want to have the turnserver running as 
# an automatic system service daemon
#
TURNSERVER_ENABLED=1
turnserver -o -v
==== Show him the instruments, Practical Frost: ====

0: TLS supported
0: DTLS supported
0: DTLS 1.2 supported
0: TURN/STUN ALPN supported
0: Third-party authorization (oAuth) supported
0: GCM (AEAD) supported
0: OpenSSL compile-time version: OpenSSL 1.0.2g-fips  1 Mar 2016
0: 
0: SQLite supported, default database location is /var/lib/turn/turndb
0: Redis supported
0: PostgreSQL supported
0: MySQL supported
0: MongoDB is not supported
0: 
0: Default Net Engine version: 3 (UDP thread per CPU core)

=====================================================
netstat -npta | grep turnserver
tcp  0  0 127.0.0.1:5766       0.0.0.0:*    LISTEN   19039/turnserver
tcp  0  0 172.17.19.101:3478   0.0.0.0:*    LISTEN   19039/turnserver
turnserver -h
turnadmin -h
service coturn stop
service coturn start
service coturn restart
service coturn status
 coturn.service - LSB: coturn TURN Server
 Loaded: loaded (/etc/init.d/coturn; bad; vendor preset: enabled)
 Active: active (running) since Mon 2018-05-07 01:26:56 CEST; 3s ago
 Docs: man:systemd-sysv-generator(8)
 Process: 14464 ExecStop=/etc/init.d/coturn stop (code=exited, status=0/SUCCESS)
 Process: 14516 ExecStart=/etc/init.d/coturn start (code=exited, status=0/SUCCESS)
 Tasks: 7
 Memory: 4.4M
 CPU: 52ms
 CGroup: /system.slice/coturn.service
 └─14526 /usr/bin/turnserver -c /etc/turnserver.conf -o -v

Add to DNS

turn.domain.xx  domain.xx
stun.domain.xx  domain.xx

Coturn CLI

telnet localhost 5766
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
TURN Server
Coturn-4.5.0.3 'dan Eider'

Type '?' for help
>

 Coturn webadmin interface

Create admin user
turnadmin -A -u admin -p verysecretpassword
Login to
https://domain.xx:3478

2019년 3월 10일 일요일

ubuntu 18.04 docker on ARM

  1. sudo apt update
  2. sudo apt install apt-transport-https ca-certificates curl software-properties-common
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. sudo add-apt-repository "deb [arch=armhf] https://download.docker.com/linux/ubuntu bionic stable"
  5. sudo apt update
  6. apt-cache policy docker-ce
  7. sudo apt install docker-ce