본문 바로가기

728x90
반응형

전체 글

(41)
[클린코드] CHAP 13 동시성 CHAPTER 13 동시성 동시성 프로그래밍이란 어플리케이션을 효율적으로 실행하기 위해 멀티코어를 온전히 활용하도록 구현하는 방식 외부 서비스의 응답을 기다리면서 아무일도 하지 않으면 CPU 사이클이 낭비된다. 동시성을 구현한다고 해서 클라이언트 입장에서 자신의 요청이 빨리 처리되는게 아니다. 어플리케이션 입장에서는 효율적으로 코어를 사용하여 처리량을 높일 수 있다. 언어레벨에서 하드웨어의 멀티코어를 적절하게 사용하도록 지원하기 때문에 동시성만 신경써서 개발하면 된다. 동시성과 병렬성이 구현된 경우 서버(코어)를 효율적으로 사용하여 처리량을 최대화 클라이언트가 아닌 어플리케이션 관점에서의 효율성을 높여야 한다. 동시성이 필요한 이유 동시성은 항상 성능을 높여주는 것이 아닌, 때로 성능을 높여준다. 자바 ..
[클린코드] CHAP 12 창발성 CHAPTER 12 창발성 (Emergence) 하위 계층에는 없는 특성이나 행동이 상위 계층 (전체 구조) 에서 자발적으로 돌연히 발생하는 현상 창발적 설계 단순한 4가지를 반복하다 보면 전체적으로 깨끗한 코드가 만들어진다. 모든 테스트를 실행한다. 중복을 없앤다. 프로그래머 의도를 표현한다. 클래스와 메서드 수를 최소로 줄인다. (실용적 관점에서 타협한다.) 모든 테스트를 실행한다. 테스트를 작성할수록 설계 품질이 좋아진다. 중복을 없앤다. 기존의 코드를 최대한 재활용한다. 각 메서드를 따로 구현하지 않고 최대한 활용한다. Template Method 패턴 알고리즘의 구조를 상위 클래스의 메서드에서 정의하고, 하위 클래스에 자신에 맞게 세부 알고리즘을 정의한다. 공통된 알고리즘을 템플릿 메서드에 담고..
[클린코드] CHAP 11 관심사 분리 패턴들 CHAPTER 11 관심사 분리 패턴들 construction (생성) 과 use (사용) 은 아주 다르다 소프트웨어 시스템은 어플리케이션 객체를 제작하고 의존성을 서로 연결하는 준비과정과 준비과정 이후에 이어지는 런타임 로직을 분리해야 한다 객체의 생성과 객체를 사용하는 부분을 분리해야 한다 시작에 대한 관심사 분리 객체의 생성은 시작단계에서, 비즈니스 로직은 객체를 사용하는데 집중한다 시작 단계는 모든 어플리케이션이 풀어야할 관심사이다. main 함수에서 시스템에 필요한 객체를 생성한 후 어플리케이션에 넘긴다. 어플리케이션은 그저 만들어진 객체를 사용한다. 모든 객체가 잘 생성되었다고 가정하고, 객체를 이용한 개발에 집중할 수 있다. 요청에 대한 관심사 분리 Spring 프레임 워크를 통해 요청에 대..
[클린코드] CHAP 10 클래스 클래스 잘 설계하기 캡슐화되어야 한다 객체의 실제 구현을 외부로부터 감추는 방식 클래스를 개발할 때 기본적으로 구현을 감추고, 외부 객체와 상호작용하는 부분만 노출한다 외부의 잘못된 사용을 방지한다 경계에서 배웠던 Map 과 동일한 개념 public class Stack { private int topOfStack = 0; private List element = new LinkedList(); public List getElements() { return elements; } public int size() { return topOfStack; } public void push() throws PoppedWhenEmpty { if (topOfStack == 0) { throw new PoppedWhen..
[클린코드] CHAP 09 단위테스트 CHAPTER 09 단위 테스트 테스트코드의 중요성 테스트 코드는 실수를 바로 잡아 준다. 테스트 코드는 반드시 존재해야 하며, 실제 코드 못지않게 중요하다 테스트 케이스는 변경이 쉽도록, 코드에 유연성, 유지 보수성, 재 사용성을 제공하는 버팀목이 바로 단위 테스트 테스트 케이스가 없다면 모든 변경이 잠정적인 버그. 테스트 커버리지가 높을수록 버그에 대한 공포가 줄어든다. 지저분한 테스트 코드는 테스트를 안하니만 못하다. 테스트는 자동화 되어야 한다 테스트의 종류 테스트 피라미드 Unit Test 작성 테스트 라이브러리를 작성하자 JUnit5 + mockito 를 많이 사용한다. Test Double given-when-then 패턴을 사용하자 public void testGetPageHierarchy..
[클린코드] CHAP 08 경계 CHAPTER 08 경계 💡 시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물며, 따라서 어떤 식으로든 이 외부코드를 우리 코드에 깔끔하게 통합하는 것이 중요하다 외부코드 사용하기 인터페이스 제공자와 사용자 사이에 존재하는 특유의 긴장으로 인하여 시스템 경계에서 문제가 생길 소지가 많다. java.util.map 클래스를 이용하여 메소드의 파라미터를 생성하여 넘기면, 해당 메서드에서 필요하지 않은 기능까지 제공한다는 문제점 발생. 제네릭을 이용하여 map 객체에 저장해야 할 유형을 지정하여 클라이언트에게 책임을 일부 넘길 수 있지만, 코드의 의도가 분명히 드러나지 않아 꺠끗한 코드라 보기는 어렵다. public class Sensors { private Map sensors = new Has..
[클린코드] CHAP 07 오류처리 CHAPTER 07 오류 처리 여기저기에 흩어진 오류 처리 코드로 인해 프로그램의 논리를 이해하기 어려워진다면 클린 코드라 부를 수 없다. [ 오류 코드보다 예외를 사용하라 ] 매번 함수 호출 즉시 logger.log()로 오류 확인하기 보다, 오류가 발생하면 예외를 던지는게 논리와 오류 처리 코드가 섞이지 않으므로 깔끔하다. // 전 public class DeviceController{ ... public void sendShutDown(){ DeviceHandle handle = getHandle(DEV1); if(handle != DeviceHandle.INVALID){ retrieveDeviceRecord(handle); if(record.getStatus() != DEVICE_SUSPENDED..

728x90
반응형