QueryDSL 사용법
JunYoung Park 님의 블로그에 잘 설명되어 있다.
https://joont92.github.io/jpa/QueryDSL/
2019년 12월 3일 화요일
2019년 10월 31일 목요일
react-native-webrtc ICE candidates 이상증상
시스템 구성 환경
이상 증상에 따른 대처 내용 들
- 서버 : janus-gateway
- 클라이언트
- react-native
- react-native-webrtc
- STUN 서버
- 테스트 Mobile
- 갤럭시 S9+
- Android 9
이상 증상에 따른 대처 내용 들
- 발견
- 로컬 로그 분석
- 서버 로그 분석
- 분석 결과 onicecandidate 의 데이터가 부족한것으로 확인
- Android 로그 분석
- react-native-webrtc 에서 dependency 하고 있는 org.webrtc 에서 오류 뿜뿜
- ICE candidate 데이터 교환 이상은 org.webrtc 에서 발생 하는 오류로 확인
- 처리
- 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
상황
깨달은 것
- spring boot 프로젝트를 jar 디플로이로 생성한다.
- 임베디드 톰캣 쓰다가 jboss 로 디플로이를 위해 war 로 변경한다.
- war 변경 잘 됐고 jboss 에 war 올려서 테스트 해본다.
- 오잉. class 파일 로드가 안된다.
- context-path 가 이상한가? index.html 파일로 테스트 해본다. 잘 됨.
- 음..뭐지.. spring boot 생성 시 war 디플로이로 선택 해서 해본다.
- war 말아서 jboss 올려보니 잘 된다. 뭐징..
- pom.xml 및 각종 설정 class 들 다 뒤져서 비교 해본다. 다른데 없다.
- 이런 XX 뭐가 잘못 된거야!
- jboss 에 디플로이 target 폴더 뒤져 본다.
- 잘 돌아가는 놈은 WEB-INF/classes 안에 class 파일들 있다... ㅠㅠ
- eclipse 의 .settings 들어가서 설정 파일들 비교 해본다.
- 빙고! org.eclipse.wst.common.component 파일에 deploy path 가 다르다!!
처리
- 프로젝트 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 에서도 오류 안남.
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-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.
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 로 복사 후 수정 하게 해줌.
사이즈에 맞게 이미지 생성 후 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 에 대해 설명 한다.
- 필요 라이브러리
- 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
- 코드
- 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 을 사용하며 공통으로 적용해야 할 내용들에 대해서 정리를 해본다.
- react-navigation
- 설명 : 명칭 그대로 react 의 navigation 을 위한 모듈.
- 단순 사용시 설치 package
yarn add react-navigation
yarn add react-native-gesture-handler
- Tab 사용시 추가 설치 package
yarn add react-navigation-stack
- 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 하단까지 안가고 해당 설정을 적용 한다.
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개 이상의 Thread 에서 동일한 테이블에 데이터 유무 확인하여 insert 하기 위해 read -> 데이터 유무 체크 -> insert 하는 method 에 Transaction 설정. 이때 'Phantom Read' 발생을 막기 위해 Isolation 은 SERIALIZABLE 로 설정 함.
- 12 개의 Thread 로 구동 중 JPA 에서 org.hibernate.exception.LockAcquisitionException 발생. 확인 해보니 이미 Lock 이 걸려 있는데 다른 thread 에서 Lock 획득 하려다가 발생한 Exception 으로 확인하고 처리.
- 처리
- 구글링 해보니 retry 하라는 내용이 많은것으로 보아 retry 로 처리 예정. 아직 안해봄. ㅋ
- Spring-retry 가 처리 방안으로 보임
- 참고
@Transactional @Caching 사용시 주의 사항
Spring 에서 @Transactional @Caching 등
Spring AOP(Proxy) 관련 기능 사용중 발생한 문제 처리 중 습득한 지식이다.
Spring AOP(Proxy) 관련 기능 사용중 발생한 문제 처리 중 습득한 지식이다.
- spring aop 의 proxy 종류
- JDK Proxy
- Interface 를 구현한 경우
- CGLIB
- Interface 없이 Class 로 구현한 경우
- Spring 의 기본 사항
- 외부에서 Invocation (호출) 한 method 에만 Proxy 기능 작동
- public method 에만 Proxy 기능 작동
- Self-Invocation (Object 내에서 내부 method 호출) 시 Proxy 기능 작동 안함.
- 처리 방법
- AspectJ 사용
- Spring AOP 의 Weaving 방식을 AspectJ 의 Weaving 방식으로 변경 함으로서 처리함.
- Self-Invocation 시 직접 method 호출이 아닌 자신의 bean 을 사용하여 method 호출
- 가장 간단 하지만 private method 호출 불가
- ex)
- @Autowired
- private SomeObject self;
- self.someMethod();
- 참고 사이트
2019년 7월 22일 월요일
IBM websphere 설치 방법
- 작성 일자 : 2019-07-23
- 목적 : eclipse 에서 websphere 설치 및 구동
- 요약 :
- eclipse plugin 설치
- IBM Installation Manager 설치
- IBM Websphere repository 등록하여 설치
- 안내 :
- IBM 사이트를 뒤져봤는데 websphere 8.5 를 직접 다운로드 하는 링크는 없어진듯 하다. IBM Installation Manager 를 통한 repository 설치만 지원 하는것 같음.
- 설치 :
- Eclipse Plugin
- IBM 의 플러그인 설명에 보면 Oxygen 이상만 가능하다고 함.
- Eclipse MarketPlace 에서 websphere 검색하면 Developer Tools 가 버전별로 나옴. 맞는 플러그인 설치
- IBM Installation Manager
- IBM Websphere 8.5 repository
- https://www.ibm.com/support/knowledgecenter/en/SSEQTP_8.5.5/com.ibm.websphere.installation.base.doc/ae/cins_repositories.html
- 인스톨 후 IBM Installation Manager 실행
- 파일 -> 환경설정 -> 저장소 선택
- 저장소 추가 (아래 이미지 우측의 repository 주소 입력 및 IBM 계정 입력)
- 확인 클릭
- 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
- sudo apt update
- sudo apt install apt-transport-https ca-certificates curl software-properties-common
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- sudo add-apt-repository "deb [arch=armhf] https://download.docker.com/linux/ubuntu bionic stable"
- sudo apt update
- apt-cache policy docker-ce
- sudo apt install docker-ce
피드 구독하기:
글 (Atom)