- Entity / Value Object (+ DTO, DAO 등등의 용어?)
- Entity : 식별자를 가지고 있는 객체, 시간에 따라 변경이 발생한다.
- Value Object : 식별자를 가지지 않는 객체, 값이 변경되지 않는다.
- Data Transfer Object : 계층간 통신을 위한 데이터 객체
- Data Access Object : 데이터베이스의 데이터에 접근하기 위한 객체 Database를 위한 로직과 비즈니스 로직을 구분하기 위해서
- Dependency (+ Injection)
- 의존이란? 기능 구현을 위한 다른 구성 요소들을 사용하는 것
- 이때 사용이란 객체 생성, 메소드 호출, 데이터 사용 등
- 의존은 하면 변경이 전파될 가능성을 의미!
- ex) 호출하는 메소드의 파라미터가 변경, 발생하는 예외타입 변경
- 단단한 결합도와 느슨한 결합도
- 단단한 결합도 : Compile 시점에 의존성 생성
- 느슨한 결합도 : Runtile 시점에 의존성 생성
- 응집도와 결합도
- 응집도(Cohesion)
- 모듈에 포함된 내부 요소들이 연간돼 있는 정도
- 변경이 발생할 때 모듈 내부에서 발생하는 변경의 정도
- 변경의 많다면 응집도가 높은 것!
- 결합도(Coupling)
- 다른 모듈에 대해서 얼마나 많은 지식을 갖고 있는 지를 나타냄
- 한 모듈이 변경되기 위해서 다른 모듈의 변경을 요구하는 정도
- 결합도가 높을수록 변경해야하는 모듈의 수가 늘어나 변경이 어려워 진다.
- 좋은 설계는 높은 응집도와 낮은 결합도를 가져야 한다.
- 의존성 주입(DI)
- IoC를 구현하는 방법 중 하나
- 구현 방법
- 생성자
- setter
- field
- 생성자를 권장함.
- null을 주입하지 않는 한 NPE가 발생하지 않는다.
- final을 사용할 수 있어서 생성 이후 변경되지 않는다.
- 생성자에 의존 객체를 넣지 않으면 객체가 생성되지 않는다.
- 순환 의존성을 컴파일 단계에서 확인할 수 있다.
- 혹시나 변경이 필요할 수 있다면 Setter를 고려해볼 수도 있다?
- Autowired Annotation이 Spring 4.3 이후로 Default
- 여러 개 구현체가 있다면 primary를 이용한 우선순위나 Qualifer를 통한 네이밍 추가가 가능하다.
- 순환 의존
- 의존 객체들의 의존 관계가 순환되는 경우
- 해결 방법이 뭐지?
- IoC(Inversion Of Control)
- 애플리케이션 코드가 프레임워크가 짜놓은 틀에서 수동적으로 동작
- The Hollywoord Principle
- Context는 객체의 생성, 연관관계를 담당
- Context는 IoC가 일어나는 공간으로 IoC Container라고 한다.
- Spring에서는 Application Context를 이용한다.
- IoC를 구현하는 방법
- 전략패턴 / 서비스 로케이터 패턴/ 팩토리 패턴/ 의존성 주입 등
- ApplicationContext
- Bean객체를 관리하는 객체!
- Bean 객체: Application Context에 의해 관리되는 객체
- JVM에 많은 객체가 등록되고 이들 중 ApplicationContext에서 관리되는 객체를 구분하기 위해서 Bean이라는 용어가 만들어짐.
- Bean anontation을 이용해서 선언
- Configuration Meta
- 실제로 ApplicationContext는 만들어야 할 빈 객체 정보를 config를 통해서 받음.
- 이때 config metadata를 xml과 java로 작성할 수 있다
- xml 작성 ⇒ GenericXmlApplicationContext 구현체 사용
- java작성 ⇒ AnnotationConfigApplicationContext 구현체 사용
- java로 작성되는 게 주류를 이룬다.
- Components Scan
- 위에서 말했던 빈 객체들에 대해서 설정 클래스에 따로 작성하지 않아도 알아서 찾아서 등록해주는 기능!(개발자의 편의성과 생산성 증대)
- Stereotype Annotation을 이용해서 Scan 대상 객체를 표기
- 불필요한 객체들은 excloude filters를 통해서 제거 가능

- Bean Scope
- singleton
- 단 하나의 객체만 생성됨.(Default)
- prototype
- 매번 새로운 타입의 객체가 생성됨.
- @Scope 이용

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- Bean Life Cycle
- Bean 생성 생명주기 Callback
- @PostConstruct이 적용된 method 호출
- Bean이 InitializingBean interface 구현 시 afterPropertiesSet 호출
- @Bean의
initMethod
에 설정한 메소드 호출 - Bean 소멸 생명주기 Callback
- @PreDestory가 적용된 method 호출
- Bean이 DisposableBean interface 구현 시 destory 호출
- @Bean의
destoryMethod
에 설정한 메소드 호출
- Enviroment Profile
- 모의객체
- Garbage Collector