Fast-Campus Java Web Programming Camp 15일차

강의 정리

Posted by kingbbode on January 9, 2017

Recently by the same author:


스프링캠프 2018-Consumer Driven Contract

Consumer Driven Contract 기법을 활용한 마이크로서비스 API의 진화

You may find interesting:


Spring 에서 @ConditionalOnClass, @ConditionalOnBean 사용할 때 주의할 점

Spring Boot 기반의 자동 설정을 위한 AutoConfiguration 클래스를 만들다가 발생한 이슈 공유 (ClassNotFoundException, ArrayStoreException)


Spring Boot 와 Properties(or Yaml) Environment

Spring의 PropertySource 의 Yaml 미지원과 ConfigurationProeprties 의 locations Deprecated 의 배경을 알아보자!.

열다섯번째 강의

유용한 기능

  • Intellij Live Template 기능

slf4j logging template code

${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}private static final Logger log = LoggerFactory.getLogger(${enclosing_type}.class);

mockito template code

${is1:importStatic('org.hamcrest.CoreMatchers.*')}${is2:importStatic('org.junit.Assert.*')}${is5:importStatic('org.mockito.Mockito.*')}${is6:import('org.junit.Test')}${is7:import('org.junit.Before')}${is8:import('org.mockito.Mock')}${is9:import('org.mockito.runners.MockitoJUnitRunner')}${is10:import('org.junit.runner.RunWith')}

Mockito

UserDao라는 객체와 의존 관계를 갖는 객체를 테스트 할 때 어떻게 테스트할 수 있을까?

Dependency Injection 활용, MockUserDao를 통해 추가해 해결할 수 있다.

  • 동일한 인터페이스를 갖는 객체를 Database를 사용하지 않고 구현

그러나 Dao 복잡도가 증가하면 구현하는데 너무 많은 비용이 발생한다.

  • 인터페이스 구현체인 가짜 객체를 만드는게 더 귀찬다.

그래서 등장한 것이 Mockito!

그러나!!!! Mock 객체를 사용했을 경우 객체지향적으로 개발했는지 의심해볼 필요가 있다.

Layered 아키텍처에 맞도록

  • 비즈니스 로직은 모델에
  • 서비스 레이어에는 가볍게

Dependency Injection(의존성 주입) 기반으로 개발함으로써 테스트하기 쉬운 코드를 구현할 수 있지만 그 보다 객체지향적으로 프로그래밍하는 것이 더 중요하다.

빈 컨테이너 설정 관리

부모/자식 구조

  • 프리젠테이션 Layer만 다르고 Service/DAO 설정을 재사용하고 싶은 경우
  • 보통 일반 사용자용과 관리툴을 분리하는 경우가 많이 발생한다.
  • 자식에서는 부모에서 관리하는 빈은 접근 가능, 반대는 불가능

인스턴스 생성 – 초기화/제거

Callback Inteface 활용

public interface InitializingBean {
 void afterPropertiesSet() throws Exception;
}

public interface DisposableBean {
 void destroy() throws Exception;
}

위 인터페이스를 implements하는 Bean은 Spring 프레임워크에 의해 자동으로 초기화 작업과 제거 작업을 한다.

Annotation

  • @PostContruct
  • @PreDestroy


아래 설정들은 편집할 수 없는 외부 설정의 라이브러리를 컨트롤할 때 사용하면 좋다.

XML 활용한 초기화 제거

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
 p:driverClassName="${database.driverClassName}" p:url="${database.url}"
 p:username="${database.username}" p:password="${database.password}"
 init-method="initResource"
 destroy-method="close"
/>

Bean 활용

@Configuration
public class Config {
 @Bean(initMethod="initIt", destroyMethod="cleanUp")
 public DataSource dataSource() {
 BasicDataSource dataSource = new BasicDataSource();
 dataSource.setDriverClassName("org.h2.Driver");
 dataSource.setUrl("jdbc:h2:~/slipp");
 dataSource.setUsername("sa");
 dataSource.setPassword("");
 return dataSource;
 }
}

AOP

하나의 완전한 애플리케이션을 구현하려면 비즈니스 로직과 비즈니스 로직을 지탱하는 인프라 로직이 필요하다.

OOP는 비즈니스 로직의 중복을 제거하기 위함이고 AOP는 인프라 로직 중복을 제거하기 위함이다.

인프라 로직이란?

데이터에 대한 조회, 변경은 하지 않으면서 성능을 높이고, 보안을 강화하기 위해 처리해야 하는 로직을 의미한다. 대표적인 인프라 로직으로 권한 로직, DB 트랜잭션 로직, 데이터 캐싱, 로깅, 성능 측정과 같은 로직을 들 수 있다.

AOP 용어

  • target : 부가 기능을 부여할 대상
  • advice : target에 제공할 부가 기능을 담은 클래스
  • joinpoint : advice가 적용될 수 있는 위치. 예를 들어 method의 실행 단계
  • pointcut : advice가 적용될 target을 지정하는 것을 의미