728x90

* RxJava 권장하는 학습순서

  1. Observable 클래스 명확하게 이해 (특히 뜨거운(Hot) Observable과 차가운(Cold) Observable의 개념을 꼭 이해해야 함)

  2. 간단한 예제로 map(), filter(), reduce, flatMap() 함수의 사용법을 익힙니다.

  3. 생성 연산자, 결합 연산자, 변환 연산자 등 카테고리별 주요 함수를 공부

  4. 스케줄러의 의미를 배우고 subscribeOn()과 observeOn() 함수의 차이를 알아둡니다.

​5. 그 밖의 디버깅, 흐름 제어 함수를 익힙니다.

 

2장(Observable) => 3장(map-filter-reduce) => 4장(주요 연산자) => 5장(RxJava 때문에 달라지는 비동기 프로그래밍, 스케줄러) => 6장(RxAndroid) => 7장(디버깅, 예외처리)

  • 자바 8을 사용하지 않아도 됨. 자바 8에서 제공하는 Consumer, Predicate, Function과 같은 함수형 인터페이스를 자체 구현했으므로 자바 6 이상이면 동작.

    • But, 8의 람다 표현식과 함수 레퍼런스를 활용하는 코드는 가독성을 좋게함. (람다식 & 함수 레퍼런스 공부)

------------------------------------------------------------------------------------------------

 

1. RxJava의 각 개념

 

(1) Observable

Observable.just(text)

- 관찰 가능한, 즉 데이터를 방출하는 스트림

- Observable.just(text)라고 하면, Observable이 text라는 데이터 하나를 just 방출했다고 이해

 

 

(2) Observer

.subscribe(fetchObserver());

- Observable에서 흘러나온 데이터를, Observer가 subscribe(구독)해서 반응

 

==> 이 때 이에 대한 연결(구독) 자체를 (3) Subscription이라고 하는 것

 

(4) Scheduler

- multi-thread를 적용하고자 할 때 사용.

.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

- SubscribeOn은 main-thread가 아닌, worker-thread를 지정하는 것

- ObserveOn은 데이터를 가공해서 써먹을 때, 어디에 결과를 보낼 것이냐는 것

 

 

 

+

 

1. Hot Observable vs. Cold Observable

- Hot Observable: Observable을 생성하자마자 아이템들을 흘려보냄. 마우스 이벤트 , 키보드 이벤트 , 시스템 이벤트등이 주로 사용된다.

- Cold Observable: 생성하자마자가 아니라, 실행을 미루고 있다가 Subscribe할때 아이템들을 흘려보냄. 누가 구독해주지 않으면 데이터를 배출을 하지 않음. 일반적인 웹 요청, 데이터베이스 쿼리등이 사용되며 내가 요청하면 결과를 받는 과정을 거친다.

 

일반적인 방법이 Hot Observable이고,

Cold Observable은 fromCallable등의 Operator로 구현해야함.

 

 

2. fromCallable

- Callable은 Generic으로 받은, 오브젝트 타입으로 value를 return 해주는, Thread에 전달할 작업

- Callable과 Runnable의 공통/차이

공통: 비슷하게, 다른 쓰레드에 의해서 실행되어질 수 있는 클래스 객체를 위한 인터페이스.

차이: 그러나 Callable은 (Runnable처럼 바로 Thread에 인자로 전달할 수 없고) ThreadPool을 사용해서 전달함.

       또한 Runnable은 return값이 없고 Exception을 낼 수 없으나, Callable은 return이 존재하고, Exception을 낼 수 있음.

 

 

 

1. Observable 세부 사항

RxJava의 Observable은 세가지의 알림을 구독자에게 전달

  • onNext : Observable이 데이터의 발행을 알린다. 기존의 옵서버 패턴과 같음.

  • onComplete : 모든 데이터의 발행을 완료했음을 알린다. onComplete이벤트는 단 한번만 발생하며, 발생한 후에는 더 이상 onNext 이벤트가 발생해선 안 된다.
  • onError : 에러 발생을 알림. onError 이벤트가 발생하면 이후에 onNext 및 onComplete 이벤트가 발생하지 않는다. 즉, Observable의 실행을 종료.

 

2. Disposable 객체

  • void dispose() / boolean isDisposed() => 2개 함수만 존재

  • dispose()

    • Observable에게 더 이상 데이터를 발행하지 않도록 구독을 해지하는 함수

    • Observable이 onComplete 알림을 보냈을 때, 자동으로 dispose()를 호출해

      Observable과 구독자의 관계를 끊는다. => 따로 dispose() 호출 X

  • isDisposed()

    • Observable이 데이터를 발행하지 않는지 (구독을 해지했는지) 확인하는 함수

    • 구독을 해지했으면 -> true

https://www.youtube.com/watch?v=_MI5X0jrfIo

 

 

 

 

 

 

 

 

Reference

https://dev-daddy.tistory.com/26

https://taeiim.tistory.com/entry/RxJava2-1-%EB%A6%AC%EC%95%A1%ED%8B%B0%EB%B8%8C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EA%B3%BC-RxJava

https://developer88.tistory.com/86

https://developer88.tistory.com/87

https://javaexpert.tistory.com/794

https://taeiim.tistory.com/entry/RxJava2-2-Observable-Single-Maybe-%EB%9C%A8%EA%B1%B0%EC%9A%B4%EC%B0%A8%EA%B0%80%EC%9A%B4-Observable-%ED%8C%A9%ED%86%A0%EB%A6%AC%ED%95%A8%EC%88%98?category=759183

 

728x90

'Dev > Java' 카테고리의 다른 글

[Java] Java SE, EE, ME, FX의 차이  (0) 2019.10.16
[Java] Calendar 객체 사용시 'set' not working  (0) 2019.09.19
[Java] Singleton Pattern 사용시  (0) 2018.10.02
728x90

Java SE: Java Platform, Standard Edition

Java SE은 추상 Java 플랫폼을 기술하는 스펙입니다. 이는 PC 데스크탑 컴퓨터에서 작업 그룹 서버까지 네트워크 중심 엔터프라이즈 애플리케이션을 빌드하고 배치하기 위한 기반을 제공합니다. Java SE는 Java Software Development Kit(SDK)으로 구현됩니다.

Rule Execution Server는 100% Java SE 코드로 규칙 세트를 실행할 수 있습니다. JMS(Java Message Service) 제공자 또는 비 Java EE ESB(Enterprise Service Bus)에서 규칙을 실행하거나 배치를 실행하는 등의 순수 Java SE 실행에 대한 많은 유스 케이스가 있습니다.

 

즉, 자바 표준 에디션은 가장 기본이 되는 에디션입니다. 흔히 자바 언어라고 하는 대부분의 패키지가 포함된 에디션이며

주요 패키지로는 java.lang.*, java.io.*, java.util.*, java.awt.*, javax.rmi.*, javax.net.* 등이 있습니다.

 

Java EE: Java Platform, Enterprise Edition

Java EE는 Java SE 스펙을 기반으로 합니다. 이는 다수 벤더와 선두 업체 사이의 협업을 나타내며 애플리케이션을 위한 인프라스트럭처 지원을 제공합니다.

Java EE 프레임워크에서, 규칙을 두 레벨로 추가합니다.

  • 동적 비즈니스 로직 및 태스크 플로우를 관리하기 위해 규칙을 애플리케이션 계층에 추가합니다.
  • 페이지 플로우와 워크플로우를 사용자 정의하고 세션 상태를 기반으로 사용자 정의 페이지를 구성하기 위해 규칙을 프리젠테이션 계층에 추가합니다.

Java EE는 이식 가능 및 확장 가능이며 기존 통합 및 EJB 아키텍처 기반 컴포넌트를 지원합니다. Java EE는 이름 지정, 트랜잭션 관리, 동시성, 보안, 데이터베이스 액세스 등 공통 표준 서비스의 완전한 세트를 정의하고 지정하여 엔터프라이즈 애플리케이션을 단순화합니다.

Java EE는 또한 Java EE 애플리케이션 컴포넌트의 인스턴스를 수용하고 관리하는 컨테이너 모델을 정의합니다. 컨테이너는 차례로 Java EE 서버 안에 수용됩니다.

 

즉, 자바로 구현되는 웹프로그래밍에서 가장 많이 사용되는 JSP, Servlet을 비롯하여, 데이터베이스에 연동하는 JDBC, 그 외에도 JNDI, JTA, EJB 등의 많은 기술들이 포함되어 있습니다.

Java SE와 Java EE

다음 다이어그램은 Java SE와 Java EE에서 Rule Execution Server 스택을 설명합니다.

애플리케이션에서 트랜잭션 관리, 웹 컨테이너 또는 보안 등의 서비스를 요구하는 경우, 필요한 필요한 Java 확장기능을 Java SE 플랫폼에 추가하거나전체 Java EE 애플리케이션 서버를 변경할 수 있습니다. 예를 들어, Java Management Extensions(JMX)는 애플리케이션의 컴포넌트와 서비스의 라이프사이클을 관리하기 위한 확장기능입니다. 또한 Java SE 애플리케이션에서 JMX를 사용할 수 있습니다. JMX 표준을 사용하여 디버깅 및 관리에 유용한 원격 특성 검사 및 조작을 이용할 수 있습니다.

 

 

+ 추가적으로 이 이외에도

Java ME와 Java FX가 존재

 

Java ME: Java Platform, Micro Edition
자바 ME 플랫폼에서는 모바일 폰과 같이 자바 프로그래밍 언어 기반의 어플리케이션이 보다 조그만 가상 머신으로 동작시킬 수 있는 기능과 API를 제공합니다. 물론 자바 SE API의 하부 구조로 API가 구성되어 있기 때문에 일관성 있는 개발이 가능하게 됩니다. 작은 장치에서 동작하는 자바 어플리케이션 개발에 필요한 전용 클래스 라이브러리들을 제공하며 자바 EE 플랫폼 서비스의 클라이언트 역할을 수행하게 될때도 있습니다.


Java FX
경량 사용자 인터페이스 API를 사용하여 리치 인터넷 어플리케이션을 만들 때 사용됩니다. JavaFX 어플리케이션은 하드웨어 수준에서 가속기능을 사용할 수 있는 그래픽과 미디어 엔진을 갖추고 있어 보다 클라이언트의 성능에 신경을 써야하는 분야에서 사용하면 좋습니다. JavaFX 어플리케이션 또한 자바 EE 플랫폼 서비스의 클라이언트 역할을 담당할 수 있습니다. 

 

 

Reference

https://www.ibm.com/support/knowledgecenter/ko/SSQP76_8.9.1/com.ibm.odm.dserver.rules.res.managing/topics/con_javase_javaee_applis.html

https://hashcode.co.kr/questions/669/%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-seeeme%EC%9D%98-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EB%AD%94%EA%B0%80%EC%9A%94

https://210life.tistory.com/entry/Java-EE%EC%99%80-Java-SE%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

728x90

'Dev > Java' 카테고리의 다른 글

RxJava 이해  (0) 2020.02.03
[Java] Calendar 객체 사용시 'set' not working  (0) 2019.09.19
[Java] Singleton Pattern 사용시  (0) 2018.10.02
728x90

[현상]

1. 나는 2개의 Calendar 객체를 각기 다르게 셋팅해서, 두 객체를 after 메소드로 비교하려고 했다.

2. A 객체는 SimpleDateFormat을 사용하여 setTime()로 날짜를 설정했고

3. B 객체는 set()만 사용하여 날짜를 설정하려고 했다.

 

한마디로 아래와 같은 상황인데

    Calendar calendarA = Calendar.getInstance();
    calendarA.set(year, monthOfYear, dayOfMonth, 0, 0, 0);

    Calendar calendarB = Calendar.getInstance();
    calendarB.setTime(dateformat.parse(specificDateStr));
    calendarB.set(Calendar.HOUR_OF_DAY, 0);
    calendarB.set(Calendar.MINUTE, 0);
    calendarB.set(Calendar.MILLISECOND, 0);

    if (calendarA.after(calendarB)) {
    	//비교했을 때 수행하려는데... 문제는...	
    }

 

예를 들어 오늘이 2019-09-20일 때,

calendarA는 2019-09-18로 설정하고, calendarB는 2019-09-19로 설정하려고 한다면,

after()메소드로 두 객체를 비교하려는 부분에서

calendarB는 19일이지만, A는 20일로 getInstance했을때의 초기값인 오늘로 설정된다는 것이었다.

 

DatePickerDialog를 쓰려고 하다보니 DateSet에서는 int값3개인데 굳이 그걸 또 setTime()으로 쓰기엔 번거로운 면이 있어서

set() 메소드를 써야하는데 이런 결과를 주니까 ?????인 상태

 

    Calendar calendarA = Calendar.getInstance();
    calendarA.set(year, monthOfYear, dayOfMonth, 0, 0, 0);
    calendarA.getTime(); // 어째서인지 강제로 업데이트해주는 식으로 getTime()메소드를 해줘 갱신되었다

    Calendar calendarB = Calendar.getInstance();
    calendarB.setTime(dateformat.parse(specificDateStr));
    calendarB.set(Calendar.HOUR_OF_DAY, 0);
    calendarB.set(Calendar.MINUTE, 0);
    calendarB.set(Calendar.MILLISECOND, 0);

    if (calendarA.after(calendarB)) {
    	//비교했을 때 수행하려는데... 문제는...	
    }

 

그래서 디버깅 연결하면서 로그를 찍어보려고, 위처럼 한번 getTime()을 했더니, 갱신이 되었다.

원래 이렇게 써야했던건가..? 내가 기초가 부족했던건가??? 싶어서 멘붕이 왔는데,

나와 같은 아래의 질문을 가진 사람과 답변이 있는 stackoverflow QnA를 발견...

직렬화 어쩌고 버그같은데...

 

https://stackoverflow.com/questions/1407007/is-calling-javas-calendar-gettime-necessary-to-update-the-object

 

Is calling Java's Calendar.getTime() necessary to update the object?

I came across a comment in some java code that states that getTime() needs to be called to update the Calendar object. Is this true? I cannot find anything that says that this is necessary. Here's...

stackoverflow.com

728x90

'Dev > Java' 카테고리의 다른 글

RxJava 이해  (0) 2020.02.03
[Java] Java SE, EE, ME, FX의 차이  (0) 2019.10.16
[Java] Singleton Pattern 사용시  (0) 2018.10.02
728x90

1. Singleton Pattern이란?

 

- 싱글톤 패턴은 하나의 프로그램 내에서 하나의 객체만을 사용해야하는 상황에 주로 사용된다.

  (즉, 어플리케이션 전체 영역에서 하나의 클래스의 단 하나의 인스턴스를 생성하는 것)

   환경설정 관리 클래스나 커넥션 풀과 같이 pool 형태로 관리되는 클래스로 주로 공통클래스에 사용되는 것이 일반적이다.

 

 ex. 로그인 시 로그인한 사용자 정보를 처음에만 셋팅하는 UserData가 있다고 가정하자. 로그인 후, 로그아웃될 때까지 단 1번만 셋팅하면 되는 데이터인데, 이를 매번 사용할 때마다 새로운 UserData 객체로 생성하게 된다면, 자원 낭비 또는 참조하는 객체의 위치가 꼬이는 일이 발생할 수 있다.

 

2. Singleton 구현에서 주의 할 점

- 생성자를 private로 생성하여, 다른 외부 클래스에서 싱글톤 클래스를 new로 구성하지 못하게 하는 부분이다.

  싱글톤 클래스의 인스턴스를 타 클래스에서 사용하기 위해서는 getInstance()를 호출해야만 한다. 

 

- Java에서 singleton 멤버변수는 static 이어야한다는 것과 Singleton 클래스의 생성자는 private / protected 이어야한다는 것을 꼭 유념해야한다. private 일 경우는 결코 new 를 이용하여 인스턴스의 중복 생성을 방지하는 셈이기도 하나 상속이 되지 않는다는 단점이 있어 protected로 대게 선언한다.

 

 

 

Reference

http://mkil.tistory.com/199

http://tokisum.tistory.com/8

http://jeong-pro.tistory.com/86

728x90

'Dev > Java' 카테고리의 다른 글

RxJava 이해  (0) 2020.02.03
[Java] Java SE, EE, ME, FX의 차이  (0) 2019.10.16
[Java] Calendar 객체 사용시 'set' not working  (0) 2019.09.19

+ Recent posts