728x90

트랜잭션


7편에서 엔터티 객체를 통해 JPA기술로 도메인과 데이터베이스를 매핑하고, createMember메서드를 통해 저장할 수 있도록 구조를 설계했다.

 

createMember메서드를 호출하고 트랜잭션하여 저장을 완료하기 위한 Service의 비즈니스 로직을 마무리해야 한다.

@WebAdapter
@RestController
@RequiredArgsConstructor
public class RegisterMembershipController {

    private final RegisterMembershipUseCase registerMembershipUseCase;

    @PostMapping(path = "/membership/register")
    Membership registerMemeber(@RequestBody RegisterMembershipRequest request) {

//        request -> UseCase(inbounded port) -> Service (biz logic)
        RegisterMembershipCommand command = RegisterMembershipCommand.builder()
                .name(request.getName())
                .address(request.getAddress())
                .email(request.getEmail())
                .isValid(true)
                .isCorp(request.isCorp())
                .build();

        return registerMembershipUseCase.registerMembership(command);
    }
}
@UseCase
@Transactional
@RequiredArgsConstructor
public class RegisterMembershipService implements RegisterMembershipUseCase {

        private final RegisterMembershipPort registerMembershipPort;
        private final MembershipMapper membershipMapper;

    @Override
    public Membership registerMembership(RegisterMembershipCommand command) {
//Port --> Adapter (createMember -> save) --> new JpaEntity --> toDomain 
        MembershipJpaEntity jpaEntity = registerMembershipPort.createMember(
                new Membership.MembershipName(command.getName()),
                new Membership.MembershipAddress(command.getAddress()),
                new Membership.MembershipEmail(command.getEmail()),
                new Membership.MembershipIsValid(command.isValid()),
                new Membership.MembershipIsCorp(command.isCorp())
        );
        return membershipMapper.mapToDomainEntity(jpaEntity);
    }
}

 

정리해보면,

  1. 클라이언트에게 HTTP요청을 Controller에서 Request객체로 받는다.
  2. 빌더 패턴을 사용해 Command 명령객체를 생성하여 UseCase 인터페이스 어댑터에 보낸다.
  3. UseCase를 구현한 Service 계층은 Port의 메서드를 호출한다.
  4. Adapter는 Port의 구현체로 도메인 객체를 받아 매핑된 엔터티를 생성한다.
  5. 새로운 엔터티는 주입받은 Spring Data JPA의메서드에 의해 DB에 저장된다.
  6. Service는 저장된 엔터티를 받아와 Mapper의 mapToDomainEntity 메서드를 통해 도메인 객체로 변환한다.
  7. 변환된 객체는 HTTP 응답으로 반환된다.

+ Recent posts