
Serializable 구현 클래스 선언에 implements Serializable만 붙이면 된다 Serializable 구현의 문제 Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다 직렬화 형태도 하나의 공개 API 가 된다 기본 직렬화 형태에서는 private와 package-private 인스턴스 필드들 마저 api로 공개하는 꼴이 된다(캡슐화 깨짐) 직렬화가 클래스 개선을 방해한다 UID(명시하지 않으면 런타임시 자동으로 생성해줌)를 생성할때 클래스 멤버들이 고려한다 나중에 수정을 한다면 UID 변한다 버그와 보안 구멍이 생길 위험이 높다 생성자를 사용해서 만드는게 기본인데 기본 메커니즘을 우회하는 객체 생성 기법이다 기본 역직렬화를 사용하면 불변식 깨짐과 허가되지 않은 접근에 ..

직렬화란? 자바가 객체를 바이트 스트림 으로 인코딩하고(직렬화) 그 바이트 스트림으로부터 다시 객체를 재구성하는 (역직렬화) 메커니즘이다. 직렬화의 단점 직렬화의 근본적인 문제는 공격 범위가 너무 넓고 지속적으로 더 넓어져 방어하기 어렵다는 점이다 바이트 스트림을 역직렬화하는 과정에서 readObject 메서드는 그 타입들 안의 모든 코드를 수행할수 있다 신뢰할 수 없는 스트림을 역직렬화 하면 원격 코드 실행(remote code execution), 서비스 거부(denial-oof-service)등의 공격으로 이어질수 있다 가젯 메서드 역직렬화 과정에서 호출되어 잠재적으로 위험한 동작을 수행하는 메서드 static byte[] bomb() { Set root = new HashSet(); Set s1 ..

전략패턴이란? 여러 알고리즘을 하나의 추상적인 접근점을 만들어 접근 점에서 서로 교환 가능하도록 하는 패턴입니다 예를들어 게임캐릭터와 무기를 구현한다고 했을때 전략패턴을 사용해 보겠습니다 public class GameCharacter { //접근점 private Weapon weapon; public void attack() { //델리게이트 - weapon 객체에 위임한다 weapon.doAttack(); } //교환 가능 public void setWeapon(Weapon weapon) { this.weapon = weapon; } } public class Sword implements Weapon { public void doAttack() { System.out.println("검 공격"); ..

Java11 Java 11 이후 Oracle JDK는 더 이상 상업적 용도로 무료로 사용할 수 없습니다.(무료로 사용하려면 OpenJDK 사용) 추가된 기능 javac 명령 사용하지않고 java 명령어로만 실행가능 (암시적 컴파일) String 클래스 새로운 유틸리티 메서드 추가 isBlank() - 빈 문자열 및 공백 만있는 문자열은 공백처리 System.out.println(" ".isBlank()); //true String s = "joeylee"; System.out.println(s.isBlank()); //false String s1 = ""; System.out.println(s1.isBlank()); //true lines() - 라인단위로 분할해 스트림으로 반환 String str = ..

Redis란? Redis는 In-Memory Store로써, String, List, Set, Hash 등 다양한 자료구조를 제공하고 빠른 데이터 입출력을 제공합니다 Redis single thread 명령어를 실행하는 코어부분은 single thread 결국은 싱글스레드라 atomic 유지 I/O Socket read/write를 할때 멀티쓰레드 동작합니다 클라이언트가 전송한 명령을 읽어서 파싱하는 부분 명령이 처리된 결과 메시지를 클라이언트에게 전달하는 부분 단일 스레드를 사용하여 불필요한 context switching 및 lock을 고려할 필요가 없고 deadlock이 없어 성능 소모가 없습니다 주요 명령어들은 O(1) 의 성능을 보이지만, 데이터가 많을 경우 여러개의 키를 다루는 명령어가 O(n..

CDN이란? 전 세계에 전략적으로 분산되어있는 서버 네트워크입니다 지연 시간 감소로인해 컨텐츠의 빠른 응답과 다운로드 시간을 제공합니다 주로 정적 컨텐츠(image, css, js) 캐시를 합니다 CDN에서 캐시는 어떻게 하나요? 프록시와 유사, cdn 노드에 기존에 방문한 기록이 있을경우 바로 처리해서 보여줍니다(GSLB) DNS 서비스의 발전된 형태 DNS와 GSLB 차이점 재해복구 dns는 서버의 상태를 알 수 없어서 서비스를 실패하는 유저가 생길 수 있습니다 gslb는 서버의 상태를 모니터링 하고 실패한 서버의 IP는 응답에서 제외 하므로, 유저는 서비스를 계속 이용할 수 있습니다 로드밸런싱 dns는 라운드 로빈 방식을 사용하기 때문에 정교한 로드밸런싱이 힘듭니다 gslb는 서버의 로드를 모니터링..

목표 Iterable과 Observable을 사용해 1부터 10까지 출력하는 어플리케이션 개발을 합니다 Iterable과 Observable 의 쌍대성(duality)에 대해서 알아봅니다 Iterable Iterable은 Collection 인터페이스에서 구현하고 있는 인터페이스로 내부의 원소들을 순회할 수 있게 만든 interface 입니다 iterator.next() 를 해서 데이터를 가져오는 방식입니다(pull 방식) //메인 안의 메소드 Iterable iter = () -> new Iterator() { int i = 0; final static int MAX = 10; @Override public boolean hasNext() { return i < MAX; } @Override publi..

JVM이란 Byte Code(.class파일)를 OS에 맞게 해석해주는 역할입니다 JVM 구조 1. Class Loader 2. Execution Engine 3. Runtime Data Areas Class Loader란 자바에서 소스를 작성하면 Person.java 처럼 .java파일이 생성됩니다. .java 소스를 자바컴파일러가 컴파일하면 Person.class 같은 .class파일(바이트코드)이 생성됩니다. 이렇게 생성된 클래스파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할을 Class Loader가 한다. (자바 애플리케이션이 실행중일 때 이런 작업이 수행됩니다.) Execution Engine의 역할 Class Loader에 의해 메..

영속성 컨텍스트 란? entity를 영구 저장하는 환경입니다 EntityManager.persist(entity); 엔티티를 영속성 컨텍스트에 저장한다 (DB가 아님) EntityManager를 통해서 영속성 컨텍스트에 접근합니다 스프링에서는 엔티티 매니저와 영속성 컨텍스트가 N:1 엔티티의 생명주기 비영속(new/transient) 영속성 컨텍스와 전혀 관계가 없는 새로운 상태입니다 영속(managed) 영속성 컨텍스트에 관리되는 상태입니다 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된 상태입니다 삭제(removed) 삭제된 상태입니다 EntityMaagerFactory emf = Persistence.createEntityManagerFactory("test"); EntityManag..
- Today
- Yesterday
- observable
- template
- jvm
- LAMBDA
- strategy
- nosql
- 디자인패턴
- Redis
- Concurrecy
- Spring
- in-memory
- 부하테스트
- Serializable
- iterable
- reactive stream
- Java
- reactive
- Serialize
- 메인보드#asrock b650m #조립pc #후기이벤트
- object
- Observer Pattern
- Effective JAVA
- gslb
- JMeter
- exception
- jdk11
- 영속성
- concurrency
- template method
- Design Pattern
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |