일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 서명
- SOA
- Java
- redis
- JWT
- Rest
- IOC
- Spring Data Redis
- AOP
- bounded context
- junit5
- MSA
- Exception
- Transaction
- OOP
- ddd
- jvm
- mockito
- rest api
- reflection
- *
- PSA
- Generic
- bytecode
- JSON
- di
- spring
- Today
- Total
목록전체 글 (25)
개발자일기
redis의 클러스터를 이용해 데이터들을 샤딩 할수 있다. 스프링 부트에서 기본 레디스 라이브러리는 lettuce 이다. lettuce의 cluster connection 관리 lettuce는 클러스터에 모든 노드를 조회해와 노드마다 connection을 가진다. slot 마다 어느 노드 인지 관리를 한다. 키를 이용해 slot을 알아내고, 해당 slot의 노드 커넥션을 이용해 command를 날린다. 응답이 moved ask 일경우 노드를 redirection을 한다. 노드에 대한 failover 설정 방법 노드가 role change가 되거나, maintenance, 신규 노드가 추가 될경우 커넥션의 갱신이 필요하다. 다음과 같이 설정을 할수 있다. @Configuration class RedisCo..
함수형 프로그래밍 가변으로 인해 동시성, 데드락 문제가 발생 -> 불변이 안전하다. 함수형 프로그래밍이란? 항상 불변을 추구 함수를 호출시 외부에 영향을 주지 않음(pure 함수) 같은 input → 같은 output 가변, 불변을 각각 모듈화하자 재 사용성 증가 객체지향의 모듈화는 가장 작은 단위의 모듈화가 아님, 함수를 모듈화 할 경우 더 많은 곳에 사용 가능 단위가 작다는건 테스트가 용이하다. 저는 객체 + 함수 형 프로그래밍을 추구. 객체지향 프로그래밍을 토대로 함수형 프로그래밍을 한다. 문제 코드 public class Car{ private int position; private void move(){ boolean canMove = new randomInt() %2 == 1; if(canMo..
카프카란 분산 메세지징 시스템, 데이터 파이프라인 라인을 만들때 주로 사용되는 플랫폼 카프카 특징(장점) 영속성(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..