Spring 입문주차/2주차

4. 메모장 프로젝트의 IoC & DI

note994 2024. 8. 19. 15:41

객체 중복 생성 문제 해결

Memo Service를 보면 "new MemoRepository(jdbcTemplate);" 코드가 중복되는게 보인다.

public class MemoService {

    private final JdbcTemplate jdbcTemplate;

    public MemoService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public MemoResponseDto createMemo(MemoRequestDto requestDto) {
        // DB 저장
        MemoRepository memoRepository = new MemoRepository(jdbcTemplate);
				...
    }

    public List<MemoResponseDto> getMemos() {
        // DB 조회
        MemoRepository memoRepository = new MemoRepository(jdbcTemplate);
        ...
    }

    public Long updateMemo(Long id, MemoRequestDto requestDto) {
        MemoRepository memoRepository = new MemoRepository(jdbcTemplate);
        ...
    }

    public Long deleteMemo(Long id) {
        MemoRepository memoRepository = new MemoRepository(jdbcTemplate);
        ...
    }
}

Service 클래스가 실행될 때 MemoRepository 클래스를 생성해주면 중복된 코드를 만들 필요가 없다.

 

이제 각 메서드마다 들어있던 MemoRepository memoRepository = new MemoRepository(jdbcTemplate); 를 삭제해도 된다. 이미 클래스 내에서 객체가 만들어져 있기 때문이다.


강한 결합 문제

Memoservice가 MemoRepository를 직접 만들고 있다.

 

마찬가지로 MemoController가 Memoservice를 직접 만들고있다.

 

이러면 제어의 흐름이 각각 Memoservice -> MemoRepository, MemoController -> Memoservice가 된다.

 

즉, 현재 프로젝트의 제어의 흐림이  MemoController -> Memoservice -> MemoRepository가 된다.

 

강한 결합 문제의 이해를 위한 예제

현재 메모장 프로젝트도 이런 문제가 있다. 지금 Controller와 Service는 사용하지도 않는 jdbc를 Repository에 전달하기 위해 생성자로 jdbc를 연쇄적으로 넘겨주고 있다. 즉 만약 Repository의 생성자의 매개변수가 바뀌면 Controller와 Service에 있는 모든 생성자 코드를 수정해줘야 한다.


강한 결합 문제 해결

1. 각 객체에 대한 객체 생성은 딱 1번만

2. 생성된 객체를 모든 곳에서 재사용

3. 생성자 주입을 사용하여 필요로 하는 객체에 해당 객체 주입

 

Controller 바꿔보기

수정 전
수정 후

Controller 생성자에서 Service 객체를 새로 생성하지 않고 이미 만들어진 객체를 사용한다.


Service 바꿔보기

수정 전
수정 후

이렇게하면 먼저 외부에서 memoRepository 객체를 만들고, 그 객체를 Controller나 Service에게 전달해주면 재사용할 수 있다. 그러므로 memoRepository가 바뀌더라도 외부에서 한번만 생성한것을 재사용하는 것이기에 Controller와 Service를 건드릴 필요가 없는것이다.


오류가 발생하는 이유

Controller 수정코드에서 빨간밑줄(오류)가 발생한다. 그 이유는 다음강의에서 설명하고 해결한다.