프로그래밍 언어/Java
-
[Java] Static Block 실행시점과 싱글톤(Singleton)에서의 활용프로그래밍 언어/Java 2022. 12. 28. 14:39
Kotlin 의 object 키워드와 companion object 키워드가 Java 코드로 어떻게 짜여지는지 궁금하여Decompile 해보던 중 이해할 수 없는 Static Block 을 발견하여 직접 실험해본 결과를 정리한다. Static Block 이란? (+ Instance Block)Static Block 은 static 키워드가 붙은 block 을 일컫는다.Instance Block 은 static 키워드가 붙지 않은 block 을 일컫는다.Instance Block 은 인스턴스가 초기화 될 때 실행된다.public class StaticBlockClass { public static final StaticBlockClass INSTANCE; // if it's called before..
-
[Java] multipartFile 이미지 리사이징 예제코드프로그래밍 언어/Java 2022. 11. 13. 16:27
사용자가 업로드 한 로고이미지를 리사이징한 후 S3 버킷에 저장해야하는 로직을 구현할 일이 있었다. 아래는 이미지를 컨트롤러에서 받아 리사이징 하는 코드이다. Using Java Library public class ImageUtils { public static File multipartFileToFile(MultipartFile multipartFile) throws IOException { File file = new File(multipartFile.getOriginalFilename()); multipartFile.transferTo(file); return file; } public static BufferedImage resizeImage(MultipartFile image, int maxW..
-
[Java] 클래스 로드와 클래스 초기화 (StaticInnerClass, InnerClass, MemoryLeak)프로그래밍 언어/Java 2022. 11. 6. 14:21
코드리뷰를 받던 중, "왜 내부클래스를 static 으로 선언하셨어요?" 라는 질문을 받게 되었다. 학생때부터 어떤 이유 때문에 습관적으로 써왔던 것이지만 기억이 안나던 나는 어버버 했다. 그 후 검색을 하여 메모리누수 때문이었다는게 기억이 났고, 다시 리뷰어분과 말씀을 나눴다. 그리고 다시 이런 질문을 받았다. "static 도 메모리에 올라가고, non-static 도 메모리에 올라가는건 마찬가지 아닌가요? 인스턴스가 초기화 되지 않으면 메모리에 안올라가는건 non-static 이지 않나요?" 클래스 로드와 클래스 초기화는 다르지 않나? 다른게 맞나..? static 은 클래스뼈대만 stack 영역에 올라가고, 인스턴스 초기화에만 heap 에 올라가는게 아닌가? non-static 은 인스턴스 초기화..
-
[Java/Kotlin] Static nested class 와 Inner Class 중 무엇을 써야할까?프로그래밍 언어/Java 2022. 11. 6. 14:10
불필요한 메모리사용과 메모리 누수를 피하려면 중첩클래스를 사용할 때 Static Nested Class 를 사용하는 것이 좋다. Static Nested Class 중첩 클래스 중, static 키워드를 붙인 내부클래스를 지칭한다. (Java) 중첩 클래스 중, 키워드 없는 내부클래스를 지칭한다. (Kotlin) Inner Class 중첩 클래스 중, 키워드 없는 내부클래스를 지칭한다 (Java) 중첩 클래스 중, inner 키워드를 붙인 내부클래스를 지칭한다. (Kotlin) 인스턴스 생성 시 // JAVA class A { class B{} static class C{} } 위의 예제 코드를 바탕으로 Static Nested Class 는 인스턴스를 생성하면 C 클래스만 생성된다. 반면에, Inner..
-
[Java] 바이트코드 조작하기 (JavaAgent, JVM, Jacoco)프로그래밍 언어/Java 2022. 6. 6. 21:50
해당 포스팅은 백기선님의 [더 자바, 코드를 조작하는 다양한 방법] 을 토대로 작성된 글입니다. 코드 커버리지는 어떻게 측정할까? (Jacoco 동작원리) Jacoco 를 사용해 보신 적이 있으신가? 소스코드에 대한 테스트 케이스가 얼마나 작성되어 코드를 얼마나 커버했는지 측정하는 라이브러리인데 아래와 같이 if 문 실행까지 체크가 가능하다. 어떻게 플러그인하나를 추가했다고 우리가 작성한 코드를 인식하고 그에 대한 테스트가 이루어졌는지 알 수 있을까? 심지어 우리 코드(.java 파일,.class 파일)는 변경이 되지 않았는데 말이다! 이는 바로 JVM 힙영역(메모리)에 클래스정보가 올라가기전에 클래스로드 시점에 인터셉트 하여 바이트코드를 조작하기 때문이다. 때문에 프로그램을 실행하면서 컴파일한 .cla..
-
[Java] JVM 이 무엇인지, 어떻게 작동하는지 대충 훑어보자! (feat. 클래스로더)프로그래밍 언어/Java 2022. 5. 29. 17:44
싱글톤패턴 중 Initialization on demand holder idiom라는 구현 기법이 있는데 해당 기법은 JVM 의 클래스로더 매커니즘을 이용한 방식이라 한다. 스프링을 사용할 때도 종종 ClassNotFoundException 이 터질 때, 검색을 해보면 클래스로더라는 키워드가 종종 등장한다. 리플렉션도 클래스로드라는 키워드가 항상 같이 끼워팔리고 있다. 그렇다 나는 미뤄왔다... 습득해야되지만 귀찮다는 이유로... 이제는 지식의 부채의 상환일이 다가 온 것이다... ㅠ_ㅠ (하지만 대충 볼거야) # 용어정리 1. JVM (Java Virtual Machine) 개요 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환하여 실행하는 역할을 한다. (자바 바이트 코드를 어떻게 실..
-
[Java/OS] 세마포어(Semaphore)에 관하여프로그래밍 언어/Java 2022. 3. 18. 08:26
이전에 OS와 시스템프로그래밍을 공부할 때 임계영역, 세마포어, 데드락, 뮤텍스락 등 배운적이 있는데 기억이 흐릿해져 다시 한번 정리하고자 한다. 사실 재밌는 옛날이야기를 찾아 신나서 포스팅 하는 것이기도 하다. ㅋㅋㅋㅋㅋ 세마포어(Semaphore)의 유래 Semaphore 는 깃발이라는 뜻이다. (!!!) 옛날 기찻길에서 깃발 표식으로 파란색이 걸려있으면 지나가도 되고 빨간색이면 다른기차가 지나간 후에 통과하라는 표시였다고 한다. 그리고 이 깃발이 Semaphore라고 한다. (매 우 흥 미 롭 잖 아 !!) 세마포어와 뮤텍스(Mutex) 세마포어는 2개이상의 프로세스(또는 쓰레드)가 공유자원에 대한 접근을 제어하는 변수 뮤텍스는 딱 2개의 프로세스(또는 쓰레드)가 공유자원에 대한 접근을 제어하는 변..
-
[Java] ThreadLocal 이 필요할 때 (feat. Thread, Thread-Safe, OS, Spring Security)프로그래밍 언어/Java 2022. 3. 15. 13:54
ThreadLocal 오직 한 쓰레드에 의해 읽고 쓰여질 수 있는 쓰레드만의 독립적인 로컬변수 ThreadLocal이 필요할 때 보통 프로세스 내부 자원을 쓰레드들은 공유하게 되는데, 아무처리를 해두지 않으면 쓰레드들은 순서없이 프로세스의 내부자원에 접근하게 된다. 여기서 변경이 생긴다면 그 뒤의 쓰레드들은 변경된 데이터로 작업을 하게 되는데 여기서 생각지 못한 동작을 하게 될 가능성이 많다. 이러한 점을 해결하기 위해 세마포어와 뮤텍스(=이진세마포어)라는 개념이 있지만, 공유변수가 아닌 오직 쓰레드만의 로컬 변수를 사용하고 싶을 때는 ThreadLocal을 사용하게 된다. ThreadLocal의 사용예시 (Spring Security Context Holder) Spring Security에서 Cont..