Java 19

[Java] Time Orderd UUID

UUID를 Primary Key로 썼을 경우 MariaDB InnoDB 테이블의 Primary Key는 Clustered 인덱스로 물리적으로 순서대로 유지가 가능 UUID의 값은 unique하긴 하나 랜덤하게 발생되는 값으로, Primary Key 컬럼일 경우 Clustered Index로 재배열하게 되어, InnoDB 스트로지 엔진의 부하가 발생. 해결방안 UUID를 랜덤하게 생성하되 이 값을 sequencial 하게 생성하여, DB 입장에서 새로운 데이터가 들어오더라도 indexing으로 인해 드는 리소스가 랜덤값보다 현저히 감소. Java UUID Generator (JUG) Library 사용 ( 아래 dependecy 추가 ) com.fasterxml.uuid java-uuid-generator..

Java 2022.02.23

[Java] JMX를 통한 자원 모니터링

JMX 확장 라이브러리를 이용한 Jconsole, Jvisualvm 기반으로 서버 실시간 자원 모니터링. ( Thread dump도 지원한다. ) Java 실행하는 쉘 스크립트를 이용하여 JMX port 오픈하는 방법 DEBUG_OPT="-Dcom.sun.management.jmxremote -Dcohttp://m.sun.management.jmxremote.port= #{JMX PORT} -Dcohttp://m.sun.management.jmxremote.rmi.port= #{JMX PORT} -Dcohttp://m.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcohttp://m...

Java 2021.06.11

[Java] 공개키(Public Key) 와 개인키(Priviate Key)

대칭키와 비대칭키란? 대칭키는 암호화 / 복호화 시에 사용하는 키가 동일한 방식으로 1개의 키만 사용한다. 전자문서(비밀편지)가 대칭키(열쇠)로 암호화 되면 똑같은 대칭키를 가지고 있는 상대방만이 이 전자문서를 복호화 할 수 있으며, 누군가가 암호화된 전자문서를 입수 하여도 이를 복호화하지 못하기 때문에 입수한 사람에게는 아무 의미가 없는 문서이다. 비대칭키는 사용하는 키와 복호화 할 때 사용하는 키가 다른 경우를 말한다. 타인에게 절대 노출되어서는 안되는 비밀키(개인키), 비밀키를 토대로 만든 공개키가 쌍을 이룬 형태이다. 2개의 키를 사용한다. 공개키 - 사람들에게 공개된 키이며 정보를 암호화 할 수 있다. 비밀키 - 사용자만 알고 있는 암호를 풀 수 있는 키 Java RSA 암호화/복호화 Util ..

Java 2020.12.10

[Java] 암호 알고리즘 / 운용 모드 / Padding

암호 알고리즘 자바에서는 대칭키 알고리즘을 사용하여 데이터를 암호화/복호화 시에 javax.crypto.Cipher 클래스를 사용한다, 클래스의 인스턴스는 정적 메서드인 Cipher.getInstance() 를 호출하여 생성할 수 있는데, 이 때 호출 시 사용할 알고리즘, 운용 모드, 패딩 방식을 인자 값으로 넘겨줘야 한다. 혼돈과 확산을 달성하기 위해 Substitution 과 Permutation을 이용한다. Subsititution은 문자를 다른 문자로 바꾸는 것이고, Permutation은 문자들의 순서를 바꾸는 것이다. Substituition과 Permutation을 한번 수행하는 것이 암호 알고리즘의 기본 수행 단위 이다. 암호문은 이를 여러번 수행할수록 안전하다. Substitution-P..

Java 2020.11.28

[Design Pattern] Chain of Responsibility Pattern

책임 연쇄 패턴( Chain of Responsibility Pattern ) 명령 객체와 일련의 처리 객체를 포함하는 패턴 각각의 처리 객체는 명령 객체를 처리할 수 있는 연산의 집합이며 체인 안의 처리 객체가 핸들링 할 수 없는 명령은 다음 처리 객체로 넘겨진다. 체인에 들어가는 객체를 바꾸거나 순서를 바꿈으로서 역할을 동적으로 추가/제거 및 상황에 따라 동적으로 핸들러를 추가하거나 제거 할 수 있으며 이러한 변화가 전체 구조에 아무런 영향을 주지 않도록 클래스들 간의 낮은 결합도로 구현되어있다. 명령에 대한 처리가 반드시 수행된다는 보장이 안되므로 반드시 명령이 처리 될 수 있도록 적절한 체인의 순서 구현 필요 ※ Sample Code public abstract class Middleware { ..

Java/Design Pattern 2020.11.23

[Java] Reflection

Java Reflection 이란, Reflection이란 객체를 통해 클래스의 정보를 분석해 내는 것을 말한다. ( 투명, 반사라는 사전적인 의미를 지니고 있다. ) 객체의 메모리 정보만 알고 있고, 객체의 형에 대해서는 모른다는 가정하에 Reflection을 통해 아래와 같은 정보를 가져 올 수 있으며. 이 정보를 통해 객체를 생성하거나 메소드를 호출하거나 변수의 값을 변경 할 수 있다. Class Constructor Method Field Class reflection = Data.class; // Data class Method 정보 Method[] m = reflection.getMethods(); // Data class Field 정보 Field[] f = reflection.getFiel..

Java 2020.11.19

[Java] Optional

JAVA Optional 이란? Java Optional 클래스는 Java 8에서 추가되었으며 자바의 고질적인 문제인 NPE (NullpointerException) 문제 해결 가이드를 제공, 메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, Null을 반환하면 에러를 유발할 가능성이 높은 상황에서 메서드의 반환 타입으로 Optional을 사용하자는 것이 Optional을 만든 주된 목적. 1. Optional.of value가 null일 경우 NPE 예외를 반환, 반드시 값이 있어야 하는 객체인 경우에만 해당 메서드를 사용 /** * Returns an {@code Optional} with the specified present non-null value. * * @param the ..

Java 2020.11.15

[Java] CPU 점유율이 높은 스레드 상태 분석(Thread dump)

1. linux에서 Java application cpu, memory 점유율 확인 top -c 2. JPS 명령어를 이용한 java application PID 확인 jps -v 3. PS 명령어를 이용한 LWP(Light Weight Process) 및 Thread별 cpu 점유율 확인 ps -mo pid,lwp,stime,time,cpu,pcpu -C java 4. JSTACK을 이용한 Thread dump 추출 후 LWP Thread 확인 jstack -F #{application pid} > threadDump.txt 참고 URL : d2.naver.com/helloworld/10963 brunch.co.kr/@springboot/126 Thread Dump 분석하기 - 쓰레드 덤프 분석하기 |..

Java 2020.11.10

[이팩티브 자바3] 제 5장. 제네릭

1. 로 타입(raw type)은 사용하지 말라. 로타입(raw type) 이란? 로타입 은 제네릭(Generic) 타입에서 타입 매개변수를 전혀 사용하지 않은 때를 말한다. 제네릭을 지원하기 전에는 컬렉션을 다음과 같이 선언했다. // 컬렉션의 로 타입 - 따라하지 말 것! // Stamp 인스턴스만 취급한다. private final Collection stamps = ...; // 실수로 동전을 넣는다. stamp.add( new Coin(...) ); // 반복자의 로 타입 - 따라하지 말 것! for( Integer i = stamp.iterator(); i.hasNext(); ) { Stamp stamp = (Stamp) i.next();// ClassCastException을 던진다. Sta..

[이팩티브 자바3] 제 4장. 클래스와 인터페이스

1. 클래스와 멤버의 접근 권한을 최소화 하라. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리이다. 접근 제어 메커니즘은 클래스, 인터페이스, 멤버의 접근성을 명시한다. private : 멤버를 선언한 톱레벨 클래스에서만 접근할 수 있다. package-private : 멤버가 소속된 패키지 안의 모든 클래스에서 접근할 수 있다. (접근 제한자를 명시하지 않았을 때 적용되는 패키지 접근 수준, 단 인터페이스의 멤버는 기본적으로 public) protected : package-private의 접근 범위를 포함하며, 이 멤버를 선언한 클래스의 하위 클래스에서도 접근 할 수 있다. pub..