2017-11-23 10 views
0

건축 패턴에 대해 물어보고 싶습니다. 나는 내가 묻는 것을 데모하기 위해 두 개의 스 니펫 코드를 작성한다.매퍼 코드, 서비스 레이어 또는 컨트롤러 레이어를 배치하는 데 가장 적합한 레이어는 무엇입니까?

첫 번째 방법은 다음과 같습니다

//a method on controller layer (in spring framework) 
@RequestMapping(...) 
public ShopDTO findShop(final Long shopId){ 
    Shop shop = shopService.getShopById(shopId); 
    ShopDTO shopDTO = shopMapper.toShopDTO(shop); 
    return shopDTO; 
} 

//A method on service layer 
@Transactional 
public Shop getShopById(final Long shopId){ 
    //some code to find an entity by id 
} 

* 참고 : 컨트롤러 레이어에 shopDTO에 가게 엔티티에서지도 어떤 코드입니다.

두 번째 방법은 다음과 같습니다

//a method on controller layer (in spring framework) 
@RequestMapping(...) 
public ShopDTO findShop(final Long shopId){ 
    ShopDTO shopDTO = shopService.getShopById(shopId); 
    return shopDTO; 
} 

//A method on service layer 
@Transactional 
public ShopDTO getShopById(final Long shopId){ 
    Shop shop = shopRepository.findById(shopId); 
    ShopDTO shopDTO = shopMapper.toShopDTO(shop); 
    return shopDTO; 
} 

* 참고 : 서비스 계층에 shopDTO에 가게 엔티티에서지도 어떤 코드입니다.

예를 들어 Spring 프레임 워크 코드를 사용합니다.

내 질문은 : 최고의 레이어는 매퍼 코드를 배치하는 것입니다. 왜 그런지 말해 줄 수 있니?

측면에서 컨트롤러 레이어에 어떤 유형의 로직을 배치해야하며 서비스 레이어에는 무엇을 배치해야합니까?

감사합니다.

+0

봄 작동하는 방법을 모르겠지만이 부분을하고있는 완전한 DLL을 가지고있는 것이 좋은 디자인이라고 생각합니다. 거기에 두 개의 개체 사이에 번역을 할 수 있습니다, 당신은 거기에 일부 번역 businessRule을 구현 사용할 수 있습니다. 따라서 다른 구성 요소에 대해이 DLL을 다시 사용할 수 있습니다. –

+0

답해 주셔서 감사합니다. 다른 매핑 구성 요소가 있습니다. 나는 그것이 최고임을 안다. 내가 물어보고 싶은 것은 컨트롤러 계층에 어떤 유형의 로직을 배치해야하며 서비스 계층에는 무엇을 배치해야하는지입니다. 나는 내 질문을 업데이트했다. –

+0

컨트롤러는 아무 것도하지 않습니다. 컨텍스트 항목 만 제공하고 비즈니스가 의미하는 기능을 제공합니다. 이 함수들에서 사용자는 기본 데이터 함수 (업데이트, 삭제, 생성)로 서비스 레이어를 호출합니다. 모든 논리는 이러한 서비스 기능에 있어야합니다. 컨트롤러가 최상의 "if logic"을 가질 수 없다면 이상적입니다. –

답변

1

두 번째 방법이 더 좋습니다.

이유는 레이어간에 특정 추상화가 필요하기 때문입니다. 컨트롤러는 ID로 가게를 가져와야합니다. 그렇게하면 컨트롤러를 변경하지 않고 데이터를 매핑하고 검색하는 방법을 변경할 수 있습니다. 그런 다음 다음 단계로 이동하여 데이터 액세스 계층과 서비스 계층의 경계에서 추상화를 가장 효과적으로 디자인하는 방법을 고려해야합니다.

컨트롤러에 어떤 로직이 있는지. 컨트롤러에서 들어오는 요청 및 API의 최종 응답과 관련된 로직을 배치해야합니다. 어쩌면 일부 유효성 검사 (요격은 요격기를 통해 수행하는 것이 더 낫다), 헤더 값을 추출하여 그걸로 일을하고 최종 예외 처리 절을 가져 API가 예기치 않게 외부로 유출되지 않도록하고 적절한 HTTP 5xx 응답. 일반적으로 컨트롤러에는 큰 메소드가 없어야하며, API 엔드 포인트를 노출하기 위해 기본 메소드가 있어야합니다.