TDD로 구현해 본 경험이 없지만 정리하면서 이해하고자 했다. TDD 법칙 세 가지 실제 코드를 짜기 전 단위 테스트부터 짜라고 요구한다. 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 둘째 법칙 : 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 이 법칙을 지키면 사실상 실제 코드를 전부 테스트하는 테스트 케이스가 나온다. 깨끗한 테스트 코드 유지하기 실제 코드가 진화하면 테스트 코드도 변해야 한다. 하지만 테스트 코드가 지저분할수록 변경하기 어려워진다. 악순환 지저분한 테스트 코드로 인해 실패하는 테스트 케이스를 점점 더 통과시키기 어려워진다. 그래서 테스트 코..
외부 코드 사용하기 외부 코드를 내 코드에서 호출하는 부분을 경계라고 한다. (아는 코드와 모르는 코드를 분리하는 것도 경계라고 한다.) 예를 들어 Map 인터페이스가 변할 경우 수정할 코드가 상당히 많아진다. Map과 같은 경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의한다. Map 인스턴스를 공개 APi의 인수로 넘기거나 반환값으로 사용하지 않는다. 학습 테스트는 공짜 이상이다. 학습 테스트란 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히는 것을 말한다. 학습 테스트는 비용이 들지 않으며, 필요한 지식만 확보할 수 있다. 깨끗한 경계 경계에 위치하는 코드는 깔끔히 분리한다. 기대치를 정의하는 테스트 케이스도 작성한다. 통제 불가능한 외부 패키지보다..
인프런 김영한 선생님 스프링 핵심 원리 강의를 보고 정리한 내용입니다. BeanFactory 스프링 컨테이너의 최상위 인터페이스 스프링 빈을 관리하고 조회하는 역할을 담당 getBean()을 제공 ApplicationContext BeanFactory의 기능을 모두 상속받아서 제공 다른 인터페이스를 상속받아 구현하여 부가 기능도 함께 제공 차이점 1. 부가 기능 ApplicationContext는 BeanFactory가 갖고 있지 않은 다른 인터페이스를 구현한다. 메시지 소스를 활용한 국제화 기능 : 실행되는 나라에 맞춰 언어 변경 환경 변수 : 로컬, 개발, 운영 등을 구분해서 처리 애플리케이션 이벤트 : 이벤트 발행 및 구독 모델 지원 편리한 리소스 조회 : 파일, 클래스패스, 외부 등에서 리소스 조..
오류 코드보다 예외를 사용하라 오류 코드를 사용하면 호출자 코드가 복잡해진다. 반면 예외를 던지게 되면 논리와 오류 처리 코드가 뒤섞이지 않아 깔끔해진다. Try-Catch-Finally 문부터 작성하라 try 블록은 트랜잭션과 비슷하다. try 블록에서 무슨 일이 생기든 catch 블록은 프로그램 상태를 일관성 있게 유지해야 한다. try 블록에서 무슨 일이 생기든지 호출자가 기대하는 상태를 정의하기 쉬워진다. 미확인 예외를 사용하라 확인된 예외는 OCP를 위반한다. → 대규모 시스템의 경우 최하위 단계에서 최상위 단계까지 연쇄적인 수정 발생 확인된 예외는 모든 함수가 최하위 함수에서 던지는 예외를 알아야 하므로 캡슐화가 깨진다. 확인된 예외와 미확인된 예외의 차이는 아래 글에서 확인할 수 있다. ht..
자료 추상화 구현을 감추려면 추상화가 필요하다. 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 한다. public interface Vehicle { double getFuelTankCapacityInGallons(); double getGallonsOfGasoline(); } 위 인터페이스는 자동차 연료 상태를 구체적인 숫자 값으로 알려준다. 두 함수가 변숫값을 읽어 반환할 뿐이라는 사실이 거의 확실하다. public interface Vehicle { double getPercentFuelRemaining(); } 반면에 위 인터페이스는 자동차 연료 상태를 백분율이라는 추상적인 개념으로 알려준다. 정보가 어디서 오는지 전혀 드러나지 않는다. 자료를 세세하게 공개하기..
인프런 김영한 선생님 스프링 핵심 원리 강의를 듣고 정리한 내용입니다. 다양한 의존관계 주입 방법 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } 생성자를 통해 의존관계를 주입하는 방법 생성자이기 때문에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에서 사용 생성자가 1개 있을 경우 @Autowired를 생략해도 자동 주입된다. (..
인프런 김영한 선생님 스프링 핵심 원리 강의를 보고 정리한 내용입니다. 컴포넌트 스캔이란 설정 정보(AppConfig)가 없어도 자동으로 스프링 빈을 등록하는 기능 의존관계도 자동으로 주입하는 @Autowired 기능도 제공 1. @ComponentScan @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다. 이때 스프링 빈의 기본 이름은 클래스명을 사용하되, 맨 앞글자만 소문자로 바꿔준다. 이렇게 클래스 위에 @Component를 붙여주면 해당 클래스는 스프링 빈으로 등록된다. Q. 그러면 기존에 의존관계 주입을 해주던 코드가 없어졌는데 어떻게 주입하나요? A. @Autowired를 사용하면 됩니다. 2. @Autowired 지정하여 의존관계 자동 주입 생성자에..
인프런 김영한 선생님 스프링 핵심 원리 강의를 보고 정리한 내용입니다. 웹 애플리케이션과 싱글톤 스프링이 없는 순수한 DI 컨테이너는 여러 고객이 동시에 요청을 할 경우 동시에 객체가 생성된다. 하지만 이것은 기업이 서비스를 제공하는 데 있어서 큰 메모리 낭비를 불러일으킨다. ex) 고객 트래픽이 초당 100이 나오면 초당 100개의 객체가 생성되고 소멸된다. 이러한 문제를 해결하기 위해서는 해당 객체가 딱 1개만 생성되고 공유하도록 설계하면 된다. 이것이 싱글톤 패턴이다. 싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 private 생성자를 이용하여 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다. (이렇게 구현하면 new 키워드를 사용할 수 없다.) 싱글톤 패..