복붙노트

[SPRING] JSF + Spring + Hibernate에서 DTO를 사용하는 방법

SPRING

JSF + Spring + Hibernate에서 DTO를 사용하는 방법

내가 주제 DTO에 관해서 새로운 것이라고 가정합니다. JSF, Spring 및 Hibernate와 함께 DTO를 사용하는 것이 맞는지 이해할 수 없습니다. 지금까지 데이터베이스에서 직접 생성 된 엔티티 bean을 비즈니스 계층과 표현 계층 모두에서 사용했습니다. 이제 DTO 방식을 사용하기로 결정했지만 어떻게 도움을 줄 수 있는지 이해할 수 없습니다. 예를 들어 사용자 및 메시지의 두 클래스가 있고 사용자에게 더 많은 메시지가 연결되어있는 경우, 데이터베이스에서 DTO를 채우려면 어떻게해야합니까? 아니면 비즈니스 계층에서 수동으로 DTO를 채우고 있습니까? DTO 사용법에 대한 예를 게시 할 수 있습니까?

미리 감사드립니다. 문안 인사, 로베르토

해결법

  1. ==============================

    1.DTO는 데이터 전송 객체를 나타냅니다. 그것은 JSF, JPA 또는 Spring 주석과 같은 API / 아키텍처 특정 제한없이 일반 바닐라 Javabean 클래스가되어야합니다. 나. 외부 API를 가리키는 가져 오기 또는 FQN이 없어야합니다. 유일한 목표는 모듈 형 웹 응용 프로그램의 서로 다른 아키텍처간에 데이터를 전달할 수 있도록하는 것입니다.

    DTO는 데이터 전송 객체를 나타냅니다. 그것은 JSF, JPA 또는 Spring 주석과 같은 API / 아키텍처 특정 제한없이 일반 바닐라 Javabean 클래스가되어야합니다. 나. 외부 API를 가리키는 가져 오기 또는 FQN이 없어야합니다. 유일한 목표는 모듈 형 웹 응용 프로그램의 서로 다른 아키텍처간에 데이터를 전달할 수 있도록하는 것입니다.

    예를 들어, JPA / Hibernate 엔티티 bean을 지나치게 제한적인 비즈니스 또는 모듈성 이유로 인해 EJB 클래스를 넘어서 전달할 수 없기 때문에 JSF 관리 Bean 및 뷰의 모델 특성으로 사용하지 않으려는 경우, 이 클래스의 복사본을 만들고 느슨한 속성을 직접 매핑합니다. 원래:

    UserEntity userEntity = em.find(UserEntity.class, id);
    UserDTO userDTO = new UserDTO();
    userDTO.setId(userEntity.getId());
    userDTO.setName(userEntity.getName());
    // ...
    return userDTO;
    

    bean-to-bean 매핑을 다음과 같은 방법으로 쉽게 만들 수있는 라이브러리가 많이 있습니다.

    SomeLibary.map(userEntity, userDTO);
    

    그러나 평균 웹 응용 프로그램의 경우 DTO가 필요하지 않습니다. 이미 JPA 엔티티를 사용하고 있습니다. JSF 빈 / 뷰에서 이들을 사용하면됩니다.

    이 질문만으로도 실제로 DTO가 전혀 필요 없다는 것을 알 수 있습니다. 특정 비즈니스 제한으로 인해 차단되지 않았습니다. 그런 다음 프로젝트에 적용 할 수 있도록 디자인 패턴을 검색해서는 안됩니다. 복잡하지 않은 코드 / 유지 불가능한 코드 / 중복 된 코드의 형태로 실제 문제를 찾아서 적절한 디자인 패턴을 묻거나 찾을 수 있도록해야합니다. 일반적으로 중복 코드를 리팩토링하면 실제로 실현하지 않고도 새로운 디자인 패턴이 거의 자동으로 도입됩니다.

    좋은 예는 JPA 엔티티가 특정 목적을 위해 너무 큽니다 (즉, 엔티티가 실제로 필요한 것보다 훨씬 많은 속성을 포함하고있는 경우). 부분적으로 사용되는 엔티티가 많으면 서버 메모리가 낭비됩니다. 이 문제를 해결하기 위해 JPQL에서 생성자 표현식을 사용하여 생성하고 채우는 몇 ​​가지 등록 정보 만 기반으로 DTO 클래스 / 하위 클래스를 만들 수 있습니다.

  2. ==============================

    2.수동으로 또는 commons-beanutils 또는 Dozer와 같은 유틸리티를 사용하여 DTO를 채우기위한 두 가지 옵션이 있습니다.

    수동으로 또는 commons-beanutils 또는 Dozer와 같은 유틸리티를 사용하여 DTO를 채우기위한 두 가지 옵션이 있습니다.

    DTO의 일반적인 개념은 웹 서비스 나 JMS를 통해 느슨하게 결합 된 레이어와 같은 대부분의 아키텍처 계층에서 데이터를 전송하는 데 사용된다는 것입니다. 또한 DTO는보기에서 사용할 수 있으므로 웹 계층은 엔티티 상태 관리 문제와 매핑 혼란을 피하기 위해 엔티티와 다른 사용자에게 표시하는 데 사용할 수있는 객체를 가져옵니다.

    그러나 전형적인 애플리케이션의 경우 DTO가 불필요하다고 주장 할 것입니다. 가능한 LazyInitializationException에주의하십시오. JSF 빈과 뷰에서 엔티티를 사용하십시오. 내 경험에 따르면 엔티티는 대부분의 경우 DTO (새 클래스가 필요하지 않음)로 사용할 수 있으며 약간주의를 기울여 사용할 수 있습니다. 그리고 내가 소규모 프로젝트에서 DTO를 보았을 때, 불필요하게 복잡한 작업 만 수행했습니다.

  3. from https://stackoverflow.com/questions/5722036/how-to-use-dto-in-jsf-spring-hibernate by cc-by-sa and MIT license