❗️230309 수정(version 2)
규약
형태로 만들어 놓은 것을 의미한다.라이브러리: 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것. 폴더명, 파일명 등의 규칙이 없고 사용성이 비교적 자유롭다.
내가 작성한 코드가 직접 제어의 흐름을 담당한다면(필요한 객체를 직접 호출하고 가져다 쓰는 것) 그것은 프레임워크가 아니라 라이브러리다.프레임워크: 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것. 폴더명, 파일명 등의 규칙이 있으며 라이브러리에 비해 엄격하고 자유도가 낮다.
프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면(스프링의 경우 스프링 컨테이너가 대신 실행) 그것은 프레임워크가 맞다. (ex. JUnit)
class Singleton {
constructor() {
if(!Singleton.instance) {
Singleton.instance = this
}
return Singleton.instance
}
static getInstance() {
return this.instance
}
}
const a = new Singleton();
const b = new Singleton();
console.log(a === b); // true, 인스턴스 참조값 같음
public class Singleton {
// 1. static 영역에 객체를 딱 1개만 생성해둔다.(private static final)
private static final Singleton instance = new Singleton();
// 2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다.
public static Singleton getInstance() {
return instance;
}
// 3. 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
private Singleton() {}
// 객체 비교 코드
private Singleton singleton1 = Singleton.getInstance();
private Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // true, 인스턴스 참조값 같음
클래스의 생성자(constructor)가 변수 a에 최초로 생성한 instance를 할당하면, 두 번째 변수 b에는 생성자 함수의 조건에 의해 앞서 만들어진 instance와 똑같은 instance를 반환하게 된다. 따라서 a === b
는 참이 된다.
Spring
, Nestjs
와 같은 프레임워크가 싱글톤 패턴으로 구현되어 있다.위 그림처럼 의존성 주입 전에는 메인 모듈(main module)이 직접 하위 모듈에 대한 의존성을 주고 있지만, 의존성 주입을 하게 되면 중간에 의존성 주입자(dependency injector)가 메인 모듈이 할 의존성 모듈을 가로채 대신 하게 되기 때문에 메인 모듈과 하위 모듈 사이의 의존성이 떨어지게 된다. 이를 디커플링
된다고 표현하기도 한다.
따로 게시글 첨부 예정..
참고 자료: 면접을 위한 CS 전공지식 노트, 스프링 핵심원리 기본편 강의 자료