본문 바로가기
반응형
Java

java entity -> dto 변환 stream, map, collect 사용 - 동작원리(1)

by brightGarden02 2023. 1. 2.

jpa를 사용하다가

entity에 dto를 적용할 때가 있었다.

 

entity를 dto로 변환하는 과정에서 stream, map, collect를 사용하였다.

동작원리를 알아보자.

 

 

코드는 AppointmentQueryService 클래스에서 findAppointmentByEmail() 메서드를 살펴보겠다.

findAppointmentByEmail() 메서드: 해당 email 멤버에 대한 예약 내역을 가져오는 메서드

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class AppointmentQueryService {

    private final AppointmentRepository appointmentRepository;
    private final MemberRepository memberRepository;
    private final DoctorRepository doctorRepository;

    public List<AppointmentDto> findAppointmentByEmail(String email) {

        Member member = findMember(email);

        List<Appointment> appointments = appointmentRepository.findByMemberId(member.getId());

        List<AppointmentDto> appointmentDtos = appointments
                .stream()
                .map(o -> new AppointmentDto(o))
                .collect(Collectors.toList());

        return appointmentDtos;
    }

 

 

 

우리는 stream, map, collect 사용부분에서

stream()을 보려고 한다.

List<AppointmentDto> appointmentDtos = appointments
        .stream()
        .map(o -> new AppointmentDto(o))
        .collect(Collectors.toList());

 

 

stream(): List<Appointment>로 되어있는 appointmens를 돌린다. stream()한다.

 

Collection 인터페이스는 Iterable 인터페이스를 상속받고 있으며

Collection 인터페이스에 stream()이 구현되어 있다.

 

 

stream() 메소드는 순차적인 stream을 리턴한다.

StreamSupport클래스에 있는 stream()메소드를 리턴한다.

 

 

stream(= the flow of data, a sequence of data)이란

데이터의 흐름이라고 보면 된다.

 

 

 

이제 구현체인 StreamSupport 클래스에 stream() 메소드를 살펴보자.

 

stream()메소드는 인터페이스 Spliterator에서

새로운 순차적인 또는 병렬적인 stream을 만든다.

 

코드는 Object.requiredNonNull(spliterator)를 통해서 null인지 확인하고

추상 클래스인 ReferencePipeline에서 stream에 대한 생성자를 만들어서 리턴한다.

 

 

다음은 추상 클래스 ReferencePipeline에 있는 Head() 생성자 코드이다.

 

 

 

즉, stream()을 사용하면

추상 클래스인 ReferencePipeline에서

stream에 대한 생성자를 만들어서 값을 리턴한다.

댓글


반응형
반응형