부록 A 동시성2 (4)

책너두 5기 48일차 로버트 C. 마틴의 클린코드 p. 437~ p.446 내용정리 부록 A 동시성 2 다중 스레드 코드 테스트 변수의 현재 값을 기억한다. 스레두 두 개를 새엉하여 각 스레드가 해당 변수에 관한 메서드를 호출한다. 의도에 맞게 값이 변경되었는지 확인한다. 의도와 다르게 변한것이 확인될 때까지 반복한다. 위와 같은 테스트는 아주 드물게 문제가 발생하기 때문에, 일억 번은 돌려야 한다. 따라서 많은 시간이 소모된다. 이를 대체하기 위한 방법들은 다음과 같다. 몬테 카를로 테스트 ...

2023년 9월 30일 · 1 분 · 배준수

부록 A 동시성2 (3)

책너두 5기 47일차 로버트 C. 마틴의 클린코드 p. 429~ p.436 내용정리 부록 A 동시성 2 작업 처리량 높이기 동기화 영역은 언제나 작을수록 좋다. 작업 처리량 계산 - 단일 스레드 환경 다음을 가정한다. 페이지를 읽어오는 평균 I/O 시간 : 1초 페이지를 분석하는 평균 처리 시간: 0.5초 처리는 CPU 100%를 사용, I/O는 CPU 0% 사용 스레드 하나가 N 페이지를 처리한다면 총 실행 시간은 1.5초 * N이다. 작업 처리량 계산 - 다중 스레드 환경 3개의 스레드를 사용한다면? 페이지 읽기 한 번은 페이지 분석 두 번과 겹침이 가능하므로 일 초마다 두 페이지를 처리한다. 따라서 단일스레드보다 처리율이 세 배 높다. ...

2023년 9월 29일 · 2 분 · 배준수

부록 A 동시성2 (2)

책너두 5기 46일차 로버트 C. 마틴의 클린코드 p. 420~ p.428 내용정리 부록 A 동시성2 라이브러리를 이해하라 Executor 프레임워크 스레드 풀링으로 정교한 실행을 지원하는 프레임워크 스레드 풀을 관리하고, 풀 크기를 자동으로 조정하며, 필요하다면 스레드를 재 사용 스레드를 차단하지 않는(non blocking) 방법 최신 프로세서는 거의 지원. CAS(Compare and Swap)라 불리는 연산을 지원 다중 스레드 환경에서 안전하지 않은 클래스 SimpleDateFormat 데이터베이스 연결 java.util 컨테이너 클래스 서블릿 메서드 사이에 존재하는 의존성을 조심하라 두 스레드가 서로를 간섭해 예외가 발생할 가능성이 있다. 해결방안 실패를 용인한다. 클리언트를 바꿔 문제를 해결한다. 즉, 클라이언트-기반 잠금 메커니즘을 구현한다. 서버를 바꿔 문제를 해결한다. 서버에 맞춰 클라이언트도 바꾼다. 즉, 서버-기반 잠금 메커니즘을 구현한다. 실패를 용인한다. 떄로는 실패해도 괜찮도록 프로그램을 조정할 수 있다. ...

2023년 9월 28일 · 1 분 · 배준수

부록 A 동시성2 (1)

책너두 5기 45일차 로버트 C. 마틴의 클린코드 p. 413~ p.419 내용정리 가능한 실행 경로 1 2 3 4 5 6 7 public class IdGenerator { int lastIdUsed; public int incrementValue() { return ++lastIdUsed; } } 스레드 하나가 IdGenrator 인스턴스 하나를 사용한다고 가정하면 가능한 실행 경로, 가능한 결과도 하나다. 반환값은 lastIdUsed 값과 동일하다. 두 값 모두 메서드를 호출하기 전보다 1이 크다. 스레드가 두 개라면? 그래서 각 스레드가 incrementValue 메서드를 한 번씩 호출한다면 결과는 어떨까? lastIdUsed 초깃값을 93으로 가정하면 결과는 다음 중 하나이다. ...

2023년 9월 27일 · 1 분 · 배준수

냄새와 휴리스틱(5)

책너두 5기 44일차 로버트 C. 마틴의 클린코드 p. 404~ p.412 내용정리 17. 냄새와 휴리스틱 테스트 1. 불충분한 테스트 테스트 케이스는 잠재적으로 깨질만한 부분을 모두 테스트해야 한다. 확인하지 않는 조건이나 검증하지 않는 계산이 있다면 그 테스트는 불완전하다. 2. 커버리지 도구를 사용하라 커버리지 도구는 테스트가 빠뜨리는 공백을 시각적으로 알려준다. 3. 사소한 테스트를 건너뛰지 마라 사소한 테스트는 짜기 쉽고 제공하는 문서적 가치는 구현에 드는 비용을 넘어선다. 4. 무시한 테스트는 모호함을 뜻한다 불분명한 요구사항은 테스트 케이스를 주석으로 처리하거나 테스트 케이스에 @ignore를 붙여 표현한다. ...

2023년 9월 26일 · 2 분 · 배준수

냄새와 휴리스틱(4)

책너두 5기 43일차 로버트 C. 마틴의 클린코드 p. 396~ p.403 내용정리 17. 냄새와 휴리스틱 자바 1. 긴 import 목록을 피하고 와일드카드를 사용하라 패키지에서 클래스를 둘 이상 사용한다면 와일드카드를 사용해 패키지 전체를 가져오라 2. 상수는 상속하지 않는다 static import를 사용하라. 3. 상수 대 Enum enum은 마음껏 사용하라. 이름 1. 서술적인 이름을 사용하라 사프트웨어 가독성의 90%는 이름이 결정한다. 시간들 들여 현명한 이름을 선택하고 유효한 상태로 유지한다. 2. 적절한 추상화 수준에서 이름을 선택하라 구현을 드러내는 이름은 피하라. 작업 대상 클래스나 함수가 위치하는 추상화 수준을 반영하는 이름을 선택하라. ...

2023년 9월 25일 · 1 분 · 배준수

냄새와 휴리스틱(3)

책너두 5기 42일차 로버트 C. 마틴의 클린코드 p. 388~ p.395 내용정리 17. 냄새와 휴리스틱 일반 26. 정확하라 코드에서 뭔가를 결정할 때는 정확히 결정한다. 결정을 내리는 이유와 예외를 처리할 방법을 분명히 알아야 한다. 코드에서 모호성과 부정확은 의견차나 게으름의 결과다. 검색 결과 중 첫 번째 결과만 유일한 결과로 간주하지 마라. 부동 소수점으로 통화를 표현하지 마라. 갱신할 가능성이 희박하다고 잠금과 트랜잭션 관리를 건너뛰지 마라. List로 선언할 변수를 ArrayList로 선언하지 마라. 모든 변수를 protected로 선언하지 마라. ...

2023년 9월 23일 · 2 분 · 배준수

냄새와 휴리스틱(2)

책너두 5기 41일차 로버트 C. 마틴의 클린코드 p. 379~ p.387 내용정리 17. 냄새와 휴리스틱 일반 15. 선택자 인수 선택자(selector) 인수는 목적을 기억하기 어려울 뿐 아니라 각 선택자 인수가 여러 함수를 하나로 조합한다. 인수를 넘겨 동작을 선택하는 대신 새로운 함수를 만드는 편이 일반적으로 좋다. 16. 모호한 의도 코드를 짤 때는 의도를 최대한 분명히 밝힌다. 17. 잘못 지운 책임 코드는 독자가 자연스럽게 기대할 위치에 배치한다. 18. 부적절한 static 함수 일반적으로 static 함수보다 인스턴스 함수가 더 좋다. 조금이라도 의심스럽다면 인스턴스 함수로 정의한다. 반드시 static 함수로 정의해야 겠다면 재정의할 가능성은 없는지 꼼꼼히 따져본다. ...

2023년 9월 22일 · 2 분 · 배준수

냄새와 휴리스틱(1)

책너두 5기 40일차 로버트 C. 마틴의 클린코드 p. 370~ p.378 내용정리 17. 냄새와 휴리스틱 환경 1. 여러 단계로 빌드해야 함 빌드는 간단히 한 단계로 끝나야 한다. 한 명령으로 전체를 체크아웃해서 한 명령으로 빌드할 수 있어야 한다. 2 . 여러 단계로 테스트해야 함 모든 단위 테스트는 한 명령으로 돌려야 한다. 함수 1. 너무 많은 인수 함수에서 인수 개수는 적을수록 좋고 아예 없으면 가장 좋다. 2. 출력 인수 인수는 출력보단 입력으로 간주할 수 있어야 한다. ...

2023년 9월 21일 · 2 분 · 배준수

SerialDate 리팩터링(3)

책너두 5기 39일차 로버트 C. 마틴의 클린코드 p. 363~ p.369 내용정리 16. SerialDate 리팩터링 리팩터링 과정 처음에 나오는 주석을 간단하게 고치고 개선한다. enum을 모두 독자적인 소스 파일로 옮긴다. 정적 변수(dataFormateSymbols)와 정적 메서드(getMonthNames, isLeapYear, lastDayOfMonth)를 DateUtil이라는 새 클래스로 옮긴다. 일부 추상 메서드를 DayDate 클래스로 끌어 올린다. month.make를 Month.fromInt로 변경했다. 다른 enum도 똑같이 변경한다. 모든 enum에 toInt() 접근자를 생성하고 index 필드를 private로 정의한다. plusYears와 plusMonths에 있는 중복을 LastDayOfMonth라는 새 메서드를 생성하여 없앴다. 자주 사용되는 숫자 1을 없앴다. 결론 위와 같은 과정을 통해 버그를 고쳤고, 테스트 커버리지가 증가했으며 코드 크기도 줄고 명확해졌다. 다른 사람은 더욱 쉽게 이해할 수 있다. ...

2023년 9월 20일 · 1 분 · 배준수