분류 전체보기 426

[JAVA] zxing 활용해 QR코드 생성하기

Intro COVID 19 이후로 정말 많은것이 달라졌습니다. 하나하나 나열하기도 힘든 만큼 일상 생활 속에서 달라진 것 들이 많지만 그 중 하나의 기술을 뽑자면 QR 코드가 아닐까 싶습니다. 아주 오래전부터 있었지만 별다른 주목을 받지 못했고 그렇게 잊혀지는가 했는데 코로나로 인한 방문 기록, 전자문진표 등 조금씩 많이 쓰이는가 싶더니 카카오페이를 비롯한 여러가지 간편결제 서비스가 많아지면서 없어서는 안 될 기술이 되었습니다. 어플리케이션을 만들 때에도 곳곳에 QR코드를 활용 할 일이 많아졌는데요, QR코드 생성 한다면 크게 두가지 방법이 있습니다. 구글의 QR Codes API 에 요청 QR 코드를 작성하는 OpenSource를 활용해 로컬에서 생성 얼핏 보면 외부 API를 활용 하는게 간단해 보이는..

Programming/Java 2022.06.30

[JPA] No Dialect mapping for JDBC type: 1111

Intro JPA 사용 중 native 쿼리를 사용해야 할 일이 있어 nativeQuery = true 옵션을 걸고 쿼리를 작성 했습니다. 그런데 생소한 에러메시지가 나오며 UUID의 맵핑이 제대로 이루어지지 않았습니다. org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 원인 https://github.com/spring-projects/spring-data-jpa/issues/1796 이미 오래전부터 알려져있었지만 고치지 않기로 결정 된 Hibernate 이슈 라고 합니다. Hibernate 구현체에서는 addScalar를 활용 하길 추천하지만 특정 구현체에 의존하지 않고 Spring Data JPA 를 이용할 경우에는 cas..

[Git] lightweight 태그와 annotated Tags

Intro 진행중인 프로젝트의 본격적인 버전 관리에 앞서 해당 스프링부트 어플리케이션에서 git 정보를 토대로 최근 커밋 해시값, 날짜, 버전(태그명) 등을 불러 올 수 있게끔 기능을 추가 해 두었습니다. 그런데 아무리 새로운 태그를 달아 주어도 이전의 태그명이 나오는 문제가 있었고 약간의 검색을 통해 그 차이가 lightweight 와 annotated 때문이었다는걸 알게 되었습니다. 분명 describe --tags 를 입력 할 때는 4.2 버전이 나오지만 git describe 만 입력 했을때는 가장 가까운 3.2 버전으로부터 128 번째 커밋이라는 정보가 나왔습니다. describe 명령은 커밋에서 도달 할 수 있는 가장 최근의 태그를 찾는데요, 태그가 커밋을 가리키는 경우에는 태그만 표시되지만,..

Development/Git 2022.06.27

[Ubuntu 20.04] 우분투 서버에 Plex 미디어 스트리밍 서버 구축기

Intro 집에서 와이프가 넷플릭스로 드라마를 보다가 스트리밍 서비스에 올라와있지 않은 영상은 애플티비로 볼 수 없는지 투덜대었습니다. 집에 남는 노트북에 우분투 서버를 올려 개인 서버 역할을 한지 어느덧 1년이 넘어가고 있는데, 그걸 이용하면 될 것 같아서 일단 된다고 대답을 했습니다. 그리하여 시작된 Plex 미디어 스트리밍 서버 구축기를 시작 해 보겠습니다. PLEX 설치 패키지 업그레이드 일단 시작에 앞서 모든 패키지를 업그레이드 해 줍니다. sudo apt update && sudo apt upgrade -y Plex 공식 저장소 등록 https://support.plex.tv/articles/235974187-enable-repository-updating-for-supported-linux-..

IT Computer/Linux 2022.06.25

[Spring Boot] git 정보 확인하는 endpoint 작성하기

Intro 서버에 현재 배포되어 있는 어플리케이션의 버전 정보를 표시 할 수 있는 방법이 있을까 고민을 해 보았습니다. 하나의 프로젝트가 여러개의 서버에서 각기 다르게 서비스 되고 있다 보니 해당 정보를 관리자 페이지에서 확인 할 수 있게끔 하면 좋겠다는 생각이 들었는데요. 방법이 있었습니다. git-commit-id-plugin 이라는 메이븐 플러그인을 활용하면 어렵지 않게 구현 할 수 있습니다. 아래는 Spring Boot 공식 매뉴얼에 작성된 관련 내용 입니다. https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/html/howto-build.html#howto-git-info 설정 Maven Dependencies pom.xml org..

[Maven 에러] java.lang.IllegalStateException: Unable to load cache item

문제 Linux 운영체제에 maven 을 설치 하고, mvn 명령어를 실행 하던 중 아래와 같이 오류가 발생 했습니다. [ERROR] Error executing Maven. [ERROR] java.lang.IllegalStateException: Unable to load cache item [ERROR] Caused by: Unable to load cache item [ERROR] Caused by: Could not initialize class com.google.inject.internal.cglib.core.$MethodWrapper원인 사용중인 메이븐 버전이 설치되어있는 JDK 의 버전을 지원하지 않기 때문에 발생한 문제 입니다. 해결 최신버전의 메이븐을 설치해서 문제를 해결 할 수 있습니..

SCP 사용중 Permission denied 대처법

Intro 모두 알고 계시는 것 처럼 리눅스에서 scp 명령어를 사용하면 손쉽게 remote 저장소에 있는 파일을 로컬에 copy 해 올 수 있습니다. 그런데 대부분의 상황에서 문제 없이 작동하는 이 기능에서도 어쩔 수 없이 Permission denied 에러를 뿜으며 안될 때가 있습니다. scp: Documents/root_file: Permission denied 이때의 대처법을 나누어 보려고 합니다. 원인 원인은 방금의 SCP 접근이 해당 파일에 대한 접근 권한을 가지고 있지 않기 때문입니다. sudo 권한을 가지고 있는 유저라고 하더라도 ssh 로 접속해서 sudo 명령어로 해당 파일에 접근하는건 가능 하지만, scp로 한번에 빼오는건 불가능 합니다. 해결 상황은 매우 당황스럽지만 어렵지 않은 ..

Docker ERROR: the image for the service you’re trying to recreate has been removed

Intro 단순히 도커 이미지를 Puling 하는 과정에서 무시무시한 에러가 발생 했습니다. docker pull browserless/chrome ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.에러 문구를 읽어보면.. 다시 생성하려고 하는 이미지가 삭제 되었기 때문에, 계속 진행 하게 되면 볼륨 데이터가 삭제 될 수 있다라고 합니다. 이정도 경고면 섣불리 엔터 치기 힘들죠.. 그러면서 계속 하기 전에 데이터를 백업 하라더니, 계속 진행 할 건지..

OAuth2 Redirect 주소 문제 해결

Intro 특정 사이트의 OAuth 로그인이 정상적으로 이루어지지 않고 있는 이슈가 접수되었습니다. 등록된 리다이렉트 URI와 일치하지 않다는 에러가 발생하고 있었고, 확인을 해 보니 등록된 리다이렉트 URL도, 실제 사용 중인 프로토콜도 https 인데, 리다이렉트 uri가 자꾸 http 로 시작하는 주소가 넘어가고 있었습니다. 문제 현 설정은 아래와 같습니다. application.yaml oauth2: clientA: clientId: ${clientA_CLIENTID} clientSecret: ${clientA_SECRET} accessTokenUri: ${clientA_URI} userAuthorizationUri: ${clientA_AUTHURI} redirectUri: "${BASE}/oau..

Linux) watch 명령을 이용해 ls 명령어 실시간 호출하기

Intro 서버에 파일 업로드할 때 임시 파일이 생성되고 소멸되는 시점과 소요 시간 등을 확인 하기 위해 ls -al 명령어를 계속 치고 있었습니다. 임시 파일을 생성 하거나 삭제 할 때에 로그를 남기는 방법이 있지만, 스프링이 MultipartFile 을 받아 임시 파일을 생성하는 시점을 확인 하려니 쉽지 않았습니다. spring: servlet: multipart: location: /home/shane/Downloads SpringBoot 에서는 aplication.yml에 위의 설정을 통해 임시 파일이 생성되는 경로를 변경 할 수 있습니다. 탐색기를 띄워 두어 눈으로 확인 할 수도 있지만, SSH 로 서버에 접속해서 상태를 확인 할 때는 얄짤없이 ls -al을 계속 타이밍 해야 했는데요 watch..

IT Computer/Linux 2022.06.17

Chrome 브라우저 업로드 / 다운로드 속도 제한 걸기

Intro 웹 애플리케이션의 파일 업로드와 다운로드 기능을 구현하는 과정에서 테스트를 하다 보면 꽤나 당황스러울 때가 많습니다. 웹 브라우저를 사용하고 있기는 하지만, 사실 브라우저를 통해 업로드 되는 파일은 네트워크 망을 전혀 타지 않고 디스크 내부에서만 COPY 행위가 일어나기 때문입니다. 이때의 속도는, 인터넷 속도에 영향을 받지 않고 디스크의 읽기/쓰기 속도를 따라 가기 때문에 일반적으로 상상하기 어려운 300 MB/s 가 나오곤 합니다. 요즘에는 보통 기가 인터넷을 쓰기 때문에 1Gbps 가 흔한데 300 MB/s가 대수냐 싶을 수도 있지만, 1MB/s == 8Mbps/s 이기 때문에 (bit와 Byte의 표기 차이) 300 MB/s 는 결국 2.4Gbps 의 속도인 것입니다. 물론 여전히 흔하..

The getKey method should only be used when a single key is returned

Intro JDBC의 KeyHolder를 사용 하던 중 위와 같은 에러를 만났습니다. 에러 전문은 아래와 같습니다. org.springframework.dao.InvalidDataAccessApiUsageException: The getKey method should only be used when a single key is returned. The current key entry contains multiple keys: [{id=13, item_name=M2Air, price=1690000, quantity=12}] keyHolder.getKey() 를 했을때 하나의 키가 반환 되어야 하지만 여러개의 키가 반환 되어 발생한 에러라고 메시지에 쓰여 있습니다. 상황 NamedParameterJdbcTe..

NGINX 대용량 파일 업로드 502 응답

Intro 대용량의 파일 업로드를 시도 할 때, 특정 용량을 넘어가면 업로드가 되지 않고 502 응답이 오는 문제가 있었습니다. 로컬 개발환경에서는 아무 문제 없지만 운영 및 개발 서버에서 문제가 재현 되었습니다. 300MB 업로드 요청시 응답 시간 정보 일단 20MB, 100MB, 300MB, 1000MB 크기의 더미 파일을 각각 준비 해두고 더미 파일 생성 방법은 아래의 링크를 참고 해 주세요 Linux) 대용량의 더미 파일 생성하기 업로드 테스트를 진행 해 본 결과 300MB 까지는 문제 없이 업로드가 되었으나, 1000MB 파일을 업로드 하려고 하면 자꾸 NginX에서 502 응답을 보내고 있었습니다. 원인 저의 경우에 Nginx 설정 값이 원인 이었습니다. nginx.conf 파일을 확인 해 보..

Linux 에서 열려있는 파일을 삭제할 때 일어나는 일

Intro 진행상황 회사에서 진행중인 프로젝트에서 기능 추가를 위해 임시 파일을 다루던 중 예기치 못한 동작을 확인 했습니다. 지금의 구조를 간략하게 보면 대략적으로 데이터 파일 저장에 관련된 부분만 보았을 때 이런 식으로 이루어 져 있습니다. 사용자가 파일을 업로드 할 경우에, 사용자를 응대해 주는 서버가 저장담당 서버와 통신을 하고, 그 파일을 전달 받은 후에는 DB에 관련된 메타데이터 정보를 저장 하고 실제 파일은 또 다른 파일 저장에 관련된 부분만을 관리 하는 또 다른 파일관리 어플리케이션에 전달을 하게 됩니다. 1번 서버에서 2번 서버로 전달되는 과정에서의 비용도 제법 아까운데, 시간을 측정 했을 때에 파일 저장소에 저장해내는 4번의 과정에서 대부분의 병목이 일어나는 것이 확인 되었습니다. 심지..

IT Computer/Linux 2022.06.13

JAVA) 자바에서는 Call By Reference가 불가능 합니다.

Intro 사실 자바를 처음 배우고나서 최근까지도 함수를 호출 하여 파라미터가 전달 될 때에 primitive 타입인 경우에는 value가, 그 외에는 reference가 전달 된다 라고 알고 있었습니다. 자바에서의 Primitive 데이터 타입들 byte short int long float double boolean char String의 경우에만 String pool을 통해 immutable로 관리되기 때문에 primitive가 아님에도 call by reference가 되지 않지만 Java) String의 Immutable이 의미하는 것 그 외에는 reference가 넘어간다고 알고 있었는데요 그 개념 하에서는 LinkedNode 나 Trie 등을 다루는 메서드를 짤 때 마다 뭔가 생각한 대로 동..

Programming/Java 2022.06.06