3.0) 템플릿 개방 폐쇄 원칙이란 코드에서 어떤 부분은 변경을 통해 그 기능이 다양해지고 확장하려는 성질이 있고, 어떤 부분은 고정되어 있고 변하지 않으려는 성질이 있음을 말해준다. 이를 통해 변화의 특성이 다른 부분을 구분해주고, 각각 다른 목적과 다른 이유에 의해 다른 시점에 독립적으로 변경될 수 있는 효율적인 각 구조를 만들어준다. 템플릿이란 이렇게 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜 효과적으로 활용할 수 있도록 하는 방법이다.
2.5) 학습 테스트로 배우는 스프링 학습 테스트의 장점 학습 테스트란? 자신이 만들지 않은 프레임워크나 다른 개발팀에서 만들어서 제공하는 라이브러리 등에 대해서 테스트를 작성하는 것이다. 학습 테스트의 목적은 자신이 사용할 API나 프레임워크의 기능을 테스트로 보면서 사용 방법을 익히려는 것이다. 따라서 테스트이지만 프레임워크나 기능에 대한 검증이 목적이 아니다. 테스트를 작성하면서 학습하면 장점이 있다. 학습 테스트는 자동화된 테스트 코드로 만들어지므로 다양한 조건에 따라 기능이 어떻게 동작하는지 빠르게 확인할 수 있다. 학습 테스트는 다양한 기능과 조건에 대한 테스트 코드를 개별적으로 만들고 남겨둘 수 있다. 이렇게 테스트로 새로운 기술의 다양한 기능을 사용하는 코드를 만들어두면 실제 개발에서 샘플..
2.4) 스프링 테스트 적용 테스트를 위한 애플리케이션 컨텍스트 관리 JUnit은 매번 테스트 클래스의 오브젝트를 새로 만든다. @Before 메소드는 테스트 메소드 개수만큼 반복되고 그에 따라 애플리케이션 컨텍스트도 개수만큼 만들어진다. 물론 테스트는 가능한 한 독립적으로 매번 새로운 오브젝트를 만들어서 사용하는 것이 원칙이다. 하지만 애플리케이션 컨텍스트처럼 생성에 많은 시간과 자원이 소모되는 경우에는 테스트 전체가 공유하는 오브젝트를 만들기도 한다. 이때도 테스트는 일관성 있는 실행 결과를 보장해야 하고, 테스트의 실행 순서가 결과에 영향을 미치지 않아야 한다. JUnit은 테스트 클래스 전체에 걸쳐 딱 한 번만 실행되는 @BeforeClass 스태틱 메소드를 지원한다. 이 메소드에서 애플리케이션 ..
2.3) 개발자를 위한 테스팅 프레임워크 JUNIT JUnit 테스트 실행 방법 테스트 없이는 스프링은 의미가 없다. 스프링을 학습하고 제대로 활용하려면 최소한의 JUnit 테스트 작성 방법과 실행 방법을 알고 있어야 한다. 가장 좋은 JUnit 테스트 실행 방법은 자바 IDE에 내장된 JUnit 테스트 지원 도구를 사용하는 것이다. JUnitCore를 이용해 테스트를 실행하고 콘솔에 출력된 메시지를 보고 결과를 확인하는 방법을 가장 간단하긴 하지만 테스트의 수가 많아지면 관리하기 힘들어진다는 단점이 있다. JUnit 테스트를 지원하는 기능을 사용할 경우 JUnitCore를 이용할 때처럼 main() 메소드를 만들지 않아도 되고 단지 JUnit Test를 선택하면 자동으로 실행되고 뷰가 나타나서 테스트 ..
2.2) USERDAOTEST 개선 테스트 검증의 자동화 첫 번째 문제점인 테스트 결과의 검증 부분을 코드로 만들어보자. 이 테스트를 통해 확인하고 싶은 사항은, add()에 전달한 User 오브젝트에 담긴 사용자 정보와 get()을 통해 다시 DB에 가져온 User 오브젝트의 정보가 서로 정확히 일치하는가다. 모든 테스트는 성공과 실패의 두 가지 결과를 가질 수 있다. 테스트의 실패는 테스트가 진행되는 동안 에러가 발생해서 실패하는 경우인 테스트 에러와, 테스트 작업 중에 에러가 발생하진 않았으나 그 결과가 기대한 것과 다르게 나오는 경우인 테스트 실패로 구분해볼 수 있다. 테스트 중에 에러가 발생하는 것은 콘솔에 에러 메시지와 긴 호출 스택 정보가 출력되기 때문에 쉽게 확인 가능하지만, 테스트가 실패..
2.1) USERDAOTEST 다시 보기 테스트의 유용성 이전에 만들었던 main() 메소드를 이용한 테스트 코드를 살펴보자. main() 메소드를 이용해 UserDao 오브젝트의 add(), get() 메소드를 호출하고, 그 결과를 화면에 출력해서 그 값을 눈으로 확인시켜준다. 이렇게 만든 테스트용 main() 메소드를 반복적으로 실행해가면서 처음 설계한 대로 기능이 동작하는지를 매 단계 확인한 덕분에, 다양한 방법으로 코드를 설계하고 개선할 수 있었다. 테스트란 결국 내가 예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인해, 만든 코드를 확신할 수 있게 해주는 작업이다. 또한 테스트의 결과가 원하는 대로 나오지 않는 경우에는 코드나 설계에 결함이 있음을 알 수 있어 디버깅을 거쳐 최종적으로 테스..
2.0) 테스트 스프링은 IoC/DI를 이용해 객체지향 프로그래밍 언어의 근본과 가치를 개발자가 손쉽게 적용하고 사용할 수 있게 도와주는 기술이다. 복잡한 애플리케이션을 개발하는 데 필요한 도구 하나는 객체지향 기술이다. 그리고 다른 하나의 도구로 스프링이 강조하고 가치를 두고 있는 것이 바로 테스트다. 애플리케이션 변화에 대응하는 첫 번째 전략이 확장과 변화를 고려한 객체지향적 설계와 그것을 효과적으로 담아낼 수 있는 IoC/DI 같은 기술이라면, 두 번째 전략은 만들어진 코드를 확신할 수 있게 해주고, 변화에 유연하게 대처할 수 있는 자신감을 주는 테스트 기술이다. 또한 테스트의 작성은 스프링의 다양한 기술 활용 방법을 이해하고 검증하고, 실전에 적용하는 방법을 익히는데 효과적이다.
1.8) XML을 이용한 설정 XML 설정 스프링은 다양한 방법을 통해 DI 의존관계 설정정보를 만들 수 있고 가장 대표적인 것이 XML이다. 본격적인 범용 DI 컨테이너를 사용하면서 오브젝트 사이의 의존정보는 일일이 자바 코드로 만들어주려면 번거롭다. 또한 DI 구성이 바뀔 때마다 자바 코드를 수정하고 클래스를 다시 컴파일하는 것도 귀찮은 작업이다. XML은 단순한 텍스트 파일이기 때문에 다루기 쉽다. 또, 쉽게 이해할 수 있으며 별도의 빌드 작업이 필요 없다. XML에 담긴 DI 정보를 활용해보자. DI 정보가 담긴 XML 파일은 를 루트 엘리먼트로 사용하며 여러 개의 을 정의할 수 있다. @Configuration을 , @Bean을 에 대응한다고 생각한다. XML에서는 하나의 @Bean 메소드를 통..