패캠 JAVA 12일차
자바 웹프로그래밍 2기 강의 12일차 내용을 정리한 포스팅입니다.
리펙토링
하나의 메소드에서 개발자가 해야하는 부분과 고정된 부분을 분리해보자
// insert method
그렇게 하나의 메소드에서 공통된 부분이 남으면 클래스로 분리해보자
// JdbcTemplate.class
상속을 통해서 클래스간의 종속된 관계를 끊을 수 있는지 찾아보자
- 추상클래스 / 추상메소드 / 인터페이스를 활용 할 수 있다.
abstract class JdecTemplate {
abstract void setValues();
abstract String createQuery();
...
}
- 익명 클래스 활용 (흐름이 어떻게 가는지 좀 정리하자)
상속이 아닌 메소드의 인자로 달라질 수 있는 부분을 정리해보자
- 가변인자 사용도 고려해보자
클래스간의 중복제거
-
상속을 통한 중복 제거
- 하위 클래스의 영향을 준다.
-
구성 (조합) composition
-
추천!
-
메소드간의 커플링을 분리
-
interface 만들어서 분리 가능하다.
-
인터페이스의 메소드의 인자로 넘긴다. (callback interface)
-
-
AutoCloseable 을 상속한 클래스는 try문에서 다 클로즈
Singleton
- 상태값을 가지지 않고 행위만 가지고 있는 클래스는 Singleton 패턴을 이용하자
public class JdbcTemplate {
private static JdbcTemplate jdbcTemplate;
private JdbcTemplate() {
// 생성자를 private으로 막는다.
}
public static JdbcTemplate getInstance() {
if (jdbcTemplate == null) {
// 더블 체크드 락킹
jdbcTemplate = new JdbcTemplate();
}
return jdbcTemplate;
}
}
// 호출 전에도 생성되어 있으나 그래도 깔끔하고 안전하다
public class JdbcTemplate {
private static JdbcTemplate jdbcTemplate = new JdbcTemplate();
private JdbcTemplate() {}
public static JdbcTemplate getInstance() {
return jdbcTemplate;
}
}
Singleton, static
-
static 기반의 단점
-
다형성에 한계가 있다.
-
테스트하기가 번거롭다.
-
레이어드 아키텍쳐
- 하나의 기능 추가에 너무 많은 클래스가 필요하다
Service의 역할은? (비지니스 로직을 담는게 서비스가 아니다!!!!)
-
Controller의 중복 코드를 제거할 수 있다.
-
다른 기능의 Service를 호출하거나 다수의 DAO를 연결하는 역할을 한다.
-
Transaction과 Cache 적용과 같은 infra 적용을 위한 단위가 된다.
-
Service는 가능한 가볍게 구현한다.(thin layer)
-
Service에 핵심 비즈니스 로직을 구현하지 말고, 로직은 상태 값을 가지고 있는 모델(또는 도메인)이 담당해야 한다.
Model(Domain), DTO, VO
-
DTO : 바뀔수 있다 (setter 가짐)
-
VO (immutable object)
Service Layer의 interface를 없애는 추세
-
인터페이스와 클래스가 1:1 매핑 -> 의미가 없다.
-
인터페이스는 구현체의 변경이 필요할 경우에 사용하면 된다. (사실 구현체가 변경될 일은 많지 않다.)
스프링 프레임워크
스프링 컨테이너 / DI 컨테이너 / Bean 컨테이너
-
Bean의 라이프 사이클을 관리! (Bean Container)
-
각각의 Bean의 의존관계 관리!!
- @Autowired : 서로 연관없는 Bean을 연결해주는 어노테이션
-
POJO : 순수 자바 오브젝트 (특정 인터페이스에 종속되지 않은)
-
@EnableWebMVC :