도메인 로직에서의 DTO 사용으로 인한 종속성 문제

손창현·2022년 6월 13일
0

이 글을 쓰는 이유

이스트소프트 익스턴쉽을 진행하면서 피드백을 받은 내용 중에 도메인 로직에서의 Dto사용으로 인해 해당 Dto에 대한 종속성을 가지는 문제점이 있었다. 그래서 기존의 쇼핑몰 프로젝트에서 해당 내용에 대한 리팩토링을 진행해보려 한다.

문제점

기존의 쇼핑몰 프로젝트에서 상품을 등록하는 과정은 아래 그림과 같았다.

클라이언트로부터 새 상품을 등록할 정보가 담긴 Dto(RegisterItemForm)를 풀어내는 로직과 엔티티를 저장하는 로직이 아래 코드처럼 모두 ItemService에서 이루어졌다.

    public Long registerItem(RegisterItemForm registerItemForm) {

		//Form -> Entity
        Item item = registerItemForm.itemFormToEntity();
        
        //Entity 저장
        Item savedItem = itemRepository.save(item);

        return savedItem.getId();
    }

이렇게 되면 도메인에 대한 핵심 기능을 담은 로직이 상품을 등록하는 페이지에서만 사용하는 RegisterItemForm이라는 Dto에 종속되게 된다.

추후에 또 다른 상품 등록 페이지를 만들기 위해 또 다른 Dto를 만든다면 ItemService의 registerItem(상품 등록 메서드)를 또 다른 Dto를 위해 오버로딩해줘야 하고 종속성을 가지기 때문에 유지보수하기 힘들어질 것이다.

해결방안

그래서 도메인 로직의 서비스 레이어와 웹 로직의 서비스 레이어를 분리하여 개발을 진행할 것이다.
정확히는 웹 로직의 서비스 레이어에서는 ItemForm을 Item Entity로 변경해 엔티티만을 도메인 로직의 서비스 레이어에 전달하도록 아래 그림같이 구성할 것이다.

변경 코드

AdminItemService (웹 로직의 서비스 레이어)

public Long registerItem(RegisterItemForm registerItemForm) throws IOException {

		//Form -> Entity
        Item item = registerItemForm.toEntity();

        Item saveItem = Item.createItem(item, itemImageList);
		
        // Entity만 전달하기
        return itemService.createItem(saveItem);
    }

ItemService (도메인 로직의 서비스 레이어)

public Long registerItem(Item item) {

		//Entity 저장
        return itemRepository.save(item).getId();
    }

이렇게 구성함으로써 웹 로직에서는 상품 엔티티만 전달해주기 때문에 새로운 Dto가 생기게 되더라도 도메인 로직의 regiserItem(실제 엔티티를 저장하는 메서드)를 변함없이 유지할 수 있게 된다.

profile
백엔드개발자 손창현입니다.

0개의 댓글