UserDAO final
public class UserDaoTest { public static void main(String[] args) throws ClassNotFoundException, SQLException { ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class); UserDao dao = context.getBean("userDao", UserDao.class); User user = new User(); user.setId("whiteship"); user.setName("백기선"); user.setPassword("married"); dao.add(user); System.out.println(user.getId() + " 등록 성공"); User user2 = dao.get(user.getId()); System.out.println(user2.getName()); System.out.println(user2.getPassword()); System.out.println(user2.getId() + " 조회 성공"); } } @Configuration public class DaoFactory { @Bean public DataSource dataSource() { SimpleDriverDataSource dataSource = new SimpleDriverDataSource (); dataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class); dataSource.setUrl("jdbc:mysql://localhost/springbook?characterEncoding=UTF-8"); dataSource.setUsername("spring"); dataSource.setPassword("book"); return dataSource; } @Bean public UserDao userDao() { UserDao userDao = new UserDao(); userDao.setDataSource(dataSource()); return userDao; }
제어의 역전 (IoC)
- 프로그램의 제어 흐름 구조가 뒤바뀌는 것
- 일반적으로 프로그램의 흐름은 main( ) 메소드와 같이 프로그램이 시작되는 지점에서 사용할 대상이 되는 오브젝트를 선정하는 것으로 시작된다.
- 제어의 역전이란 이런 제어 흐름의 개념을 거꾸로 뒤집는 것
- 프레임워크는 제어의 역전 개념이 적용된 대표적인 기술
- c.f.) 프레임워크와 라이브러리의 차이를 분명히 알자
빈 팩토리 & 애플리케이션 컨텍스트
public interface BeanFactory { 여러 빈 조회 메서드 }
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver { }
BeanFactory
- 빈을 생성하고 관계를 설정하는 IoC 의 기본 기능에 초점을 맞춘 것ApplicationContext
- 모든 구성요소의 제어 작업을 담당하는 IoC 엔진이라는 의미를 부각
DaoFactory 를 분리하여 얻을 수 있는 장범
- 애플리케이션의 컴포넌트 역할을 하는 오브젝트와
- 애플리케이션의 구조를 결정하는 오브젝트 (설계도) 를 분리했다
싱글톤 레지스트리
- static method 와 private 생성자를 사용해야 하는 비정상적인 클래스가 아니라 평범한 자바 클래스를 싱글톤으로 활용하게 해 준다.
- 객체의 생성과 관계설정, 사용 등에 관한 제어권을 모두 IoC 기능을 제공하는 Application Context 에 제공하기 때문
참고
Singleton Pattern스프링 컨테이너와 스프링 빈