2

아래에서는 사용 양식에서 지속성 계층으로의 데이터 흐름을 소개합니다. 그러나 어떤 객체가 MVC의 어떤 레이어에서 사용 가능해야하는지, 그리고 MVC의 다른 레이어간에 데이터가 어떻게 전송되어야하는지에 대해 의문을 가지십시오. 아래에 게시 된 코드는 Spring 프레임 워크의 코드입니다.다른 MVC 계층 간의 데이터 흐름

이제 우리는 사용자가 입력 한 양식 데이터를 보유하고있는 DTO (데이터 전송 개체) PatientForm을 가지고 있습니다.

public class Patient { 

private int id; 
private String name; 
private String medicineOne; 
private String medicineTwo; 

public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public String getMedicineOne() { 
    return medicineOne; 
} 
public void setMedicineOne(String medicineOne) { 
    this.medicineOne = medicineOne; 
} 
public String getMedicineTwo() { 
    return medicineTwo; 
} 
public void setMedicineTwo(String medicineTwo) { 
    this.medicineTwo = medicineTwo; 
} 
} 
PatientForm

은 데이터를 전송하지 않고, 제어부 PatientController에 전달하지만, 서비스 계층 PatientService 형태로 전달된다. Pesistent 엔티티 Patient에 DTO의 데이터 서비스 계층에

@PostMapping("/patient/addpatient") 
public ModelAndView addPatient(@ModelAttribute("patientform") PatientForm patient){ 
    patientService.addPatient(patient); 
    return new ModelAndView("redirect:/"); 
} 

PatientService 실제 전송이 이루어진다.

  1. 할까요 Controller layer 또는 Service layer 데이터를 전송 DTO에서 영구 엔티티 :

    public void addPatient(com.hp.view.form.PatientForm patientForm){ 
        String medicineOneName = patientForm.getMedicineOne(); 
        Medicine medicineOne = medicineService.findByName(medicineOneName); 
        if(medicineOne == null){ 
         medicineService.save(new Medicine(medicineOneName)); 
         medicineOne = medicineService.findByName(medicineOneName); 
        } 
    
        String medicineTwoName = patientForm.getMedicineTwo(); 
        Medicine medicineTwo = medicineService.findByName(medicineTwoName); 
        if(medicineTwo == null){ 
         medicineService.save(new Medicine(medicineTwoName)); 
         medicineTwo = medicineService.findByName(medicineTwoName); 
        } 
    
        List<Medicine> medicines = new ArrayList<>(); 
        medicines.add(medicineOne); 
        medicines.add(medicineTwo); 
    
        Patient patient = new Patient(); 
        patient.setName(patientForm.getName()); 
        patient.setMedicine(medicines); 
        patientRepository.save(patient); 
    } 
    

    여기에 위의 흐름에 따라 내 질문은?

  2. 컨트롤러에서 데이터 전송이 수행되면 모델 엔터티가 컨트롤러 계층에 선언됩니다. 데이터 전송이 서비스 계층에서 수행되면 DTO가 서비스 계층에서 선언됩니다. 다음 중 어느 것이 좋습니다?

  3. 내 서비스 계층에 내 엔터티 개체 인스턴스를 구체화했습니다 Patient. 이것이 문제를 일으키고 Spring Contianer가 Entity Bean을 관리하도록해야합니까?

Patient patient = new Patient(); 

답변

1

사실 나는 완전히 다른 접근 방식을 취할 것입니다. DTO는 잠재적으로 특정 웹 응용 프로그램 프레임 워크에 바인딩 될 수 있습니다. 그러면 서비스의 재사용 가능성이 줄어 듭니다. 대신 "DTO to entity converter"와 같은 것을 만들 수 있습니다. 다음과 같이 할 수 간단한 인터페이스 :

public interface DtoToEntityConverter<T, R> { 
    R getEntity(T t); 
} 

을 그리고 당신은 (간단한 경우에 람다를 사용하는 경우에도 나)와 같이 구체적인 클래스를 정의 할 수는 :

다음
@Component 
public class PatientFormConverter implements DtoToEntityConverter<PatientForm, Patient> { 

    public Patient getEntity(PatientForm form) { 
     // Conversion rules and stuff... 
    } 
} 

, 단지 컨트롤러에 해당 구성 요소를 삽입하고 환자 추가시 getEntity을 호출 할 때 :

addPatient(patientFormConverter.getEntity(patientForm)); 
0

당신이 (당신은 당신의 클래스를 초기화하지 않습니다. 내가 전자) 애플리케이션 컨텍스트는 당신의 bean을 관리 할 수 ​​있도록하고 명시 적없이 autowire하기 (다른 클래스에 포함) 수 그들을 초기화합니다.

1) 서비스 계층은 컨트롤러와 모델 사이의 중개자로 사용됩니다. 즉, 나머지 컨트롤러에 서비스를 자동으로 제공합니다.

2이고 세 번째 대답은 위에 설명되어 있습니다.

P.S .: 여기 autowiredependency injection -을 의미합니다. http://www.javatpoint.com/dependency-injection-in-spring

1

(1) 영구 엔티티 DTO에서 층 또는 층 서비스 데이터를 전송을 제어 하는가?

FormBeans 클라이언트/채널/종점 특정이므로 컨트롤러 층 (최소 길이, 최대 길이, 등등과 같은) 클라이언트 특정 검증을 수행 한 후 전달한다 엔티티 빈에 FormBean에 데이터를 변환해야 서비스 계층에 전달합니다. 3 계층 아키텍처에서 FormBeans를 인식하지 않아야하는 서비스 계층을 재사용 할 수 있어야합니다 (아래 설명 참조). 따라서 엔터티 개체를 수신하고 비즈니스 논리 처리 (비즈니스 유효성 검사 및 핵심 논리 수행, DAO/저장소와의 상호 작용)를 담당해야합니다. 클래스).

(2) 컨트롤러에서 데이터 전송이 수행되면 모델 엔터티는 컨트롤러 레이어에 선언 된 이됩니다. 그리고 데이터 전송이 서비스 에서 수행되면 계층은 DTO가 서비스 계층에서 선언됨을 의미합니다. 다음 두 가지 중 어느 것이 좋습니다 : ?

단일 서비스는 컨트롤러 또는 다른 웹 서비스와 같이 여러 끝점을 연결하기 위해 재사용/노출 될 수 있으며 각 끝점마다 다른 formbeans가 필요할 수 있으므로 컨트롤러 (끝점) 레이어가 끝점을 처리하는 것이 좋습니다 특정 유효성 검사를 수행 한 다음 올바른 엔티티 개체를 작성/전달합니다.

(3) 내 서비스 계층에서 내 개체 개체 환자의 인스턴스를 인스턴스화했습니다. 이 문제가 발생하고 스프링 컨테이너가 내 엔티티 bean을 관리하도록해야합니까?

아무런 문제가 없습니다. 엔티티 객체는 싱글 톤이 아니므로, 어떻게 수행했는지와 같이 서비스 내에서 만들 수 있습니다. 그러나 Spring이 이들을 관리하도록 허용한다면, 각 입력 요청마다 하나의 인스턴스가 생성되도록해야합니다. 이는 스프링 빈의 defaultscopesingleton이므로 request 범위로 변경해야하기 때문입니다.