패캠 JAVA 15일차
자바 웹프로그래밍 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이다.