Development 120

[Java] Unsupported class file major version 61 해결하기

문제 Unsupported class file major version 61 ArchUnit을 통한 아키텍처 테스트를 해 보려는데 Unsupported class file major version 61 에러가 발생했습니다. 원인 class file major version 61은 로드 하려고 시도하고 있는 클래스 파일이 자바 17 혹은 그 이상의 버전에서 컴파일이 되었으며, 자바 17 이상에서만 사용 될 수 있을 때 발생한다고 합니다. 사실 스프링부트 3.0 부터는 요구되는 자바 버전이 17이 될거라는 소식을 듣고, 미리 JDK 17을 사용하며 불편한 상황이 어떤게 있을 지 알아보고, 트러블슈팅이 가능하다면 해보려고 Temurin JDK 17 (AdoptOpenJDK 에서 이전됨) 을 사용하고 있었거든요..

[인프콘] INFCON 2022 를 기다리며

https://infcon.day/ 벌써 일년 2021년 8월 4일에 개발자로서 첫 직장에 출근을 시작했으니 내일이면 드디어 만 1년차 개발자가 됩니다. 1년동안 근무하며 참 많은 일이 있었지만 지금까지도 최대 관심사 중 하나는 개발자로서의 성장 입니다. 회사에서 맡고 있는 프로젝트에 진심으로 임하고, 기능 하나를 추가하더라도 너무 오버스펙으로 넣는거 아니냐는 소리를 들을 정도로 사용자를 우선으로 생각하며 항상 최선을 다하고는 있지만.. 균형있는 영양소의 섭취가 필요하듯 주어진 일 만 해서는 금새 성장에 정체기가 올거라고 생각했습니다. 정말 감사하게도 재직중인 회사에서는, 진행되는 사내 교육 프로그램은 없지만 구성원들의 성장을 적극 장려하기 위해 인프런을 통한 교육을 지원 하고 있습니다. 그 덕에 관심있..

Development/DevLife 2022.08.02

Netdata 를 활용한 시스템 모니터링

Intro https://github.com/netdata/netdata Netdata는 특별한 설정이 필요 없이 실시간 분산 모니터링을 제공해주는 오픈소스 모니터링 도구 입니다. 시스템, 하드웨어, 컨테이너, 어플리케이션들로부터 수천개의 데이터를 실시간으로 수집하며 물리/ 가상 서버 및 컨테이너, 클라우드 환경, IOT 장비등 에서 영구적으로 동작 합니다. 대부분의 Linux 배포판 뿐만 아니라 Kubernetes나 Docker 등의 컨테이너 플랫폼 및 MacOS 등에서도 sudo 권한 없이 설치 할 수 있습니다. Netdata는 아래와 같은 특징들을 가지고 있습니다. 설정이 필요없음 관리가 필요없음 최소한의 Disk I/O 및 메모리 사용. 싱글코어 1% 만의 CPU 점유 빠르고 인터렉티브 한 시각화..

Development/DevOps 2022.07.27

[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

[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..

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 파일을 확인 해 보..

Git) 서브모듈 추가 및 제거

Intro A 라는 프로젝트 아래에 B 라는 서브 모듈이 필요 하게 되었습니다. 이미 B 프로젝트는 C 프로젝트를 서브 모듈로 가지고 있는 상황이었는데, A 프로젝트에 B 프로젝트를 서브 모듈로 추가하고, 다시 삭제하는 과정을 진행 해 보도록 하겠습니다. 서브모듈 추가 git submodule add 저장소주소 서브모듈경로 로 추가 할 수 있습니다. 아래의 명령어는 메인 git 저장소의 /build 폴더에 url-to-pdf 라는 프로젝트를 url-to-pdf 라는 이름으로 서브모듈로 추가하는 예시 입니다. git submodule add git@github.com:Shane-Park/url-to-pdf.git build/url-to-pdf 이후 확인해보면 .gitmodules에 [submodule "b..

Development/Git 2022.05.31

Nojde.js Web app을 도커 이미지로 만들고 Docker Hub에 올리기

Intro Node.js로 작성한 웹 어플리케이션을 간단하게 도커 이미지로 만든 후에 해당 이미지를 도커 허브에 push 해서 어디서나 받아서 사용하는 방법을 알아 보도록 하겠습니다. 1. Node.js 웹 어플리케이션을 도커 이미지로 Node.js App 생성 일단 준비된 Node.js 웹 어플리케이션이 없다면 테스트를 위해 생성 해 줍니다. 준비된 어플리케이션이 따로 있다면 이 과정은 생략 하실 수 있습니다. Node.js 앱을 생성 할 빈 폴더를 생성 한 뒤 해당 폴더에 package.json 파일을 생성 해 줍니다. { "name": "docker_web_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "First L..

Development/DevOps 2022.05.30

Git) 여러개의 Git 저장소 한번에 fetch / pull

Intro 사용하는 PC 가 여러개 (Linux, MacOS, ...) 있다 보니, 혼자서만 사용하는 Git Repository라고 해도 fetch 혹은 pull 을 꼬박꼬박 진행 해 주어야 합니다. 가끔씩 fetch / pull 을 까먹은 상태로 커밋을 하고 거기에 push -f로 강제 푸시라도 하는 날에는 기존에 작업했던 내용을 잃기도 합니다. 코딩을 하다가 자바의 특정 기능을 테스트 해보고 그걸 나중을 위해 기록으로 남겨두는 저장소 시간 날 때 알고리즘 문제를 풀어보는 저장소 새로움 배움이 있거나 기록할 게 있을 경우 추후 블로그 작성을 위해 메모해 두는 저장소 이 세 저장소는 특히 여러개의 PC에서 commit이 자주 일어나는데요. 특히 출/퇴근 후에는 혹시 모를 실수를 방지하기 위해 모든 저장소..

Development/Git 2022.05.27