//직접 생성한 DaoFactory 오브젝트 출력코드
DaoFactory factory = new DaoFactory();
UserDao dao1 = factory.userDao();
UserDao dao2 = factory.userDao();
System.out.println(dao1);
System.out.println(dao2);
💻 출력 :
springbook.dao.Userdao@118f375
springbook.dao.Userdao@117a8bd
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao3 = context.getBean("userDao", UserDao.class);
UserDao dao4 = context.getBean("userDao", UserDao.class);
System.out.println(dao3);
System.out.println(dao4);
💻 출력 :
springbook.dao.UserDao@ee22f7
springbook.dao.UserDao@ee22f7
🌟 싱글톤 레지스트리
: 싱글톤을 저장하고 관리
🌟 스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 생성
싱글톤
으로 빈
을 만들까?서비스 오브젝트
생김. 서블릿
은 대부분 멀티스레드
환경에서 싱글톤
으로 동작싱글톤 패턴의 원리
: 한 개의 오브젝트만 만들어서 사용하는 것, 서버환경에서는 서비스 싱글톤의 사용이 권장됨.
안티패턴이라고 하는 개발자도 존재 : 사용하기 까다롭고 문제점이 많기 때문에
오브젝트
를 생성하지 못하도록 생성자를 private
로 만듦싱글톤 오브젝트
를 저장할 수 있는 자신과 같은 타입의 static field
를 정의static factory method
인 getInstance()
를 만들고 이 메소드가 최초로 호출되는 시점에서 한 번만 오브젝트
가 만들어지게 함. 생성된 오브젝트는 static field에 저장됨. 또는 static field의 초기값으로 오브젝트를 미리 만들어둘 수도 있음.//싱글톤 패턴을 적용한 UserDao
public class UserDao {
private static UserDao INSTANCE;
...
private UserDao(ConnectionMaker connectionMaker) {
this.connectionMaker = connectionMaker;
}
public static synchronized UserDao getInstance() {
if (INSTANCE == null) INSTANCE = new UserDao(???);
return INSTANCE;
}
...
}
🌟 싱글톤 레지스트리
: 스프링이 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능, 스프링이 지지하는 객체지향적인 설계 방식과 원칙, 디자인 패턴 등을 적용하는 데 아무런 제약이 없음.
//인스턴스 변수를 사용하도록 수정한 UserDao
public class UserDao {
private ConnectionMaker connectionMaker;//초기에 설정하면 사용 중에는 바뀌지 않는 읽기 전용 인스턴스 변수
private Connection c;//매번 새로운 값으로 바뀌는 정보를 담은 인스턴스 변수. 심각한 문제가 발생한다.
private User user;// 위와 동일
public User get(String id) throws ClassNotFoundException, SQLException {
this.c = connectionMaker.makeConnection();
...
this.user = new User();
this.user.setId(rs.getString("id"));
this.user.setName(rs.getString("name"));
this.user.setPassword(rs.getString("password"));
...
return this.user;
}
}
Connection 과 User를 클래스의 인스턴스 필드로 선언.
싱글톤으로 만들어져서 멀티스레드 환경에서 사용하면 심각한 문제가 발생.
싱글톤
프로토타입 스코프
: 컨테이너에 빈을 요청할 때마다 매번 새로운 오브젝트를 생성요청 스코프
세션 스코프