전체 글
이펙티브 자바, 쉽게 정리하기 - item 65. 리플렉션보다는 인터페이스를 사용하라
이펙티브 자바, 쉽게 정리하기 - item 65. 리플렉션보다는 인터페이스를 사용하라 리플렉션이란? 자바 리플렉션 (Reflection) 이란? 포스팅 참고 리플렉션의 기능 특정 클래스의 생성자, 메서드, 필드 정보를 가져올 수 있다. 추가적으로 멤버 이름, 필드 타입, 메서드 시그니쳐 등을 가져올 수 있다. 실제 생성자, 메서드, 필드를 조작할 수도 있다. Method.invoke() 는 메서드를 호출할 수 있게 해준다. 리플렉션을 이용하여 컴파일 당시 존재하지 않던 클래스도 이용 가능하다. 리플렉션의 단점 컴파일 타입 검사의 이점을 누릴 수 없다. 런타임에야 오류를 알게될 것이다. 코드가 지저분해진다. 성능이 떨어진다. 리플렉션을 통한 메서드 호출은 상당히 느리다. 일반적인 코드에서는 리플렉션이 필요..
이펙티브 자바, 쉽게 정리하기 - item 64. 객체는 인터페이스를 사용해 참조하라
이펙티브 자바, 쉽게 정리하기 - item 64. 객체는 인터페이스를 사용해 참조하라 웬만하면 유연함을 위해 인터페이스로 연결하자 매개변수, 반환값, 변수, 필드가 대상이 될 수 있다. 인터페이스를 타입으로 사용하면 프로그램이 유연해진다. Map 인터페이스를 사용한다고 가정했을 때, HashMap 도 가능하고, 성능을 위해 EnumMap 혹은 순서를 위해 LinkedHashMap 등을 유연하게 사용할 수 있다. 왜냐하면 구현체들은 다 Map 인터페이스를 구현한 것이기 때문이다. Set sonSet = new LinkedHashSet(); // O LinkedHashSet sonSet = new LinkedHashSet(); // X 그러나 인터페이스가 항상 정답은 아니다. 클래스를 써야 하는 경우 적합한..
이펙티브 자바, 쉽게 정리하기 - item 63. 문자열 연결은 느리니 주의하라
이펙티브 자바, 쉽게 정리하기 - item 63. 문자열 연결은 느리니 주의하라 String concatenation + 이용하기 "a" + "b" 와 같은 방식으로 간단히 쓸 수 있지만, 성능저하가 있다. String 객체는 실제로 불변이기 때문에 새로운 객체를 만들어 더해야 한다. 'String 타입의 변수는 잘 바뀌는데 이게 왜 불변이지?' 싶다면 스트링 풀 쉽게 이해하기 포스팅 을 참고하면 좋다. n 개의 문자열을 잇는다면 n^2 에 비례하는 시간이 걸린다. @Test public void stringPlusTest() { String result = ""; for (int i = 0; i < 10000; i++) { for (String string : strings) { resu..
자바 리플렉션 (Reflection) 이란?
자바 리플렉션 (Reflection) 이란? 실행 중인 자바 애플리케이션이 JRE (Java Runtime Environment) 를 검사, 수정, 상호작용할 수 있도록 하는 기능이다. 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있다. 자바 리플렉션의 용도 (Use Case) 리플렉션의 대부분의 기능은 일반 애플리케이션 개발에는 크게 필요 없으며 프레임워크의 관점에서 접근할 때 크게 도움이 된다. ex) 프레임워크 이용자가 어떤 애노테이션을 적용했는지 알고 싶을 때는 리플렉션이 크게 도움이 된다. 클래스 구조 검사하기 객체의 클래스를 확인하고 어떤 메서드가 있는지 어떤 필드가 있는지 어떻게 구성됐는지에 대한 정보를 얻을 수 있다. 어떤 상수와 애노테이션이 선언되어 있는지 확인할 수도 있다. 우리가..
풀스택 테스팅, 챕터 1 풀스택 테스팅이란?
풀스택 테스팅, 챕터 1 풀스택 테스팅이란? 도입 테스트 분야가 정리된지 수십년이 지났지만 오늘날에도 여전히 테스트에 대한 이해가 다양하다. 필자는 이러한 현상을 테스트 담당 인재가 부족하기 때문에 발생한 것이라 생각한다. 이 책의 목표는 테스트를 처음 접하는 사람이 오늘날의 웹 및 모바일 애플리케이션 테스트에 필요한 모든 기술을 초중급자 수준 이상으로 향상시킬 수 있는 종합적인 자료가 되는 것이다. 소프트웨어 개발 팀의 역할 좋은 품질의 소프트웨어를 제공해야 한다. 플립카트와 야후는 경쟁사 대비 낮은 소프트웨어 품질로 인해 시장에서 살아남지 못했다. 플립카트는 트래픽을 견디지 못했으며 야후는 검색품질이 떨어졌다. 아무리 좋은 비즈니스 아이디어를 가지고 있더라도 소프트웨어 품질을 신경쓰지 않는다면 생각보..
Shift Left Testing 이란?
Shift Left Testing 이란? 개발 수명 주기 초기에 테스트 단계를 왼쪽 (시작점) 으로 이동하는 것을 말한다. 테스트를 앞단계로 가져오는 것이다. 테스트가 소프트웨어 개발 수명 주기의 마지막에만 적용되는 것을 피하려 하는 것이다. 폭포수 개발 방법론 vs 애자일 개발 방법론 포스팅 을 참고하면 폭포수에선 주로 마지막에만 테스팅을 하고, 애자일에서는 매 주기마다 테스트를 한다. 왜 Shift Left Testing 이라 하는가? 이는 우리가 보통 글을 읽을 때 왼쪽에서 오른쪽으로 읽는 것에서 착안했다고 생각하면 된다. 왼쪽으로 간다는 것은 "초기에 자주 테스트하고 가능한 한 빨리 테스트를 시작하라"는 뜻을 가졌다. Shift Left Testing 의 핵심 계획 단계에서 품질을 점검하고 개발 ..
애자일 개발 방법론 (Agile Development Methodology) 과 폭포수 개발 방법론 (Waterfall Development Methodology) 의 비교
애자일 방법론 (Agile Methodology) 애자일 방법론의 핵심은 반복적인 증분적 (incremental) 개발이다. 요구사항과 솔루션이 팀 간의 협업을 통해 진화한다. 요구사항 수집 (Requirements gathering) 고객과 비즈니스 이해관계자와의 반복적인 회의를 통해 요구사항을 수집한다. 디자인 (Design) 애자일 환경에서는 디자인이 주로 개발과 함께 진행된다. 디자인이 한 단계가 아니라 지속적인 프로세스와 가깝다는 이야기이다. 개발과 코딩 (Development and coding) 현재까지 진행된 사항을 통해 코드가 쓰여지고 즉시 테스팅된다. 테스팅 (Testing) 테스트는 개발과 함께 이루어져서 이슈 사항들을 이른 시기에 파악한다. 배포 (Deployment) 배포는 더 작..
대규모 서비스를 지탱하는 기술, 9강 IO 부하를 줄이는 방법 요약
대규모 서비스를 지탱하는 기술, 9강 IO 부하를 줄이는 방법 요약 캐시를 전제로 I/O 부하 줄이기 데이터 규모에 비해 물리 메모리가 크면 캐시를 통해 전체 데이터를 메모리에 올려둘 수 있기 때문에 이를 고려해야 한다. 일반적인 케이스에 캐시로 올리지 못하더라도 압축 알고리즘을 이용해 올릴 수 있는 경우도 있으니 이를 조사해보는 것도 좋다. 실무에서는 메모리의 가격도 큰 의사결정 요소가 되기 때문에 소프트웨어 개선과 하드웨어 구매 중 어느 것이 싸게 먹히는지 생각해보아야 한다. 복수 서버로 확장시키기 데이터를 전부 캐싱할 수 없는 규모에서 사용하기 적합하다. AP 서버를 늘리는 건 정말 쉽다. DB 서버는 늘리려면 고려할 사항이 많다. 테이블 단위로 각각 다른 DB 서버로 나누는 등의 방식을 사용할 수..
대규모 서비스를 지탱하는 기술, 8강 OS의 캐시 구조 요약
대규모 서비스를 지탱하는 기술, 8강 OS의 캐시 구조 요약 OS 캐시 구조 알고 애플리케이션 작성하기 OS 의 캐시 구조를 이해하고 디스크 액세스를 최소화하면 프로그램을 빠르게 만들 수 있다 디스크와 메모리 간 속도 차는 10^5 에서 10^6 배 이상이다 캐시 구조를 이해하면 최대한 메모리에 올릴 수 있다 메모리를 이용해 디스크 액세스를 줄일 수 있다. (OS 캐시) 가상 메모리 논리적인 선형 주소를 물리적인 물리 주소로 변환하는 것이다 프로세스는 가상 메모리의 물리 주소를 통해 메모리에 접근한다 프로세스는 특정 번지부터 시작한다는 식의 상대 주소로 메모리에 접근한다 OS 는 커널 내에서 메모리를 추상화하고 이것을 가상 메모리라고 한다 OS 는 메모리를 1 바이트씩 액세스하는 것이 아니라 4바이트 정..
대규모 서비스를 지탱하는 기술, 7강 대규모 데이터를 다루기 위한 기초 지식 요약
대규모 서비스를 지탱하는 기술, 7강 대규모 데이터를 다루기 위한 기초 지식 요약 프로그램을 작성할 때의 요령 어떻게 하면 메모리에서 처리를 마칠 수 있을까 생각해보기 디스크 seek 횟수를 최소화해보자. 데이터량 증가에 강한 알고리즘 사용 선형 탐색 말고 이분 검색 같은 알고리즘을 사용하면 데이터 양이 기하급수적으로 증가해도 실제 연산 양이 많이 늘지 않는다. 데이터 압축, 검색기술과 같은 테크닉 이용하기 압축해서 데이터량을 줄이거나 검색엔진을 이용하자 대규모 데이터를 다루기 위한 전제 지식 OS 캐시 분산을 고려한 RDBMS 운용 알고리즘 데이터 구조 CPU 사용률, I/O 대기율 확인하기 리눅스에서 sar 명령어로 가능 윈도우즈에서 Performance Monitor, Resource Monitor..
대규모 서비스를 지탱하는 기술, 6강 규모 조정의 요소 요약
대규모 서비스를 지탱하는 기술, 6강 규모 조정의 요소 요약 스케일 업과 스케일 아웃 전략 스케일 업보다는 스케일 아웃이 주류 하드웨어 가격 차이가 아주 많이 난다. 시스템 구성에 유연성이 크다. CPU 부하와 I/O 부하 데이터와 관련된 작업 ex.DB 에 질의하는 부분 등을 빼면 나머지는 CPU 부하 데이터 작업을 수행하는 경우 DB 서버 측면에서는 I/O 부하 애플리케이션에 걸리는 부하는 단순히 애플리케이션 서버를 더 늘리고 로드밸런서로 부하 분산을 해주면 됨 DB 에 걸리는 I/O 부하는 단순하지 않음 DB 를 여러개 클러스터링해서 사용하려면 DB 에 있는 데이터 쓰기 내역을 매번 동기화해줘야 함 정리 CPU 부하의 규모 조정은 간단하다. 서버를 늘리고 로드 밸런서로 분산 웹, AP 서버, 크롤러..
대규모 서비스를 지탱하는 기술, 5강 대규모 데이터 처리의 어려운 점 요약
대규모 서비스를 지탱하는 기술, 5강 대규모 데이터 처리의 어려운 점 요약 디스크는 왜 메모리보다 느린가 물리적인 장치를 통해 데이터를 찾아나간다. 원반을 돌리거나 디스크 헤드를 이동시켜서 데이터를 찾아낸다. 메모리는 전기적 신호를 사용한다. SSD 는 이전의 디스크 역할을 하지만 전기적 신호를 이용하는 디스크이다. 메모리와 디스크의 전송 속도는 100배 이상 차이가 난다. 메모리 7.5GB/s 디스크 58MB/s (2008년에 발간된 책이라 현재는 어떨지 잘 모르겠다.) OS 레벨에서의 해결책 자주 같이 쓰이는 데이터를 몰아놓는다. 한번 읽을 때 4KB 정도의 주변 데이터를 같이 읽는다. 단일 호스트 부하 개선 팁 단일 서버의 성능을 최대한 끌어내야 복수 서버에서의 부하 분산이 의미를 갖는다. 추측하지..