Programming Language/Java & Scala 33

scala에러 Unable to make private java.nio.DirectByteBuffer 해결 방법

Unable to make private java.nio.DirectByteBuffer(long,int) accessible: module java.base does not "opens java.nio" 와 같은 코드가 떠서 놀랬다. intellij에서 sbt로 빌드한 스칼라코드가 실행되지 않을 때가 있는데, 이 오류는 jvm컴파일 버전 때문에 생기는 이슈이다.  https://stackoverflow.com/questions/70153343/unable-to-make-private-java-nio-directbytebufferlong-int-accessible Unable to make private java.nio.DirectByteBuffer(long,int) accessibleI'm using P..

spring boot HttpServletRequest 사용 쿠키 구현시 HttpSession.getAttribute(String) is null 에러 발생 대응

spring boot에서 쿠키/세션 로그인 기능 구현시 다음과 같은 에러를 만났습니다 ...HttpSession.getAttribute(String)" is null 분명히 다음과 같이 attribute를 제대로 설정했는데 왜그랬을까요? HttpSession session = request.getSession(true); session.setAttribute("LOGIN_MEMBER", 123); 이유는 다음과 같습니다. 제가 가진 특수한 상황 때문이였는데요. - server : localhost:8080 - client : localhost:3000 - client는 server로 axios 요청을 함 위 상황은 여러가지 문제가 있었고 해결방안은 다음과 같습니다. 1) CORS 문제 크로스 도메인에 대..

실행 가능한 자바 jar 패키지 만들기(with gradle)

실행 가능한 자바의 jar 패키지를 만들기 위해 shallowjar 등을 사용했었다. 그러나 아래와 같은 코드를 사용하여 uberJar(디펜던시가 모두 포함된)을 만들 수도 있다. task uberJar(type: Jar) { from sourceSets.main.output dependsOn configurations.runtimeClasspath from { configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) } } manifest { attributes "Main-Class": "com.example.Main" } } - package명 : com.example - public static ..

현재 Unixtime 가져오기 in 자바

Unixtime으로 현재시간을 가져오고 싶다면 아래와 같이 수행합니다. System.currentTimeMillis() Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond, the granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems measure time in units of tens of milliseconds. See the description of the class Date for a ..

자바와 스칼라 차이점

자바와 스칼라 둘다 JVM위에서 돌아간다는 공통점이 있다. 그러나 객체지향적 언어와 함수형 언어라는 점이 매우 다르다. 어떤 다른점이 있는지 개략적으로 살펴보자. TRAIT 스칼라의 trait는 자바의 인터페이스와 유사한 역할을 한다. 스칼라에서는 interface가 없다. trait는 변수를 선언하고 메서드를 구현할 수 있다는 점이 인터페이스와 차이점이다. 물론 자바 8부터는 인터페이스에서 default 메서드형태로 구현할 수 있는 점이 동일하다. 그러나 자바8의 인터페이스는 변수를 선언할 수 없고 메서드만 선언할 수 있기 때문에 trait와 차별점을 가진다고 볼수 있다. 그럼 추상클래스와 비슷하다고 볼 수 있지 않을까? 자바의 추상클래스는 2개 이상 상속가능하고 trait도 클래스에 2개 이상의 tr..

인증서란? openJDK의 cacerts 설명

인증서(Certificate) 디지털 인증서라고도 부른다. 유저 -> 브라우저 또는 서버 -> 서버 간에 암호화된 연결을 수립하는데 사용된다. 인증되지 않는 사용자의 네트워크 데이터 탈취를 막기 위한 용도. SSL 인증서는 공개키 방식을 사용한다. 공개키 방식은 공개키와 비밀키 방식이 있다. 공개키 방식으로 암호화하고 비공개키로 복호화한다. 비공개키가 없으면 복호화할 수 없다. CA(Certificate authority) 인증서를 보장하는 기업들을 CA 또는 Root Certificate라고 부른다. CA는 신뢰성이 업격하게 공인된 기업들만이 참여할 수 있다. 대표적인 기업으로는 Symantec, Comodo, GlobalSign 등이 있다. 암호화된 통신을 제공하려는 서비스는 CA를 통해서 인증서를 ..

log4j에서 DailyRollingFileAppender 사용시 반드시 선언 순서를 지켜야한다.

log4j는 properties파일을 통해 로깅 파일을 어떻게 활용할 것인지 선언할 수 있습니다. 그런데 이 파일에서 DailyRollingFileAppender를 사용할 경우 순서를 반드시 지켜야합니다. 그 순서란 아래와 같습니다. log4j.appender.outAppender=org.apache.log4j.DailyRollingFileAppender log4j.appender.outAppender.DatePattern='.'yyyy-MM-dd log4j.appender.outAppender.File=${router.logs.dir}/application.log log4j.appender.outAppender.layout=org.apache.log4j.EnhancedPatternLayout log4j..

JVM 기반 애플리케이션 운영시 스레드 덤프를 통한 이슈 해결

JVM기반 애플리케이션을 개발하다가 이슈가 생겼을때 다양한 방식으로 이슈를 확인하고 처리할 수 있습니다. 그중 한가지인 스레드 덤프를 사용하여 이슈를 해결한 사례를 공유하겠습니다. 제가 운영하고 있는 애플리케이션은 Scala로 이루어져 있고 JDK 1.8에서 돌아가는 Multithread application입니다. 카프카 컨슈머를 스레드로 작게는 10개 많게는 100개이상 띄워서 운영하고 있습니다. 이 애플리케이션은 안전하게 중지하기 위해 Shutdown hook을 받도록 개발했습니다만, 언제부턴가 Shutdownhook을 통해 중지요청을 하더라도 애플리케이션이 중지하는 절차를 진행하지 않는 현상이 발생했습니다. 또다시 shutdown hook을 kill -term 명령어와 함께 명령내렸으나 응답이 없..

sbt 실행시 '/modules/java.base/java/lang/String.class' is broken 이슈 해결 방법

sbt를 실행했을 경우 아래와 같은 에러가 발생하였습니다. 위 에러는 java13을 사용하기 때문에 발생하는 오류인데요. 공식 sbt download 홈페이지에서도 이 에러에 대해 처리하는 방법에 대해 자세히 나와 있습니다. ⚠️ Homebrew maintainers have added a dependency to JDK 13 because they want to use more brew dependencies (brew#50649). This causes sbt to use JDK 13 even when java available on PATH is JDK 8 or 11. To prevent sbt from running on JDK 13, install jEnv or switch to using SD..

Java GC 종류별 도식화

이 포스트는 https://blog.voidmainvoid.net/190에서 이어지는 내용입니다. 자바 가비지 컬렉션 설명 및 종류 Getting Started JVM 기반 언어와 C, C++과 가장 큰 다른점은 free()와 같은 메모리접근을 통한 명시적 메모리 해제 여부이다. 자바는 OS메모리 영역에 직접 접근하지 않고 JVM이라는 Process이자 가상머신을 통해.. blog.voidmainvoid.net Garbage Collection은 Heap memory에 존재하는 unreachable object를 삭제하는 과정입니다. Java에서는 여러 버젼을 업그레이드 해가는 동안 다양한 GC알고리즘을 적용했었습니다. 오늘은 각 GC별 동작을 도식화하여 설명드리도록 하겠습니다. GC 도식화 설명에 앞선..

Java PermGen의 역사

오늘은 Java PermGen에 대해서 알아보겠습니다. PermGen은 JDK 1.7 이하 버젼에서 존재하였습니다. 이곳은 클래스 메타 데이터가 들어갈 곳인데, 이 공간의 크기는 예측하기가 어려웠습니다. 자바에서는 클래스의 메타데이터를 읽고 해당 메타데이터를 통해 객체를 생성할 수 있습니다. 클래스 메타데이터란? : 클래스의 이름, 생성정보, 필드정보, 메서드 정보 등 그 때문에 아래와 같은 에러가 종종 일어나곤 했습니다. java.lang.OutOfMemoryError: PermGen space PermGen영역은 OS, JVM버젼마다 각기다른 default값을 가지고 있으며 대부분 매우 작게 할당되어 있었습니다. 그렇기 때문에 클래스 로딩을 많이하다보면 PermGen이 부족할때 위와 같은 에러가 발생..

스레드풀(Thread Pool)이란? 종류, 설명

자바에서 스레드를 생성하고 제거하며, 다수의 스레드를 관리할 수 있도록 자바에는 java.util.concurrent.Executors 를 통해 스레드풀 기능을 제공하고 있습니다. public class Executors { public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); } ... 스레드풀의 종류 - newFixedThreadPool : 주어진 스레드 개수만큼 생성하고 그 수를 유지. 생성된 스레드 중 일부가 종료되었으면 스레드를 다시 생성. - ne..

JVM 버젼별 Scala 하위호환표(JDK Compatibility for scala)

이 포스트는 2020년 2월 18일 기준입니다. Scala는 JVM위에서 돌아가는 언어이며, Scala버젼별로 JVM 버젼의 호환성이 있으므로 아래 표를 기준으로 Scala버젼을 운영해야합니다. Scala 공식홈페이지에 따르면, Java 8 이상에서 scala를 compile하는 것을 권장합니다. JVM은 하위호환성이 있으므로, Compile은 옛날버젼으로 하되, 실제 code를 Running할때는 최신버젼의 JVM버젼을 사용하는게 일반적입니다. Java 8으로 compile된 Scala code는 JVM 8 이상에서 정상적으로 돌아야만 합니다. 만약 Java8으로 compile했음에도 불구하고 이슈가 생긴다면 이는 긴급수정 사항입니다. 일부 오래된 JVM버젼은 scala code의 compile과 ru..

DateTimeFormatter에서 년도표시에 yyyy대신 uuuu를 사용해야하는 이유?

DateTimeFormatter는 Java에서 datetime을 표시할때 가장 많이 사용하는 코드중 하나입니다. 보통 아래와 같은 코드로 표기하여 사용하는데요. LocalDate m = LocalDate.of(2018,12,31); String str = m.format(DateTimeFormatter.ofPattern("yyyy-MM"); //2018-12 선언한 pattern에 따라 LocalDate가 변경되어 String으로 반환되는 모습을 볼 수 있습니다. 위 pattern은 아래와 같은 특징을 가지는데요. 위 특징에 따라 보통 년도를 표시할때 yyyy를 사용하곤 합니다. 그런데 stackoverflow의 이 질문(링크)에서는 yyyy대신 uuuu를 사용하라고 합니다. 왜일까요? 서기, 기원전 표..

Spring boot Resttemplate 사용시 HttpComponentsClientHttpRequestFactory 옵션 설명(setConnectTimeout, setConnectionRequestTimeout, setReadTimeout)

개요 Spring boot에서 rest call을 위해 Resttemplate를 사용한다. 이때 여러 옵션(connection timout 등)을 사용하기 위해 아래와 같이 Restemplate에 RequestFactory를 주입하여 사용하는 경우가 있다. 이 경우 각 옵션이 어떤 역할을 하는지 알아보자 HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setConnectionRequestTimeout(30000); requestFactory.setConnectTimeout(30000); requestFactory.setReadTimeout(300..

Resttemplate으로 PATCH 사용시 에러나는 경우 해결방법 - Invalid HTTP method: PATCH; nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH

Spring boot 내에서 Resttemplate를 사용하여 타 url을 호출하는 경우가 있다. 사용하던 도중 아래와 같은 오류가 날 때가 있다. RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); URI uri = new URI(Api.patchJob(host)); String active = "{\"active\":true}"; headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity(active, headers); ResponseEntity response = restTemplate.exchan..

Android studio에서 gradle upgrade시 deprecated feature 확인 옵션 켜는 방법

Android를 개발하면서 gradle plugin과 gradle wrapper의 version을 지속해서 업그레이드해야한다. Gradle version upgrade를 하면 여러 feature들이 추가되고 Deprecated되는데 gradle build를 할때 아래와 같이 경고를 할 때가 있다. Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/5.1.1/userguide/command_line_interface.ht..

Java gc log 분석, 시각화하는 무료 사이트 추천 gceasy.io

Java 개발과 운영을 하다보면 gc log에 대한 분석이 반드시 필요할 때가 있다. application운영을 통해 남겨진 gc log를 막상 볼려고 하면 어디서 부터 봐야할지 막막하다. 이때 gceasy.io 사이트를 사용한다면 그 걱정이 말끔히 사라진다. https://gceasy.io/ gceasy.io Training Our easy to understand, fun filled training programs is a preferred choice for several enterprises to transform their engineers in to performance experts gceasy.io gceasy.io 사이트는 gc log를 무료로! 간단하게 업로드만으로 분석해준다. 다양한..

Java8이상에서 MaxMetaspaceSize 설정, 반드시 해야할까?

지난글(Java 8 에서 사라진 maxPermSize, PermSize을 대체하는 옵션?)에서 Class의 Meta정보, Method의 Meta정보, Static변수와 상수정보를 저장하는 공간인 Permanent Heap에 대해서 이야기해 보았다. Java8부터 해당 Heap은 Native Memory영역으로 넘어갔으며 Native Memory상한까지 영역을 차지할 수 있으며, 그렇기에 Metaspace에 대한 옵션은 크게 주의를 가지고 설정할 필요가 없다고 적었다. 하지만, MaxMetaspaceSize를 정의하지 않은 상태의 특수한 상황이라면 어떨까? 지속적으로 class의 meta정보, static변수와 상수정보값이 늘어나는 경우에는 아래와 같이 끔찍한 일이 벌어질 것이다. 상기 applicatio..

scala개발시 sbt build때 GZIPInputStream: java.util.zip.ZipException: Not in GZIP format 에러나는 경우 해결책

scala를 개발할때 java와 연동되던 gradle이나 maven과는 다른형태의 build툴인 sbt를 사용한다. sbt는 simple build tool 이라는 약자를 가지고 있다고는 하지만 개인적으로 엄청 불편한거같다. 최근 sbt upgrade를 하던도중 아래와 같은 에러를 만났다. sbt 0.13.X 에서 sbt 1.X로 올리거나 그 반대의 경우 아래와 같은 에러를 만날때가 있다. 에러로그 % sbt [info] Loading global plugins from /home/smarter/.sbt/0.13/plugins [info] Updating {file:/home/smarter/.sbt/0.13/plugins/}global-plugins... [info] Resolving org.fuseso..

자바 가비지 컬렉션 설명 및 종류

Getting StartedJVM 기반 언어와 C, C++과 가장 큰 다른점은 free()와 같은 메모리접근을 통한 명시적 메모리 해제 여부이다. 자바는 OS메모리 영역에 직접 접근하지 않고 JVM이라는 Process이자 가상머신을 통해 접근한다. 자바 application은 System.gc()와 같은 명시적 명령어를 통해 garbage collection을 수행할 수 있으나, 권장되지 않는다. 대신 JVM의 옵션에 따라 Serial GC, Parallel GC, CMS(Concurrent Mark Sweep) GC, G1 GC(after java 7)이 사용되고, 각 GC들은 특정 알고리즘과 주어진 옵션에 따라 메모리 관리를 하게 된다.What is garbage?Java application에서는 ..

Java 8 에서 사라진 maxPermSize, PermSize을 대체하는 옵션?

아래 포스팅은 HotSpot JVM을 기준으로 설명합니다. JVM architecture(오라클 GC설명페이지) Java 7에서 있던 -XX:MaxPermSize=size, -XX:PermSize=size option들은 이제 Java 8에서는 Deprecated되었다. 더 정확히는 metaSpaceSize로 대체(superseded)되었다고 볼 수 있다. 그래서 많은 개발자들이 java7에서 8으로 업그레이드 한 이후에 아래와 같은 warning 메시지를 본적이 있을 것이다. Java HotSpot(TM) Server VM warning: ignoring option PermSize=32m; support was removed in 8.0 Java HotSpot(TM) Server VM warning:..

Java 시큐어 코딩 - 공격 종류 및 해결방안

1. SQL injection 취약점 발생 원인외부입력값을 동적으로 SQL실행문을 만들어서 사용할때 주로 나타남. /* SQL injection에 취약한 코드*/ String userId=request.getParameter("userId"); String password=request.getParameter("password"); ... Statement stmt = conn.createStatement(); ResultSet result = stmt.executeQuery("select count(*) as count from student where userid='"+userId+"' and password='"+password+"'"); userid에 admin' OR '1'='1 을 입력하면 그..

Java 시큐어 코딩 - 개론 및 보안사례

개요 및 단어 설명시큐어 코딩에 앞서 단어설명을 한다. 보안약점(weakness) - 개발자가 개발을 하는 단계, 구현을 하는 단계에서 나타나는 bug - 코드 리뷰를 통해 보안약점을 찾겠다. - But, LOC(Line of code)가 너무 많으므로 정적분석도구를 사용한다. - ex) findBug, findSecurity plugin - Secure coding이 필요한 단계 보안취약점(vulnerability) - 서비스가 나가고 난 뒤 침해관련 사고 - 실제 침해사고로 일어난 사례 - 공격자(해커)가 의도하는 공격(해킹)이 일어나는 곳 Secure coding(보안 약점 구간)에서 이슈를 알아 낼 수 없는 경우도 있다. 예를 들어 논리적인 & 구조적인 이슈(ex. sms를 통한 인증)로 인해 보..

예제로 알아보는 스칼라에서 Option monad

Java에서 항상 우리가 하던대로 코딩하면 아래와 같이 나온다. Customer customer = Customers.findById(1234); return customer.getAccount(SOME_ACCOUNT).getLastInterest.getAmount 하지만 그냥 위와 같이 쓰게 되면 nullPointException에서 자유로울수 없기 때문에 보통 아래와 같이 사용한다. Customer customer = Customers.findById(1234); if(customer !=null){ if(customer.getAccount(SOME_ACCOUNT)!=null){ if(customer.getAccount(SOME_ACCOUNT).getLastInterest!=null){ return ..

Intellij에서 scala와 sbt를 사용시 반드시 알아야할 3가지

아래 글은 Intellij IDEA 2018.2 이후 버젼에서 scala를 사용하기 위한 sbt plugin이 동작하는 방식에 대해 설명한 글 입니다. 만약 이 글을 보시는 분이 intellij에서 scala와 sbt plugin을 쓰신다면 반드시 이 포스팅을 읽어볼 것을 권장합니다. 제가 삽질을 너무 많이해서.. 다른 분은 삽질을 덜 했으면 좋겠습니다. ㅠㅠ SBTSBT란. SBT는 최신 빌드 도구 중 하나이다. 스칼라로 작성되었고, 스칼라에 사용하기 편한 기능을 많이 제공하기는 하지만, SBT 자체는 범용 빌드 도구이다. 1. sbt project를 import 하기이미 존재하는 sbt로 빌드된 project를 intellij에서 사용하기 위해 import할 때 아래와 같이 진행한다. (1) Inte..

[Groovy]배열 종류 및 사용법

Groovy의 array는 java 처럼 쓸수도 있고 혹은 groovy 자체의 방식으로도 사용가능하다. array 내부에 들어가는 변수는 groovy 변수와 같이 다양한 타입의 변수가 한번에 들어갈 수 있다. 준비물 macbook groovyConsole설치(설치하는 방법 보러가기) Array append(배열 추가하기) 1. terminal에서 groovyConsole 실행 $ groovyConsole 2. 아래와 같이 groovy script def andersonArray = [] andersonArray.add("tistory") andersonArray.add(-3.1) andersonArray

[Groovy]변수 선언하기 및 변수 종류

groovy의 variable의 type은 마지막에 집어넣은 data의 형을 따른다. 즉 javascript마냥 다양한 변수를 집어넣을 수 있는 것이다. 혹은 java처럼 쓰일 수도 있다. 준비물 macbook groovyConsole설치(설치하는 방법 보러가기) Groovy def 변수 선언하기 1. terminal에서 groovyConsole 실행 $ groovyConsole 2. 아래와 같이 groovy script def x = 1 x = new java.util.Date() println x x = -3.1499392 println x x = false println x x = "Groovy!" println x 3. 결과물 Java 변수 선언하기 1. terminal에서 groovyConsol..