전체 글 318

5. 압축 프로그래밍

책의 6~10장에서는 애플리케이션 개발자를 대상으로 대규모 데이터를 처리하는 핵심 요소를 파악하도록 하기 위해 지금까지 소개했던 각종 방법을 자세히 들여다본다. 6장에서는 과제로서 압축 프로그래밍, 7,8장에서는 알고리즘, 데이터의 실용화 9장, 10장에서는 검색엔진을 만든다. 1. 정수 데이터를 컴팩트하게 가져가기 1) 과제 : 정수열이 기록된 CSV를 바이너리로 해서 콤팩트하게 가져가기 : 정수의 부호화를 연구해서 텍스트로 152MB인 CSV 데이터를 절반 이하의 크리로 처리할 수 있도록 하라. 물론 원본을 복원할 수 있어야 한다. 2) 출제의도 : 큰데이터를 압축해서 콤팩트하게 만들면 디스크 I/O를 줄일 수 있다. (큰 데이터를 다룰 때 '압축'을 항상 염두에 두어라) 또한 RDBMS에서 보통 정..

4. 대규모 데이터 처리 실전 입문(#대규모 서비스를 지탱하는 기술)

1. 용도 특화형 인덱싱 대규모 데이터를 다룰 경우 RDBMS로는 한계가 있다. 따라서 배치 처리로 RDBMS에서 데이터를 추출해서 별도의 인덱스 서버와 같은 것을 만들고 이 인덱스 서버에 웹 애플리케이션에서 RPC(Remote Procedure Call) 등으로 액세스 하는 방법을 사용한다. 1) RPC와 웹 API 위 그림에서 DB에서 정기적으로 corn 등으로 데이터를 추출해 2의 인덱스 서버로 넘긴다. 인덱스로는 2에서 검색용 역 인덱스를 만들어준다. 그러면 AP서버에서는 인덱스를 가지고 있는 2인덱스 서버에 RPC로 액세스 한다. 요즘은 RPC보다 웹 API라고(JSON이랑 http로 처리) 부른다. AP서버에 인덱스를 직접 저장하지 않는 이유는 AP서버에 충분한 메모리가 탐재되어있지 않는 경우..

ch5. 컴포넌트 스캔(#스프링5 프로그래밍 입문-최범균 저)

ch4. 의존 자동 주입과 함께 사용하는 추가 기능이 컴포넌트 스캔이다. 컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다. 따라서 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있다. 1. @Component애노테이션 1) 설정 방식 @Component애노테이션은 클래스 위에 적용하고 XML방식으로 설정할 경우 태그를 이용해서 스프링이 클래스를 검색할 패키지를 지정하면 된다. 태그를 추가하면 @Component애노테이션 또는 하위 애노테이션이 적용된 클래스를 검색하여 빈으로 등록하게 된다. 만약 자바 코드 설정을 사용한다면 @ComponentScan(basePackages="~~~")를 이용해주면 된다. 2) 애노테이션 종류 @Service @Repos..

ch4. 의존자동주입(#스프링5 프로그래밍 입문-최범균 저)

1. 설정 클래스에서 빈의 모습(직접 의존 주입했을 경우와 하지 않았을 경우) 설정 클래스에 빈으로만 등록해주고 의존 주입을 직접 set이나 생성자로 해주지 않아도 @Autowired를 통해 자동 의존 주입을 가능하게 할 수 있다. ※Component-scan 기능을 통해 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있다. @Configuration public class AppCtx { @Bean public MemberDao memberDao() { return new MemberDao(); } @Bean public MemberRegisterService memberRegSvc() { return new MemberRegisterService(); } //자동 주입 기능을..

0. 자바의 정석 ch6(객체지향 프로그래밍)

1. 객체와 인스턴스 클래스를 인스턴스화 한 것이 인스턴스(객체)이다. 객체의 구성요소로는 속성과 기능이 있으며 여기서 속성이란 멤버 변수를 의미하고 기능이란 메서드(함수)를 의미한다. Ex). Class Tv{ String color; Boolean power; ..... void power() {power =! power;} //껐다 켰다 true, false로 변경 가능 void channelUp() ....... } 2. 인스턴스의 생성과 사용 Tv t1 = new Tv(); Tv t2 = new Tv(); t2=t1; //t1이 저장하고 있는 값(주소)을 t2에 저장하면서 참조 변수 t2가 가리키는 인스턴스는 가비지 컬렉터에 의해 자동적으로 메모리에서 제거된다. t1. color = red; /..

JSP 태그 라이브러리

스프링 MVC는 , 등 HTML 폼과 커맨드 객체를 연동하기 위한 JSP 태그 라이브러리를 제공한다. 1. -> id대신 modelAttribute 지정하면 커맨드 객체 이름 설정할 수 있다. 예를 들어 modelAttibute = "loginCommand"라는 커맨드 객체와 연결해주고 여기서 이메일, 비밀번호 꺼내와서 authInfo라는 커맨드 객체에 다시 값을 넣어준 뒤 세션을 만드는 컨트롤러를 보자. @PostMapping public String submit( LoginCommand loginCommand, Errors errors, HttpSession session, HttpServletResponse response) { new LoginCommandValidator().validate(lo..

3-2. 분산을 고려한 MySQL 운용

앞서 설명한 바와 같이 분산을 할 때는 데이터 규모에 맞게 탑재 메모리를 조정하고, 메모리 증설로도 대응할 수 없을 경우 분산해야 한다. 앞으로는 DB레이어에서 MySQL운용, 스케일 아웃 전략에 대해 공부해보자 (OS 캐시, 인덱스를 적절하게 설정하기, 확장을 전제로 한 시스템 설계 순으로 공부한다. 1. OS 캐시 활용 전체 데이터 크기에 주의해서 데이터량 < 물리 메모리를 유지해야 한다. 메모리가 부족할 경우에 증설을 하고 스키마 설계가 데이터 크기에 미치는 영향을 고려해야 한다. 그냥 아무 생각 없이 create table로 스키마 설정하면 안 돼. 최소 정수 int형은 32비트 = 4바이트, 문자열은 8비트=1바이트 같은 기본적인 수치는 기억하자. 2. 인덱스의 중요성 MySQL의 인덱스는 기본..

3-1. OS 캐시

1. OS 캐시의 구조 메모리를 이용해서 디스크 액세스를 최대한 줄여야 한다. 이를 위해 OS 캐시를 이용. 예를 들어 리눅스 페이지 캐시를 살펴보자 '프로세스 1'은 데이터를 읽어오기 위해 직접 디스크에 액세스 할 수 없고 가상 메모리에 접근해서 데이터를 읽어와야 한다. OS가 읽어온 블록을 메모리에 쓰고 OS는 그 메모리 주소를 프로세스 1에게 전달한다. 그러면 '프로세스 1'이 그 데이터에 접근할 수 있는 것이다. 반면, '프로세스 2'가 동일한 데이터에 접근하기 위해서 위와 같은 작업을 반복하는 것이 아니라 커널은 한 번 할당한 메모리를 해제하지 않고 남겨두기 때문에 '프로세스 1'이 데이터를 읽어올 때 남겨둔 페이지를 사용하면 된다. 이 개념이 페이지 캐시인 것이다. (파일 캐시가 아니고 페이지..

3장. 대규모 데이터를 다루기 위한 기초지식(#대규모 서비스를 지탱하는 기술)

1. 프로그램을 작성할 때의 요령 1) 메모리에서 최대한 처리를 마쳐서 디스트 Seek횟수를 최소화한다. 2) 데이터량 증가에 강한 알고리즘을 사용해라. ex) 선형 탐색이 아닌 Log Order알고리즘을 적용하는 방법 3) 데이터 압축이나 검색 기술을 활용한다. 데이터 압축을 통해 데이터량을 줄일 수 있다면 근본적으로 seek횟수를 줄일 수 있으며, 특정용도에 특화된 검색엔진을 만들어 웹 애플리케이션에서 이용하는 형태로 전환하면 속도를 제대로 확보할 수 있다. 2. 프로그램 개발의 근간이 되는 기초(3가지) 1) OS캐시 : OS가 캐시를 통해 대규모 데이터를 효율적으로 처리, OS 캐시만으로 처리할 수 없게 되었을 때 분산을 해야 하는 것 2) 분산을 고려한 RDBMS 운용 3) 알고리즘과 데이터 구조