Fast-Campus Java Web Programming Camp 12일차

강의 정리

Posted by kingbbode on December 29, 2016

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 의 배경을 알아보자!.

열두번째 강의

강의 전에

리팩토링은 어떻게 해야하는가?

  • 테스트 코드가 지탱을 하고 있어야 한다.
  • 시작은 최대한 작은 발걸음으로 시작한다. 자신감이 붙으면 좀 더 큰 보폭으로 진행한다.
  • 가능한 배포 가능한 상태가 되도록 노력한다.
    • 우리는 언제든지 0순위의 업무가 생길 수 있다.
  • 리팩토링을 생활화한다.
    • 별도의 시간을 투자해 하는 활동이 아니라 시간 나는 틈틈이 진행해야 한다.
  • 리팩토링 연습은 평생에 걸쳐 해야 한다.
  • 프로그래머의 삶에 가장 즐거운 활동 중의 하나가 리팩토링이다.
    • 리팩토링은 창의성을 요구하는 설계 영역이기 때문이다.

배운 것

JDBC 리펙토링

클래스간 중복 제거

  • 상속
  • 구성(composition)

AutoCloseable

AutoCloseable을 구현, 상속하는 클래스는 try문으로 작성하여 finally를 제거할 수 있다.

Callback Interface

Singleton Pattern

  • Double Checked Locking을 기반의 Singleton

    • Double Checked도 완전하지 않음
  • static field 기반의 Singleton

    • 로드될 때 무조건 객체가 생성됨

기존의 Singleton 패턴을 적용하지 않으면서 같은 효과를 내는 방법이 추세

스프링에서 아래 방식을 사용

  • Singleton 패턴의 서블릿 컨테이너에서 Single 인스턴스를 만드는 방법
    • 인스턴스를 저장해놓은 후 재사용

static method로 작성하는 방식도 있으나, 객체지향적인 다형성 측면과 테스트 측면에서 좋지 않기 때문에 서블릿 컨테이너에서 Single 인스턴스를 생성하는 것이 추세.

Layerd 아키텍처

Service Layer의 등장

  • Controller의 중복 코드를 제거할 수 있다.
  • 다른 기능의 Service를 호출하거나 다수의 DAO를 연결하는 역할을 한다.
  • Transaction과 Cache 적용과 같은 infra 적용을 위한 단위가 된다.
  • Service는 가능한 가볍게 구현한다.(thin layer)
  • Service에 핵심 비즈니스 로직을 구현하지 말고, 로직은 상태 값을 가지고 있는 모델(또는 도메인) 이 담당해야 한다.

[중요] 그러나 현재 많은 개발자들이 Service에서 비즈니스 로직을 구현하고 있다. 비즈니스 로직은 모델(도메인) 객체에서 구현되어야 한다

  • DTO
    • Data Transformer Object(가변)
  • VO
    • Value Object (불변)
  • POJO
    • Plain Old Java Object
    • interface나 class에 종속되지 않는 Java Object

Service Layer에 Interface가 필요한가?

Service와 Interface가 1:1을 갖는 구조에는 필요하지 않다. 본래 Interface는 조합을 위한 개념이기 때문이다.

Service 외에도 Dao 등 다른 Layer에서도 Interface가 필요하지 않은 경우에는 궂이 사용할 필요가 없다(Dao에서는 구현체가 변경될 때를 위해 필요할 수도 있지만, 한번 구현된 시스템에서 구현체가 변경되는 경우는 거의 없다)

Spring MVC

  • Bean
  • Bean Container
  • XML, JAVA Config