스프링은 객체지향 설계와 구현에 관해 효과적으로 개선해 나갈지에 대한 방법을 제시한다. 객체지향 기술과 설계, 구현에 관해 프레임워크로 제공한다.
하나의 객체가 다른 객체의 의존성을 제공하는 테크닉
클라이언트에게 무슨 서비스를 사용할 것인지를 알려주는것
의존성 주입은 결합도를 느슨하게 하고 의존관계 역전원칙과 단일 책임 원칙을 따르도록 클라이언트의 행위로 부터 분리하는것
프로그래머가 작성한 프로그램이 프레임워크에 의해 흐름제어를 받게되는것
템플릿 메소드 패턴
클래스에 만들어 두고 자주 변경되며 활장할 기능은 서브클래스에 만들도록한다.
슈퍼클래스에서는 미리 추상 메소드 또는 오버라이드 가능한 메소드를 정의해 두고 이를 활용해 코드의 기본 알고리즘을 담고있는 템플릿 메소드를 만든다.
슈퍼클래스에서 디폴트 기능을 정의해두거나 비워뒀다가 서브클래스에서 선택적으로 오버라이드할 수 있는 메소드를 훅 메소드라고 한다.
서브 클래스에서는 추상 메소드를 구현하거나, 훅 메소드를 오버라이드 하는 방식을 이용해 기능을 확장한다.
http요청으로 들어온 데이터를 읽기 위해 getReader(), getInputStream()으로 읽을 수 있다.
getReader()getInputStream()하지만 Servlet API 에서 두 메서드를 동시에 쓰지 말라고 강조하고 있다.
getReader()를 호출하고 getInputStream() 호출하면 IllegalStateException이 발생한다.
이는 서블릿 컨테이너는 요청 본문의 데이터를 한번만 읽을 수 있도록 설계 되었기 때문이다. getReader()로 읽고 데이터가 소비된 상태에서 getInputStream()을 읽어 더이상 소비할 데이터가 없기 때문
아니면 반복적인 request 데이터를 사용할 경우 spring framework에서 제공하는 ContentCachingRequestWrapper를 사용한다.
ContentCachingRequestWrapper는 데코레이터 패턴을 통해 ServletRequest를 감싸고 있다. getInputStream(), getReader()메소드를 오버라이드 하여 IllegalStateException을 던지지 않도록 재정의하였다. 또한 Request에서 데이터를 읽으면 반복적으로 데이터를 읽을 수 있도록 getInputStream()에서는 ContentCachingInputStream이 ByteArrayOutputStream 필드에 캐싱한다. 이로인해 데이터를 반복적으로 읽을 수 있게 도와준다.
ContentCachingRequestWrapper를 쓰기위해 Servlet request에 적용하는 filter로 작업하여 wrapper될 수 있도록 적용해야한다.
메모리 공간에 프로세스를 연속적으로 할당하는 방식
최초 적합(first fit)
운영체제가 메모리 내의 빈 공간을 순서대로 검색하다가 적재할 수 있는 공간을 발견하면 그 공간에 프로세스를 배치하는 방식
적재할 수 있는 공간을 발견하면 즉시 할당 하므로 검색을 최소화할 수 있다.
최적 적합
운영체제 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 작은 공간에 프로세스를 배치하는 방식
최악 적합
운영체제 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 큰 공간에 프로세스를 배치하는 방식
연속 메모리 할당은 효율적인 메모리 사용방식이 아니다. 연속 메모리 할당은 외부 단편화라는 문제를 가지고 있다.
프로세스들이 메모리 공간에 할당하고 종료됨을 반복하다보면 사이 사이 빈공간이 발생한다. 이러한 공간들이 프로세스보다 적은 공간일 경우 메모리 낭비로 이어지는 현상을 외부 단편화라고 한다.
외부 단편화를 해결하는 대표적인 방법
여기저기 흩어진 메모리 공간들을 하나로 모으는 방식
단, 메모리를 모으는 동안 시스템에서 실행 중인 프로세스를 중지해야하고, 메모리에 있는 내용을 옮기는 작업은 많은 오버헤드를 야기할 수 있다.