객체 중복 생성 문제 해결
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 수정코드에서 빨간밑줄(오류)가 발생한다. 그 이유는 다음강의에서 설명하고 해결한다.
'Spring 입문주차 > 2주차' 카테고리의 다른 글
6. JPA란 무엇일까? (0) | 2024.08.20 |
---|---|
5. IoC Container와 Bean (0) | 2024.08.19 |
3. IoC(제어의 역전), DI(의존성 주입) 이해하기 (0) | 2024.08.19 |
2. 역할 분리하기 (0) | 2024.08.18 |
1. 3 Layer Architecture (0) | 2024.08.16 |