인프런 커뮤니티 질문&답변

윤지상님의 프로필 이미지
윤지상

작성한 질문수

Kevin의 알기 쉬운 RxJava 1부

변환 연산자 (1)

groupby 질문있습니다!

해결된 질문

작성

·

254

1

groupby 연산자를 사용하면.. 

db 쿼리 처럼 특정 컬럼기준으로 합계를 구한다던가.. 계산된 데이터를 확인하는 용도가 아닌거 같은데요..

groupby 를 사용해도 결국엔 filter 연산자를 사용해서 내가 원하는 데이터를 걸러내야 하는거 같은데요..

차라리 이러면 생성자로부터 통지받은 데이터를 애초부터 groupby 를 사용하지 않고 filter 연산자로만 걸러내는방식이랑 어떤점이 다를까요?

답변 5

1

Kevin님의 프로필 이미지
Kevin
지식공유자

아니에요. 부족하지만 저도 제가 아는걸 다른분들께 공유하면 보람도 되고, 더불어 저도 더 성장할 수 있고 또 아기 분유값도 벌 수 있어서 좋습니다. ^^;; 지상님도 개발자로써 멋진 인생 살아가시길 기원하겠습니다. 감사합니다!

0

윤지상님의 프로필 이미지
윤지상
질문자

존경합니다. 직장과 육아가 있는데 시간쪼개서 강의도 제작하시니 반성하게 되네요 ! 화이팅입니다! 

0

Kevin님의 프로필 이미지
Kevin
지식공유자

현재 Spring Reactive Web Applications 강의를 준비하고 있는 중입니다. 1부는 Reactor 위주이구요. 2부는 WebFlux를 이용한 Reactive Web Application 을 만들어보는것입니다. 직장이랑 육아때문에 강의 제작할 수 있는 작업 시간이 많이 나지않아서 강의 하나 올리는데 기간이 꽤 걸리네요. ^^; 제 개인적인 바램으로는 겨울이 가기 전에 오픈할 수 있었으면 하는 바램이에요. RxJava 강의를 오픈할때부터 Spring 베이스의 Reactive Application을 염두에 두고 있었으니까 죄송하지만 조금만 기다려주시면 감사드릴게요. 충분한 답변이 되셨다고 하니 다행입니다. ^^

0

윤지상님의 프로필 이미지
윤지상
질문자

아 자세한 답변 너무나도 감사합니다! 다시 작성해주신 코드를 보니 groupby 를 사용하는 목적을 제대로 이해했네요! 

혹시 추후 Spring 기반의 Mono Flux 를 다루는 API 서버 리액터 프로그래밍 강좌도 준비하실 계획없으세요?ㅎㅎ 

저도 그렇고 다들 스프링 리액터 강좌를 기다리시는 분들이 많을거 같네요! ^^

0

Kevin님의 프로필 이미지
Kevin
지식공유자

말씀하신대로 사용한 두번째 예제 코드에서 filter 사용은 불필요한게 맞는것 같습니다.

단순히 쉬운 예를 보여드리려고 한 의도가 있었는데 groupBy()를 설명하기에는 적절하지 않은 예인것 같네요.

groupBy()는 말씀하신대로 그룹별로 묶어서 어떤 처리를 할 수 있는 Operator가 맞습니다. 

그래서 groupBy() 사용에 좀 더 적절한 예제 코드를 추가로 올려두었습니다. github에 올려둔 소스 코드를 잠깐 설명 드리자면,

==== ObservableGroupByExample03 ===

/**
* 제조사를 그룹으로 묶어서 자동차 명을 출력하는 예제
*/
public class ObservableGroupByExample02 {
public static void main(String[] args) {
Observable<GroupedObservable<CarMaker, Car>> observable =
Observable.fromIterable(SampleData.carList)
.groupBy(Car::getCarMaker);

observable
.flatMapSingle(carGroup ->
carGroup.flatMap(car ->
Observable.just(car.getCarName()))
.toList()
)
.subscribe(System.out::println);

}
}

: 제조사별로 자동차 명만 출력하는 예제입니다. groupBy( ) 연산자는 Observable<GrouppedObserveble>을 반환을 하는데 이 GrouppedObservable을 flatMapSingle( ) 연산자를 이용해서 해당 그룹별로 통지되는 Car 객체 중에 CarName만 얻은 후,(CarName을 얻기 위해서 내부적으로 flatMap() 연산자를 한번 더 사용했음)  toList()를 통해 Single로 CarName이 담긴 list를 통지하는데요.  출력 결과는 아래와 같습니다.

=====================================

[티볼리, G4렉스턴]

[SM6, SM5]

[말리부, 트래버스, 트랙스]

[쏘렌토, 팰리세이드]

그리고 추가적으로 네번째 예제 코드를 하나 더 추가했습니다.

==== ObservableGroupByExample04 ====

/**
* 제조사 별로 그룹으로 묶은 후, 제조사 별 차량 가격의 합계를 구하는 예제
*/
public class ObservableGroupByExample03 {
public static void main(String[] args) {
Observable<GroupedObservable<CarMaker, Car>> observable =
Observable.fromIterable(SampleData.carList)
.groupBy(car -> car.getCarMaker());

observable
.flatMapSingle(carGroup ->
Single.just(carGroup.getKey())
.zipWith(
carGroup.flatMap(car ->
Observable.just(car.getCarPrice()))
.reduce((p1, p2)-> p1 + p2)
.toSingle()
, (key, sum) -> key + ": " + sum
)
)
.subscribe(System.out::println);
}
}

: 제조사 별 차량 가격의 합계를 구하는 예제인데요.  위의 ObservableGroupByExample03  코드와 거의 같은데 다른점은 제조사 별 차량 가격의 합계를 구하기 위해 reduce( ) 연산자를 한번 더 사용했다는 거구요.

차량 가격 합계 앞에 제조사를 표시해주기 위해서 zipWith( ) 연산자를 추가적으로 사용을 했습니다.

출력 결과는 아래와 같습니다.

================================

CHEVROLET: 91000000

HYUNDAE: 61000000

SSANGYOUNG: 66000000

SAMSUNG: 75000000

지적해주신 부분은 다른 수강생 분들도 아셔야 될테니 제가 시간될 때 코드 설명과 함께 새소식 공지로 다시 올리도록 할께요.

좋은 지적 해주셔서 감사합니다. 다른 의견 있으시면 언제든지 문의 주세요

감사합니다.

윤지상님의 프로필 이미지
윤지상

작성한 질문수

질문하기