[SPRING] 메모장 프로젝트의 IoC & DI

라미·2024년 2월 25일

spring

목록 보기
7/17
post-thumbnail

메모장 프로젝트의 IoC & DI

객체 중복 생성 문제 해결

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;
    }
}

0개의 댓글