일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- spring boot
- 디자인 패턴
- ddd
- 자바8인액션
- Java8 in action
- web
- spring Batch
- AWS101
- CQRS
- Java
- Java in action
- Template Method Pattern
- 패스트캠퍼스
- Java8
- 자바의 신
- 자바8
- domain
- Design Pattern
- Clean Code
- facade pattern
- Was
- head first
- 자바
- 스트림
- spring
- jsp
- Java 8 in action
- 클린코드
- Stream
- SERVLET
- Today
- Total
목록분류 전체보기 (35)
주난v 개발 성장기
컬렉션은 데이터를 그룹화하고 처리할 수 있다. 프로그래밍 작업에 필수적인 요소다. 하지만, 특정 조건에 대한 처리에는 약하다. 많은 요소를 포함하는 커다란 컬렉션은 어떻게 처리할까? -> 성능을 높이려면 멀티코어 환경에서 병렬로 컬렉션 요소를 처리해야 한다. 하지만, 병렬 처리 코드를 구현하는 것은 어렵다. 따라서, "스트림"을 사용하는 것이 답이다. 스트림이란 무엇인가? - 자바 API에 추가된 기능, 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. List lowCaloricDishes = new ArrayList(); for (Dish d : menu) { if (d.getCalories() < 400)..

람다 표현식 - 익명함수를 단순화한 것 람다 표현식에는 이름이 없지만, 파라미터 리스트, 바디, 반환 형식, 예외 리스트는 가질 수 있다. 익명 : 메소드 이름이 없다. 함수 : 람다 표현식은 특정 클래스에 종속되지 않으므로 함수라고 한다. 함수처럼 파라미터 리스트, 바디, 반환 형식, 예외 리스트를 가진다. 전달 : 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 : 자질 구레한 코드가 필요 없다. Comparator byWeight = new Comparator() { public int compare(Apple apple1, Apple apple2) { return apple1.getWeight().compareTo(apple2.getWeight()); } }; (Apple ..

우리의 요구사항은 언제나 바뀐다. "동작 파라미터화"를 이용하면 효과적으로 대응할 수 있다. "동작 파라미터화"란 아직 어떻게 실행될지 정해지지 않은 코드 블록으로, 실행은 나중으로 미뤄진다. 이미 파일 필터링이나, List 정렬 등을 통해 경험을 해보았을 수 있지만, 동작 파라미터화를 추가하려면 코드가 늘어난다. 이는 3장 람다 표현식을 통해 해소된다. 변화하는 요구사항에 대응하자! 1. 녹색 사과만 필터링하자. public List filterGreenApples(List inventory) { List result = new ArrayList(); for (Apple apple : inventory) { if ("green".equals(apple.getColor()){ result.add(appl..
자바 8에서 변화가 많이 일어났다. 사과 리스트 정렬 코드 //JAVA8 이전 Collections.sort(inventory, new Comparator() { public int compare(Apple apple1, Apple apple2) { return apple1.getWeight().compareTo(apple2.getWeight()); } } //JAVA8 inventory.sort(comparing(Apple::getWeight()); 멀티코어 CPU 대중화와 같은 하드웨어적인 변화도 자바 8에 영향을 미쳤다. 대부분 쿼드 코어 이상의 CPU를 사용할 것이다. 자바8이 등장하기 이전에는 나머지 코어를 활용하려면 스레드를 사용하는 것이 좋다고 조언했지만, 관리하기 어렵고 문제가 발생 자바 ..
CQRS - Command Query Responsibility Segregation 단일 모델의 단점 조회 화면의 특성상 속도가 빨라야 하는데, 여러 애그리거트에서 데이터를 가져와야 할 경우 구현 방법을 고민해야 한다. (ex. 주문 상세 조회 시에 주문, 상품, 회원 정보를 모두 조회해한다.) ID를 이용해서, 애그리거트를 참조하는 방식을 사용하면 즉시 로딩과 같은 최적화 기능을 이용 못하고, 여러번 select를 해야함으로 속도에 문제가 생긴다. ID가 아니라 직접 참조하는 방식으로 연결해도 즉시 로딩이나 지연 로딩을 처리해야 하므로, 네이티브 쿼리를 사용해야 할 수도 있다. 이러한 고민은 단일 도메인을 사용하기 때문이다. 해결법은 상태 변경을 위한 모델과 조회를 위한 모델을 분리하는 것! CQRS..
org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT into BATCH_JOB_EXECUTION(JOB_EXECUTION_ID, JOB_INSTANCE_ID, START_TIME, END_TIME, STATUS, EXIT_CODE, EXIT_MESSAGE, VERSION, CREATE_TIME, LAST_UPDATED, JOB_CONFIGURATION_LOCATION) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; (conn=21562) Duplicate entry '0' for key 'PRIMARY'; nested exception is java.sql.SQLIntegr..

구매를 취소하면 환불을 처리해야 한다. 이 때, 환불 기능을 실행하는 주체는 주문 도메인 엔티티가 될 수 있다. 도메인 객체에서 환불 기능을 실행하려면 1. 도메인 서비스를 파라미터로 전달받아 처리 public class Order { public void cancel(RefundService refundService) { // 처리 refundService.refund(getPaymentId()); } } - 주문 로직과 결제 로직이 섞이는 문제 - 기능 확장의 어려움 발생 - 메일을 보낸다고 했을 때, 메일 발송 Service를 파라미터에 추가해줘야한다. - 더불어 트랜잭션 처리도 복잡해진다. 2. 응용 서비스에서 별도 환불 기능 실행 - CancelOrderService 구현 - 응용 서비스에서 C..

도메인 모델과 경계 한 도메인은 여러 하위 도메인으로 구분되기 때문에, 한 개의 모델로 여러 하위 도메인을 모두 표현하려다보면 모든 하위 도메인에 맞지 않는 모델을 만들게 된다. (ex. 주문 - 상품 / 배송 - 상품 / 재고 - 상품) 논리적으로는 같아 보이지만, 실제로 사용하는 방법은 다 다르다 하위 도메인마다 같은 용어라도, 의미가 다르고 지칭하는 용어가 다를 수 있기 때문에, 한 개의 모델로 모든 하위 도메인을 표현할 수 없다. 여러 하위 도메인의 모델이 섞이기 시작하면 모델의 의미가 약해지고, 요구사항을 모델에 반영하기가 어렵다. 모델은 구분되는 경계를 가지게 되는데 이를 BOUNDED CONTEXT라 한다. BOUNDED CONTEXT 모델의 경계를 결정하며, 한 개의 BOUNDED CONT..