일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java
- jvm
- JWT
- Exception
- OOP
- Generic
- Transaction
- JSON
- mockito
- Spring Data Redis
- Rest
- redis
- PSA
- spring
- ddd
- SOA
- IOC
- 서명
- *
- di
- bytecode
- junit5
- AOP
- MSA
- rest api
- reflection
- bounded context
- Today
- Total
목록개발 (23)
개발자일기
redis의 클러스터를 이용해 데이터들을 샤딩 할수 있다. 스프링 부트에서 기본 레디스 라이브러리는 lettuce 이다. lettuce의 cluster connection 관리 lettuce는 클러스터에 모든 노드를 조회해와 노드마다 connection을 가진다. slot 마다 어느 노드 인지 관리를 한다. 키를 이용해 slot을 알아내고, 해당 slot의 노드 커넥션을 이용해 command를 날린다. 응답이 moved ask 일경우 노드를 redirection을 한다. 노드에 대한 failover 설정 방법 노드가 role change가 되거나, maintenance, 신규 노드가 추가 될경우 커넥션의 갱신이 필요하다. 다음과 같이 설정을 할수 있다. @Configuration class RedisCo..
카프카란 분산 메세지징 시스템, 데이터 파이프라인 라인을 만들때 주로 사용되는 플랫폼 카프카 특징(장점) 영속성(Persistence) 메세지를 파일시스템(디스크)에 저장 Kafka는 기존 메시징 시스템과는 달리 메시지를 메모리 대신 파일 시스템에 쌓아두고 관리함 장애시에 오프셋을 이용해 이전의 메세지 참조 가능 디스크 IO는 성능 저하를 유발할수 있지만, 메세지를 디스크에 순차적으로 저장 및 최적화를 통해 해결함(그림참조) 메시지는 하드디스크로 부터 순차적으로 읽음 하드디스크의 랜덤 읽기 성능에 대한 단점을 보완, 동시에 OS 페이지 캐시를 효과적으로 활용할 수 있다. 하드디스크의 순차적 읽기 성능은 메모리에 대한 랜덤 읽기 성능보다 뛰어남 메모리의 순차적 읽기 성능보다 7배 정도 느리다. (물론 하드..
객체지향 프로그래밍에서는 가변보다 불벽객체를 지향한다. 자바에서는 대표적인 예로 String, BigInteger 같은 클래스 들이 있다. 지향하는 이유을 알아보자. 불변 클래스(객체는) 가변 보다 오류가 생길 여지도 적다. 쓰레드 안정하여 동기화 필요가 없다. 안심하고 공유 할수 있다. 특별한 이유가 없다면 불변으로 불변 객체라는건 이 객체가 생성과 동시에 완전한 객체 불변 객체를 신뢰하고 사용할 수있다. 단점도 존재한다. 값이 다르면 독립된 객체가 생성이 필요. 하지만 현대의 하드웨어 빵빵한 스펙에는 딱히 문제가 되지 않을것같다. Integer클래스가 지원하는 객체풀(캐시)을 이용하는 방법도 있다. 불변 클래스 만들기 final class로 상속을 방어 하위클래스에서 변경할수 있다. 필드들을 fina..
생성자 대신 정적 팩토리 메소드 사용 클래스의 생성자와 별도로 객체를 생성하는 팩토리 메소드를 제공할수있다. 팩토리 메소드를 지향하는 이유는 다음과 같다. 이름을 가질수 있다. BigInteger(int, int, Random) 보단 BigInteger.probablePrime 이 '더욱 값이 소수인 BigInteger'을 생성 반환한다고 표현되어질수 있다. 호출때마다 인스턴스를 항상 생성하지 않아도 된다. 매번 객체를 생성 하지 않고 객체풀을 만들어 전달 Boolean.valueOf(boolean)을 보면 Boolean.TRUE, Boolean.FALSE 같이 풀을 관리 반환타입의 하위 타입 객체를 반환할수 있다. 하위클래스를 공개 하지 않고, 상위클래스의 공개만으로 하위클래스 생성하는 방법이다. 입력..
해당 객체에 의미를 부여할수있다. void sell(int price); void sell(Money price); class Money{ private int value; Money(int value){ this.value = value; } }Money라는 돈을 의미하는 클래스의 객체를 전송함으로써 의미를 부여 할수 있다. 해당 리터럴에 대한 제약조건을 부여 할수있다. class PositiveNum{ private int value; PositiveNum(int value){ if(value < 0){ throw new IllegalException(); } this.value = value; } } PositiveNum이란 객체를 생성함으로써 양수의 제약조건을 만족하는 숫자를 의미한다.
일급 컬렉션이란? 특정 필터된 콜렉션 값을 래핑한 클래스를 의미한다. 규칙 콜렉션 이외에 다른 멤버변수는 없어야 한다. 이점 비지니스에 종속적인 자료구조 public class UserCars{ private final List cars; public UserNames(List cars) { if(cars.size() > 10) { throw new Exception(); } this.cars = cars; } } 컬렉션에 대해 비스니스 적인 제약을 둘수 있다. 예제와 같이 소유가능한 자동차의 갯수는 사이즈는 10개 미만으로 제한되도록 강제화 할수 있다. 해당 컬렉션에 대한 불변을 보장 as-is List userCars = Arrays.as(new Car(), new Car()) userNames.ad..
트랜잭션이란? 데이터베이스의 상태를 변화시키기 일련의 작업 단위 또는 연산을 의미 트랜잭션 특성 ACID 원자성 ( Atomicity ) 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것을 말합니다. 즉, All or Noting의 개념으로서 작업 단위를 일부분만 실행하지 않는다는 것을 의미합니다. 일관성 ( Consistency ) 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지하는 것을 말합니다. 제약조건이 항상 유지 된다는 의미이다. 기본키, 외래키, 문자길이 같은 제약 사항들이 유지 격리성 ( Isolation ) 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것을 말합니다. 즉, 트랜잭션끼리는 서로를 간섭할 수 없습니다. 지속성 ( Durabili..
도메인 주도 개발 무엇인가 ? 요구사항, 유즈케이스, 스펙등을 도메인으로 표현하고 해당 도메인들을 도메인 모델로 설계 부터 구현까지의 패턴과 원칙들 객체 지향 + 추가적인 개발론 : oop를 위반하는 경우도 잇음 : 간접 참조, 재사용보단 각각의 모델 장점 보통 서비스(어플리케이션) 레이어에 도메인 로직이 담겨있다. 이럴경우 도메인 로직에 대한 응집도가 떨어지고 코드 중복성이 늘어나 가독성 및 유지보수가 어렵게 된다. 비지니스(도메인) 로직을 도메인 모델이 책임지게 하여, 해당 도메인에 대한 응집도를 높이게 되고, 객체 지향적인 설계 원칙( 객체는 기능+상태)을 잘 적용할수 있다. 단점 아무래도 oop는 재활용성을 강조하지만 ddd는 각각의 도메인 모델을 추구 함으로 코드에 대한 중복이 늘어날수 있다. ..