1. 의존관계 주입 응용 스프링이 제공하는 기능의 99%는 DI 의 혜택을 이용하고 있다. DI 없이는 스프링도 없다. DI 의 장점이 드러나는 몇 가지 응용 사례를 알아보자. 먼저 데이터베이스 관련 개발을 하고 있다고 해보자. 보통 개발환경과 운영환경이 나뉘어져 있어 데이터베이스도 개발 DB와 운영 DB가 나뉘어있을 것이다. 만약 DI 를 사용하지 않고 DAO 코드에서 DB 연결 클래스를 직접 new 로 생성해서 사용했다면 엄청난 수정과정을 거쳐야 한다. DI 는 이 문제를 깔끔하게 해결해준다. 모든 DAO 는 생성 시점에 ConnectionMaker 타입의 오브젝트를 컨테이너로부터 제공받는다. 구체적인 사용 클래스 이름은 컨테이너가 사용할 설정 정보에 들어있다. 개발 DB 를 사용한다고 하면 아래와 ..
1. 싱글톤 레지스트리 앞서 직접 만들었던 오브젝트 팩토리와 스프링의 애플리케이션 컨텍스트 사이에는 큰 차이가 있다. 바로 싱글톤 객체라는 부분이다. DaoFactory의 userDao() 메소드는 호출할 때마다 new 연산자를 통해 오브젝트를 생성하도록 되어있다. 즉, userDao() 메소드를 통해 얻는 오브젝트는 매번 새롭게 생성된다는 것이다. DaoFactory factory = new DaoFactory(); UserDao dao1 = factory.userDao(); UserDao dao2 = factory.userDao(); System.out.println(dao1); System.out.println(dao2); springbook.dao.UserDao@11111111 springbook..
지금까지 DAO 코드를 개선해온 과정을 프로그래밍 이론의 관점에서 한 번 더 생각해보자. 1. 개방 폐쇄 원칙(OCP, Open-Closed Principle) 클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다는 원칙이다. 앞서 구현한 UserDao 는 DB 연결 방법 기능을 확장하는 데에는 열려 있다. 동시에 UserDao 자신의 핵심 기능을 구현한 코드는 변화에 영향을 받지 않고 유지된다. 그러므로 개방 폐쇄 원칙을 지킨다고 말할 수 있다. 2. 전략 패턴(Strategy Pattern) 전략 패턴은 자신의 기능 맥락에서 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리시키고, 이를 구현한 구체적인 알고리즘 클래스로 필요에 따라 바꿔서 사용할 수 있게 하는..
먼저 사용자 정보를 저장할 User 클래스를 만들어보자. package springbook.user.domain; public class User { String id; String name; String password; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName() { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.passwor..