학습계획
- 멘토링 복습
- 의존관계 정리
- 페이징을 통한 가상 메모리 관리
Today I Learned
스프링에서 구현한 싱글톤은 싱글톤 패턴을 적용 했다기 보다는 객체를 미리 생성하고 꺼내쓰는 맵과 같은 형태로 이해하자
프록시 패턴
사용하는쪽에서 프록시(대리자)인지 알 수 없도록 하는것
Ioc vs Ioc 컨테이너
IoC란 제어의 역전이라는 개념
IoC를 구현하기 위해 DI를 사용한다.
의존성 역전을 하기 위해 구현된 것이 IoC컨테이너 = 스프링
연관관계 & 의존관계
연관관계 & 의존관계 모두 하나의 클래스에서 다른 클래스의 기능을 사용하는 상황을 나타낸다.
연관관계, 의존관계 모두 Person 클래스에서 Phone클래스의 메소드를 사용하고 있다.
- 연관관계와 가장 큰 차이점은 연관관계는 관계를 지속되는 관계이고, 의존관계는 짧은 시간동안만 지속는 관계가 아니다.
연관관계
public class Person {
private Phone phone;
public Person(Phone phone) {
this.phone = phone;
}
public void sendMessage() {
String to = "hello";
String message = "hi";
phone.sendMessage(to, message);
}
}
의존관계(dependency relation)
- 의존 관계는 어떤 클래스가 다른 클래스를 참조하는것을 의미한다. = 어떤 클래스가 의존하는 다른 클래스가 추가되거나 변경되면 A에 영향이 가므로 ‘사용에 대한 의존관계’가 있다.라고 한다.
- 의존 관계를 설명하기 위해서는 방향성을 부여해야한다. UML에서 의존관계를 점섬으로 표현한다.
- 위에서 언급한 참조란 아래와 같은 형태가 있다.
- 어떤 클래스는 참조하는 클래스의 참조를 사용 후 유지하지 않는다.
- DI 시 생성자 주입 방식이 권장되는 이유
- @Autowired를 사용하면 스프링 없이는 의존관계를 맺을 수 없으므로 스프링 의존적인 코드가 된다.
- 자바 어플리케이션을 만드는 개발자로서 , 순수하게 자바 언어를 사용하여 코드를 조작하지 못한다는것은 큰 문제사항이 됨
- 그래서 생성자 또는 setter까지는 자바 코드로 조작이 가능한 범위임
의존성 주입(DI)
- 위에서 설명한 의존관계를 외부에서 결정하고 주입하는 기술
- 하나의 객체가 다른 객체의 의존성을 제공하는 기술
- 의존성 : 서비스로 사용할 수 있는 객체
- 주입 : 의존성을 사용하려는 객체(클라이언트)로 전달하는 기술
- 토비의 스프링에서 언급하는 DI
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않고, 인터페이스에만 의존해야한다.
- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다.
- 의존 관계로 사용할 오브젝트에 대한 레퍼런스를 외부에서 주입함으로써 만들어진다.
- 의존성 주입의 의도
- 구현 방식
- 런타임 시점의 의존관계를 주입받으므로써 DI를 구현한다.
- 장점
페이징을 통한 가상 메모리 관리
프로세스 연속 메모리 할당의 문제점
- 외부 단편화
- 물리 메모리보다 큰 프로세스를 실행 할 수 없다는 것
- 가상 메모리 관리 기법
- 페이징(주로 현대 운영체제에서 사용)
- 세그멘 테이션
페이징이란?
프로세스의 논리 주소 공간을 페이지라는 일정 단위로 자르고, 메모리 물리 주소 공간(프레임)이라는 페이지와 동일한 크기의 일정한 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 기법
페이지 테이블
페이징 시스템은 프로세스의 불연속적인 물리적 주소를 논리 주소에는 연속적으로 배치되도록 페이지 테이블을 사용한다.
페이지 테이블을 이용하면 CPU가 실제 메모리에 접근하기 위해서 두번 동작을 해야하는 상황이 발생한다.
CPU 옆에 TLB(Translation Lookaside Buffer)라는 캐시 메모를 둔다.
- TLB 히트 CPU가 찾는 페이지 번호가 있는 경우
- TLB 미스 CPU가 찾는 페이지 번호가 없는 경우
[참고]
https://songkangchan.tistory.com/2
토비의 스프링 p.113