Controller와 service 단에서의 중복된 객체 생성
MemoService memoService = new MemoService(jdbcTemplate);
MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
📝 기존의 중복된 객체 생성
@RestController
@RequestMapping("/api")
public class MemoController {
private final JdbcTemplate jdbcTemplate;
public MemoController(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
// service 요청하기
MemoService memoService = new MemoService(jdbcTemplate); // 서비스 객체 생성
return memoService.createMemo(requestDto); // 클라이언트에서 전달받은 데이터도 사용 받게 함께 전달
}
@GetMapping("/memos")
public List<MemoResponseDto> getMemos() {
MemoService memoService = new MemoService(jdbcTemplate);
return memoService.getMemos();
}
}
📝 생성자를 통해 생성이 될때 jdbcTemplate 을 받으면서 memoService 생성 중복 객체 생성 제거
@RestController
@RequestMapping("/api")
public class MemoController {
private final MemoService memoService;
public MemoController(JdbcTemplate jdbcTemplate) {
this.MemoService = new MemoService(jdbcTemplate);
}
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
return memoService.createMemo(requestDto); // 클라이언트에서 전달받은 데이터도 사용 받게 함께 전달
}
@GetMapping("/memos")
public List<MemoResponseDto> getMemos() {
return memoService.getMemos();
}000000000
}
Service 단에서의 Repository 객체 생성도 위와 동일하기때문에 생략하겠다.
하지만 여전히 강한 결합인 상태이다(필요한 객체를 직접 생성하여 사용한다)
제어의 흐름 : MemoController -> MemoService -> MemoRepository
만약 repository 단에서 코드 변경이 있다면 service, controller 모두에서 코드 변경이 불가피하다.
그렇기 때문에 MemoService,MemoRepository를 Bean 으로 등록해 준 뒤 생성자 주입을 통해 DI를 통핸 IoC를 실행한다!
📝 생성자 주입
@RestController
@RequestMapping("/api")
public class MemoController {
private final MemoService memoService;
//memoService가 Bean으로 등록되어 있기 때문에 외부에서 주입 받을 수 있다!
public MemoController(MemoService memoService) {
this.memoService = memoService;
}
}
@Service //Bean 등록
public class MemoService {
private final MemoRepository memoRepository;
public MemoService(MemoRepository memoRepository) {
// 생성자를 통해 생성이 될때 jdbcTemplate 을 받으면서 memoRepository 생성
this.memoRepository = memoRepository;
}
}
@Repository //Bean 등록
public class MemoRepository {//서비스와 레포 분리 db와 소통의 역할
private final JdbcTemplate jdbcTemplate;
public MemoRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}