3 Layer Architecture

- 객체지향 관점의 Spring 프로그래밍 기법.
- 작은 구조의 프로그램이면 Controller Class 에서만 구현을해도 문제가 없지만, 확장됄수록 많은 문제가 발생.
- Controller, Service, Repository 3개로 분리
Controller

- Client의 요청을 받음.
- 요청에 대한 비즈니스 로직을 Service단에게 전달. (Data) 존재시 함께 전달
- 완성된 답안 Data를 Client 에게 재전달
Service

- 실제 비즈니스로직을 처리하는 부분
- DB에 데이터를 저장하거나 조회할 경우에는 Repository 계층을 통해서 처리
Repository

좋은코드
- 논리가 간단해야함.
- 중복을 제거하고 기능에대한 표현이 명확해야함
- 코드를 처음보더라도 이해 및 수정이 간단해야함
- 의존성을 최소화 (의존성은 변경을 전파한다)
IoC (Inversion of Control)
의존성 이란?
- 일명
하드코딩 , 강하게 결합된 상태 라고 부름, 수정사항이 생겼을 때 코드의 변경이 전파되는 형태.
다형성 을 통해 결합도를 낮출수 있다.
public class Consumer {
void eat(Food food) {
food.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.eat(new Chicken());
consumer.eat(new Pizza());
}
}
interface Food {
void eat();
}
class Chicken implements Food{
@Override
public void eat() {
System.out.println("치킨을 먹는다.");
}
}
class Pizza implements Food{
@Override
public void eat() {
System.out.println("피자를 먹는다.");
}
}
Consumer 는 Food Interface 만을 의존하면서 먹는 존재를 받을뿐 먹는 행위자체는 코드수정없이 구현이 가능해진다.
주입
- Filed 주입
- 외부에서 접근이 불가능함. (private 접근제어자)
- 테스트 코드의 중요성 부각으로 사용을 지양하는편
- Method(Setter) 주입
- 주입받는 객체의 변동가능성이 존재할 경우 사용(극히 드뭄)
- Constructor 주입
- 생성자 호출시점에서 1회 호출되는 것을 보장
- 주입객체가
불변성을 띄거나, 반드시 객체의 주입 필요성을 강제
제어의 역전

- 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아닌 외부에서 결정하는 것을 의미
- 변경의 대한 영향을 적게받기위한 기법
- 강한결합에서는
Consumer → Food 의 형태로 Consumer가 Food를 직접 객체를 생성하여 사용하는 형태를 지님, Food 가 변경됄때 마다 Food의 객체를 직접생성하고 사용하는 등 코드변경성의 전파가 생김.
- 이를 해결하기 위해서 Food를 Consumer의 외부에서 받아온다면 Consumer는 Food가 무엇이든지 Consumer의 코드는 알필요가 없게됌.
Food → Consumer 의 형태로 어떤 Food 가 와도 Consumer의 코드는 받아들이게 된다.
IoC Container 와 Bean
- DI 를 사용하기위해선 객체가 필요하다. 그럼 어느타이밍에 누가 객체를 생성하는지에 대한 개요.

- 빈 (Bean) : Spring 이 관리하는
객체
- Spring IoC 컨테이너 : Bean을 모아둔 컨테이너
- @ComponentScan -> 패키지 스캔 -> @Component가 설정된 클래스들을 ‘Bean’으로 등록
- @Autowired : DI를 해주기위한 어노테이션. 생성자가
1개 일 경우 생략가능.
- @RequiredArgsConstructor : 를 사용할 경우 생성자 주입 과정 생략가능