본문 바로가기
반응형

Clean Code13

[클린 코드] 13장 - 동시성 (Concurrency) 동시성이란? 멀티 스레드를 사용하는 프로그램을 말한다. 동시성이 필요한 이유? 동시성은 결합을 없애는 작업이다. 무엇과 언제를 분리하는 전략을 말한다. 단일 스레드는 무엇을 언제 실행하는지 예상할 수 있다. 디버깅하기엔 좋지만 작업 효율이 좋지 않은 경우가 있다. 그럴 때 멀티 스레드를 사용한다. 무엇과 언제를 분리시켜 효율을 증대시킨다. 예) 카카오 알림톡을 유저 100명에게 보내는 경우 (1명에게 보내는 시간이 1초) 단일 스레드로 이 작업을 진행하는 경우 1명씩 차근차근 보내야 하기 때문에 100초가 걸린다. 멀티 스레드(스레드 수 = 3)로 이 작업을 진행하면 3개씩 보낼 수 있기 때문에 33초정도가 걸린다. 동시성의 미신과 오해 위 예제만 보면 아마 동시성이 엄청 좋아보일지 모른다. 아니다. 미.. 2022. 9. 5.
[클린 코드] 12장 - 창발성 (Emergence) 이번 포스팅에선 클린 코드 12장 - 창발성 (Emergence)에 대해 알아보겠습니다. 창발성이란? 이전에 보이지 않았던 것이 어느 순간 갑자기 나타나는 것 창발적 설계로 깔끔한 코드를 구현하자! 착실하게 따르기만 하면 우수한 설계가 나오는 간단한 규칙 4가지가 있다면? 2022. 3. 18.
[클린 코드] 11장 - 시스템 (Systems) 이번 포스팅에선 클린 코드 11장 - 시스템 (Systems)에 대해 알아보겠습니다. 이번 장 이름만 봐서는 유추가 안 되는데 차라리 관심사 분리로 이름을 바꾸는 게 더 좋은듯 하다. 왜 생성과 사용을 분리해야 할까? 생성 로직과 사용 로직을 분리하면 모듈성이 높아진다. 왜 그런지 알아보자. public Service getService() { if (service == null) service = new MyServiceImpl(...); return service; } 위 코드를 보면 생성 로직과 사용 로직이 섞여있다. 생성 로직 if (service == null) service = new MyServiceImpl(...); 사용 로직 return service; 장점 1. 실제로 getServic.. 2022. 3. 17.
[클린 코드] 10장 - 클래스 (Classes) 이번 포스팅에선 클린 코드 10장 - 클래스에 대해 알아보겠습니다. 클래스 체계 클래스 내에 아래와 같은 순서로 코드를 작성하자. 1) static 변수 : public -> protected -> package -> private 2) instance 변수 : public -> protected -> package -> private 3) 생성자 4) 메서드 : (public -> private -> private) -> (public -> private -> private)... public 메서드에서 호출되는 private 메서드는 바로 아래에 둔다. public List getFlaggedCells() { List flaggedCells = new ArrayList(); addFlaggedCell.. 2022. 3. 11.
[클린 코드] 9장 - 단위 테스트 (Unit Tests) 이번 포스팅에선 클린 코드 9장 - 단위 테스트 (Unit Tests)에 대해 알아보겠습니다. 단위 테스트란 (Unit Test)? 유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다. - Wikipedia 개별 컴포넌트가 정상적으로 작동하는지 테스트 케이스를 만들어 테스트 하는 걸 말한다. 주로 JUnit, Mockito를 사용해 테스트를 한다. 이외에도 Integration Test, E2E Test가 있는데 따로 언급하진 않겠다. 왜 테스트를 짜야 할까? 테스트는 유연성, 유지보수성, 재사용성을 제공한다. 일단 잘 돌아가는지 테스트를.. 2022. 3. 11.
[클린 코드] 8장 - 경계 (Boundaries) 이번 장에선 클린 코드 8장 - 경계에 대해서 알아보겠습니다. 경계(Boundaries)란? 프로젝트를 진행하다 보면 오픈 소스, 다른 부서가 만들어 놓은 API, 모듈 등 외부 코드를 사용하는 경우가 대부분인데 외부 코드를 내 코드에서 호출하는 부분을 경계(boundaries)라고 한다. 단순하게 외부 코드를 사용하려는 곳에서 직접 호출할 수 있지만 그렇게 하는 경우는 드물고 외부 코드를 호출하는 부분을 따로 만드는 게 보편적인 방법이다. 경계 코드도 그냥 짜면 안 된다. 어떻게 하면 이쁘게 짤 수 있는지 알아보자! 외부 코드 사용하기 외부 라이브러리 SensorsFactory는 Map 형태로 값을 리턴해준다고 가정해보자. SensorsFactory.get()으로 가져온 sensors를 sensorId.. 2022. 3. 11.
[클린 코드] 7장 - 오류 처리 (Error Handling) 이번 포스팅에선 클린 코드 7장 - 오류 처리를 정리해보겠습니다. 로직도 중요하지만 오류 처리를 잘 하는 것도 매우 중요합니다. 어떻게 오류 처리를 해야 좋을지 알아보겠습니다. 오류 코드보다 예외를 사용하라! 3장 8번에서 한번 다룬 내용이 7장에 또 나오네요. 아래 코드를 보면 getHandle(DEV1), record.getStatus()를 비교하는 로직을 보면 else일 때 에러 메세지를 로깅하고 있습니다. 문제점 호출 즉시 에러 처리를 하지않기 때문에 코드가 복잡해져 이해하기가 어렵다. public class DeviceController { public void sendShutDown() { DeviceHandle handle = getHandle(DEV1); // 디바이스 상태를 점검한다. i.. 2022. 3. 7.
[클린 코드] 6장 - 객체와 자료 구조 (Objects and Data Structures) 이번 포스팅에선 클린 코드 6장 - 객체와 자료 구조에 대해서 알아보겠습니다. 자료 구조 vs 객체 자료 구조 : 자료를 그대로 공개하며 별다른 함수는 제공하지 않음 public class Point { public double x; public double y; } 딱봐도 직교좌표계를 이용하는 걸 알 수 있다. 변수 x, y의 구현이 노출되어 있다. public interface Vehicle { double getFuelTankCapacityInGallons(); double getGallonsOfGasoline(); } 위 두 함수는 그냥 변수 값을 리턴하는 게 확실해보인다. 자료를 세세하게 노출하고 있다. 객체 : 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개 public interfac.. 2022. 3. 6.
[클린 코드] 5장 - 형식 맞추기 (Formatting) 이번 포스팅에선 클린 코드 5장 - 형식 맞추기에 대해 알아보겠습니다. 왜 형식을 맞춰야 할까? 1장에서 우리는 저자라고 했습니다. 독자가 읽고 수정하기 편하도록 할 의무가 있습니다. public List getFlaggedCells() { List flaggedCells = new ArrayList(); for (Cell cell : gameBoard) if (cell.isFlagged()) flaggedCells.add(cell);return flaggedCells;} 위하고 아래 코드 둘 중 어떤 게 잘 읽히나요? 당연히 아래입니다. public List getFlaggedCells() { List flaggedCells = new ArrayList(); for (Cell cell : gameBoa.. 2022. 3. 1.
반응형