북리뷰/토비의 봄(13)
-
테스트 코드 작성, JUnit 사용과 테스트 주도 개발(TDD)
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import springbook.user.domain.User; import java.sql.SQLException; public class UserDaoTest { public static void main(String[] args) throws ClassNotFoundException, SQLException { ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); ..
2022.01.15 -
스프링 컨텍스트와 싱글톤 레지스트리
전 포스팅에서, DaoFactory와 같이 직접 클래스간 의존성을 설정해서 사용하는 것과, @Configuration 애너테이션을 추가하여 스프링 애플리케이션 컨텍스트를 통해 사용하는 것의 차이는 무엇일까? 테스트 결과로는 같은데 말이다. 스프링 컨텍스트와 클래스 직접 생성의 차이 차이점을 확인하기 위해 userDao()메서드를 두 번 호출해서 리턴되는 UserDao오브젝트를 비교하자 DaoFactory factory = new DaoFactory(); UserDao dao1 = factory.userDao(); UserDao dao2 = factory.userDao(); System.out.println(dao1); System.out.println(dao2); 출력 결과에서 알 수 있듯이, 두 개는 ..
2022.01.15 -
스프링의 애플리케이션 컨텍스트
오브젝트 팩토리를 이용한 스프링 IOC 기존에 제작한 DaoFactory를 스프링에서 사용이 가능하도록 변신시켜보자. 스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈(Bean) 이라고 한다. 자바 빈 또는 엔터브라이즈 자바빈(EJB)에서 말하는 빈과 비슷한 오브젝트 단위의 예플리케이션 컴포넌트를 말한다. 동시에 스피링 빈은 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다. 스프링에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리(bean Factory) 혹은 애플리케이션 컨텍스트(application context)라고 부른다. 애플리케이션 컨텍스트는 별도의 정보를 참고해서 빈의 생성, 관..
2022.01.09 -
IOC의 필요성 - 4. 오브젝트 팩토리, 제어관계 역전
오브젝트 팩토리 지금까지는 문제가 많은 초난감 DAO를 깔끔한 구조로 리펙토링하는 작업을 수행했다. 하지만, 여태껏 얼렁뚱땅 넘긴 게 하나 있다. 바로 클라이언트인 UserDaoTest이다. 기존에 코드의 성능 및 동작여부를 테스트하면 UserDaoTest가 갑자기 어떤 ConnectionMaker 구현 클래스를 결정해하는 책임을 엉겁결에 떠맡았다. 즉, 관계설정을 결정해하는 책임을 담당할 클래스를 생성해야한다. 이 클래스의 역할은 객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 것인데, 이런 일을 하는 오브젝트를 흔히 팩토리라고 부른다. DaoFactory를 생성하여 기존에 UserDaoTest가 책임지고 있었던 관계 설정 부분을 옮기자 package springbook.user.dao..
2022.01.09 -
IOC의 필요성 - 3. 클래스의 분리 및 인터페이스 도입, 관계설정 책임
클래스의 분리 처음에는 독립된 메서드를 만들어서 분리했고, 그 다음에는 상하위 클래스의 상속을 통해 분리했다. 이번에는 아예 상속관계도 아닌 완전히 독립적인 클래스로 만들어보겠다. 그림에 나와있는 것 처럼 SimpleConnectionMaker라는 새로운 클래스를 만들고 DB 생성 기능을 그 안에 넣는다 . 그리고 UserDao에서 SimpleConnectionMaker클래스의 오브젝트를 만들어두고, 이를 각 메서드에서 사용하면 된다. package springbook.user.dao; import springbook.user.domain.User; import springbook.util.SimpleConnectionMaker; import java.sql.*; public class UserDao {..
2022.01.09 -
IOC의 필요성 - 2. 클래스 상속을 통한 관심사 분리
DB Connection 제작 메서드 독립 직전 포스팅에서 제작한 UserDao 코드가 엄청난 인기를 얻어 네ㅇ버와 카ㅋ오에서 UserDao를 구매하겠다고 주문이 들어왔다. 그런데, 납품 과정에서 문제가 발생했다. 문제는 네ㅇ버와 카ㅋ오에서 각기 다른 종류의 DB를 사용하고 있고, DB 커넥션을 가져오는 데 있어 독자적으로 만든 방법을 적용하고 싶어한다는 점이다. 더욱 큰 문제는 UserDao를 구매한 이후에도 DB 커넥션을 가져오는 방법이 종종 변경될 가능성이 높다는 점이다. 물론 고객한테 직접 UserDao 소스코드를 제공하여 직접 수정해서 쓰라고 하고 싶지만, 초 특급 비밀기술이 적용된지라 고객에게 소스코드를 직접 공개하고 싶지 않다. 이런 경우 어떻게 해야 고객 스스로 원하는 DB커넥션 생성 방식..
2022.01.09