Spring

    [토비 스프링] CH2-3. 학습 테스트

    학습 테스트란? 보통 개발자는 자신이 만들고 있는 코드에 대한 테스트만 작성하면 되지만 때로는 자신이 만들지 않은 프레임워크나 다른 개발팀에서 제공한 라이브러리 등에 대해서도 테스트를 작성해야 한다. 이런 테스트를 학습 테스트라고 한다. 학습 테스트의 목적은 자신이 사용할 API나 프레임워크의 기능을 테스트로 보면서 사용 방법을 익히는 것이다. 학습 테스트 연습 JUnit은 테스트 메소드를 수행할 때마다 새로운 오브젝트를 만든다고 했다. 이에 대한 학습 테스트를 만들어보자. 먼저 새로운 테스트 클래스를 만들고 적당한 이름으로 세 개의 테스트 메소드를 추가하자. 테스트 클래스 자신의 타입으로 스태틱 변수를 하나 선언한다. 매 태스트 메소드에서 현재 스태틱 변수에 담긴 오브젝트와 자신을 비교해서 같지 않다는..

    [토비 스프링] CH2-2. 스프링과 JUnit

    [토비 스프링] CH2-2. 스프링과 JUnit

    현재 문제점 테스트 코드가 어느 정도 깔끔해지긴 했지만 어플리케이션 컨텍스트의 생성 방식에 문제가 있다. @Before 메소드가 테스트 메소드 개수만큼 반복되기 때문에 컨텍스트도 여러 번 생성된다. 빈이 많아지고 복잡해지면 애플리케이션 컨텍스트 생성에 적지 않은 시간이 걸린다. 또 한 초기화 될 때 어떤 빈은 독자적으로 많은 리소스를 할당하거나 독립적인 스레드를 띄우기 때문에 테스트를 마칠 때마다 애플리케이션 컨텍스트 내의 빈이 할당한 리소스 등을 정리해주지 않으면 다음 컨텍스트를 만들 때 문제가 생길 수 있다. 애플리케이션 컨텍스트의 경우 초기화되고 나면 내부의 상태가 바뀌지 않기 때문에 한 번만 만들고 여러 테스트가 공유해서 사용하도록 하는 것이 좋다. 이를 위해 스프링이 직접 제공하는 애플리케이션 ..

    [토비 스프링] CH2-1. 테스트

    테스트의 필요성 테스트란 결국 내가 예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인해서, 만든 코드를 확신할 수 있게 해주는 작업이다. 보통 웹 프로그램에는 웹 화면을 통해 값을 입력하고 기능을 수행하고, 결과를 확인하는 식으로 테스트한다. 하지만 이는 DAO에 대한 테스트로서는 단점이 너무 많다. 테스트하고 싶었던 건 UserDao였는데 다른 계층의 코드와 컴포넌트, 서버 설정 상태까지 모두 테스트에 영향을 미치기 때문에 이런 방식으로 테스트를 하게 되면, 정확한 오류 지점을 파악하기 힘들다. 따라서 테스트하고자 하는 대상이 명확하다면 그 대상에만 집중해서 테스트하는 것이 바람직하다. 테스트를 할 때도 관심사의 분리 원리가 적용된다. 작은 단위의 코드에 대해 테스트를 수행하는 것을 단위 테스트라..

    [토비 스프링] 의존관계 주입(DI)

    [토비 스프링] 의존관계 주입(DI)

    의존관계 주입(DI) 제어의 역전과 의존관계 주입 DaoFactory처럼 객체를 생성하고 관계를 맺어주는 등의 작업을 담당하는 기능을 일반화한 것이 스프링의 IoC 컨테이너이다. 스프링이 제공하는 IoC방식의 핵심은 의존 관계 주입(DI)이다. 의존성 주입이란 오브젝트 레퍼런스를 외부로부터 제공(주입)받고 이를 통해 여타 오브젝트와 다이나믹하게 의존관계가 만들어지는 것을 의미한다. 의존관계 두 개의 클래스 또는 모듈이 의존관게에 있다는 할 때는 항상 방향성이 존재한다. 다음에서는 A가 B에 의존하고 있음을 의미한다. A는 B에게 의존하고 있기 때문에 B에서 특정 메소드가 추가 혹은 수정되면 A에게도 영향을 미친다. UserDao의 의존관계 UserDao의 의존관계를 살펴보면 ConnectionMaker라..

    [토비 스프링] CH1-3. 싱글톤 레지스트리와 오브젝트 스코프

    [토비 스프링] CH1-3. 싱글톤 레지스트리와 오브젝트 스코프

    DaoFactory와 스프링 IoC의 차이 DaoFactory를 직접 사용하는 것과 @Configuration 애노테이션을 추가해서 스프링의 에플리케이션 컨텍스트를 통해 사용하는 것은 테스트 결과만 보자면 동일한 것 같지만 그렇지 않다. 다음은 DaoFacotry의 userDao() 메소드를 두 번 호출해서 리턴되는 UserDao 오브젝트를 출력하는 코드이다. public class EqualityCheck { public static void main(String[] args) { DaoFactory factory = new DaoFactory(); UserDao dao1 = factory.userDao(); UserDao dao2 = factory.userDao(); System.out.println..