자바 웹프로그래밍 2기 강의 15일차 내용을 정리한 포스팅입니다.

Mockito

서로 의존적인 서비스 두 개를 동시에 개발한다면 테스트를 어떻게 할까?

  • 의존관계를 맺고 있는 interface 를 구현하는 구현체를 가짜로 만든다.

  • 가짜 구현체를 만드는 작업에 부담이 크다…

  • 가짜 구현체를 만들지 않고도 같은 효과를 내게 해주는게 Mockito 다!


@RunWith(MockitoJUnitRunner.class)
public class UserControllerTest {
    @Mock
    private UserDao userDao;

    // UserController 의 UserDao에 Mock 객체를 넣는다.
    @InjectMocks
    private UserController controller;

    @Test
    public void profile() throws Exception {
        // userDaodml findByUserId 가 호출되면
        // test 유저를 리턴한다.
        when(userDao.findByUserId("test"))
                .thenReturn(new User("test", "password", "name", ""));
        ExtendedModelMap model = new ExtendedModelMap();
        controller.profile("test", model);

        User user = (User) model.get("user");
        System.out.println("User : " + user);
    }
}

TDD 잘하려면 ?

객체 지향적으로 개발하면 테스트 케이스 작성하기도 편해진다.

  • 객체에게 자꾸 메시지를 던지도록 하라

  • 서비스는 객체들한테 일을 시키는 정도?

  • 테스트 코드를 먼저 구현하고 서비스 로직을 구현하는게 더 좋다는 생각

  • 요구사항을 세분화해서 todo-list 만들고 이를 기반으로 테스트 메소드를 만든다. (도메인 분석)

    • 바로 코딩하지 말고 구현하고자 하는 로직을 리스트한 후에 테스트 케이스 옮기고 로직 작성 시작!

Active Record 패턴

  • Ruby on Rails 진영이 강조하는 패턴

  • Repository 같은 CRUD 로직을 모델에서 들고 있다.

점진적인 리펙토링

스프링 라이프 사이클

  • XML, JavaConfig 설정 정보를 읽어 파싱한 후 BeanDefinition 형태의 메타 정보를 생성

  • BeanFactoryPostProcessor를 실행

  • 생성자 또는 static 메서드를 실행해 인스턴스를 생성

  • Setter 메서드를 호출해 Dependency Injection 실행

  • Aware 인터페이스를 구현하고 있는 Bean에 Inject(일단 무시)

  • BeanPostProcessor의 postProcessBeforeIntialization 실행

  • 앞의 초기화 메서드를 실행해 Bean 초기화

  • BeanPostProcessor의 postProcessAfterIntialization 실행

AOP (Aspect Oriented Programming)

  • OOP : 비지니스 로직의 중복을 제거하기 위함

  • AOP : 인프라 로직의 중복을 제거하기 위함

인프라 로직은 프로그래밍 모든 영역에 걸쳐 등장하며, 많은 중복 코드를 만든다.
비즈니스 로직 코드보다 인프라 로직 코드가 더 많은 코드 가독성을 떨어트리고, 유지보수를 어렵게 만든다.
따라서 AOP를 활용해 인프라 로직의 중복을 제거함으로써 비즈니스 로직에 집중할 수 있다.

  • target

  • advice

  • pointcut

Spring AOP

  • Servlet Filter와 Intercepter의 한계

ServletFilter는 Servlet 실행 전/후에 대한 처리, Interceptor는 Controller 메소드 실행 전/후 에 대한 처리만 가능하다.
애플리케이션 전체 소스 코드에 대해 Aspect를 적용하고 싶다.
이때 사용할 수 있는 것이 Spring AOP이다.