200 likes | 364 Views
고급자바프로그래밍 (Advanced Java Programming). 강원대학교 컴퓨터학부 2012 년 가을학기 담당교수 정충교. 1.4 제어의 역전 ( IoC - Inversion of Control). 애플리케이션 코드가 프레임워크에 의해 제어됨 1.4.3 제어권 이전을 통한 제어관계 역전 메인 메소드 없이 프레임워크에 의해 프로그램들이 실행됨. 1.3.3 관계설정 책임의 분리. 관계설정 책임을 담당하는 클라이언트 userDaoTest 추가
E N D
고급자바프로그래밍(Advanced Java Programming) 강원대학교컴퓨터학부 2012년 가을학기 담당교수정충교
1.4 제어의 역전 (IoC - Inversion of Control) 애플리케이션 코드가 프레임워크에 의해 제어됨 1.4.3 제어권 이전을 통한 제어관계 역전 메인 메소드 없이 프레임워크에 의해 프로그램들이 실행됨
1.3.3 관계설정 책임의 분리 • 관계설정 책임을 담당하는 클라이언트 userDaoTest추가 • 특정 ConnectionMaker이름이 들어 있지 않은 “범용” UserDao가 됨 • 어떤 ConnectionMaker를 사용할지 클라이언트가 결정해줌 • 리스트 1-11, 리스트 1-12, 리스트 1-13 • spring30-1.3.3
1.4.1 오브젝트 팩토리 클라이언트 기능 중 테스트 기능과 관계설정기능을 분리 public class UserDaoFactory { public UserDaouserDao() { UserDaodao = new UserDao(connectionMaker()); return dao; } public ConnectionMakerconnectionMaker() { ConnectionMakerconnectionMaker = new DConnectionMaker(); return connectionMaker; } } public class UserDaoTest { public static void main(String[] args) throws ClassNotFoundException, SQLException { UserDaodao = new UserDaoFactory().userDao(); ...
1.5 스프링의 IoC 1.5.1 오브젝트 팩토리를 이용한 스프링 IoC 스프링 빈 (bean) 스프링에 의해 제어되는 오브젝트 스프링이 만들고 관계를 부여함 빈 팩토리 빈의 생성과 관계 설정을 담당 Application context 빈 팩토리를 확장한 것
스프링 설정 ApplicationContext가 필요로 하는 정보 어떤 bean을 어떤 클래스로부터 생성할지 오브젝트간 관계는 어떻게 설정할지 ApplicationContext에게 정보를 제공하는 방법 애노테이션이 첨가된 자바 코드 xml 설정 파일
ApplicationContext에게 정보를 제공하는 방법 애노테이션이 첨가된 자바 코드 리스트 1-18 리스트 1-19 ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class); UserDaodao = context.getBean("userDao", UserDao.class); spring30-1.5.1
ApplicationContext에게 정보를 제공하는 방법 xml 설정 파일 리스트 1-40 ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml"); UserDaodao = context.getBean("userDao", UserDao.class);
1.7 의존관계 주입 (DI – Dependency Injection) 1.7.1 IoC and DI 1.7.2 런타임 의존관계 • 인터페이스를 통한 • 느슨한 결합을 갖는 의존관계 • 런타임에 오브젝트간 의존관계가 결정됨 • 클래스의 의존관계 • 고정된 의존관계
의존관계 주입 (DI) • 어떤 객체가 사용할 (의존할) 대상 객체를 런타임에 지정해 주는 작업 • 두 클래스가 인터페이스에의 의해 느슨하게 결합한다. 클래스 코드에는 클래스간 런타임 의존관계가 나타나지 않는다. • 런타임 의존관계는 컨테이너나 팩토리같은 제 3자가 결정한다. • 의존관계는 사용할 오브젝트 레퍼런스를 제공(주입)해 줌으로써 만들어진다.
제 3자가 런타임에 UserDao객체에게 ConnectionMaker객체를 주입(DI)하려면 UserDao의 코드가 아래와 같은 생성자를 갖거나 setter 메소드를 가져야 함 public class UserDao { private ConnectionMakerconnectionMaker; public ConnectionMaker(ConnectionMakerconnectionMaker) { this.connectionMaker = connectionMaker; } public void setConnectionMaker(ConnectionMakersimpleConnectionMaker) { this.connectionMaker = simpleConnectionMaker; } 런타임 의존관계 주입에 의한 객체간 의존관계
1.8 XML을 이용한 설정 <beans> <bean id="myConnectionMaker" class="springbook.user.dao.DConnectionMaker"> </bean> <bean id="userDao" class="springbook.user.dao.UserDao"> <property name="connectionMaker" ref="myConnectionMaker" /> </bean> </beans> public class UserDao { private ConnectionMakerconnectionMaker; public void setConnectionMaker(ConnectionMakerconnectionMaker) { this.connectionMaker = connectionMaker; }
1.8.3 DataSource인터페이스로 변환 1.8.4 프로퍼티 값 주입 • ConnectionMaker대신 javax.sql.DataSource를 사용 • 리스트 1-41 • 리스트 1-42 DataSource를 사용하는 UserDao • 리스트 1-48 dataSource를 bean으로 등록하는 xml 설정
1.6 싱글톤레지스트리와 오브젝트 스코프 • 스프링의 애플리케이션 컨텍스트가 생성하는 빈은 기본적으로 싱글톤임 • 싱글톤(Singleton) - 두 개 이상의 인스턴스들이 동시에 존재할 수 없는 클래스, 항상 한 개의 인스턴스만을 가짐 • 클래스를 작성할 때 두 개 이상의 인스턴스를 만들 수 없도록 코드를 작성할 수 있음 (싱클톤 클래스) • (싱글톤 클래스를 작성하는 방법 - 교재 108쪽 하단 - 109쪽 상단 참고) • 스프링의 애플리케이션 컨텍스트는 빈을 만들 때 기본적으로 싱글톤으로만듬(클래스가 싱글톤 패턴에 맞춰 작성된 것이 아니라도) • 싱글톤이되지 않도록 설정하는 것도 가능 • 엔터프라이즈 애플리케이션은 서버로 작동하므로 각 사용자 요청마다 빈을 만들면 서버 성능에 문제가 생기므로...
UserDao, ConnectionMaker는 빈이다. • User는 빈이 아니다. • 싱글톤인 빈을 설계할 때 인스턴스 필드 지정에 신중해야 함 • 각 사용자의 요청을 처리하는 쓰레드들이 동시에 하나의 빈을 실행하므로 인스턴스 필드에 상태정보를 저장할 수 없음
잘 못된 예 public class UserDao { private DataSourcedataSource; private Connection c; private User user; public void setDataSource(DataSourcedataSource) { this.dataSource = dataSource; } public User get(String id) throws SQLException { User user = new User(); Connection c = this.dataSource.getConnection(); PreparedStatementps = c.prepareStatement(...); ... }
1.7.4 의존관계 주입의 응용 • 기능 구현의 교환 • LocalDBConnectionMaker <--> ProductDBConnectionMaker • 부가기능추가 • 개발 중 DB 연결 횟수를 세고 싶다. (부가기능) • Dao에 이 기능을 추가하는 것은 좋지 않다. • 개발 후 모두 제거해야 하므로 • Dao의 관심사항이 아니므로 (Dao의 응집도!)
Dao와 connectionMaker사이에 연결횟수를세는 (부가기능) 오브젝트를 삽입 • 리스트 1-30 <----- 매우 중요! • 기존 런타임 오브젝트 의존관계 • CountingConnectionMaker를 적용한 후의 오브젝트 런타임 의존관계