의존성 주입이란❓
클래스간의 의존성을 클래스 외부에서 주입하는 것.
클래스 간의 의존성❓
한 클래스를 수정 시 다른 클래스가 영향을 받는다.
하나의 객체 A가 다른 객체 B를 사용해야 할 때 , A의코드 내부가 아닌 외부에서 만들고,
생성자 혹은 setter메소드 등을 활용해서 A의 내부로 주입하는 것을 의미 한다.
ex) 스프링 적용 예시
스프링 컨테이너: BeanFactory, ApplicationContext
Bean 객체 : @Component, 직접 .XML 파일에 등록
프로세스
코드로 작성된 프로그램이 메모리에 적재되어 사용할 수 있는 상태가 된 것이다.
즉, 프로세스는 실행 중인 프로그램이라 말할 수 있다.
스레드
프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행하고, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 부른다.
💨 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료 될 위험을 갖고 있다.
💨 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있다.
💨 두 방법은 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단이 있으므로 적용하는 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 한다.
Application 시작시 어떤 클래스가 최초 한 번만 메모리를 할당하고, 그 메모리에 인스턴스를 만들어 사용한다.
⭕장점
💨 한번의 new 연산자를 통해 고정된(static)메모리를 사용, 메모리 낭비 방지
💨 용이한 데이터 공유 static 영역에 저장되므로, 데이터에 접근이 쉽다.
❌문제점
💨멀티 스레딩 환경에서 발생하는 동시성 문제를 해결하기 위해 syncronized를 사용해야한다.
💨테스트하기 어렵다.(자원을 공유하므로, 테스팅마다 인스턴스를 초기화해서 사용해야함.)
💨자식클래스를 만들 수 없다.
💨내부 상태를 변경하기 어렵다.
💨결합도가 높아져 "개방-폐쇄 원칙" 을 위배한다.
결국 유연성이 떨어진다.
- private 접근제한자로 static 변수인 instance를 1개로 제한.
- instance가 없을때 new 생성자를 통해 1번 생성.
- 생성한 instance의 주소가 같다.
해결 방법.
💨 불필요한 경우에도 인스턴스가 생성되므로, 리소스 낭비가 있다.
💨 큰 성능저하가 발생한다. 권장하지않는다.
💨 getInstance()메서드에서 LazyHolder.INSTANCE를 호출하는 순간
💨 Class가 로딩되며 초기화가 진행되고,이 시점에 thread-safe를 보장한다.
https://mangkyu.tistory.com/150
https://ksbsite.tistory.com/4