language/java 7

[java] map과 flatMap의 차이

면접질문으로 나왔던 map과 flatMap의 차이점을 복기한다. Java 8 에서 Optional, stream이 추가되었고 이에 사용될 수 있는 map()와 flatMap() 의 목적이 다르다. Optional에서 Map, flatMap 사용법 다음 예시는 "test"를 대문자로 변환한다. Optional s = Optional.of("test"); Assertions.assertEquals(Optional.of("TEST"), s.map(String::toUpperCase)); System.out.println(Optional.of("TEST")); //output: Optional[TEST] 더 복잡한 경우에 Optional.of() 파라미터값으로 Optional.of()가 반환되는 함수가 들어갔다..

language/java 2022.06.09

Java PermGen 영역

PermGen(Permanent Heap)은 Java 8 버전 이하에서 존재했다. 클래스 메타데이터가 들어갈 곳인데 이 공간의 크기를 예측하기 어려웠다. 자바에서는 클래스의 메타데이터(class 메타정보, Method의 메타정보, static변수, 상수정보)를 읽고 해당 메타데이터를 통해 객체를 생성할 수 있다. PermGen 영역은 OS, JVM버전마다 각기 다른 default값을 가지고 있으며 대부분 매우 작게 할당되어 있어 java.lang.OutOfMemoryError와 같은 에러를 접할 수 있다. PermSize를 commandline에서 늘릴 수 있으나 임시방편이다. Java 8 버전에서는 PermGen 영역이 Metaspace로 대체되었다. Metaspace는 Native memory에 속하..

language/java 2022.03.20

Annotation 생성시 @Retention

Custom Annotation을 만들어 사용할 때 @Retention() annotation을 다들 접한 적 있을 것이다. @Retention() 은 annotatin의 life cycle, 즉 언제까지 살아 남아 있을지를 결정한다. import java.lang.annotation.ElementType; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE)..

language/java 2022.02.13

Resouce leak: 'applicationContext' is never closed

자바 스프링 공부를 하다 다음과 같이 ApplicationContext를 사용할 때 resource leak 오류를 볼 수 있다. 스프링 컨테이너가 중지되면 암시적으로 닫히므로 실행되는데는 문제가 없지만 warning으로 뜨는 것이 꽤 신경쓰여 한번 알아보았다. - ApplicationContext란? 해당 어플리케이션에 대한 구성정보를 제공하는 인터페이스이다. 객체를 생성하고 스프링 컨테이너를 초기화하기 위해 Bean들을 불러오는데 BeanFactory interface를 상속 받은 인터페이스이다. BeanFactory와의 차이점이라면 BeanFactory는 lazy-loading 방식인데 반해 ApplicationContext는 pre-loading 방식으로 더 좋은 성능을 보인다. 아래가 내가 작성..

language/java 2022.01.27

VScode Junit에서 test용 application.yml 못읽어올 때

//==환경==// IDE: VScode 프로젝트: Java spring 에러소스: Junit4 test code 문제) 본 소스용 application.yml과 테스트용 application.yml을 따로 만들어 각각의 resources/ 에 추가했는데 java.lang.IllegalStateException: Failed to load ApplicationContext 본 소스용 application.yml이 적용되며 에러가 발생한다. 해결방법) vscode 설정파일인 .classpath 파일을 열어 vscode extension이 main보다 test 리소스를 먼저 읽도록 순서를 변경한다. 출처: https://githubmemory.com/repo/microsoft/vscode-java-test/..

language/java 2021.10.02

java 장애 hang up 걸렸을 때

jstack jdk 1.6 이상을 사용하고 있다면 Microsoft Windows에서도 jstack을 이용해 thread dump를 획득할 수 있다. 먼저 수행 중인 Java application process의 PID를 확인해야 한다. PID는 아래와 같이 jps로 확인 jps -v jps로 추출한 PID를 파라미터로 넣어 jstack을 실행하여 thread dump를 획득한다. jstack 2123 그 후, locked 라고 되어있는 printTrace를 확인한다. 출처: https://dzone.com/articles/how-analyze-java-thread-dumps https://d2.naver.com/helloworld/10963

language/java 2021.07.17