일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바8
- spring
- 디자인 패턴
- spring boot
- Stream
- jsp
- 스트림
- AWS101
- Java 8 in action
- ddd
- head first
- CQRS
- domain
- Was
- facade pattern
- 자바의 신
- web
- Java
- SERVLET
- Java in action
- 클린코드
- spring Batch
- Clean Code
- Java8 in action
- Java8
- Template Method Pattern
- Design Pattern
- 자바
- 자바8인액션
- 패스트캠퍼스
- Today
- Total
목록개발 성장기 (34)
주난v 개발 성장기
jar, war, 클래스, 패키지 등 많은 곳에서 사용하므로 이름을 잘 지으면 여러모로 편하다. * 의도를 분명히 밝혀라 - "의도가 분명하게 이름을 지으라" 그러면 (자신을 포함해) 코드를 읽는 사람이 좀 더 행복해지리라. int d; // 경과 시간(단위: 날짜) - 아무 의미도 드러나지 않는다. 코드가 단순하더라도, 변수명이나 파라미터에 따라서 코드를 이해하기가 더 쉬워진다. 단순히 이름만 고쳐도 함수가 하는 일을 이해하기 쉬워진다. 이것이 좋은 이름이 주는 위력이다. * 그릇된 정보를 피하라. 소문자 L이나 대문자 O같은 경우는 1과 0 처럼 혼동이 가능하다. 그리고, 직각삼각형의 빗변(hypotenuse)를 구현할 때는 hp가 훌륭한 약어이겠지만, hp는 독자에게 그릇된 정보를 제공한다. * 의..
나쁜 코드 우리 모두는 대충 짠 프로그램이 돌아간다는 사실에 안도감을 느끼며 그래도 안 돌아가는 프로그램보다 돌아가는 쓰레기가 좋다고 스스로를 위로한다. 다시 돌아와 나중에 정리하겠다고 다짐한다. 물론...그때 그시절 우리는 "르블랑의 법칙"을 몰랐다. 나중은 결코 오지 않는다. 나쁜 코드로 치르는 대가 매번 얽히고 설킨 코드를 '해독'해서 얽히고 설킨 코드를 더한다. 이로 인해 생산성이 바닥나고 결국 재설계를 하게 된다. 비야네 스트롭스트룹 - 효율을 중요하게 여기자. 단순히 속도 뿐만 아니라 CPU 자원을 낭비하는 코드도 우아하지 못한다. - 오류 처리도 신경써야 한다. (메모리 누수, 경쟁 상태, 일관성 없는 명명법) - 나쁜 코드는 너무 많은 일을 하려 애쓰다가 의도가 뒤섞이고 목적이 흐려진다. ..
운영체제 역할 * 시스템 자원 관리자 OS라고도 한다. 시스템 자원 = 컴퓨터 하드웨어 CPU(중앙 처리장치), Memory(DRAM, RAM) I/O Devices Monitor, Mouse, Keyboard, Network 저장 매체 : SSD, HDD (특징 : 컴퓨터를 꺼도 데이터가 보존된다.) * 사용자와 컴퓨터 간의 커뮤니케이션 지원 * 컴퓨터 하드웨어와 프로그램을 제어 "컴퓨터 하드웨어"는 스스로 할 수 있는 것이 없습니다. CPU : 각 프로그램이 얼마나 CPU를 사용할지 결정할 수 없다. Memory : 각 프로그램이 어느 주소에 저장되어야 하는지, 어느 정도의 메모리 공간을 확보해야 하는지 결정할 수 없다. 저장매체 (SSD, HDD) : 어떻게, 어디에 저장되는지를 결정할 수 없다. ..
병렬 스트림 - parallelStream을 호출하면 병렬 스트림 생성 - 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림 순차 스트림을 병렬 스트림으로 변환하기 - 순차 스트림에 parallel 메서드를 호출하면 리듀싱 연산이 병렬로 처리 병렬 스트림에서 스레드 풀 설정 - 병렬 스트림은 내부적으로 ForkJoinPool 사용 -프로세서 수, Runtime.getRuntime().availableProcessors()가 반환하는 값에 상응하는 스레드를 가짐. - 전역 설정이므로, 모든 병렬 연산에 영향을 준다. 특정한 값을 따로 지정할 수는 없다. 스트림의 성능 측정 - (예제 7-1) 참고 - sequential sum :97ms, for : 2ms, parallel : ..
스트림의 연산은 filter, map과 같은 중간 연산 / count, findFirst, forEach, reduce 등의 최종 연산 중간 연산 : 한 스트림을 다른 스트림으로 변환, 여러 연산을 연결할 수 있다. 최종 연산 : 스트림 요소를 소비해서 최종 결과를 도출 컬렉터란? 스트림의 요소를 어떤 식으로 도출할지 지정 .collect(Collectors.toList()); collect를 호출하면 스트림의 요소에 리듀싱 연산이 수행된다. collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 방문하면서 컬렉터가 작업을 처리한다. Collector 인터페이스의 메서드를 어떻게 구현하느냐에 따라 스트림에 어떤 리듀싱 연산을 수행할지 결정 Collectors 클래스는 정적 팩토리 메서드를 제공한다..
필터링과 슬라이싱 - 일부 요소를 무시하거나 스트림을 주어진 크기로 축소하는 방법 1. 프레디케이트로 필터링 - 프레디 케이트(boolean을 반환하는 함수)를 인수로 받아서 일치하는 모든 요소를 포함하는 스트림을 반환 2.고유 요소 필터링 - distinct() 메서드 반환 3. 스트림 축소 - limit(n) 4. 요소 건너뛰기 - skip(n) 매핑 - 스트림은 함수를 인수로 받는 map 메서드 지원 - 함수를 적용한 결과가 새로운 요소로 매핑된다. relationIds.stream().map(relationId -> likeCountVO(likeType, relationId, 0L)) .forEach(likeCountVOList::add); 스트림 평면화 - map, flatMap 검색과 매칭 1..
DB 데이터와 LDAP을 이용해서 인증을 처리하는 클래스를 만들었을 때... 두 클래스는 거의 유사한 코드를 갖게 된다. 실행의 과정 / 단계는 동일한데 일부의 구현이 다른 경우에 사용하는 패턴을 "템플릿 메서드 패턴"이라고 한다. public abstract authenticator { public Auth authenticate(String id, String pw) { if (!doAuthenticate(id, pw) { throw createException(); } return createAuth(id); } protected abstract boolean doAuthenticate(String id, String pw); protected abstract Auth createAuth(Strin..
전략 패턴 - 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성 - 유사한 행위들을 캡슐화하는 인터페이스 생성 - 객체의 행위를 직접 수정하지 않고, 런타임 시점에 전략을 바꿔주어서 행위를 유연하게 확장 기능 위임. 기존 코드의 변경 없이 외부 주입만 변경하면서 사용하는 패턴 as-is - 계산 클래스에서 모든 처리를 다해줌 - 조건이 추가된다면 코드가 무한정 증가되는 단점을 가짐 public class Calculator { public int calculate(boolean firstGuest, List items) { int sum = 0; for (Item item : items) { if (firstGuest) { sum += (int) (item.getPrice() * 0.9);// ..