1385 Commits

Author SHA1 Message Date
haerong22
0698f6e4f6 #38 hexagonal: docker compose - banking service 2023-07-25 18:04:18 +09:00
haerong22
b2d17c133e #38 hexagonal: banking service - register bank account 2023-07-24 21:49:23 +09:00
haerong22
cbf4f49fd6 #38 hexagonal: banking service - init 2023-07-24 20:43:05 +09:00
haerong22
afc71221b1 #38 hexagonal: docker-compose 2023-07-23 20:45:51 +09:00
haerong22
ccfb9fa3b4 #38 hexagonal: entity pk 타입 변경(String -> Long) 2023-07-22 20:57:57 +09:00
haerong22
0a4f5cc714 #38 hexagonal: 도커 플러그인 실행방법 2023-07-21 18:47:53 +09:00
haerong22
4eb93bc538 #38 hexagonal: dockerizing 2023-07-20 18:47:11 +09:00
haerong22
d33869db03 #38 hexagonal: common 모듈 분리 2023-07-19 20:27:39 +09:00
haerong22
a8803a1a91 #38 hexagonal: register membership test 2023-07-18 21:29:09 +09:00
haerong22
61b8775c9e #39 reactive programming: completable future - blocking 2023-07-17 18:42:04 +09:00
haerong22
ac03b1be8f #39 reactive programming: completable future - common 2023-07-16 18:49:13 +09:00
haerong22
4de62ecf23 #39 reactive programming: completable future - init 2023-07-16 18:36:14 +09:00
haerong22
de2e071cc0 #36 rxjava: 데이터 변환 - toList, toMap 2023-07-05 23:44:30 +09:00
haerong22
8db3256035 #38 hexagonal: find membership 2023-07-04 22:36:59 +09:00
haerong22
dd9579fc59 #38 hexagonal: register membership 2023-07-03 21:21:53 +09:00
haerong22
4f3652c68c #38 hexagonal: swagger 설정 2023-07-03 21:21:08 +09:00
haerong22
5f1b528e55 #38 hexagonal: 공통 어노테이션 생성 2023-07-03 20:39:20 +09:00
haerong22
f83bd6a132 #38 hexagonal: membership 도메인 설계 2023-07-03 20:27:54 +09:00
haerong22
8cef5e30b7 #38 hexagonal: membership service 모듈 생성 2023-07-03 20:21:36 +09:00
haerong22
3fbb9f458d #38 hexagonal: init 2023-07-03 19:47:26 +09:00
haerong22
a45c9b38c1 #37 java: covid - scraper & result 2023-05-29 17:52:44 +09:00
haerong22
d88f014b79 #37 java: covid - pdf exporter 2023-05-29 17:52:11 +09:00
haerong22
03fb626a02 #37 java: covid - excel exporter 2023-05-29 17:51:57 +09:00
haerong22
3c12589f2b #37 java: covid - dto 2023-05-29 17:51:32 +09:00
haerong22
f90de8a155 #37 java: resume - controller 2023-05-28 19:06:35 +09:00
haerong22
875d91d4a0 #37 java: resume - view 2023-05-28 19:05:47 +09:00
haerong22
84061c60d5 #37 java: resume - domain 2023-05-28 19:05:26 +09:00
haerong22
c5a788f5e5 #37 java: daum book search api 2023-05-27 21:05:49 +09:00
haerong22
480b3eaf94 #36 rxjava: 데이터 변환 - concatmap, switchmap 2023-05-26 23:46:46 +09:00
haerong22
3132be2e0e #36 rxjava: 데이터 변환 - map, flatmap 2023-05-26 23:34:35 +09:00
haerong22
34a783b0be #37 java: kakao map api 2023-05-25 21:33:59 +09:00
haerong22
1b4d16c421 #37 java: api 활용 2023-05-24 20:30:12 +09:00
haerong22
26b21420eb #37 java: itext api ex2 2023-05-24 14:49:43 +09:00
haerong22
975d461a85 #37 java: itext api ex 2023-05-24 14:38:02 +09:00
haerong22
e5aaffe0c0 #37 java: poi api ex2 2023-05-24 12:43:02 +09:00
haerong22
6b99c06e31 #37 java: poi api ex 2023-05-24 12:08:24 +09:00
haerong22
3747851cff #37 java: open weather api ex 2023-05-23 21:04:33 +09:00
haerong22
35d8416f44 #37 java: jsoup api ex 2023-05-23 19:14:29 +09:00
haerong22
a99b9caf90 #37 java: jsoup api 2023-05-23 18:06:26 +09:00
haerong22
8a17a41f5c #36 rxjava: filtering 2023-04-30 12:21:36 +09:00
haerong22
f931669090 #36 rxjava: 생성 연산자 2023-04-28 03:17:02 +09:00
haerong22
eaf7da0fd9 #36 rxjava: method reference 2023-04-28 00:32:13 +09:00
haerong22
d866cc3d1b #36 rxjava: functional descriptor 2023-04-26 01:32:41 +09:00
haerong22
0389c9341c #36 rxjava: functional interface ex 2023-04-26 01:15:38 +09:00
haerong22
110705ec37 #36 rxjava: functional interface 2023-04-26 01:14:02 +09:00
haerong22
55f43da1c9 #36 rxjava: completable 2023-04-26 00:59:36 +09:00
haerong22
ecb9c35490 #36 rxjava: maybe 2023-04-25 03:48:40 +09:00
haerong22
bd84db4003 #36 rxjava: single 2023-04-23 18:42:07 +09:00
haerong22
001089a034 #36 rxjava: flowable, observable 2023-04-22 18:31:49 +09:00
haerong22
c6b3fddc31 #36 rxjava: backpressure 2023-04-21 00:46:39 +09:00
haerong22
eeb0f86c6b #36 rxjava: utils 2023-04-20 00:23:02 +09:00
haerong22
4cb96ac29c #36 rxjava: hot, cold publisher 2023-04-19 23:36:54 +09:00
haerong22
f78db7e5c9 #36 rxjava: ex02 2023-04-14 03:25:34 +09:00
haerong22
4e152aab04 #36 rxjava: basic 2023-04-14 02:53:37 +09:00
haerong22
d125ae2959 #36 rxjava: init 2023-04-14 00:30:14 +09:00
haerong22
bd99fcc720 #31 loan: create domain - entry, balance 2023-03-29 00:50:07 +09:00
haerong22
83af0c334a #31 loan: approve judgement 2023-03-28 00:53:43 +09:00
haerong22
f063e89ea2 #31 loan: delete judgement 2023-03-28 00:42:02 +09:00
haerong22
07abdbdf45 #31 loan: update judgement 2023-03-28 00:27:02 +09:00
haerong22
d72d45e2ad #31 loan: get judgement 2023-03-28 00:15:02 +09:00
haerong22
24c00bb43c #31 loan: create judgement 2023-03-27 01:23:01 +09:00
haerong22
701c000c43 #31 loan: create judgement domain 2023-03-27 00:59:44 +09:00
haerong22
722ec7b875 #35 springboot: custom metric - gauge 2023-03-27 00:41:31 +09:00
haerong22
f59b306ad1 #35 springboot: custom metric - timer with aop 2023-03-26 01:45:56 +09:00
haerong22
fb2fd1b64d #35 springboot: custom metric - timer 2023-03-26 01:40:15 +09:00
haerong22
708269ac14 #35 springboot: custom metric - counter with aop 2023-03-26 01:14:13 +09:00
haerong22
b4144f9a56 #35 springboot: custom metric - counter 2023-03-26 01:08:13 +09:00
haerong22
4c83abd161 #35 springboot: custom metric - order ex 2023-03-26 00:54:02 +09:00
haerong22
456417e63d #35 springboot: grafana - traffic ex 2023-03-24 01:12:37 +09:00
haerong22
3079b463dd #35 springboot: prometheus 2023-03-23 02:05:41 +09:00
haerong22
286fb89c2f #35 springboot: actuator - basic 2023-03-22 01:39:01 +09:00
haerong22
6dfc13256b #35 springboot: actuator - init 2023-03-22 00:44:01 +09:00
haerong22
524ddcf50a #35 springboot: @Profile 2023-03-21 01:42:04 +09:00
haerong22
cd964ecf23 #35 springboot: external read - application.yml 2023-03-20 03:27:56 +09:00
haerong22
8bec270be5 #35 springboot: external read - @ConfigurationProperties validate 2023-03-20 03:21:31 +09:00
haerong22
7ba7b68e32 #35 springboot: external read - @ConfigurationProperties with constructor 2023-03-20 01:12:30 +09:00
haerong22
50c6a41536 #35 springboot: external read - @ConfigurationProperties 2023-03-20 01:04:59 +09:00
haerong22
ed31d8ad36 #35 springboot: external read - @Value 2023-03-20 00:41:23 +09:00
haerong22
368a14af3e #35 springboot: external read - Environment 2023-03-20 00:32:38 +09:00
haerong22
031a38085c #35 springboot: external read - init 2023-03-20 00:17:31 +09:00
haerong22
023d4ce0d2 #35 springboot: application properties 2023-03-16 01:10:26 +09:00
haerong22
11ede7084d #35 springboot: environment variables - spring env 2023-03-16 00:23:38 +09:00
haerong22
0b2f865a14 #35 springboot: environment variables - command line 2023-03-15 04:18:51 +09:00
haerong22
ae537d78f4 #35 springboot: environment variables - java system 2023-03-15 03:57:19 +09:00
haerong22
0a4198ba8f #35 springboot: environment variables - os 2023-03-15 03:48:07 +09:00
haerong22
01a3accd9e #35 springboot: environment variables - init 2023-03-15 03:44:15 +09:00
haerong22
70239ffc51 #35 springboot: importSelector 2023-03-15 03:17:30 +09:00
haerong22
851ba5c12b #35 springboot: use custom library(auto configuration) 2023-03-14 03:36:10 +09:00
haerong22
8e3e541013 #35 springboot: custom library(auto configuration) 2023-03-14 03:34:58 +09:00
haerong22
aba45ed1ce #35 springboot: use custom library 2023-03-14 03:12:17 +09:00
haerong22
66e464128b #35 springboot: custom library 2023-03-14 02:57:32 +09:00
haerong22
7cbbd57ac7 #35 springboot: @Conditional 2023-03-14 00:07:32 +09:00
haerong22
c208e032e8 #35 springboot: custom auto config init 2023-03-13 23:34:53 +09:00
haerong22
bec3d198ae #35 springboot: auto config - check bean 2023-03-12 01:28:13 +09:00
haerong22
db9c48eb4d #35 springboot: auto config - db config 2023-03-10 01:06:35 +09:00
haerong22
0713974837 #35 springboot: auto config - init 2023-03-10 00:51:29 +09:00
haerong22
eacde81521 #35 springboot: boot init 2023-03-08 01:28:44 +09:00
haerong22
ec2f86809a #35 springboot: my springboot 2023-03-08 01:01:22 +09:00
haerong22
9e802f05ec #35 springboot: embeded tomcat - start(spring) 2023-03-06 02:11:35 +09:00
haerong22
4f22ea3ba6 #35 springboot: embeded tomcat - start 2023-03-06 02:03:26 +09:00
haerong22
2199cd8b72 #35 springboot: embeded tomcat init 2023-03-06 01:49:15 +09:00
haerong22
822ed8893b #35 springboot: spring mvc - servlet container initialize 2023-03-03 01:29:20 +09:00
haerong22
81acd1d887 #35 springboot: add spring container 2023-03-03 01:19:36 +09:00
haerong22
ffbe50b5dc #35 springboot: servlet container initializer 2023-03-03 00:21:20 +09:00
haerong22
5c1adfbe5a #35 springboot: Servelt 등록 2023-03-02 01:37:13 +09:00
haerong22
d41bb00ffb #34 kotlin basic: enum class 2023-02-28 01:43:59 +09:00
haerong22
196b4b101d #34 kotlin basic: interface 2023-02-28 01:22:39 +09:00
haerong22
662584b0cb #34 kotlin basic: class, inheritance 2023-02-24 01:24:45 +09:00
haerong22
87eee6d0cd #34 kotlin basic: nullsafety, exception 2023-02-22 01:51:38 +09:00
haerong22
9bca47f239 #34 kotlin basic: if, when, for, while 2023-02-19 02:33:24 +09:00
haerong22
6933a0f29b #34 kotlin basic: variable, function 2023-02-16 01:55:26 +09:00
haerong22
a995bedfc7 #33 tdd(order-service): payment - package 2023-02-16 00:19:55 +09:00
haerong22
9bcc7518fa #33 tdd(order-service): payment - apply jpa 2023-02-15 01:35:53 +09:00
haerong22
7c66361794 #33 tdd(order-service): payment - api test 2023-02-15 01:21:59 +09:00
haerong22
f1c72f63f5 #33 tdd(order-service): payment - spring 2023-02-15 00:59:43 +09:00
haerong22
71bb50f3e2 #33 tdd(order-service): payment - pojo 2023-02-14 01:41:56 +09:00
haerong22
7a7fbefb95 #33 tdd(order-service): order - jpa 2023-02-14 00:25:31 +09:00
haerong22
66c8feb24b #33 tdd(order-service): order - api test 2023-02-14 00:15:47 +09:00
haerong22
b67acc7ea9 #33 tdd(order-service): order - spring boot test 2023-02-12 11:23:00 +09:00
haerong22
6593b196c0 #33 tdd(order-service): order - pojo 2023-02-10 01:39:13 +09:00
haerong22
8fbc086337 #33 tdd(order-service): update product - api test 2023-02-09 01:34:23 +09:00
haerong22
65cc3b0463 #33 tdd(order-service): update product - springboot test 2023-02-09 01:22:41 +09:00
haerong22
80c4fdb121 #33 tdd(order-service): update product - pojo 2023-02-09 01:13:47 +09:00
haerong22
6035b8ea22 #33 tdd(order-service): get product - api test 2023-02-08 01:37:50 +09:00
haerong22
e87891c8d8 #33 tdd(order-service): get product 2023-02-08 01:23:34 +09:00
haerong22
305d0369c3 #33 tdd(order-service): add product - jpa 2023-02-08 01:06:54 +09:00
haerong22
6c82ac7d6c #33 tdd(order-service): add product - bean, api test 2023-02-07 01:46:55 +09:00
haerong22
34e24a116b #33 tdd(order-service): add product - pojo 2023-02-07 00:53:03 +09:00
haerong22
b726431da3 #33 tdd(order-service): init 2023-02-07 00:26:14 +09:00
haerong22
61955aed67 #28 bulk upload - add thumbnail 2023-02-06 14:01:12 +09:00
haerong22
3d4ccecf46 #30 jpa basic: jpql - bulk 2023-02-06 03:07:50 +09:00
haerong22
de4b8dc94f #30 jpa basic: jpql - named query 2023-02-06 02:56:07 +09:00
haerong22
c09c5781a0 #30 jpa basic: jpql - fetch join 2023-02-06 01:52:53 +09:00
haerong22
41337aafb8 #30 jpa basic: jpql - path 2023-02-06 01:02:59 +09:00
haerong22
114bb71492 #30 jpa basic: jpql - function 2023-02-05 03:38:11 +09:00
haerong22
9c8ecdc113 #30 jpa basic: jpql - condition 2023-02-05 03:21:53 +09:00
haerong22
95f554e337 #30 jpa basic: jpql - type 2023-02-05 03:05:58 +09:00
haerong22
75749c6711 #30 jpa basic: jpql - join 2023-02-04 21:41:40 +09:00
haerong22
c4650ba936 #30 jpa basic: jpql - paging 2023-02-04 01:05:02 +09:00
haerong22
ec3b9f6533 #30 jpa basic: jpql - projection 2023-02-03 01:52:46 +09:00
haerong22
30dc9138c4 #30 jpa basic: jpql basic 2023-02-03 01:34:40 +09:00
haerong22
aa05a87543 #30 jpa basic: jpql 2023-02-03 00:46:59 +09:00
haerong22
8f08c33677 #30 jpa basic: value type collection 2023-02-02 02:16:43 +09:00
haerong22
24f31cc0a0 #30 jpa basic: immutable 2023-02-02 01:24:01 +09:00
haerong22
6a75b0faa0 #30 jpa basic: embedded 2023-02-02 01:09:53 +09:00
haerong22
3c35236261 #30 jpa basic: proxy - cascade 2023-02-01 00:44:36 +09:00
haerong22
ab9ee6cb4c #30 jpa basic: proxy - fetch type 2023-01-31 01:23:27 +09:00
haerong22
698623f2a4 #30 jpa basic: MappedSuperClass 2023-01-30 01:47:25 +09:00
haerong22
499ad11274 #30 jpa basic: inheritance 2023-01-30 01:35:21 +09:00
haerong22
4002eb8ce4 #32 multi module: build 2023-01-29 03:27:39 +09:00
haerong22
2e381a04d0 #32 multi module: db setting 2023-01-29 02:40:51 +09:00
haerong22
3894ada549 #32 multi module: handle exception 2023-01-29 02:07:10 +09:00
haerong22
e41d43cd65 #32 multi module: use common module 2023-01-29 01:51:43 +09:00
haerong22
d396757563 #32 multi module: module setting 2023-01-29 01:31:29 +09:00
haerong22
0e9ca9cbd9 #32 multi module: init 2023-01-28 01:15:23 +09:00
haerong22
74865252c2 #16 board: swagger test 2023-01-27 01:40:05 +09:00
haerong22
889d78a654 #16 board: test bug fix 2023-01-27 01:22:12 +09:00
haerong22
5f28a4c1fb #16 board: vault 2023-01-27 01:04:28 +09:00
haerong22
08248e9673 #16 board: security - environment variables 2023-01-27 00:11:40 +09:00
haerong22
f570ed4538 #16 board: kakao oauth - apply view 2023-01-26 01:11:58 +09:00
haerong22
48006d7b24 #16 board: kakao oauth - configuration 2023-01-26 01:11:20 +09:00
haerong22
5899dba9a4 #16 board: user account service 2023-01-26 01:10:06 +09:00
haerong22
bd07c8df14 #16 board: kakao oauth - response dto, test 2023-01-25 03:26:53 +09:00
haerong22
9bec8a1f77 #16 board: kakao oauth settings 2023-01-25 01:14:22 +09:00
haerong22
11d160b3fa #30 jpa basic: relation mapping 2023-01-24 20:25:25 +09:00
haerong22
b3d8efc094 #30 jpa basic: relation mapping - one to one 2023-01-24 20:13:10 +09:00
haerong22
7b69afd796 #16 board: child comment - view 2023-01-24 02:00:05 +09:00
haerong22
1ccb1e4db9 #16 board: child comment - logic implementation 2023-01-23 02:51:45 +09:00
haerong22
6835f7da1d #16 board: child comment - test data update and query test 2023-01-22 01:35:05 +09:00
haerong22
54b720e6ea #16 board: child comment - update domain 2023-01-22 01:15:24 +09:00
haerong22
ad95e5d318 #16 board: hashtag service view 2023-01-21 01:44:59 +09:00
haerong22
5e90ac5983 #16 board: hashtag service implementation 2023-01-21 01:36:44 +09:00
haerong22
4a0a3489eb #16 board: hashtag service test 2023-01-20 01:14:37 +09:00
haerong22
16f74f627b #16 board: add domain - hashtag 2023-01-19 03:55:04 +09:00
haerong22
b26fe0853f #16 board: update erd 2023-01-19 03:53:37 +09:00
haerong22
8d62ba1f92 #16 board: hashcode, equals 2023-01-19 00:20:38 +09:00
haerong22
7dc0502f23 #31 loan: create accept terms 2023-01-18 00:39:58 +09:00
haerong22
2df31f15ef #31 loan: get terms list 2023-01-18 00:00:20 +09:00
haerong22
5518075b62 #31 loan: create terms 2023-01-17 03:24:08 +09:00
haerong22
ad7dcf7b4e #31 loan: delete application 2023-01-17 03:06:06 +09:00
haerong22
acb28890ca #31 loan: update application 2023-01-17 02:59:52 +09:00
haerong22
f969a5e6fa #31 loan: get application 2023-01-17 02:50:52 +09:00
haerong22
668b078042 #31 loan: create application 2023-01-17 00:48:50 +09:00
haerong22
a7502e3c5f #31 loan: application entity 2023-01-17 00:21:56 +09:00
haerong22
af8b0ed0e9 #31 loan: delete counsel 2023-01-16 02:35:21 +09:00
haerong22
b87d68fd7e #30 jpa basic: relation mapping ex 2023-01-15 20:35:05 +09:00
haerong22
55c14c33d3 #30 jpa basic: relation mapping 2023-01-15 19:53:01 +09:00
haerong22
2c750fca68 #30 jpa basic: entity mapping ex 2023-01-14 21:52:03 +09:00
haerong22
e78fc39151 #30 jpa basic: entity mapping 2023-01-14 21:26:13 +09:00
haerong22
dbca3e6644 #31 loan: update counsel 2023-01-13 00:31:39 +09:00
haerong22
434fe64941 #31 loan: get counsel 2023-01-11 00:46:52 +09:00
haerong22
3917ffb7ba #31 loan: create counsel 2023-01-11 00:28:27 +09:00
haerong22
f3aa42938e #31 loan: common response 2023-01-11 00:27:41 +09:00
haerong22
fd8106c294 #31 loan: create counsel entity 2023-01-09 01:07:01 +09:00
haerong22
4992bcfe1b #31 loan: init 2023-01-09 00:49:23 +09:00
haerong22
d5310b28f1 #26 pharmacy: prod properties 2023-01-08 01:51:24 +09:00
haerong22
53c3e40ad4 #26 pharmacy: redis test 2023-01-06 00:59:01 +09:00
haerong22
03394386a4 #26 pharmacy: redis - cache pharmacyDto 2023-01-06 00:58:34 +09:00
haerong22
246c364ea5 #26 pharmacy: add redis 2023-01-05 07:35:38 +09:00
haerong22
a04491b148 #26 pharmacy: build project 2023-01-05 06:53:02 +09:00
haerong22
f240d89987 #26 pharmacy: direction controller test 2023-01-05 06:34:19 +09:00
haerong22
e30964612a #26 pharmacy: shorten url 2023-01-04 02:56:50 +09:00
haerong22
0207344263 #26 pharmacy: directionUrl, loadviewUrl 2023-01-04 00:50:03 +09:00
haerong22
e66729c3ba #26 pharmacy: form controller test 2023-01-04 00:37:29 +09:00
haerong22
5592d40f82 #26 pharmacy: output page 2023-01-03 03:36:21 +09:00
haerong22
90214e439f #26 pharmacy: main page - kakao postcode 2023-01-03 03:20:02 +09:00
haerong22
eae41a0e8b #26 pharmacy: main page - jquery, handlebars, bootstrap 2023-01-03 03:12:48 +09:00
haerong22
bbb8cde6ce #30 jpa basic: persistence context 2023-01-03 00:56:46 +09:00
haerong22
c30737417a #30 jpa basic: basic crud 2023-01-01 04:42:33 +09:00
haerong22
b0029e4624 #30 jpa basic: init 2023-01-01 04:11:13 +09:00
haerong22
490427b42f #25 spring cloud: prometheus + grafana 2022-12-31 18:49:51 +09:00
haerong22
a445ff6bbe #29 pass: send notification before class job 2022-12-30 00:49:37 +09:00
haerong22
dc23c3405b #29 pass: notification entity 2022-12-30 00:36:49 +09:00
haerong22
5d65e7965d #28 bulk upload - return video url 2022-12-29 16:18:33 +09:00
haerong22
d5d9b05102 #25 order-service: sleuth + zipkin 2022-12-28 21:39:48 +09:00
haerong22
4e4631e359 #25 user-service: sleuth + zipkin 2022-12-28 21:39:18 +09:00
haerong22
07d0f5137a #29 pass: add passes job 2022-12-28 01:38:53 +09:00
haerong22
336832b1a7 Merge branch 'master' of https://github.com/haerong22/Study 2022-12-28 01:38:15 +09:00
haerong22
3ecf148a83 #29 pass: entity - bulk_pass, user_group_mapping 2022-12-28 01:38:04 +09:00
haerong22
3e2601e9d7 #25 user-service: circuit breaker 2022-12-27 22:20:51 +09:00
haerong22
eee9be0c5c #29 pass: expire passes job 2022-12-25 15:26:10 +09:00
haerong22
fcd4b5dec1 #29 pass: create entity 2022-12-24 16:26:19 +09:00
haerong22
f42ccfc33b #28 bulk upload - multipart file 2022-12-23 19:59:18 +09:00
haerong22
edeee8b68d #29 pass: database setting 2022-12-23 01:41:16 +09:00
haerong22
b0b5fbde6d #29 pass: spring batch simple example 2022-12-23 01:22:02 +09:00
haerong22
4840835d4e #29 pass: init 2022-12-23 01:13:57 +09:00
haerong22
5f956009c7 #28 bulk upload - tus protocol 2022-12-22 21:47:15 +09:00
haerong22
50af3889ef #25 order-service: order kafka producer - kafka connect 2022-12-21 21:01:52 +09:00
haerong22
f55619ac15 #25 order-service: mariadb 2022-12-21 20:23:35 +09:00
haerong22
2391d9b1a5 #25 order-service: kafka producer 2022-12-21 19:57:11 +09:00
haerong22
670a02bf3c #25 catalog-service: kafka consumer 2022-12-21 19:56:34 +09:00
haerong22
ab0a48f770 #27 stock: race condition solution 3 - redis(redisson) 2022-12-21 00:50:51 +09:00
haerong22
148ceb5e3f #27 stock: race condition solution 3 - redis(lettuce) 2022-12-21 00:17:05 +09:00
haerong22
a0184500bc #27 stock: race condition solution 2 - db(named lock) 2022-12-20 23:07:19 +09:00
haerong22
7a5a641de1 #27 stock: race condition solution 2 - db(optimistic lock) 2022-12-20 22:56:38 +09:00
haerong22
59d0c438c5 #27 stock: race condition solution 2 - db(pessimistic lock) 2022-12-20 22:46:41 +09:00
haerong22
68f33e2ec5 #27 stock: race condition solution 1 - java syncronized 2022-12-20 22:35:43 +09:00
haerong22
a5ba98db4b #27 stock: stock decrease - race condition 2022-12-20 22:23:58 +09:00
haerong22
be1e1343a4 #27 stock: init 2022-12-20 22:03:49 +09:00
haerong22
ab93de5b1b #26 pharmacy: kakao category search api 2022-12-19 00:04:38 +09:00
haerong22
379f610365 #26 pharmacy: save recommendation result 2022-12-18 23:36:20 +09:00
haerong22
e3a35b2fbd #26 pharmacy: spring retry 2022-12-18 11:44:43 +09:00
haerong22
96315109e3 #26 pharmacy: direction service test 2022-12-15 00:36:34 +09:00
haerong22
669e29704e #26 pharmacy: direction service - haversine formula 2022-12-15 00:36:09 +09:00
haerong22
dcabb4c55a #26 pharmacy: data setup 2022-12-14 23:56:16 +09:00
haerong22
8619e8d6e4 #26 pharmacy: jpa auditing 2022-12-14 22:51:02 +09:00
haerong22
6d1307f2ae #26 pharmacy: jpa dirty checking test 2022-12-14 00:41:27 +09:00
haerong22
171fb33296 #26 pharmacy: kakao address api test 2022-12-14 00:06:32 +09:00
haerong22
0e7683d55a #26 pharmacy: testcontainers - integration test 2022-12-13 23:52:14 +09:00
haerong22
919b3b221c #26 pharmacy: spock - unit test 2022-12-12 01:02:31 +09:00
haerong22
b972aefc79 #26 pharmacy: kakao api - local address search 2022-12-12 00:43:53 +09:00
haerong22
eb2c1a1967 #26 pharmacy: docker-compose - redis, mariadb 2022-12-10 23:43:39 +09:00
haerong22
22d105bd5e #26 pharmacy: profiles 2022-12-10 23:18:09 +09:00
haerong22
20ab448366 #26 pharmacy: docker - single container 2022-12-10 22:29:18 +09:00
haerong22
6a1d2828b5 #26 pharmacy: init 2022-12-09 01:45:22 +09:00
haerong22
9d8a3cd994 #24 simple sns: alarm with kafka 2022-12-08 03:27:04 +09:00
haerong22
8a8cb186e8 #25 order-service: mariadb connect 2022-12-03 22:00:01 +09:00
haerong22
a9be1a58cd #24 simple sns: alarm with sse 2022-12-03 00:03:47 +09:00
haerong22
b479560d3e #24 simple sns: caching with redis 2022-12-02 03:27:53 +09:00
haerong22
1d8218d491 #24 simple sns: 코드 최적화 2022-11-30 01:16:54 +09:00
haerong22
888c54e527 #25 change gradle wrapper version 2022-11-26 18:30:09 +09:00
haerong22
b66319f0c3 #25 user-service: feign client error decoder 2022-11-26 18:28:57 +09:00
haerong22
14dda18ecd #24 simple sns: 알림기능 api 2022-11-25 03:39:44 +09:00
haerong22
d314680151 #24 simple sns: 알림기능 테스트 코드 2022-11-25 02:50:53 +09:00
haerong22
4affa2cd2d #24 simple sns: 댓글 기능 api 2022-11-23 01:32:05 +09:00
haerong22
c4bb71e8e4 #24 simple sns: 댓글 기능 테스트 코드 2022-11-23 00:56:49 +09:00
haerong22
02fd021a07 #24 simple sns: 좋아요 개수 api 2022-11-22 02:21:42 +09:00
haerong22
fc328f92b8 #24 simple sns: 좋아요 api 2022-11-22 02:12:34 +09:00
haerong22
a8efd26a78 #24 simple sns: 시큐리티 설정 변경 2022-11-22 01:29:33 +09:00
haerong22
f0c3ab0417 #24 simple sns: 로그인 문제 해결(파라미터 이름 변경) 2022-11-22 01:12:50 +09:00
haerong22
48f3b8e7bb #24 simple sns: 피드 목록, 내 피드 목록 api 2022-11-22 00:57:44 +09:00
haerong22
d4458cc646 #24 simple sns: 포스트 삭제 api 구현 2022-11-13 22:01:35 +09:00
haerong22
c590acced2 #24 simple sns: 포스트 삭제 테스트코드 2022-11-13 21:50:45 +09:00
haerong22
9fab52991c #25 user-service: apply feign client 2022-11-12 20:20:22 +09:00
haerong22
0c1f942505 #24 simple sns: 포스트 수정 api 구현 2022-11-08 00:41:37 +09:00
haerong22
035feabbdd #24 simple sns: 포스트 수정 테스트 코드 2022-11-06 12:53:18 +09:00
haerong22
b8b6e507a8 #24 simple sns: 포스트 작성 api 구현 2022-11-04 23:34:08 +09:00
haerong22
1dd9957897 #24 simple sns: 포스트 작성 테스트 코드 2022-11-03 00:53:10 +09:00
haerong22
edf0ebc0d3 #24 simple sns: 회원가입, 로그인 테스트코드 수정 2022-11-01 00:43:18 +09:00
haerong22
d165c8d824 #24 simple sns: 로그인 api 구현 2022-11-01 00:40:10 +09:00
haerong22
90dd93838e #24 simple sns: 예외 처리 및 테스트 코드 수정 2022-11-01 00:13:34 +09:00
haerong22
7de3ebe398 #24 simple sns: 패스워드 암호화 저장 2022-10-31 23:14:03 +09:00
haerong22
b7aee85b9b #24 simple sns: db settings(postgresql) 2022-10-19 00:37:06 +09:00
haerong22
f86f895fea #24 simple sns: join 2022-10-18 23:53:30 +09:00
haerong22
edd9482d49 #24 simple sns: join, login test code 2022-10-16 15:13:40 +09:00
haerong22
5894e5597a #24 simple sns: add front-end, add heroku settings 2022-10-15 23:34:16 +09:00
haerong22
30875d6fbe #24 simple sns: init 2022-10-15 22:55:50 +09:00
haerong22
098f39ced1 #23 di: di practice 2022-10-13 23:24:28 +09:00
haerong22
c4b7873125 #22 mvc: annotation based 2022-10-12 23:57:50 +09:00
haerong22
dd97887635 #22 mvc: handler adapter 2022-10-11 01:42:28 +09:00
haerong22
1c0ea3230e #22 mvc: create user 2022-10-11 01:27:34 +09:00
haerong22
6744d9ab7a #22 mvc: view resolver 2022-10-11 01:26:51 +09:00
haerong22
dbc80e4d80 #22 mvc: HandlerKey 2022-10-11 00:48:39 +09:00
haerong22
a235f0f396 #22 mvc: add controller - user list 2022-10-11 00:29:14 +09:00
haerong22
99f0b69f42 #22 mvc: RequestMappingHandlerMapping 2022-09-24 02:14:30 +09:00
haerong22
89a253d36e #22 mvc: dispatcher servlet 2022-09-24 02:14:01 +09:00
haerong22
b149204c16 #22 mvc: change dir 2022-09-24 02:12:39 +09:00
haerong22
0c412100a2 #22 mvc: reflection 2022-09-22 23:41:55 +09:00
haerong22
54edba1b02 #22 mvc: reflection - annotation scan 2022-09-21 23:50:34 +09:00
haerong22
67c8588ada #21 jdbc: refactoring 2022-09-20 01:59:05 +09:00
haerong22
53c5d34a3b #21 jdbc: create test 2022-09-19 03:46:34 +09:00
haerong22
abc21bfa82 Merge branch 'master' of https://github.com/haerong22/Study 2022-09-19 02:47:08 +09:00
haerong22
b239d8a212 #21 jdbc: init 2022-09-18 22:35:25 +09:00
haerong22
207a3ffeda #20 react-netflix: movie detail modal 2022-09-10 21:15:44 +09:00
haerong22
76e4b83e61 #20 react-netflix: footer with styled component 2022-09-10 20:27:54 +09:00
haerong22
1130fdc0f0 #20 react-netflix: slider 2022-09-10 19:36:32 +09:00
haerong22
198858f98e #20 react-netflix: movies row 2022-09-10 19:22:37 +09:00
haerong22
8bc9f18971 #19 servlet - embedded tomcat 2022-09-06 02:01:15 +09:00
haerong22
a5320f4fbc #19 was : thread safe 2022-09-05 03:02:14 +09:00
haerong22
f45ed023c5 #20 react-netflix: video banner 2022-09-04 20:45:11 +09:00
haerong22
7681d0a70d #20 react-netflix: banner component 2022-09-04 20:13:24 +09:00
haerong22
8ac08b62c5 #20 react-netflix: nav component 2022-09-04 19:20:07 +09:00
haerong22
e2107b73c7 #20 react-netflix: axios instance 2022-09-04 18:50:37 +09:00
haerong22
c630906ea5 #20 react-netflix: init 2022-09-04 18:50:10 +09:00
haerong22
bb57d402b0 Merge branch 'master' of https://github.com/haerong22/Study 2022-09-03 17:46:24 +09:00
haerong22
40f909fb7a blog: chatting - connection test 2022-09-03 17:46:16 +09:00
haerong22
10985d0b1c #19 was : thread pool 2022-09-02 02:45:54 +09:00
haerong22
e665a970b5 #19 was : multi thread 2022-09-02 02:35:43 +09:00
haerong22
1295814dba #19 was : HttpRequest, HttpResponse 2022-09-01 03:36:35 +09:00
haerong22
d3e4dc074c #19 was : parsing inputStream 2022-09-01 03:28:40 +09:00
haerong22
0934c0f2a7 #19 was : custom web application server init 2022-08-31 02:59:18 +09:00
haerong22
d349f6b340 #18 oop : order process 2022-08-30 03:09:19 +09:00
haerong22
f0570d855a #18 oop : grade calculator 2022-08-30 02:31:07 +09:00
haerong22
57eb21d6a9 #18 oop : calculator 2022-08-29 03:14:48 +09:00
haerong22
7677bd5280 #18 oop : change package 2022-08-29 03:14:08 +09:00
haerong22
4011a6a520 #17 react-todo-app : save localstorage 2022-08-28 20:12:57 +09:00
haerong22
19ff2b1c1c #17 react-todo-app : edit todoData 2022-08-28 19:42:23 +09:00
haerong22
3a6abd10ce #17 react-todo-app : delete all todoData 2022-08-28 19:24:29 +09:00
haerong22
1cb37606fe #17 react-todo-app : optimization 2022-08-28 19:20:47 +09:00
haerong22
c2ff75e187 #17 react-todo-app : add component - list 2022-08-28 18:49:25 +09:00
haerong22
aedd45f9b5 #17 react-todo-app : drag and drop 2022-08-28 18:41:58 +09:00
haerong22
9a5a431601 #17 react-todo-app : apply tailwindcss 2022-08-28 17:53:38 +09:00
haerong22
3a14cb04bb #17 react-todo-app : tailwindcss setting 2022-08-28 17:32:07 +09:00
haerong22
a784822703 #17 react-todo-app : component separation 2022-08-28 17:11:44 +09:00
haerong22
6d81f6fbf3 #17 react-todo-app : class component -> hooks 2022-08-28 16:24:59 +09:00
haerong22
4845d5d522 #18 oop : password validator 2022-08-27 02:26:49 +09:00
haerong22
676e539c28 change directory 2022-08-27 01:42:54 +09:00
haerong22
79efea26d1 change directory 2022-08-27 01:40:43 +09:00
haerong22
e7da12d713 #18 oop : init 2022-08-27 01:40:07 +09:00
haerong22
bf1954cfa5 #16 board : heroku settings 2022-08-26 03:27:49 +09:00
haerong22
e1b93ae610 #16 board : fix test code 2022-08-25 03:51:41 +09:00
haerong22
cc10e64ee5 #16 board : add README.md 2022-08-25 03:15:52 +09:00
haerong22
930689f9af #16 board : apply security - views 2022-08-24 03:41:00 +09:00
haerong22
752ea4d3e2 #16 board : apply security - article comments 2022-08-24 03:11:55 +09:00
haerong22
118f8b06e5 #16 board : apply security - article 2022-08-24 03:01:26 +09:00
haerong22
197cb3c713 #16 board : jpa config 2022-08-23 03:42:37 +09:00
haerong22
7648cf2c64 #16 board : security config 2022-08-23 03:27:40 +09:00
haerong22
7019244156 #16 board : article detail view - create, delete comment 2022-08-23 00:52:36 +09:00
haerong22
5ce977e362 #16 board : article comment controller impl, test 2022-08-22 03:47:44 +09:00
haerong22
eb9bf718d6 #16 board : sign-up template, css 2022-08-21 21:01:22 +09:00
haerong22
14bdc13414 #16 board : article form 2022-08-21 20:55:38 +09:00
haerong22
dff43b265e #16 board : article add, update, delete impl 2022-08-21 20:53:30 +09:00
haerong22
76caed8f49 #16 board : change entity, erd 2022-08-21 20:17:45 +09:00
haerong22
103a4ee945 blog : chatting - init 2022-08-20 16:06:12 +09:00
haerong22
7c53b4581a #16 board : form data encoder 2022-08-19 03:11:27 +09:00
haerong22
1cb4dcf69e #16 board : index, detail view 2022-08-19 02:48:42 +09:00
haerong22
ef53f97d60 #16 board : add header menu(hashtags) 2022-08-19 02:33:05 +09:00
haerong22
64453a7603 #16 board : hashtag search page impl 2022-08-18 03:54:11 +09:00
haerong22
a59f98621d #16 board : hashtag search controller test, impl 2022-08-18 03:53:48 +09:00
haerong22
a47e29149b #16 board : hashtag search service test, impl 2022-08-18 03:53:25 +09:00
haerong22
03f4e83b0b #16 board : article list page - search(with paging, sort) 2022-08-17 03:16:11 +09:00
haerong22
21b9c4c3f0 #16 board : update erd, entity 2022-08-17 02:02:56 +09:00
haerong22
b21371cd52 #16 board : article comment service impl 2022-08-17 02:00:23 +09:00
haerong22
079e2ef151 #16 board : article list page - sort 2022-08-17 01:47:31 +09:00
haerong22
d6d1bf9955 #16 board : article list page - apply pagination 2022-08-16 03:36:03 +09:00
haerong22
6a25f0b4ec #16 board : article controller - apply pagination 2022-08-16 03:35:23 +09:00
haerong22
2f0db5e519 #16 board : pagination service impl & test 2022-08-16 03:34:18 +09:00
haerong22
fa2895f08a #16 board : article detail page impl 2022-08-15 04:05:00 +09:00
haerong22
a304ef30cc #17 react-todo-app : completed todo list 2022-08-14 20:13:32 +09:00
haerong22
8aa2f65be8 #17 react-todo-app : add todo list 2022-08-14 19:41:52 +09:00
haerong22
805d0ae256 #17 react-todo-app : delete todo list 2022-08-14 19:09:17 +09:00
haerong22
3ecfce2bb2 Merge branch 'master' of https://github.com/haerong22/Study 2022-08-14 18:47:15 +09:00
haerong22
d3f1465f7d #17 react-todo-app : todo list 2022-08-14 18:46:58 +09:00
haerong22
ada7759947 #17 react-todo-app : init 2022-08-14 17:56:10 +09:00
haerong22
8a7c755d43 #16 board : articles page impl 2022-08-14 04:17:38 +09:00
haerong22
05a75ee55b #16 board : article controller impl 2022-08-14 04:17:09 +09:00
haerong22
7e1ed339b1 #16 board : article service impl 2022-08-14 04:16:37 +09:00
haerong22
9bd3fd55cd #16 board : osiv - false 2022-08-13 03:50:26 +09:00
haerong22
93cb6a6dd1 #16 board : article comments - service, test 2022-08-13 03:36:27 +09:00
haerong22
5b659f1882 #16 board : article - service, test 2022-08-13 03:36:11 +09:00
haerong22
f955f9da20 #16 board : main controller, test 2022-08-13 03:31:42 +09:00
haerong22
d61bbda6d8 #16 board : modify - entity relation, erd 2022-08-13 03:30:16 +09:00
haerong22
e2a8e7a645 #16 board : add gitignore - jpa buddy 2022-08-13 01:27:44 +09:00
haerong22
b4b4fa8023 #16 board : add design - bootstrap 2022-08-12 03:14:51 +09:00
haerong22
7e4784ea3d #16 board : spring security - setting, test 2022-08-11 03:46:43 +09:00
haerong22
1cf7b4fc5d #16 board : add UserAccount Entity 2022-08-11 03:27:50 +09:00
haerong22
84ac46cc50 #16 board : article detail - view template (appliy decoupled logic) 2022-08-10 02:55:45 +09:00
haerong22
a5ec2d2181 #16 board : thymeleaf - decoupled logic setting 2022-08-10 02:49:58 +09:00
haerong22
b278db5d62 #16 board : article page - view template 2022-08-09 03:13:26 +09:00
haerong22
7ac0d164f5 #16 board : view - endpoint test 2022-08-09 00:32:01 +09:00
haerong22
50ef4dd8ec #16 board : querydsl - api list filtered(QuerydslPredicateExecutor, QuerydslBinderCustomizer) 2022-08-08 03:32:49 +09:00
haerong22
ead357016d #16 board : data rest test disabled 2022-08-08 03:30:38 +09:00
haerong22
afd18594cd #16 board : add querydsl dependency 2022-08-08 03:29:36 +09:00
haerong22
7629d30e46 #16 board : data rest test - data rest / hal explorer 2022-08-07 03:28:27 +09:00
haerong22
6ff5a273f2 #16 board : add AuditingFields - @MappedSuperClass 2022-08-06 00:40:28 +09:00
haerong22
bbee2dcb5c #16 board : jpa basic test 2022-08-05 04:00:46 +09:00
haerong22
4264e8a8ea #16 board : spring boot version change 2022-08-05 03:59:01 +09:00
haerong22
e79ca584e9 #16 board : entity - article comment 2022-08-05 00:51:32 +09:00
haerong22
940a841e0f #16 board : entity - article 2022-08-04 02:13:19 +09:00
haerong22
2af644267c #16 board : db setting 2022-08-04 01:50:21 +09:00
haerong22
1fcfbe80a0 #16 board : domain - erd, domain class 2022-08-03 02:54:15 +09:00
haerong22
70fa188f1a #16 board - init 2022-08-03 01:59:20 +09:00
haerong22
664f5bfc7a #15 kafka : producer - callback producer 2022-08-02 01:43:31 +09:00
haerong22
b9a344b361 #15 kafka : producer - patition producer 2022-08-02 01:34:44 +09:00
haerong22
741e5fe240 #15 kafka : producer - key value producer 2022-08-02 01:24:17 +09:00
haerong22
2fe8430bba #15 kafka : producer - simple producer 2022-08-02 01:21:33 +09:00
haerong22
6f7c39c894 #15 kafka : producer - init 2022-08-02 01:20:53 +09:00
haerong22
4c21076546 #14 simple blog : css 2022-08-01 02:04:20 +09:00
haerong22
677246734a #14 simple blog : front - edit view 2022-08-01 01:07:01 +09:00
haerong22
1d56166333 #14 simple blog : front - read view 2022-08-01 00:56:24 +09:00
haerong22
7111441e72 #14 simple blog : front - home view 2022-08-01 00:32:33 +09:00
haerong22
57a3b7bf6f #14 simple blog : cors 2022-07-31 03:30:11 +09:00
haerong22
5a76744191 #14 simple blog : front - write view 2022-07-31 03:05:45 +09:00
haerong22
516d367fd6 #14 simple blog : front - vue init 2022-07-31 02:25:17 +09:00
haerong22
6750a3f7f2 #14 simple blog : spring rest docs custom 2022-07-30 06:14:17 +09:00
haerong22
0e0e9a7a3b #14 simple blog : spring rest docs basic 2022-07-30 01:57:03 +09:00
haerong22
d81cf991b5 #14 simple blog : custom exception 2022-07-29 02:39:11 +09:00
haerong22
0390d16e11 #14 simple blog : exception handle 2022-07-28 01:32:40 +09:00
haerong22
83c8144bce #14 simple blog : delete post 2022-07-28 01:11:11 +09:00
haerong22
e565298b55 #14 simple blog : edit post 2022-07-28 00:56:42 +09:00
haerong22
373a656349 #14 simple blog : pageable - querydsl 2022-07-27 03:34:50 +09:00
haerong22
929877b099 #14 simple blog : pageable 2022-07-27 02:39:01 +09:00
haerong22
8a482b7d08 #14 simple blog : get post list api 2022-07-26 02:10:47 +09:00
haerong22
1e1555ff8c #14 simple blog : add response class 2022-07-26 01:22:49 +09:00
haerong22
bcd8ef83ed #14 simple blog : get post api 2022-07-25 03:30:35 +09:00
haerong22
dd47b0019d #14 simple blog : use builder 2022-07-25 02:56:57 +09:00
haerong22
d8393b350d #14 simple blog : create post api - save db 2022-07-24 05:00:04 +09:00
haerong22
27815ec303 #14 simple blog : create post api - validation 2022-07-24 04:31:56 +09:00
haerong22
4fbec65c28 #14 simple blog : create post api 2022-07-23 04:15:42 +09:00
haerong22
9037722220 #14 simple blog : init 2022-07-23 03:42:44 +09:00
haerong22
049d148ea1 #13 spring transaction : propagation - recover(require_new) 2022-07-23 00:39:13 +09:00
haerong22
1ef1e16952 #13 spring transaction : propagation - outerTxOn 2022-07-23 00:21:13 +09:00
haerong22
b5f2a519ea #13 spring transaction : propagation - singleTx 2022-07-22 03:03:17 +09:00
haerong22
8171e5bbc0 #13 spring transaction : propagation - outerTxOff 2022-07-22 02:53:36 +09:00
haerong22
9a97fcd8fd #13 spring transaction : propagation ex init 2022-07-22 02:50:11 +09:00
haerong22
eebf3a5c77 #13 spring transaction : propagation - rollback requires new 2022-07-22 02:19:07 +09:00
haerong22
d2fd06ef8a #13 spring transaction : propagation - rollback 2022-07-21 00:59:53 +09:00
haerong22
1aa96b5818 #13 spring transaction : propagation 2022-07-21 00:24:32 +09:00
haerong22
235ab0e07d #13 spring transaction - commit, rollback test 2022-07-20 02:49:33 +09:00
haerong22
3361551f24 #13 spring transaction - exception, runtimeException 2022-07-19 01:53:05 +09:00
haerong22
602545de7a #13 spring transaction - exception : rollback, commit 2022-07-18 03:23:55 +09:00
haerong22
b79e4e155f #13 spring transaction - transaction aop init 2022-07-17 21:12:33 +09:00
haerong22
46343248e4 #13 spring transaction - proxy internal call solve 2022-07-17 19:19:13 +09:00
haerong22
b47facfbbf #13 spring transaction - proxy internal call problem 2022-07-17 19:06:10 +09:00
haerong22
cdec1adb61 #13 spring transaction - tx order test 2022-07-17 17:55:36 +09:00
haerong22
c92e7fb194 #13 spring transaction - apply test 2022-07-17 17:30:50 +09:00
haerong22
d23c126531 #13 spring transaction - init 2022-07-17 01:09:19 +09:00
haerong22
f58c9764da #13 spring db: v2 2022-07-14 02:32:29 +09:00
haerong22
27ef0948d6 #13 spring db: querydsl - basic 2022-07-12 02:35:59 +09:00
haerong22
3b14e71aed #13 spring db: querydsl - setting 2022-07-12 02:20:13 +09:00
haerong22
3b430bdf3d #11 spring batch: @JobScope, @StepScope 2022-07-10 20:47:59 +09:00
haerong22
8e873e9dee #11 spring batch: @JobScope, @StepScope 2022-07-10 19:34:47 +09:00
haerong22
297b961584 #13 spring db: spring data jpa - basic 2022-07-10 18:06:39 +09:00
haerong22
4a3fe7c987 #11 spring batch: FlowStep 2022-07-07 01:41:37 +09:00
haerong22
bef0f66b67 #11 spring batch: SimpleFlow ex 2022-07-05 03:11:52 +09:00
haerong22
4663a90b90 #13 spring db: jpa - basic 2022-07-03 19:37:55 +09:00
haerong22
c01aa926a2 #13 spring db: jpa - setting 2022-07-03 18:58:23 +09:00
haerong22
e11cdb9664 #11 spring batch: SimpleFlow ex 2022-07-01 00:36:32 +09:00
haerong22
04a4cea83b #13 spring db: mybatis - basic 2022-06-30 02:26:40 +09:00
haerong22
7f3ea50313 #13 spring db: mybatis - setting 2022-06-29 03:01:57 +09:00
haerong22
aa20fd5559 #13 spring db: test - embedded db 2022-06-28 01:40:02 +09:00
haerong22
03720662be #13 spring db: test - detach test db & rollback 2022-06-28 01:22:59 +09:00
haerong22
faf1afaf2c #11 spring batch: SimpleFlow api 2022-06-26 19:17:40 +09:00
haerong22
5e40ddfab6 #11 spring batch: FlowJob 2022-06-26 18:52:48 +09:00
haerong22
f651262458 #11 spring batch: JobExecutionDecider 2022-06-24 02:11:32 +09:00
haerong22
e8f93fd437 #11 spring batch: Custom ExitStatus 2022-06-23 02:55:17 +09:00
haerong22
d7ba035648 #11 spring batch: Transition - on(), to(), stop(), fail(), end(), stopAndRestart() 2022-06-22 02:33:13 +09:00
haerong22
01f01ee628 #13 spring db: JdbcTemplate - SimpleJdbcInsert 2022-06-21 02:01:31 +09:00
haerong22
d1d567fbbe #11 spring batch: Transition - BatchStatus, ExitStatus, FlowExecutionStatus 2022-06-21 01:43:06 +09:00
haerong22
098094e66e #13 spring db: JdbcTemplate - NamedParameterJdbcTemplate 2022-06-20 02:59:12 +09:00
haerong22
6d071b17fb #13 spring db: JdbcTemplate - basic 2022-06-18 18:55:40 +09:00
haerong22
4fc470e27c #11 spring batch: FlowJob api - start(), next() 2022-06-18 17:16:48 +09:00
haerong22
d6fdd519c2 #11 spring batch: FlowJob api 2022-06-18 16:59:01 +09:00
haerong22
98165874c2 #11 spring batch: JobStep 2022-06-17 02:33:03 +09:00
haerong22
ac3587491d #11 spring batch: TaskleStep api - startLimit(), allowStartIfComplete() 2022-06-16 01:49:42 +09:00
haerong22
4a767ff4fc #11 spring batch: TaskleStep api - tasklet() 2022-06-16 01:31:39 +09:00
haerong22
c927e7a3d8 #13 spring db: init 2022-06-15 02:28:10 +09:00
haerong22
8ed84398b9 #11 spring batch: TaskleStep api 2022-06-14 01:31:52 +09:00
haerong22
e4a5f8198a #11 spring batch: StepBuilderFactory, StepBuilder 2022-06-12 18:35:14 +09:00
haerong22
418c0c56af #11 spring batch: SimpleJob api - preventRestart, incrementer 2022-06-10 01:54:05 +09:00
haerong22
3ff89a82c0 #11 spring batch: SimpleJob api - start, next, validator 2022-06-09 02:11:43 +09:00
haerong22
8889d5a42f #11 spring batch: SimpleJob api 2022-06-08 02:07:49 +09:00
haerong22
dcedf8cc5d #11 spring batch: JobBuilderFactory 2022-06-08 01:36:59 +09:00
haerong22
8cd52ceb20 #11 spring batch: batch initialize setting 2022-06-07 00:40:30 +09:00
haerong22
86868c887d #11 spring batch: JobLauncher 2022-06-06 01:54:59 +09:00
haerong22
e4996d5064 #11 spring batch: JobRepository 2022-06-05 19:58:53 +09:00
haerong22
1bf109d360 #11 spring batch: ExecutionContext 2022-06-05 18:49:29 +09:00
haerong22
b86d2336f0 #11 spring batch: StepContribution 2022-06-05 17:18:16 +09:00
haerong22
7ce9a013f2 #11 spring batch: StepExecution 2022-06-03 01:41:51 +09:00
haerong22
b584a5aad5 #11 spring batch: Step 2022-06-03 00:59:17 +09:00
haerong22
e24cc821af #10 effective java: item 8 2022-06-02 02:10:31 +09:00
haerong22
33ba7cf823 #11 spring batch: jobParameter, jobExecution 2022-06-02 00:03:36 +09:00
haerong22
41dea3f4d0 #11 spring batch: job, jobInstance 2022-06-01 23:03:56 +09:00
haerong22
0310ae6b3c #10 effective java: item 7 2022-05-31 01:43:52 +09:00
haerong22
635828eb4a spring batch: hello spring batch 2022-05-30 00:06:42 +09:00
haerong22
e9fe4e53d7 change directory 2022-05-29 13:34:04 +09:00
haerong22
16af1f17d4 spring batch basic: init 2022-05-29 13:33:05 +09:00
haerong22
fe6feed168 #10 effective java: item 7 2022-05-25 02:11:12 +09:00
haerong22
8188d0fc15 #10 effective java: item 6 2022-05-24 07:50:57 +09:00
haerong22
75848752a2 #10 effective java: item 6 2022-05-23 02:25:56 +09:00
haerong22
69ddddd1ce #10 effective java: item 5 2022-05-19 01:03:43 +09:00
haerong22
c6cf9334e2 #10 effective java: item 5 2022-05-18 01:57:22 +09:00
haerong22
57fcca02d9 Merge branch 'master' of https://github.com/haerong22/Study 2022-05-18 01:42:52 +09:00
haerong22
b4d9a0a296 #10 effective java: item 4 2022-05-17 02:26:19 +09:00
haerong22
190e3a0b60 chatting: websocket(stomp), redis pub/sub 2022-05-16 00:05:28 +09:00
haerong22
e831ce5943 #10 effective java: item 3 2022-05-14 20:52:02 +09:00
haerong22
eb96046e52 #10 effective java: item 3 2022-05-13 01:32:43 +09:00
haerong22
e94dea9b6d #10 effective java: item 2 2022-05-12 01:20:05 +09:00
haerong22
668c2d69c3 #10 effective java: item 2 2022-05-11 02:07:35 +09:00
haerong22
e16a8ee85e #10 effective java: item 1 2022-05-07 03:12:50 +09:00
haerong22
c2a0211113 #10 effective java: item 1 2022-05-06 01:07:18 +09:00
haerong22
12c0ec71dc #9 jdbc: JdbcTemplate 2022-05-05 11:53:39 +09:00
haerong22
8c30706ca2 #9 spring data access exception 2022-05-04 00:33:13 +09:00
haerong22
a149d51f11 #9 custom data access exception 2022-05-03 00:43:02 +09:00
haerong22
4b9aa88a5e #9 jdbc: checked exeption -> runtime exception 2022-05-02 00:05:57 +09:00
haerong22
b49128c36a closed #8 jdbc: unchecked exception 2022-05-01 18:18:53 +09:00
haerong22
c5f2ce41fa closed #7 jdbc: checked exception 2022-05-01 17:53:31 +09:00
haerong22
c88287982c closed #6 jdbc: unchecked exception ex 2022-05-01 17:42:56 +09:00
haerong22
6ef7c5679c closed #5 jdbc: checked exception ex 2022-05-01 16:30:52 +09:00
haerong22
c0d23651bd Merge branch 'master' of https://github.com/haerong22/Study 2022-05-01 15:29:07 +09:00
haerong22
63a689f803 closed #4 jdbc: springboot auto configuration 2022-05-01 15:28:49 +09:00
haerong22
0978b8cf2c closed #3 blog: enum parameter binding 2022-04-30 22:36:08 +09:00
haerong22
829d720670 closed #2 jdbc: transaction aop 2022-04-29 00:44:30 +09:00
haerong22
eb7fa43b6b jdbc : transaction template 2022-04-28 00:03:57 +09:00
haerong22
27af79fa53 Merge branch 'master' of https://github.com/haerong22/Study 2022-04-27 02:16:34 +09:00
haerong22
74857638e4 jdbc : transaction manager 2022-04-27 02:15:56 +09:00
haerong22
9aa1a56183 nft ex : select network 2022-04-26 01:24:58 +09:00
haerong22
3360f9cf98 nft ex : buy, sale 2022-04-26 00:54:47 +09:00
haerong22
ee84f9116f nft ex : burn 2022-04-26 00:24:36 +09:00
haerong22
126b295c12 nft ex : my nft detail 2022-04-25 15:08:11 +09:00
haerong22
53c5e7a6ff nft ex : my nft list 2022-04-25 14:26:15 +09:00
haerong22
7234dbd9ea nft ex : minting 2022-04-25 13:50:01 +09:00
haerong22
64684f75d4 jdbc : apply transaction 2022-04-24 21:17:37 +09:00
haerong22
126f71e391 emotion diary : deploy(firebase) 2022-04-24 17:16:51 +09:00
haerong22
5958339a81 emotion diary : fix error 2022-04-23 03:13:49 +09:00
haerong22
833117d08e jdbc : DataSource - Connection Pool 2022-04-22 17:54:37 +09:00
haerong22
e1e6b79f7f jdbc : DataSource ex 2022-04-22 17:38:58 +09:00
haerong22
8cab584d7f emotion diary : optimization 2022-04-22 15:19:32 +09:00
haerong22
14ee5271d8 emotion diary : localStorage 2022-04-21 01:08:06 +09:00
haerong22
29afae3a99 emotion diary : detail page 2022-04-20 21:52:43 +09:00
haerong22
a32bcaafe1 jdbc : update, delete 2022-04-19 17:07:41 +09:00
haerong22
ccef2b749d jdbc : select 2022-04-19 16:52:45 +09:00
haerong22
ce60ed2411 emotion diary : edit diary page 2022-04-19 15:02:39 +09:00
haerong22
092d6e5d8d emotion diary : create diary page 2022-04-19 12:49:49 +09:00
haerong22
5eff4e2d8f jdbc : insert 2022-04-18 21:07:15 +09:00
haerong22
1f4aed1e8c emotion diary : home page 2022-04-18 19:13:04 +09:00
haerong22
a75a10068d jdbc : connection 2022-04-17 01:40:14 +09:00
haerong22
a3f6feaba3 jdbc : init 2022-04-16 23:40:34 +09:00
haerong22
aa6c9b3165 emotion diary : global settings 2022-04-16 19:57:12 +09:00
haerong22
e1fedb6548 emotion diary : init 2022-04-16 18:18:11 +09:00
haerong22
e7ee23f938 simple diary : refactoring - context api 2022-04-15 21:08:21 +09:00
haerong22
8ecea4223a simple diary : refactoring - useReducer 2022-04-15 20:43:34 +09:00
haerong22
6ccea03ba3 simple diary : optimize 2022-04-15 17:47:05 +09:00
haerong22
035cd6cd7e simple diary : init data 2022-04-15 15:21:19 +09:00
haerong22
e44b2cb702 simple diary : edit data 2022-04-14 03:08:45 +09:00
haerong22
8d7ed23f0d simple diary : delete data 2022-04-14 02:45:07 +09:00
haerong22
80db4a31d9 simple diary - save data 2022-04-13 23:12:16 +09:00
haerong22
14535dcf47 simple diary - render diary list 2022-04-13 21:39:47 +09:00
haerong22
9e5fcfb2ab simple diary - validate input 2022-04-13 21:12:05 +09:00
haerong22
94d7660bdf simple diary - init 2022-04-13 21:00:17 +09:00
haerong22
f6dceec053 refactoring : comments - introduce assertion 2022-04-13 15:16:56 +09:00
haerong22
0a0c21e12f refactoring : refused bequest 2022-04-13 15:00:57 +09:00
haerong22
1334689b2f refactoring : data class - encapsulate record 2022-04-13 14:33:59 +09:00
haerong22
dd7f5c0917 refactoring : alternative classes with different interfaces 2022-04-13 00:05:50 +09:00
haerong22
9187ff9e2e node.js : react practice 2022-04-12 20:26:46 +09:00
haerong22
8095c43d5e node.js - basic 2022-04-12 00:15:05 +09:00
haerong22
ef6ebca959 refactoring : large class - extract superclass 2022-04-11 14:09:20 +09:00
haerong22
d690d7c0e1 refactoring : insider trading 2022-04-10 18:25:09 +09:00
haerong22
470ba9495e refactoring : middle man - replace subclass with delegate 2022-04-09 21:35:28 +09:00
haerong22
852cfbe5af refactoring : middle man - replace superclass with delegate 2022-04-08 01:15:12 +09:00
haerong22
38763848b9 refactoring : middle man - remove middle man 2022-04-07 00:33:39 +09:00
haerong22
914b38fd18 refactoring : method chain - hide delegate 2022-04-06 00:32:51 +09:00
haerong22
fabf7d0255 refactoring : temporary field - introduce special case 2022-04-05 23:24:36 +09:00
haerong22
4321bf7ffe refactoring : speculative generality - remove dead code 2022-04-05 01:52:40 +09:00
haerong22
b844d40585 refactoring : lazy element - collapse hierarchy 2022-04-04 23:46:37 +09:00
haerong22
ceba83fab1 refactoring : loops - replace loop with pipeline 2022-04-03 16:48:18 +09:00
haerong22
a78e242e4b refactoring : repeated switches 2022-04-03 16:32:13 +09:00
haerong22
7f55ac3858 refactoring : primitive obsession - replace conditional with polymorphism 2022-04-02 01:50:15 +09:00
haerong22
13fb80e26e refactoring : primitive obsession - replace type code with subclasses 2022-03-27 22:16:49 +09:00
haerong22
22c9b6d30c refactoring : primitive obsession - replace primitive with object 2022-03-26 22:35:07 +09:00
haerong22
93e4f929f6 refactoring : data clumps 2022-03-22 17:20:19 +09:00
haerong22
a01616f3a3 refactoring : feature envy 2022-03-21 15:31:39 +09:00
haerong22
6a0d19bc72 refactoring : shotgun surgery - inline class 2022-03-20 15:13:29 +09:00
haerong22
1deceed613 refactoring : shotgun surgery - inline function 2022-03-19 14:57:59 +09:00
haerong22
548d6636b9 rxjava : flowable, observable 2022-03-18 16:41:39 +09:00
haerong22
5f22036461 rxjava : backpressure 2022-03-18 16:03:46 +09:00
haerong22
09f76d51d6 refactoring : shotgun surgery - move field 2022-03-18 13:00:37 +09:00
haerong22
7aa3953c83 rxjava : operator, async 2022-03-17 17:48:06 +09:00
haerong22
f1428b4944 rxjava : cold publisher, hot publisher 2022-03-17 16:48:54 +09:00
haerong22
bd2100f400 refactoring : divergent change - extract class 2022-03-17 12:30:06 +09:00
haerong22
81e90a39f8 rxjava : stream 2022-03-16 17:10:30 +09:00
haerong22
fb89148a66 rxjava : stream 2022-03-16 16:16:47 +09:00
haerong22
37ba93c045 refactoring : divergent change - move function 2022-03-16 12:59:45 +09:00
haerong22
826cbf6631 rxjava : functional interface 2022-03-15 16:19:14 +09:00
haerong22
bed29f3233 rxjava : lambda 2022-03-15 13:02:08 +09:00
haerong22
b807790cd1 refactoring : divergent change - split phase 2022-03-15 11:36:42 +09:00
haerong22
2fcf164ccb refactoring : mutable data - change reference to value 2022-03-14 11:45:39 +09:00
haerong22
9738221070 refactoring : mutable data - combine functions into transform 2022-03-13 17:05:34 +09:00
haerong22
6cc60fd90c refactoring : mutable data - replace derived variable with query 2022-03-12 23:17:33 +09:00
haerong22
055b3cd831 refactoring : mutable data - remove setting method 2022-03-11 16:48:10 +09:00
haerong22
204d0e831b refactoring : mutable data - separate query from modifier 2022-03-09 14:26:30 +09:00
haerong22
3dab0d009b refactoring : mutable data - split variable 2022-03-06 18:29:58 +09:00
haerong22
ed972eb807 refactoring : global data - encapsulate variable 2022-03-05 15:00:55 +09:00
haerong22
dd1faea4d2 refactoring : long parameter list - combine functions into class 2022-03-04 23:17:53 +09:00
haerong22
c0df96dbfa refactoring : long parameter list - remove flag argument 2022-03-03 16:24:56 +09:00
haerong22
692c4d039d refactoring : long parameter list - replace parameter with query 2022-03-01 16:34:43 +09:00
haerong22
56744580e6 refactoring : long function - replace conditional with polymorphism 2022-02-27 20:32:24 +09:00
haerong22
99e370ebc8 refactoring : long function - split loop 2022-02-26 15:55:30 +09:00
haerong22
0a2b13f4a7 refactoring : long function - decompose conditional 2022-02-22 23:34:44 +09:00
haerong22
8a94bb8c3e refactoring : long function - replace function with command 2022-02-21 23:46:41 +09:00
haerong22
65908b147e refactoring : long function - preserve whole object 2022-02-20 22:50:12 +09:00
haerong22
53d89db12c refactoring : long function - introduce parameter object 2022-02-19 22:38:31 +09:00
haerong22
f89cd205d9 refactoring : long function - replace temp with query 2022-02-17 01:42:44 +09:00
haerong22
23da005132 refactoring : duplicated code - pull up method 2022-02-16 01:34:55 +09:00
haerong22
5eb3995dc8 refactoring : duplicated code - slide statements 2022-02-16 01:24:38 +09:00
haerong22
400ce9cf19 refactoring : duplicated code - extract function 2022-02-16 01:11:55 +09:00
haerong22
edead5a675 refactoring : mysterious name - rename field 2022-02-15 00:08:48 +09:00
haerong22
f343c73ca4 refactoring : mysterious name - rename variable 2022-02-13 20:24:48 +09:00
haerong22
1afb0f51b4 refactoring : mysterious name - change method declaration 2022-02-13 19:36:00 +09:00
haerong22
9535fffa7a refactoring : init 2022-02-12 23:11:03 +09:00
haerong22
eb11492061 design patterns : visitor 2021-12-26 18:16:56 +09:00
haerong22
fabe51fa21 design patterns : template 2021-12-25 16:46:15 +09:00
haerong22
bb620d4b9f design patterns : strategy 2021-12-22 01:31:00 +09:00
haerong22
3e176ea078 Merge branch 'master' of https://github.com/haerong22/Study 2021-12-20 23:57:36 +09:00
haerong22
15bcfc4b02 design patterns : state 2021-12-20 23:57:14 +09:00
haerong22
947a0cf302 design patterns : observer 2021-12-19 17:51:34 +09:00
haerong22
8525b605a1 design patterns : memento 2021-12-18 18:52:39 +09:00
haerong22
6e569b43f9 design patterns : mediator 2021-12-17 01:56:20 +09:00
haerong22
2cbcbcf901 design patterns : iterator 2021-12-15 01:13:57 +09:00
haerong22
440b57ea56 design patterns : interpreter 2021-12-14 01:27:50 +09:00
haerong22
b1ec3f9dd1 design patterns : command 2021-12-13 00:52:46 +09:00
haerong22
69c62d780d design patterns : chain of responsibillity 2021-12-12 19:04:48 +09:00
haerong22
67f3a09433 design patterns : proxy 2021-12-11 17:58:22 +09:00
haerong22
faba67f357 design patterns : flyweight 2021-12-10 00:44:36 +09:00
haerong22
9cfe1533a0 design patterns : facade 2021-12-08 01:13:56 +09:00
haerong22
544729aa01 design patterns : decorator 2021-12-07 01:37:22 +09:00
haerong22
13570f05d2 blog : cookie 2021-12-06 14:48:43 +09:00
haerong22
686fdec125 design patterns : composite 2021-12-05 19:58:11 +09:00
haerong22
8e04fdf63a design patterns : bridge 2021-12-04 20:59:23 +09:00
haerong22
203487d80c design patterns : adapter 2021-12-03 01:47:07 +09:00
haerong22
b5592a6d89 design patterns : prototype 2021-12-02 01:58:09 +09:00
haerong22
dcd3980d62 design patterns : builder 2021-12-01 01:56:58 +09:00
haerong22
bcf5a61879 design patterns : abstract factory 2021-11-30 02:09:20 +09:00
haerong22
79edb155af spring core aop : proxy - type casting problem 2021-11-29 01:19:07 +09:00
haerong22
5811885526 spring core aop : proxy - internal call solution 2021-11-28 20:05:39 +09:00
haerong22
bcb52c0a18 spring core aop : proxy - internal call problem 2021-11-28 03:59:25 +09:00
haerong22
03b2085dac spring core aop : log trace - spring aop (@Trace, @Retry) 2021-11-28 00:20:31 +09:00
haerong22
f691f3b2bd spring core aop : spring aop exam init 2021-11-27 22:21:24 +09:00
haerong22
55a837fc5f spring core aop : pointcut - this, target 2021-11-26 02:54:59 +09:00
haerong22
e8908879d7 spring core aop : pointcut - bean, parameter 2021-11-26 02:21:53 +09:00
haerong22
cf003c710c spring core aop : pointcut - @target, @within, @annotation, @args 2021-11-26 00:25:53 +09:00
haerong22
e4954db356 spring core aop : pointcut - within, args 2021-11-25 02:27:20 +09:00
haerong22
ac722d0815 spring core aop : pointcut - execution 2021-11-25 02:02:02 +09:00
haerong22
286880053a spring core aop : pointcut example init 2021-11-25 01:30:43 +09:00
haerong22
d7d5b1c478 spring core aop : spring aop 2021-11-24 02:31:19 +09:00
haerong22
21346286dd spring core aop : spring aop 2021-11-23 23:29:20 +09:00
haerong22
c22779a513 spring core aop : spring aop init 2021-11-22 23:44:58 +09:00
haerong22
269a74decf spring core proxy : log trace - @Aspect 2021-11-21 02:55:03 +09:00
haerong22
21e5b69629 spring core proxy : log trace - spring auto proxy creator 2021-11-19 21:57:22 +09:00
haerong22
b0312fc13f spring core proxy : log trace - bean post processor 2021-11-19 20:54:37 +09:00
haerong22
ae8a400691 spring core proxy : bean post processor 2021-11-19 14:26:20 +09:00
haerong22
f4efdad0d4 spring core proxy : log trace - proxy factory 2021-11-18 02:28:27 +09:00
haerong22
406aa76a7f spring core proxy : advisor 2021-11-18 02:07:28 +09:00
haerong22
7f302b4a09 spring core proxy : proxy factory 2021-11-17 01:50:25 +09:00
haerong22
b3117d49f7 spring core proxy : cglib 2021-11-16 02:52:26 +09:00
haerong22
a7cef6704a spring core proxy : log trace - jdk dynamic proxy 2021-11-16 02:38:16 +09:00
haerong22
8aa60ae09c spring core proxy : invocation handler 2021-11-16 01:59:17 +09:00
haerong22
beb13babc9 spring core proxy : reflection 2021-11-15 23:49:03 +09:00
haerong22
403c222dce spring core proxy : log trace v2 - concrete proxy 2021-11-15 01:04:25 +09:00
haerong22
5435303be3 spring core proxy : concrete proxy 2021-11-14 22:52:54 +09:00
haerong22
649b835b93 spring core proxy : log trace v1 - interface proxy 2021-11-14 22:12:43 +09:00
haerong22
8f6851528c spring core proxy : decorator pattern 2021-11-13 18:50:39 +09:00
haerong22
c448b207d5 spring core proxy : proxy pattern 2021-11-13 17:55:12 +09:00
haerong22
7956f866c6 spring core proxy : init 2021-11-13 16:34:21 +09:00
haerong22
ce27975021 spring core advanced : log trace - templete callback pattern 2021-11-12 02:32:37 +09:00
haerong22
61721c7844 spring core advanced : strategy pattern 2021-11-12 01:59:01 +09:00
haerong22
24836b84a8 spring core advanced : log trace v4 - template method 2021-11-11 02:40:20 +09:00
haerong22
d0c9e403ed spring core advanced : template method 2021-11-11 02:07:11 +09:00
haerong22
8e61583567 spring core advanced : ThreadLocal 2021-11-10 01:45:31 +09:00
haerong22
4997808f87 spring core advanced : concurrency problem 2021-11-10 01:19:07 +09:00
haerong22
6eea6f2bda spring core advanced : log trace v3 - FieldLogTrace 2021-11-09 02:53:09 +09:00
haerong22
1249ae1b0b spring core advanced : log trace v2 - parameter synchronization 2021-11-07 19:31:12 +09:00
haerong22
7aa3bab457 spring core advanced : log trace - prototype 2021-11-07 18:46:04 +09:00
haerong22
d46427e59f spring core advanced : log trace - prototype 2021-11-07 17:50:11 +09:00
haerong22
b21ae6ffca design patterns : factory method 2021-11-06 02:56:41 +09:00
haerong22
3c8c5e5874 design patterns : factory method - before 2021-11-05 23:37:47 +09:00
haerong22
408593f0b5 design patterns : singleton 2021-11-03 02:34:48 +09:00
haerong22
e60979a162 blog : dapp 2021-10-28 15:39:03 +09:00
haerong22
a0ae48dad8 zoom : webRTC - data channel 2021-10-24 22:02:18 +09:00
haerong22
7b9f774c2c zoom : webRTC - senders, stun server 2021-10-24 21:05:06 +09:00
haerong22
4463b0854e zoom : webRTC - offers, answers, ice candidate 2021-10-24 20:20:40 +09:00
haerong22
d03396347f zoom : create room 2021-10-23 20:02:51 +09:00
haerong22
477e0ab812 zoom : video, audio controller 2021-10-23 17:36:02 +09:00
haerong22
1c58883fcd zoom : socket.io - admin-ui 2021-10-16 20:54:34 +09:00
haerong22
4f81534b0a zoom : socket.io - rooms, users count 2021-10-16 20:43:17 +09:00
haerong22
29e097f543 zoom : socket.io - message 2021-10-16 19:48:18 +09:00
haerong22
d9f190165e zoom : socket.io - room 2021-10-16 18:43:29 +09:00
haerong22
05edfdd5ef zoom : using socket.io 2021-10-16 17:11:04 +09:00
haerong22
c1a4577adc blog: i18n 2021-10-14 15:20:58 +09:00
haerong22
6dfd233beb blog: i18n 2021-10-14 11:13:30 +09:00
haerong22
fd82b8f7f9 blog : builder 2021-10-13 12:58:16 +09:00
haerong22
919039e1e6 spring core : web scope 2021-10-09 00:09:28 +09:00
haerong22
58fc8ec894 spring core : spring bean scope 2021-10-08 22:51:14 +09:00
haerong22
6cccf71342 spring core : spring bean life cycle 2021-10-08 00:05:31 +09:00
haerong22
46f6fb5596 spring core : Dependency Injection 2021-10-07 00:59:36 +09:00
haerong22
715e7259bd jwt : basic jwt test 2021-10-06 12:55:18 +09:00
haerong22
08c954fe34 spring core : component scan 2021-10-06 00:18:26 +09:00
haerong22
9b13cf0f88 spring core : singleton container 2021-10-05 22:46:52 +09:00
haerong22
d71e0fec8f spring cloud : communicate with each service - rest template 2021-10-04 21:15:48 +09:00
haerong22
8b1cf46364 spring cloud : config service - encrypt, decrypt config value(asymetric key) 2021-10-04 19:58:05 +09:00
haerong22
f4d165fec3 zoom : webSocket - chatting with nickname 2021-10-04 18:33:37 +09:00
haerong22
f7f00b979b zoom : chatting 2021-10-04 17:15:20 +09:00
haerong22
5d7de0c9d8 spring core : bean definition 2021-10-04 02:40:41 +09:00
haerong22
5af6ebfeee spring core : xml config 2021-10-04 02:25:30 +09:00
haerong22
52c57167b7 spring core : find spring bean 2021-10-04 02:09:13 +09:00
haerong22
64818c2b71 zoom : project setup 2021-10-03 18:43:52 +09:00
haerong22
ffaa06f571 Merge branch 'master' of https://github.com/haerong22/Study 2021-10-03 02:27:07 +09:00
haerong22
38f24fe39e spring core - apply spring(spring container) 2021-10-03 02:26:48 +09:00
haerong22
147bf15edd spring cloud : config service - encrypt, decrypt config value(symetric key) 2021-10-02 20:48:10 +09:00
haerong22
35be135132 spring cloud : spring cloud bus - rabbitmq(amqp) 2021-10-02 20:28:00 +09:00
haerong22
477d04060e spring core : apply DIP - app config 2021-10-02 02:23:40 +09:00
haerong22
3a0c12727b spring core : 할인정책 변경(OCP, DIP 위반) 2021-10-02 01:50:21 +09:00
haerong22
6bcefd735e spring core : order domain(java) 2021-10-02 00:21:36 +09:00
haerong22
d0429f346d spring core : member domain(java) 2021-10-01 01:33:51 +09:00
haerong22
6955210070 spring cloud : spring cloud config - fix 2021-09-29 23:18:55 +09:00
haerong22
a1a290fbd0 spring cloud : spring cloud config - profile, remote git repo, native file 2021-09-29 22:47:52 +09:00
haerong22
858fdcbb1b properties file 2021-09-29 11:56:36 +09:00
haerong22
925c37e374 spring cloud : e-commerce(gateway) - spring cloud config(actuator refresh) 2021-09-26 20:20:16 +09:00
haerong22
8049af7d79 spring cloud : e-commerce(user-service) - spring cloud config(actuator refresh) 2021-09-25 21:34:57 +09:00
haerong22
3bdb65635d blog : my library 2021-09-25 18:18:50 +09:00
haerong22
08e31dc92b spring cloud : e-commerce(config-service) - init 2021-09-23 23:39:28 +09:00
haerong22
8b3ffd0f71 spring cloud : e-commerce(user-service) - login filter 2021-09-22 21:11:24 +09:00
haerong22
357cc76e1a spring cloud : e-commerce(user-service) - spring security login(jwt) 2021-09-22 19:38:03 +09:00
haerong22
f6dfe1190e spring cloud : e-commerce(user-service) - AuthenticationFileter, UserDetailService 2021-09-22 17:58:47 +09:00
haerong22
4514d92bae spring cloud : e-commerce(order-service) - create order, get orders 2021-09-21 19:04:50 +09:00
haerong22
76033edaec spring cloud : e-commerce(catalog-service) - get catalog list 2021-09-20 20:21:25 +09:00
haerong22
0bd7610a45 spring cloud : e-commerce(user-service) - get user, get userlist 2021-09-19 19:46:17 +09:00
haerong22
c5ae07d266 spring cloud : e-commerce(user-service) - spring security 2021-09-19 18:07:52 +09:00
haerong22
2aa5af4811 spring cloud : e-commerce - create user 2021-09-19 17:42:37 +09:00
haerong22
3443ecadbf spring cloud : e-commerce - user service setting 2021-09-18 19:34:11 +09:00
haerong22
9070918d4f spring cloud : spring cloud gateway - logging filter, load balancer 2021-09-18 18:04:41 +09:00
haerong22
00ff9c993f Merge branch 'master' of https://github.com/haerong22/Study 2021-09-17 01:50:10 +09:00
haerong22
8b0ecf8b28 spring cloud : spring cloud gateway - custom filter, global filter 2021-09-17 01:50:01 +09:00
haerong22
fb70f9b44d log : slack log 2021-09-16 16:59:49 +09:00
haerong22
80d7f018b6 spring cloud : spring cloud gateway(filter) 2021-09-16 02:26:30 +09:00
haerong22
e4301c7435 springcloud - discoveryservice, user-service init 2021-09-15 02:05:37 +09:00
haerong22
7b3e2bf60b log : gradle profile 2021-09-14 16:53:37 +09:00
haerong22
223f0ff6f0 log : spring profile 2021-09-13 17:56:37 +09:00
haerong22
98c7aedc01 change directory 2021-09-13 10:51:59 +09:00
haerong22
59642a8198 querydsl : querydsl extra 2021-09-10 20:20:00 +09:00
haerong22
0eee3ff049 querydsl : spring data jpa + querydsl 2021-09-10 00:54:37 +09:00
haerong22
e9439e15f1 change name 2021-09-09 15:49:04 +09:00
haerong22
a891b3b814 querydsl: jpa + querydsl 2021-09-09 01:51:15 +09:00
haerong22
85b0662097 Merge branch 'master' of https://github.com/haerong22/Study 2021-09-08 18:02:43 +09:00
haerong22
ffcacdc306 view, view resolver 2021-09-08 18:02:36 +09:00
haerong22
dbad8d8f5f querydsl : projection, dynamic query, bulk update, sql function 2021-09-08 00:58:07 +09:00
haerong22
c4b671d63f Merge branch 'master' of https://github.com/haerong22/Study 2021-09-07 17:17:52 +09:00
haerong22
3cdae77a22 handler mapping, handler adapter, view resolver 2021-09-07 17:17:45 +09:00
haerong22
6784613b8e querydsl : basic - join, theta join, join on, fetch join, subquery, case, concat 2021-09-07 01:11:53 +09:00
haerong22
ffc8604068 dispatcher servlet 2021-09-06 18:01:20 +09:00
haerong22
59a1960cb5 querydsl : search, resultFetch, sort, paging, aggregation, group 2021-09-06 01:06:40 +09:00
haerong22
6ff8a25a93 querydsl : jqpl vs querydsl 2021-09-05 23:22:23 +09:00
haerong22
079fbe29cf querydsl : example test 2021-09-05 01:19:39 +09:00
haerong22
ddcb3fd2ed querydsl : setting 2021-09-05 00:44:34 +09:00
haerong22
8d49cb0106 spring data jpa : native query 2021-09-04 00:05:30 +09:00
haerong22
0260422403 spring data jpa : Projections 2021-09-03 23:22:16 +09:00
haerong22
a498be6f2c spring data jpa : Query By Example 2021-09-03 22:37:51 +09:00
haerong22
349b7a64b6 Merge branch 'master' of https://github.com/haerong22/Study 2021-09-03 21:39:41 +09:00
haerong22
79e507f8bd spring data jpa : Specifications 2021-09-03 21:39:24 +09:00
haerong22
82f2444176 http encryption 2021-09-03 16:47:24 +09:00
haerong22
d7dec53511 http encryption : aes 2021-09-03 12:13:16 +09:00
haerong22
2ba3743d86 spring data jpa : Persistable 2021-09-03 01:13:40 +09:00
haerong22
d53f56ba7b spring data jpa : web extension - domain class converter, paging, sort 2021-09-03 00:03:22 +09:00
haerong22
aace14b55d spring data jpa : auditing 2021-09-02 22:44:52 +09:00
haerong22
cf66d50314 spring data jpa : custom repository 2021-09-02 22:16:13 +09:00
haerong22
aa514596a7 http encryption : js <-> java 2021-09-02 18:02:27 +09:00
haerong22
3762924952 Merge branch 'master' of https://github.com/haerong22/Study 2021-09-02 14:19:40 +09:00
haerong22
ce3e4a91a5 http encryption : response encrypt wrapper 2021-09-02 14:19:34 +09:00
haerong22
b71b3ec8ca spring data jpa : jpa hint & lock 2021-09-02 00:36:10 +09:00
haerong22
c610ca4568 spring data jpa : @EntityGraph 2021-09-02 00:09:36 +09:00
haerong22
db2fd7183f spring data jpa : bulk update 2021-09-01 23:30:41 +09:00
haerong22
aadc0919d6 spring data jpa : paging(spring-data-jpa) 2021-09-01 23:04:59 +09:00
haerong22
abf70e98f9 Merge branch 'master' of https://github.com/haerong22/Study 2021-09-01 17:44:43 +09:00
haerong22
58d328cb59 http encryption : 암호화 된 바디 데이터 복호화 하여 처리 2021-09-01 17:44:28 +09:00
haerong22
db7f32fc2f spring data jpa : paging(jpa) 2021-09-01 00:57:38 +09:00
haerong22
cbb91d32cb spring data jpa : parameter binding, result type 2021-09-01 00:30:56 +09:00
haerong22
5314613c8c spring data jpa : @Query, return value, dto 2021-08-31 23:43:39 +09:00
haerong22
abb9a2bb2b spring data jpa : named query 2021-08-31 23:23:17 +09:00
haerong22
56c3e04afa spring data jpa : query creation 2021-08-31 23:05:44 +09:00
haerong22
7894be3a91 spring data jpa : basic crud test(spring-data-jpa) 2021-08-31 01:00:06 +09:00
haerong22
9884f850c9 spring data jpa : basic crud test(jpa) 2021-08-31 00:27:02 +09:00
haerong22
d8f352e45b spring data jpa : ex domain model test 2021-08-30 22:40:33 +09:00
haerong22
b868e9a030 spring data jpa : jpa vs spring-data-jpa 2021-08-30 22:11:03 +09:00
haerong22
513d012814 Merge branch 'master' of https://github.com/haerong22/Study 2021-08-29 00:48:27 +09:00
haerong22
ad1b163ad4 spring data jpa : init 2021-08-29 00:41:06 +09:00
haerong22
6a7c351639 view change 2021-08-28 20:54:03 +09:00
haerong22
b9336c4b50 refactor: excel download 2021-08-28 16:36:42 +09:00
haerong22
017e7736d6 excel download 2021-08-27 15:56:07 +09:00
haerong22
3864a5be36 redis - remote servie 2021-08-24 14:11:44 +09:00
haerong22
b6633ea520 redis - remote servie 2021-08-24 12:48:42 +09:00
haerong22
35f8fe6f1b redis - remote service 2021-08-21 21:23:36 +09:00
haerong22
8b0bbde6bc redis - remote service 2021-08-20 17:43:24 +09:00
haerong22
d1fac41dc3 mini block chain 2021-08-07 01:01:28 +09:00
haerong22
304ed0f1a4 tdd : picking system - pick error 2021-08-05 22:23:30 +09:00
haerong22
0dc9916bde tdd : picking system - picking 2021-08-05 22:11:12 +09:00
haerong22
cab6df8514 tdd : picking system - picker, picking list assign 2021-08-05 21:22:46 +09:00
haerong22
0d68372add tdd : picking system - assigned picker 2021-08-05 21:01:24 +09:00
haerong22
eae3e20024 tdd : picking system - change order state 2021-08-04 23:51:41 +09:00
haerong22
fbee19e861 tdd : picking system - create picking list 2021-08-04 23:46:46 +09:00
haerong22
a756ce4c99 tdd : picking system - order -> order detail vaildation 2021-08-04 23:05:08 +09:00
haerong22
396111104f tdd : picking system - order detail vaildation 2021-08-04 22:56:41 +09:00
haerong22
900ff41f10 tdd : picking system - create order detail 2021-08-04 22:46:30 +09:00
haerong22
591393b772 tdd : picking system - order state enum 2021-08-04 22:32:07 +09:00
haerong22
e330fca802 tdd : picking system - order validation 2021-08-03 19:29:37 +09:00
haerong22
e6f2115892 tdd : picking system - create order 2021-08-03 18:58:24 +09:00
haerong22
8665d427d8 tdd : picking system - init 2021-08-03 18:37:17 +09:00
haerong22
222d1e2b60 tdd : inventoryHelper test 2021-08-03 17:30:40 +09:00
haerong22
469337c2d6 tdd : inventory test 2021-08-03 16:22:42 +09:00
haerong22
6bd8af76cc tdd : init 2021-08-03 15:44:20 +09:00
haerong22
5e8f7ad59f msa : msa - api gateway 2021-08-02 16:33:09 +09:00
haerong22
e02d823f36 msa : msa - get webbook chapter 2021-08-02 16:03:35 +09:00
haerong22
f2b6b9bd72 msa : msa - webbook chapter payment 2021-07-31 21:00:46 +09:00
haerong22
b69e694be9 msa : msa - get webbook chapter list 2021-07-31 20:15:26 +09:00
haerong22
491a6dd63e msa : msa - get webbook list 2021-07-31 19:53:56 +09:00
haerong22
1fc5c1711b msa : msa - add web book chapter 2021-07-31 18:52:46 +09:00
haerong22
a4b3ea5689 msa : msa - feign client 를 이용하여 모듈간(user, webbok) 연동 : add webbook 2021-07-31 18:09:35 +09:00
haerong22
8fdbc34379 msa : msa - entity 2021-07-31 16:53:17 +09:00
haerong22
b44a10f651 msa : msa - init 2021-07-31 16:22:20 +09:00
haerong22
207accd8bb msa : monolithic - payment webbook chapter 2021-07-29 17:37:52 +09:00
haerong22
4f899cca59 msa : monolithic - get webook chapter list 2021-07-29 16:59:16 +09:00
haerong22
bcc07b6e7e msa : monolithic - get webook list 2021-07-29 15:39:41 +09:00
haerong22
fd8c21fd12 msa : monolithic - regist reader 2021-07-29 14:54:04 +09:00
haerong22
a653ad6f5d msa : monolithic - regist webbook chapter 2021-07-29 14:49:22 +09:00
haerong22
5acd0d6188 msa : monolithic - regist webbook 2021-07-29 14:32:03 +09:00
haerong22
72bc123822 msa : monolithic - regist writer 2021-07-29 14:21:53 +09:00
haerong22
2e301c3e7f msa : init 2021-07-29 13:46:33 +09:00
haerong22
ce5bdb37fe upload : file upload, download 2021-07-28 17:26:30 +09:00
haerong22
390c71326b upload : file upload(spring) 2021-07-28 16:35:25 +09:00
haerong22
a4fcb80abe upload : file upload(servlet) 2021-07-28 15:09:58 +09:00
haerong22
5058a22eb4 upload : init 2021-07-28 11:09:06 +09:00
haerong22
fe38d38c40 type converter : spring default fomatter(annotation) 2021-07-27 19:15:01 +09:00
haerong22
4a10adc89e type converter : DefaultFormatterConversionService 2021-07-27 18:32:04 +09:00
haerong22
40f9c52c95 type converter : formatter 2021-07-27 17:21:57 +09:00
haerong22
6d17000a47 type converter : thymeleaf apply converter(spring) 2021-07-27 16:16:41 +09:00
haerong22
784d6ef37d type converter : regist converter(spring) 2021-07-27 15:52:24 +09:00
haerong22
6b8a5daa96 type converter : conversion service 2021-07-27 13:44:37 +09:00
haerong22
957c2c7250 type converter : converter test 2021-07-27 13:22:05 +09:00
haerong22
a86845a94f type converter : init 2021-07-27 12:50:11 +09:00
haerong22
526b553777 exception : spring - @ControllerAdvice 2021-07-26 21:01:01 +09:00
haerong22
2acacb8495 exception : spring - ExceptionHandlerExceptionResolver 2021-07-26 19:39:13 +09:00
haerong22
0e7cd9f28e exception : spring - DefaultHandlerExceptionResolver 2021-07-26 18:42:18 +09:00
haerong22
2706e2f16d exception : spring - ResponseStatusExceptionResolver 2021-07-26 17:51:08 +09:00
haerong22
c8ca1c2c6a exception : custom HandlerExceptionResolver 2021-07-26 17:13:33 +09:00
haerong22
6096232d39 exception : HandlerExceptionResolver 2021-07-26 16:49:35 +09:00
haerong22
2719ce1f4b exception : handle exception(api) 2021-07-26 15:33:27 +09:00
haerong22
3bedcaa601 exception : exception info(springboot) 2021-07-25 00:42:39 +09:00
haerong22
8586c31e2f exception : exception page(springboot) 2021-07-25 00:28:50 +09:00
haerong22
8f5b52d8ef exception : handle exception(interceptor) 2021-07-24 23:58:51 +09:00
haerong22
91d7539fab exception : handle exception(filter) 2021-07-24 23:20:13 +09:00
haerong22
20345eb1d9 exception : error info 2021-07-24 22:58:37 +09:00
haerong22
f6bae5e299 exception : errorPage 2021-07-24 22:39:37 +09:00
haerong22
d1cd185a93 exception : exception, sendError 2021-07-24 22:00:16 +09:00
haerong22
a43f5d33a5 login : session check(argument resolver) 2021-07-23 17:34:44 +09:00
haerong22
b4761c66d1 login : login check (interceptor) 2021-07-23 16:59:55 +09:00
haerong22
107de2610d login : interceptor 2021-07-23 16:41:12 +09:00
haerong22
d16e743e93 login : login check (filter) 2021-07-23 15:24:30 +09:00
haerong22
b1bb1abbec login : filter 2021-07-23 12:49:41 +09:00
haerong22
55c8c9f9de login : session info, timeout 2021-07-20 22:18:21 +09:00
haerong22
40b6b1211a login : http session(spring) 2021-07-20 22:02:29 +09:00
haerong22
ecf0f48c65 login : http session 2021-07-20 21:45:10 +09:00
haerong22
54a5b68510 login : login with my session 2021-07-20 21:31:26 +09:00
haerong22
713499fec0 login : session manager 2021-07-20 21:20:30 +09:00
haerong22
6228b17526 login : cookie 2021-07-19 22:46:47 +09:00
haerong22
2b79570d89 login : login 2021-07-19 22:13:03 +09:00
haerong22
c749c9d79d login - add member 2021-07-19 21:22:34 +09:00
haerong22
25b42acaad login : home page 2021-07-19 21:04:06 +09:00
haerong22
55eda2dd99 login - init 2021-07-19 20:57:53 +09:00
haerong22
6e69b828a3 springboot_validation : bean validation - http message converter 2021-07-17 22:36:56 +09:00
haerong22
78581cdce0 springboot_validation : bean validation - dto 2021-07-17 21:32:27 +09:00
haerong22
bcda7b7558 springboot_validation : bean validation - groups 2021-07-17 20:12:53 +09:00
haerong22
c5da0f0fe8 springboot_validation : bean validation - object error handling 2021-07-17 11:38:14 +09:00
haerong22
aa48d790d7 springboot_validation : bean validation - error code 2021-07-17 11:25:22 +09:00
haerong22
6c0f5f7e88 springboot_validation : bean validation 2021-07-17 11:03:24 +09:00
haerong22
0a0651e90e springboot_validation : @InitBinder 2021-07-16 03:42:47 +09:00
haerong22
5b48261a38 springboot_validation : validator 2021-07-16 03:30:14 +09:00
haerong22
23b463ca15 springboot_validation : typeMismatch 2021-07-16 03:19:04 +09:00
haerong22
42a3cfb471 springboot_validation : MessageCodesResolver 2021-07-16 03:13:01 +09:00
haerong22
1c68f318e5 springboot_validation : MessageCodesResolver 2021-07-16 01:23:31 +09:00
haerong22
51f2adeeba springboot_validation : reject(), rejectValue() 2021-07-16 00:51:33 +09:00
haerong22
4979ec4ad3 springboot_validation : errors.properties 2021-07-16 00:41:13 +09:00
haerong22
70673e29e3 springboot_validation : v2 - BindingResult & #fields + input value 2021-07-14 23:08:31 +09:00
haerong22
fa59aeedc1 springboot_validation : v2 - BindingResult & #fields 2021-07-14 22:24:58 +09:00
haerong22
1259597ea4 change directory name 2021-07-14 21:57:27 +09:00
haerong22
ef019cde62 springboot_validation : v1 2021-07-14 21:56:07 +09:00
haerong22
743a93731c springboot_validation : init 2021-07-14 21:02:35 +09:00
haerong22
0ab0db8e93 springboot_message : internationalization 2021-07-12 20:54:18 +09:00
haerong22
15983e8eeb springboot_message : message 2021-07-12 20:38:10 +09:00
haerong22
a1fb62520e springboot_message : init 2021-07-12 19:54:41 +09:00
haerong22
00c9a269dd thymeleaf_form : select box 2021-07-12 19:25:35 +09:00
haerong22
ccc730a6d2 thymeleaf_form : radio box 2021-07-12 19:15:54 +09:00
haerong22
574cf622f7 thymeleaf_form : multi checkbox 2021-07-11 17:36:19 +09:00
haerong22
7ed1e1dab1 thymeleaf_form : single checkbox 2021-07-10 15:10:21 +09:00
haerong22
6755588d90 thymeleaf_form : th:object, th:field 2021-07-10 13:46:43 +09:00
haerong22
ceaed89f3a Merge branch 'master' of https://github.com/haerong22/Study 2021-07-10 13:18:32 +09:00
haerong22
fc4e6cff2c thymeleaf_form : init 2021-07-10 13:18:00 +09:00
haerong22
92bd837239 thymeleaf - layout 2021-07-07 19:07:01 +09:00
haerong22
150bfb3720 thymeleaf - layout 2021-07-07 18:24:07 +09:00
haerong22
fdb240f472 thymeleaf - fragment 2021-07-07 18:23:19 +09:00
haerong22
71c30c0578 thymeleaf - javascript inline 2021-07-07 16:37:30 +09:00
haerong22
5ae2c9df13 thymeleaf - block 2021-07-06 21:16:55 +09:00
haerong22
97884965f4 comments 2021-07-05 21:03:26 +09:00
haerong22
1642807194 condition 2021-07-05 20:54:10 +09:00
haerong22
25523700d6 each 2021-07-05 20:44:58 +09:00
haerong22
f5c11356d1 attribute 2021-07-05 20:32:30 +09:00
haerong22
c7b656724f operation 2021-07-05 20:20:17 +09:00
haerong22
b7ef59a6e6 url link & literal 2021-07-05 20:05:40 +09:00
haerong22
0c718984cd utility object, java8time 2021-07-05 19:33:55 +09:00
haerong22
b8c001f69f thymeleaf - basic objects 2021-07-03 22:05:43 +09:00
haerong22
5c092aa8f4 thymeleaf - springEL 2021-07-03 19:50:16 +09:00
haerong22
26b3b8e64c thymeleaf - text, utext 2021-07-02 19:01:05 +09:00
haerong22
8cb96474f7 spring batch : batch api 2021-05-13 16:43:35 +09:00
haerong22
85f35be99b spring batch : scheduling 2021-05-13 16:29:38 +09:00
haerong22
40d23d51b9 spring batch : parallel processing(read database) 2021-05-13 15:35:36 +09:00
haerong22
76b761102e spring batch : parallel processing(read file) 2021-05-13 14:22:43 +09:00
haerong22
1a73fd9850 delete eatgo 2021-05-11 16:12:44 +09:00
haerong22
ab179884f8 spring batch : seperate database(batch, demo) 2021-05-11 16:11:56 +09:00
haerong22
0eb3f353cf spring batch : jobParameters 2021-05-11 15:01:11 +09:00
haerong22
9268189974 spring batch : contextRefreshedEventListener 2021-05-11 14:55:14 +09:00
haerong22
30ec8e1c18 spring batch : reader, processor, writer(jdbc) 2021-05-11 14:25:44 +09:00
haerong22
ef554befa0 spring batch : reader, processor, writer 2021-05-11 12:49:39 +09:00
haerong22
7464feea7b spring batch - job, step 2021-05-11 02:15:27 +09:00
haerong22
3414189371 spring mvc : PRG(Post/Redirect/Get), RedirectAttribute 2021-04-11 19:13:29 +09:00
haerong22
a82b113799 spring mvc : item update 2021-04-11 18:26:43 +09:00
haerong22
498a29e5f7 spring mvc : item save 2021-04-11 18:07:16 +09:00
haerong22
5f92e02fc8 spring mvc : item detail 2021-04-11 00:34:54 +09:00
haerong22
a70c87361b spring mvc : item list 2021-04-10 15:25:36 +09:00
haerong22
d99d444d70 spring mvc : service view page(html) 2021-04-09 23:09:34 +09:00
haerong22
e74c29ad20 spring mvc : item domain 2021-04-09 22:30:25 +09:00
haerong22
fda3fa4684 spring mvc : item service page init 2021-04-08 22:30:52 +09:00
haerong22
3bb55dbd65 spring mvc : http response - message body 2021-04-08 17:59:08 +09:00
haerong22
fd45fe2a6a spring mvc : http response - static, view template 2021-04-08 02:01:41 +09:00
haerong22
c2c29dab9d spring mvc : http request body(json) 2021-04-07 23:16:18 +09:00
haerong22
40adcfb072 spring mvc : http request body(text) 2021-04-07 21:09:52 +09:00
haerong22
6d09b99ca1 spring mvc : @ModelAttribute 2021-04-07 18:48:48 +09:00
haerong22
e7f18d930b spring mvc : @RequestParam 2021-04-07 17:36:05 +09:00
haerong22
1787bc1000 spring mvc : query parameter, html form 2021-04-07 16:00:01 +09:00
haerong22
3b15bd8ff8 spring mvc : http request - header 2021-04-06 21:25:23 +09:00
haerong22
3159a95ee7 spring mvc : request mapping 2021-04-06 20:18:17 +09:00
haerong22
ae3d4b54d3 spring mvc : request mapping 2021-04-06 20:10:54 +09:00
haerong22
5ba57148a4 sprnig mvc : logging 2021-04-05 15:59:16 +09:00
haerong22
cb96cafd2a spring mvc : welcome page 2021-04-05 00:35:01 +09:00
haerong22
cbc4158578 spring mvc : 실용적인 controller 2021-04-04 20:49:58 +09:00
haerong22
b92047f7a4 spring mvc : controller 통합 2021-04-04 20:28:30 +09:00
haerong22
c0fdbc62b2 spring mvc : controller 구현 2021-04-04 20:15:50 +09:00
haerong22
c2ea773b6a spring mvc : ViewResolver 2021-04-04 18:26:42 +09:00
haerong22
1b70093122 spring mvc : HandlerMapping, HandlerAdapter 2021-04-04 17:25:15 +09:00
haerong22
d979c241eb spring mvc : mvc 프레임워크 만들기 - 유연한 컨트롤러 2021-04-03 21:56:27 +09:00
haerong22
72127d8ccc spring mvc : mvc 프레임워크 만들기 - 유연한 컨트롤러 2021-04-03 21:03:51 +09:00
haerong22
9fb140c02a spring mvc : mvc 프레임워크 만들기 - 실용적인 컨트롤러 2021-04-03 20:13:35 +09:00
haerong22
05467386f9 spring mvc : mvc 프레임워크 만들기 - model 추가 2021-04-03 18:43:24 +09:00
haerong22
56347c47c5 spring mvc : mvc 프레임워크 만들기 - front controller, view 분리 2021-04-03 16:50:35 +09:00
haerong22
c4f24fe465 spring mvc : mvc 프레임워크 만들기 - front controller 도입 2021-04-03 00:01:50 +09:00
haerong22
f7f5a8389f spring mvc : 회원관리 웹(mvc) - 회원목록 2021-04-02 00:56:26 +09:00
haerong22
b1a03a1b45 spring mvc : 회원관리 웹(mvc) - 회원가입 2021-04-02 00:41:40 +09:00
haerong22
812380629d spring mvc : 회원관리 웹(mvc) - 회원가입 폼 2021-04-02 00:22:23 +09:00
haerong22
e5791118c4 spring mvc : 회원관리 웹(jsp) - 회원목록 2021-04-01 23:40:33 +09:00
haerong22
69096c047d spring mvc : 회원관리 웹(jsp) - 회원가입 2021-04-01 23:29:00 +09:00
haerong22
b88327b58f spring mvc : 회원관리 웹(jsp) - 회원가입 폼 2021-04-01 23:19:40 +09:00
haerong22
193eef5be7 spring mvc - welcome page 2021-04-01 01:04:42 +09:00
haerong22
7896e0b470 spring mvc : 회원가입 웹 애플리케이션(servlet) 2021-04-01 01:02:04 +09:00
haerong22
aab81cebd5 spring mvc : servlet, jsp, mvc pattern - 회원 관리 웹 2021-03-31 23:18:02 +09:00
haerong22
9a8adaf8f0 spring mvc : HttpServletResponse(json) 2021-03-30 00:34:18 +09:00
haerong22
2d5d0fb32e spring mvc : servlet - HttpServletResponse(html) 2021-03-30 00:13:06 +09:00
haerong22
a6e32dd58b spring mvc : servlet - HttpServletResponse 2021-03-29 23:40:38 +09:00
haerong22
a79e5de0a7 spring mvc : servlet - http message body(json) 2021-03-29 23:16:28 +09:00
haerong22
d5302a4d23 spring mvc : servlet - http message body(String) 2021-03-29 22:55:58 +09:00
haerong22
3e2bab875c spring mvc : servlet - post html form 2021-03-29 21:28:26 +09:00
haerong22
cba360a523 spring mvc : servlet - get query parameter 2021-03-29 20:29:24 +09:00
haerong22
8f721ed0a4 spring mvc : HttpServletRequest 사용 2021-03-29 19:11:09 +09:00
haerong22
45e1e78527 spring mvc : servlet 생성 2021-03-28 23:39:39 +09:00
haerong22
2659fa0c7a spring mvc : servlet project start 2021-03-27 23:21:01 +09:00
haerong22
b76a04926f react web game : switch, exact 2021-03-26 22:20:51 +09:00
haerong22
dbe91e8839 react web game : queryString, URLSearchParams 2021-03-26 21:50:29 +09:00
haerong22
c9729c8e69 react web game : dynamic route 2021-03-26 21:31:39 +09:00
haerong22
907a11fe93 react web game : HashRouter, params, withRouter 2021-03-26 20:26:57 +09:00
haerong22
c2aaee2c6e react web game : BrowserRouter, Link 2021-03-26 19:19:35 +09:00
haerong22
fc5b2013e3 react web game : react router 2021-03-25 22:01:11 +09:00
haerong22
230eff9498 react web game : react router 2021-03-25 21:52:18 +09:00
haerong22
8447297449 react web game : 지뢰찾기 - context api 최적화 2021-03-24 22:42:46 +09:00
haerong22
a3af80205c react web game : 지뢰찾기 - 타이머 2021-03-24 22:04:53 +09:00
haerong22
ed5dc9f01c react web game : 지뢰찾기 - 승리 조건 2021-03-24 21:58:09 +09:00
haerong22
f11fa564b2 react web game : 빈 칸들 한 번에 열기(재귀) 2021-03-23 22:14:28 +09:00
haerong22
a30a666e9e react web game : 지뢰 갯수 표시 2021-03-23 19:59:48 +09:00
haerong22
7141285fde react web game : 클릭 로직 만들기 2021-03-23 19:08:35 +09:00
haerong22
b45c9f34b1 rest controller practice : send email(reset user password) 2021-03-23 16:50:30 +09:00
haerong22
6b635ca397 react web game : useContext 2021-03-22 21:53:39 +09:00
haerong22
e95d3b9165 react web game : Context API - createContext, Provider 2021-03-22 20:40:21 +09:00
haerong22
b5342a2645 rest controller practice : send email (scheduler) 2021-03-22 02:09:52 +09:00
haerong22
67aef63aa6 rest controller practice : scheduler 2021-03-22 01:09:19 +09:00
haerong22
6863329313 rest controller practice : send mail - mail template(board_reply) 2021-03-22 00:01:07 +09:00
haerong22
4e9f8127c9 rest controller practice : send mail - mail template(board_add) 2021-03-21 22:12:48 +09:00
haerong22
3213d8e24f rest controller practice : send mail 2021-03-21 20:31:56 +09:00
haerong22
cad04d75ee rest controller practice : properties 2021-03-21 16:49:22 +09:00
haerong22
cb2662c988 rest controller practice : validation JWT token (interceptor) 2021-03-21 00:23:27 +09:00
haerong22
837cbf17d1 rest controller practice : interceptor 2021-03-20 23:53:56 +09:00
haerong22
19d4f964e5 rest controller practice : naver translate api 2021-03-20 20:09:15 +09:00
haerong22
ea5527923a rest controller practice : kakao translate api 2021-03-20 19:30:47 +09:00
haerong22
17f0a4acb1 rest controller practice : 공공 api 2021-03-20 18:54:12 +09:00
haerong22
f4897a28b1 rest controller practice : open api 사용하기 2021-03-19 17:11:13 +09:00
haerong22
6abc60ae3f rest controller practice : open api 사용하기 2021-03-19 16:15:32 +09:00
haerong22
5f994cb87f rest controller practice : open api 사용하기 2021-03-18 23:57:27 +09:00
haerong22
0c3c2703de rest controller practice : controller log(aop) 2021-03-17 16:22:55 +09:00
haerong22
d2574817a5 rest controller practice : exception log 2021-03-16 15:14:38 +09:00
haerong22
5afbec0fe4 rest controller practice : login log (aop) 2021-03-15 23:18:30 +09:00
haerong22
0e7bfbf018 rest controller practice : 로그인, jwt생성 2021-03-15 19:37:45 +09:00
haerong22
895ef4732d java oop : wrapper class 2021-03-15 17:18:47 +09:00
haerong22
3dc6365baf rest controller practice 2021-03-14 23:46:45 +09:00
haerong22
5a8f260c75 rest controller practice 2021-03-14 22:58:35 +09:00
haerong22
053d2d9d46 rest controller practice 2021-03-14 21:02:52 +09:00
haerong22
0db2b3fb05 java oop : IntArray api 2021-03-14 19:59:24 +09:00
haerong22
f5523c6435 java oop : string class 2021-03-14 18:10:37 +09:00
haerong22
045f2ab5fc java oop : java api 2021-03-14 17:58:24 +09:00
haerong22
142f77510f java oop : package 2021-03-14 15:43:34 +09:00
haerong22
fa9d7c6919 rest controller practice 2021-03-13 22:06:14 +09:00
haerong22
706c9cd32c rest controller practice 2021-03-13 20:48:45 +09:00
haerong22
987c40a5c9 rest controller practice 2021-03-13 19:58:56 +09:00
haerong22
96953f4954 java oop : object class 2021-03-13 18:03:44 +09:00
haerong22
1a4171060a rest controller practice 2021-03-13 18:01:17 +09:00
haerong22
9bd1813384 java oop : object class 2021-03-13 14:51:57 +09:00
haerong22
7ebe360415 react web game : 지뢰찾기 2021-03-13 00:32:14 +09:00
haerong22
b8357a8d3a rest controller practice 2021-03-12 21:38:38 +09:00
haerong22
2255d79091 rest controller practice 2021-03-12 20:25:03 +09:00
haerong22
5c9e2a9cc0 rest controller practice 2021-03-12 18:24:49 +09:00
haerong22
e9b0716fd0 java oop : interface - jdbc 와의 관계 2021-03-12 15:13:45 +09:00
haerong22
d8af84e303 Merge branch 'master' of https://github.com/haerong22/Study 2021-03-12 15:11:10 +09:00
haerong22
9b81e125fb java oop : interface 2021-03-12 14:04:12 +09:00
haerong22
ba2a8669ee react web game : 틱택토 - 테이블 최적화 2021-03-11 20:41:27 +09:00
haerong22
8b836a642d react web game : 틱택토 구현 2021-03-11 20:05:24 +09:00
haerong22
1c6e52efee java oop : message polymorphism 2021-03-10 15:03:30 +09:00
haerong22
a4d8c3a2bc java oop : object casting 2021-03-10 14:30:36 +09:00
haerong22
3c057a52be react web game : 틱택토 - useReducer(reducer, dispatch, action) 2021-03-09 22:43:44 +09:00
haerong22
3f672e26f7 react web game : reducer, dispatch, action 2021-03-09 21:46:30 +09:00
haerong22
d657443e42 react web game : 틱택토 - useReducer 2021-03-09 21:00:28 +09:00
haerong22
b82b983c6a java oop : overiding 2021-03-09 18:15:24 +09:00
haerong22
9d7ca69373 java oop : 상속 2021-03-09 16:43:29 +09:00
haerong22
b9ebb3eef1 react web game : 로또추첨기 Hooks 2021-03-08 19:32:34 +09:00
haerong22
4207a8a8b9 react web game : 로또추첨기 Hooks 2021-03-08 19:31:15 +09:00
haerong22
e09fcbeccd java oop : 여러 API 사용 2021-03-08 17:05:50 +09:00
haerong22
c1eab928bf java oop : 클래스 설계 2021-03-08 15:32:49 +09:00
haerong22
aa498f8ee9 react-redux : rendering 2021-03-08 02:32:44 +09:00
haerong22
2b51bcc65d react-redux : jsx, fragment 2021-03-08 01:54:46 +09:00
haerong22
a3e60033dd react-redux : start 2021-03-08 00:24:00 +09:00
haerong22
b0f96c966b react web game : 로또추첨기 - 클래스 컴포넌트 2021-03-07 19:08:17 +09:00
haerong22
70dd095285 react web game : 로또 추첨기 - 클래스 2021-03-07 18:18:18 +09:00
haerong22
765691e6fa java oop : class, object, instance 2021-03-07 16:00:47 +09:00
haerong22
61893a9dcb java oop : 메모리에 객체 생성과정 2021-03-07 15:35:21 +09:00
haerong22
7df93548f9 react web game : 가위바위보 Hooks로 변경하기 2021-03-07 01:43:13 +09:00
haerong22
77074b9457 react web game : 고차함수 2021-03-07 00:51:04 +09:00
haerong22
00ae1a5d02 java oop : JVM Memory Model 2021-03-06 23:01:59 +09:00
haerong22
4ffd1fa1f9 java oop : 변수와 메소드의 관계 2021-03-06 22:19:29 +09:00
haerong22
2b8c4f2c87 java oop : variable vs array 2021-03-06 20:07:55 +09:00
haerong22
82ac818ad3 react web game : 가위바위보 게임 2021-03-06 01:06:50 +09:00
haerong22
37c8a5c61c react web game :
componentDidMount 안에 setInterval 넣기
2021-03-06 00:38:25 +09:00
haerong22
165b4e4fd6 react web game : react lifecycle 2021-03-05 22:51:33 +09:00
haerong22
e106c78dbf oop : variable, data type, assign 2021-03-05 20:08:45 +09:00
haerong22
a6cd2f88d4 application test : ArchUnit - class dependency test 2021-03-03 17:59:30 +09:00
haerong22
acde3e159b application test : ArchUnit - JUnit 연동 2021-03-03 17:20:31 +09:00
haerong22
63b8593624 application test : archtest 2021-03-03 17:09:27 +09:00
haerong22
0774762ff7 application test : chaos monkey 2021-03-02 17:23:41 +09:00
haerong22
53bda6ff02 application test : jmeter 2021-03-01 15:25:10 +09:00
haerong22
f797c78c1b application test : testcontainers - docker compose 2021-02-28 17:23:39 +09:00
haerong22
c249e495fd application test : testcontainers - 컨테이너 정보 사용 2021-02-28 15:28:35 +09:00
haerong22
cec6d7cedc application test : testcontainers - 기능 2021-02-27 23:48:09 +09:00
haerong22
808ac8a653 application test : testcontainers - 설치, 실행 2021-02-27 22:50:10 +09:00
haerong22
c3ab7070c1 application test : mockito - bddmockito 2021-02-26 22:44:58 +09:00
haerong22
9d750bf725 application test : mockito - verify 2021-02-26 21:53:46 +09:00
haerong22
9a067f2c29 application test : mockito - stubbing 2021-02-26 20:40:50 +09:00
haerong22
e8c8c9b38e application test : mockito - mock 생성 2021-02-26 18:19:00 +09:00
haerong22
c21e407da0 application test : mockito 2021-02-26 17:51:24 +09:00
haerong22
35b0b745af application test : junit5 - junit4 migration 2021-02-25 23:44:16 +09:00
haerong22
68f74b0025 application test : junit5 - Extension Model 2021-02-25 23:05:20 +09:00
haerong22
f8180e4bf5 application test : junit5 - 외부 설정 2021-02-25 21:05:34 +09:00
haerong22
3a04b91368 application test : junit5 - 테스트 순서 2021-02-25 20:06:40 +09:00
haerong22
82d5107d5e application test : junit5 - 테스트 인스턴스 2021-02-25 19:38:49 +09:00
haerong22
88eaa68881 swagger 2021-02-25 17:40:28 +09:00
haerong22
aa14524b43 application test : junit5 - 반복 테스트 2021-02-24 21:04:47 +09:00
haerong22
b7f94f4356 application test : junit5 - 커스텀 태그 2021-02-24 19:07:30 +09:00
haerong22
7c44dd71c4 application test : junit5 - 태깅, 필터링 2021-02-24 18:46:14 +09:00
haerong22
ea6c1e3ae1 application test : junit5 - 조건에 따라 테스트 실행하기 2021-02-24 17:14:47 +09:00
haerong22
181cef092f application test : junit5 - assertion 2021-02-23 17:55:18 +09:00
haerong22
e062e87a62 application test : junit5 - 테스트 이름 표시하기 2021-02-23 15:05:20 +09:00
haerong22
9dd361afa6 application test : junit 2021-02-23 14:38:09 +09:00
haerong22
22e9eaebcc code manipulation : annotation processor #2 2021-02-22 18:15:29 +09:00
haerong22
2f6598a763 code manipulation : annotation processor #1 2021-02-22 15:45:37 +09:00
haerong22
9df40d2578 code manipulation : class proxy(cglib, bytebuddy) 2021-02-22 01:02:20 +09:00
haerong22
da7847a43d code manipulation : dynamic proxy 2021-02-21 22:48:14 +09:00
haerong22
edc5bf337b code manipulation : dynamic proxy(proxy pattern) 2021-02-21 22:12:00 +09:00
haerong22
705a4dcbd3 code manipulation : reflection(간단한 DI 프레임워크 만들기) 2021-02-20 23:37:52 +09:00
haerong22
608cbe2ae2 code manipulation: reflection(Class API) 2021-02-20 21:55:15 +09:00
haerong22
dcc16bbd17 fixed 2021-02-20 00:01:54 +09:00
haerong22
afbe183231 code manipulation: relfection(annotation) 2021-02-19 22:55:23 +09:00
haerong22
b30a888de3 code manipulation : reflect(Class API) 2021-02-19 22:55:10 +09:00
haerong22
41890753df code manipulation : 바이트 코드 변경하기(javaagent) 2021-02-19 22:55:08 +09:00
haerong22
edd21fce02 code manipulation : 바이트 코드 변경하기(ByteBuddy) 2021-02-19 22:55:06 +09:00
haerong22
6533f5fd47 code manipulation : 코드 커버리지 측정하기(jacoco) 2021-02-19 22:54:57 +09:00
haerong22
f88be42e74 java8 : parallel sort 2021-02-19 22:54:46 +09:00
haerong22
fda18e75a0 java8 : annotation 2021-02-19 22:54:31 +09:00
haerong22
eb1460a4a1 java8 : completableFuture(compose, exception) 2021-02-19 22:54:21 +09:00
haerong22
757e5f5656 java8 : completableFuture 2021-02-19 22:54:12 +09:00
haerong22
a05558a2f5 java8 : completableFuture(Callable, Future) 2021-02-19 22:54:04 +09:00
haerong22
89c9384369 java8 : completableFuture(executors) 2021-02-19 22:53:56 +09:00
haerong22
eb69ecaba0 java8 : CompletableFuture 2021-02-19 22:53:46 +09:00
haerong22
8a5b47c436 java8 : Date/Time API 2021-02-19 22:53:36 +09:00
haerong22
ffeeed9250 java8 : date/time api 2021-02-19 22:53:26 +09:00
haerong22
b4b47941df java8 : optional 2021-02-19 22:53:14 +09:00
haerong22
f3881c93a0 java8 : stream api 2021-02-19 22:53:03 +09:00
haerong22
0c7e0d02b7 java8 : stream 2021-02-19 22:52:49 +09:00
haerong22
63b46a4f38 java8 : stream 2021-02-19 22:52:38 +09:00
haerong22
5a95e0d231 io-bound-application : 50k stress test 2021-02-19 22:52:15 +09:00
haerong22
8e0dc27d41 io-bound-application stress test(region 변경, nofile limit 변경) 2021-02-19 22:52:02 +09:00
haerong22
a7a80f35fe io-bound-application stress test 2021-02-19 22:51:34 +09:00
haerong22
89df8e655b java8 : java8 api 에 추가된 기본 메소드들 2021-02-19 22:51:24 +09:00
haerong22
f52fbc692e java8 : interface(default method, static method) 2021-02-19 22:51:14 +09:00
haerong22
31c0953d96 react-springboot : 글 수정하기 2021-02-19 22:51:04 +09:00
haerong22
345dcdd9ff react-springboot : 책 삭제하기 2021-02-19 22:50:50 +09:00
haerong22
3546a59734 react-springboot : 책 상세보기 페이지 2021-02-19 22:50:35 +09:00
haerong22
2ebfad6af5 react-springboot : 책 등록하기 2021-02-19 22:50:25 +09:00
haerong22
7e9793d9f3 react-springboot : 글 목록 보기 2021-02-19 22:50:17 +09:00
haerong22
6ae0cb6027 react-springboot : 화면 구성하기 2021-02-19 22:50:04 +09:00
haerong22
91166d979c react-springboot : init 2021-02-19 22:49:52 +09:00
haerong22
95a2d94d44 auto deploy test : GitHub webhook, jenkins 2021-02-19 22:49:39 +09:00
haerong22
d51a83428c java8 : method references 2021-02-19 22:49:24 +09:00
haerong22
647060c8fb java8 : lambda(expression, variable capture) 2021-02-19 22:49:13 +09:00
haerong22
f6c7164877 java8 : functional interface & lambda 2021-02-19 22:48:58 +09:00
haerong22
c94dc0bb38 java8 : functional interface & lambda 2021-02-19 22:48:30 +09:00
kim
2c5d800247 rolling deploy test 2021-02-07 05:10:26 +09:00
kim
68b01e2bc7 spring boot docker build 2021-02-06 18:02:46 +09:00
kim
8848048bdf stress test with artillery 2021-02-06 00:19:09 +09:00
kim
327545e8f8 cpu bound application 2021-02-05 23:27:22 +09:00
kim
a350f8f707 react-springboot : unit test, integration test 2021-02-05 21:07:48 +09:00
kim
472666bf8e react-springboot : unit test, integration test 2021-02-05 19:45:50 +09:00
kim
c584535a3d react-springboot : controller test (unit, integration) 2021-02-05 18:31:41 +09:00
kim
559ad43316 react-springboot : api server test (junit5) 2021-02-05 17:21:19 +09:00
kim
97508ae5d3 react-springboot : test api server 2021-02-05 16:39:16 +09:00
kim
1181ef4948 react-springboot : server setting 2021-02-05 13:54:52 +09:00
kim
01b5149d66 springboot - webflux 2021-02-04 23:43:52 +09:00
kim
3b235633d7 reactive streams test 2021-02-04 20:48:41 +09:00
kim
cbe5aca2f5 webflux : flux test 2021-02-04 20:14:20 +09:00
kim
b520a64054 react : redux 2021-02-04 16:19:00 +09:00
kim
0c76d9be82 react : post list 2021-02-04 03:00:45 +09:00
kim
2a18e19c2f react : bootstrap 2021-02-04 00:24:01 +09:00
kim
f9d0dc80a7 react : react router dom 2021-02-03 22:22:40 +09:00
kim
5ab44f06f9 react : style componet 상속 2021-02-03 21:24:29 +09:00
kim
4478635b3a react : styled component props 2021-02-03 21:20:12 +09:00
kim
76e8885e1b react : props 2021-02-03 21:05:04 +09:00
kim
cd1abc03b6 react : styled component 2021-02-03 19:02:50 +09:00
kim
78039e26ca react : useRef 2021-02-03 17:51:10 +09:00
kim
b3f1c8c9dc react : useMemo 2021-02-03 17:08:02 +09:00
kim
548dd9206c react : useEffect 2021-02-03 16:28:19 +09:00
kim
32d061a3eb react : useState 2021-02-03 15:46:01 +09:00
kim
83d394fecc react : useState, component 2021-02-03 15:26:35 +09:00
kim
efef869860 react : concat, slice, map, spread(...), filter 2021-02-03 15:09:15 +09:00
kim
dbbdb7d6d8 aop - logback, sentry 2021-02-03 02:50:04 +09:00
kim
94a5456c34 validation - spring-boot-aop : before, after, around 2021-02-03 00:20:17 +09:00
kim
1c2c5c2b2a validation, bindingresult 2021-02-02 23:13:11 +09:00
kim
fd3942df6c rest api basic 2021-02-02 21:56:02 +09:00
kim
419e1ebb6c jpablog : delete comment 2021-02-02 15:14:57 +09:00
kim
a1cac3e0d8 jpablog : delete post cascade 2021-02-02 15:02:51 +09:00
kim
62c665b9f3 jpablog : write comment(native query) 2021-02-02 14:43:41 +09:00
kim
20d9d1a8ba jpablog : write comment(dto) 2021-02-02 14:16:53 +09:00
kim
1a566847a7 jpablog : write comment 2021-02-02 13:59:10 +09:00
kim
6e11fac235 jpablog : comment list 2021-02-02 13:34:31 +09:00
kim
383805369a jpablog : comment form 2021-02-02 13:10:14 +09:00
kim
8db327050b jpablog : kakao login api - oauth 2021-02-02 00:55:08 +09:00
kim
30cf152fc7 jpablog : kakao login api - get user profile 2021-02-01 22:31:24 +09:00
kim
bbb0a43dd5 jpablog : kakao login api - access token 2021-02-01 21:23:48 +09:00
kim
2d73e60fb9 jpablog : spring security session 변경 2021-02-01 19:33:33 +09:00
kim
e46b30e17e jpablog : update user 2021-02-01 18:05:24 +09:00
kim
3f66ed663d jpablog : update post 2021-02-01 16:24:44 +09:00
kim
2b4fd9e3ec jpablog : delete post 2021-02-01 15:11:12 +09:00
kim
4b87bfe924 jpablog : board detail 2021-01-31 00:40:44 +09:00
kim
becc2a0a93 jpablog : page number 2021-01-31 00:20:25 +09:00
kim
132c50a342 jpablog : paging (pageable) 2021-01-30 22:50:08 +09:00
kim
f774e693fc jpablog : board list 2021-01-30 21:31:49 +09:00
kim
c6c8fbe0d7 jpablog : write form(summernote), api 2021-01-30 21:19:02 +09:00
kim
34a5f77013 jpablog : login with spring security 2021-01-30 20:00:10 +09:00
kim
a0bedb3791 jpablog : password encryption 2021-01-30 18:21:17 +09:00
kim
5d4f484a53 jpablog : login form custom (security) 2021-01-30 17:19:14 +09:00
kim
b28b1a3806 jpablog : security login, jsp taglib 2021-01-30 16:58:22 +09:00
kim
5b5b32fc5a jpablog : 요청 주소 변경 2021-01-30 16:42:55 +09:00
kim
fe6b1a679e jpablog : login basic 2021-01-30 16:33:35 +09:00
kim
74c99eb2b4 jpablog : join user 2021-01-30 00:51:51 +09:00
kim
98c792c60d jpablog : login form, join form 2021-01-29 22:18:49 +09:00
kim
233fb8498b jpablog : index page 2021-01-29 21:58:45 +09:00
kim
853f09a930 jpablog : exception handling 2021-01-29 20:45:46 +09:00
kim
2830836a94 jpablog : delete test 2021-01-29 20:07:23 +09:00
kim
28580eb408 jpablog ; update test(dirty checking) 2021-01-29 19:49:31 +09:00
kim
7d7494ffcf jpablog : paging 2021-01-29 18:54:14 +09:00
kim
51ff7f902c jpablog : read test 2021-01-29 18:23:30 +09:00
kim
dd65e06994 jpablog : insert test 2021-01-29 17:17:49 +09:00
kim
fda06b8c72 jpablog : create entity 2021-01-29 16:26:05 +09:00
kim
17a5be0425 jpablog : http test 2021-01-28 23:27:22 +09:00
kim
13c1d9d2db jpablog : mysql 2021-01-28 20:11:38 +09:00
kim
b7e9aae880 jpablog : init 2021-01-28 19:46:53 +09:00
kim
4b63ef0094 jpashop : querydsl 2021-01-28 17:12:42 +09:00
kim
7426896698 jpashop : data jpa 2021-01-28 16:18:21 +09:00
kim
b466b73105 jpashop : 컬렉션 조회 v6 (jpa -dto 직접조회, 플랫 데이터) 2021-01-27 22:33:20 +09:00
kim
eb3ef708a5 jpashop : 컬렉션 조회 v5 (jpa - dto 직접조회 최적화) 2021-01-27 22:02:12 +09:00
kim
37df621a2d jpashop : 컬렉션 조회 v4 (jpa - dto 직접조회) 2021-01-27 21:19:56 +09:00
kim
990121a658 jpashop : 컬럭션 조회 v3.1 (dto응답, paging, batchsize) 2021-01-27 19:33:03 +09:00
kim
ddbd688d8c jpashop : 컬렉션 조회 v3 (dto 응답, fetch join, distinct) 2021-01-27 18:14:08 +09:00
kim
288d6ca162 jpashop : 컬렉션 조회 v2 (entity -> dto 응답) 2021-01-27 17:18:19 +09:00
kim
484b99f670 jpashop : 컬렉션 조회 v1 (entity 직접응답) 2021-01-27 16:32:25 +09:00
kim
d919864281 jpashop : get data api v4 (query use dto) 2021-01-26 21:35:06 +09:00
kim
b8829b9dc8 jpashop : get data api v3 (fetch join) 2021-01-26 20:52:42 +09:00
kim
a2b9015d04 jpashop : get data api v2 (entity -> DTO) 2021-01-26 20:16:19 +09:00
kim
4e9ead35d7 jpashop : get data api v1 (entity) 2021-01-26 19:54:18 +09:00
kim
3c2fdcdd38 jpashop : create sample data 2021-01-26 17:46:35 +09:00
kim
e942391db7 jpashop : get members api 2021-01-26 16:11:14 +09:00
kim
b19be8a7b7 jpashop : update member api 2021-01-26 15:45:16 +09:00
kim
bc71f58ddf jpashop : join member api 2021-01-26 15:09:02 +09:00
kim
1c7096c708 jpashop : order list search, cancle - views, controller 2021-01-25 21:51:10 +09:00
kim
ef10e9fdc5 jpashop : orderForm view, controller 2021-01-25 21:19:38 +09:00
kim
854e0678ec jpashop : update item - dirty checking & merge 2021-01-25 20:10:01 +09:00
kim
423dea6f22 jpashop : updateitem views, controller 2021-01-25 18:53:47 +09:00
kim
860cb533a7 jpashop : itemList view, controller 2021-01-25 18:21:40 +09:00
kim
402204f76f jpashop : create item form, controller 2021-01-25 18:05:13 +09:00
kim
49f797b428 jpashop : list view, controller 2021-01-25 17:46:33 +09:00
kim
4962164138 jpashop : joinForm, member join 2021-01-25 16:57:46 +09:00
kim
a0dc00d626 jpashop : test views 2021-01-25 16:26:48 +09:00
kim
2141af1c6d jpashop : search (dynamic query) 2021-01-25 15:48:22 +09:00
kim
a47eb966be jpashop : order test 2021-01-25 01:11:51 +09:00
kim
0d26dd21a3 jpashop : order service 2021-01-24 21:25:54 +09:00
kim
36586bb895 jpashop : order repository 2021-01-24 20:40:45 +09:00
kim
2906aed318 jpashop : order, orderItem entity 2021-01-24 20:29:15 +09:00
kim
ba9af4d938 jpashop : item service 2021-01-24 19:17:13 +09:00
kim
cb8693943d jpashop : item repository 2021-01-24 19:05:28 +09:00
kim
ce39455fa9 jpashop : item entity 2021-01-24 18:55:10 +09:00
kim
a25469e0d6 jpashop : member test 2021-01-24 18:12:30 +09:00
kim
d3c1633ac9 jpashop : member service 2021-01-24 16:13:32 +09:00
kim
cb62ef3d8e jpashop : member repository 2021-01-24 15:41:24 +09:00
kim
ca58abe65f jpashop : entity config 2021-01-24 15:20:13 +09:00
kim
17eb1989f9 jpashop : entity (embedded type) 2021-01-24 02:44:44 +09:00
kim
95536efdac jpashop : create entity 2021-01-24 02:39:20 +09:00
kim
913277aea3 boot-jpa : init 2021-01-23 23:52:04 +09:00
kim
ca0215011c jspblog : board keyword search 2021-01-23 01:59:02 +09:00
kim
c829cbd3d7 jspblog : delete reply 2021-01-23 01:25:28 +09:00
kim
80c6990ba8 jspblog : reply list 2021-01-22 20:06:34 +09:00
kim
4a1301898e jspblog : write reply (ajax) 2021-01-22 17:52:28 +09:00
kim
c9110a6c78 jspblog : write reply 2021-01-22 15:52:57 +09:00
kim
75d116b884 jspblog : common response dto 2021-01-22 15:19:46 +09:00
kim
094606e426 jspblog : update post 2021-01-22 15:03:58 +09:00
kim
3e31e38789 jspblog : delete post 2021-01-22 13:53:20 +09:00
kim
8012cb97a5 jspblog : views count 2021-01-22 02:09:33 +09:00
kim
6127b81754 jspblog : content detail 2021-01-22 00:58:52 +09:00
kim
2ff55f1429 jspblog : rucy-xss-filter 2021-01-21 19:47:57 +09:00
kim
269f2e3c10 xss filter 2021-01-21 19:15:10 +09:00
kim
edfa2584f3 jspblog : board list firstpage, lastpage, page percent bar 2021-01-21 17:07:37 +09:00
kim
848b59152c jspblog : boardlist paging 2021-01-21 16:36:51 +09:00
kim
fa8905715f jspblog : board list 2021-01-21 15:01:54 +09:00
kim
cffbd128a6 jspblog : session, url check filter 2021-01-21 14:36:13 +09:00
kim
ed6da3790e jspblog : writeForm 2021-01-21 13:18:08 +09:00
kim
9f05d0b031 jspblog : writeForm - summernote api 2021-01-21 01:33:15 +09:00
kim
aa29dc4df1 Command pattern 2021-01-20 23:30:00 +09:00
kim
77b361ba96 Proxy Pattern 2021-01-20 23:13:01 +09:00
kim
b23a62120b jspblog : user login/logout 2021-01-20 22:02:30 +09:00
kim
5ff651a35d jspblog : ajax test - json 2021-01-20 17:19:02 +09:00
kim
163bedea4d jspblog : ajax test 2021-01-20 16:42:37 +09:00
kim
8b3ff7935d jsp blog : ajax - id check 2021-01-20 15:37:38 +09:00
kim
94dcf7b936 jspblog : ajax - XMLHttpRequest, jquery, fetch 2021-01-20 04:15:39 +09:00
kim
847ae74548 jspblog : userjoin - juso.go.kr api 2021-01-20 00:25:30 +09:00
kim
08f341f7b2 Flyweight Pattern 2021-01-19 22:56:03 +09:00
kim
af9458d9de Memento Pattern 2021-01-19 22:45:39 +09:00
kim
a4bacc5e49 jspblog : userjoin 2021-01-19 19:25:09 +09:00
kim
d3a78f4bf7 jspblog : joinForm 2021-01-19 18:15:32 +09:00
kim
a2e0519e28 project setting dbconnect, domain, service, dto, dao 2021-01-19 17:17:31 +09:00
kim
3ec6f556d8 domain, UserService 2021-01-19 15:08:10 +09:00
kim
678a8f7662 http request, response, mime type 2021-01-19 00:06:48 +09:00
kim
51941e2b0c jsp blog setting 2021-01-18 21:22:14 +09:00
kim
da5d5671e3 State Pattern 2021-01-18 16:23:29 +09:00
kim
4af6067c6b Mediator Pattern 2021-01-18 15:34:00 +09:00
kim
8455511ac8 Observer Pattern 2021-01-17 23:32:44 +09:00
kim
8f907de6ff Observer Pattern (use Observable) 2021-01-17 23:07:00 +09:00
kim
3b7ff5babe Observer Pattern 2021-01-17 22:52:35 +09:00
kim
47a4544f6f Facade Pattern 2021-01-17 00:28:49 +09:00
kim
28dfa7044c Chain of Responsibility 2021-01-16 19:26:32 +09:00
kim
1c023fb358 Chain of Responsibility Pattern 2021-01-16 18:33:56 +09:00
kim
2459f8b46f java reflection 2021-01-16 15:58:41 +09:00
kim
6379ad3d08 java reflection - 리플렉션한 메소드의 파라미터값 주입 2021-01-16 15:54:17 +09:00
kim
5bb0c8d488 java reflection - 리플렉션한 메소드 파라미터 분석 2021-01-16 15:15:33 +09:00
kim
8fc0754ab5 java reflection - 디스패쳐 필터 생성- 메소드 검색- 어노테이션으로 검색- 주소 매핑 2021-01-16 02:41:47 +09:00
kim
44396ac986 java reflection init 2021-01-16 00:29:10 +09:00
kim
17e594313d Visitor Pattern 2021-01-15 19:01:52 +09:00
kim
aa329c4f95 Decorator Pattern 2021-01-15 15:40:18 +09:00
kim
3ca5b69ce9 Composite Pattern 2021-01-14 17:37:50 +09:00
kim
44537138fe Bridge Pattern 2021-01-14 16:43:01 +09:00
kim
8017dc6fef Abstract Factory Pattern 2021-01-14 00:22:55 +09:00
kim
922c2854e5 Abstract Factory Pattern 2021-01-13 21:43:26 +09:00
kim
bf5f1582d1 Builder Pattern (chaining) 2021-01-12 16:58:21 +09:00
kim
a75273882d Builder Pattern 2021-01-12 16:36:50 +09:00
kim
f52780c38e deep copy, swallow copy 2021-01-11 18:39:34 +09:00
kim
12d96fec9e Prototype pattern #1 2021-01-11 18:05:42 +09:00
kim
9c2547019e Singleton pattern 2021-01-09 16:10:06 +09:00
kim
054954380b Factory Method pattern 2021-01-09 15:20:13 +09:00
kim
9a3ccd73eb TemplateMethod pattern 2021-01-08 18:44:44 +09:00
kim
18e8ebcf3c Adapter pattern 2021-01-08 17:02:49 +09:00
kim
39a39bdbde Strategy Pattern 2021-01-07 15:34:50 +09:00
haerong22
83f7ac3c47 responsecheck : hooks 2020-12-23 18:34:35 +09:00
haerong22
324efb72fa responsecheck : setTimeout 2020-12-23 17:35:43 +09:00
haerong22
5a0f515d67 react 조건문 2020-12-23 17:08:25 +09:00
haerong22
fbdbcaa48c React.createRef 2020-12-22 20:52:26 +09:00
haerong22
c9f88b76ea hooks - memo 2020-12-22 20:37:34 +09:00
haerong22
aa242cf0fb improve performance : shoudComponentUpdate, PureComponent 2020-12-22 20:23:13 +09:00
haerong22
ac032f6541 number baseball hooks 2020-12-21 15:52:31 +09:00
haerong22
9361fcabcb numberbaseball class component 2020-12-21 15:24:11 +09:00
haerong22
4043468a36 props 2020-12-20 20:50:01 +09:00
haerong22
8e76cbaf22 key 2020-12-20 20:25:55 +09:00
haerong22
1de0dfde66 map 2020-12-20 20:04:29 +09:00
haerong22
1ca5d09378 fix bug(webpack-dev-server) 2020-12-20 19:10:04 +09:00
haerong22
c06eb8213f wordrelay hooks 2020-12-19 22:12:04 +09:00
haerong22
65be1557ee hot reload , dev server 2020-12-19 21:34:16 +09:00
haerong22
64eaf012c2 webpack setting details 2020-12-19 17:55:29 +09:00
haerong22
d78c78bd9e webpack settings 2020-12-19 17:20:03 +09:00
haerong22
5b2b6214fc React Hooks 2020-12-19 15:39:37 +09:00
haerong22
73976a7349 React Hooks 2020-12-19 15:14:45 +09:00
haerong22
ee65cd737a ref 2020-12-17 16:39:11 +09:00
haerong22
aafc454629 함수형 setState 2020-12-17 16:23:53 +09:00
haerong22
3c513b6401 fragment, constructor 2020-12-17 16:13:36 +09:00
haerong22
ae8200c83c gugudan component 2020-12-17 15:55:46 +09:00
haerong22
01fb84e6d9 webgame with react init 2020-12-16 21:40:13 +09:00
haerong22
c0bab54b70 Authorization Authentication with JWT 2020-12-15 20:24:42 +09:00
haerong22
db7e525672 create JWT token 2020-12-15 19:23:45 +09:00
haerong22
647dc6793c UsernamePasswordAuthenticationFilter config 2020-12-15 17:35:52 +09:00
kim
8e90d6b380 jwt filter 2020-12-15 02:38:24 +09:00
haerong22
4a59fe9c1b filter 2020-12-14 21:03:04 +09:00
haerong22
3f0369c37c filter & security filter chain order 2020-12-14 20:07:02 +09:00
kim
0558392291 jwt security setting 2020-12-13 20:18:09 +09:00
kim
0086dccf86 jwt project init 2020-12-13 19:34:26 +09:00
kim
7fce2b2bc8 naver oauth login 2020-12-12 02:23:29 +09:00
kim
081723600f facebook oauth login 2020-12-12 01:49:10 +09:00
kim
94b9871c1c google login -> auto join 2020-12-10 03:41:45 +09:00
kim
d748c108b8 session - Authentication object(userdetails, oauth2user) 2020-12-10 01:01:48 +09:00
kim
e77ae79d04 google oauth login with oauth2-client 2020-12-09 22:48:08 +09:00
kim
c786d8bb08 권한 처리 2020-12-09 03:07:54 +09:00
kim
4d6981459f login with spring security 2020-12-09 02:39:52 +09:00
kim
0a9029e4aa join with security 2020-12-09 02:04:24 +09:00
kim
67b9a0e913 spring security setting 2020-12-08 04:08:10 +09:00
kim
cd1bb84a1d nodemon 2020-12-07 23:57:38 +09:00
kim
6c90cc0a0c create package 2020-12-07 23:20:45 +09:00
kim
78742f6166 routing, express 2020-12-06 22:37:50 +09:00
kim
72708d6efe create server 2020-12-06 21:59:37 +09:00
kim
997e72304a EventEmitter 2020-12-06 01:15:39 +09:00
kim
a2fe0ffb61 sync async 2020-12-05 04:14:24 +09:00
kim
6e4f6b137e 3rd party module 2020-12-05 03:55:12 +09:00
kim
0a3631ace7 core module 2020-12-05 03:42:17 +09:00
kim
4b2d0ebca2 exports module study 2020-12-03 03:58:23 +09:00
haerong22
efe786fbd5 create post api 2020-11-29 22:36:26 +09:00
haerong22
360007e417 finduser, createuser api 2020-11-29 17:42:00 +09:00
haerong22
c88913ebbb jpa findall 2020-11-29 16:28:10 +09:00
haerong22
4a94eec180 h2 database 설정, spring security 설정 변경 2020-11-29 16:04:11 +09:00
haerong22
4b4193017f spring security 인증 처리 2020-11-28 17:40:00 +09:00
haerong22
819e224316 hal browser를 이용한 hateoas 기능 구현 2020-11-28 17:19:00 +09:00
haerong22
edb107354e actuator 를 이용한 rest api monitoring 2020-11-28 17:09:18 +09:00
haerong22
eafe96b914 swagger 정보 커스터마이징 2020-11-28 16:51:55 +09:00
haerong22
e064d5eda8 swagger를 이용한 rest api documentation 2020-11-28 16:37:31 +09:00
haerong22
650ea60f53 추가정보를 전송하기 위한 hateoas 적용 2020-11-28 15:30:02 +09:00
haerong22
9e97a3b269 header 를 이용한 api 버전관리 2020-11-28 14:56:35 +09:00
haerong22
6ffa54dedd request parameter를 통한 버전관리 2020-11-28 14:41:25 +09:00
haerong22
6d88318fea uri를 이용한 rest api 버전관리 2020-11-28 14:27:12 +09:00
haerong22
247ab25b6c json filter 2020-11-27 17:55:27 +09:00
haerong22
c840621c22 jsonignore 2020-11-27 17:40:46 +09:00
haerong22
a29a6cb757 xml형식으로 response받기 2020-11-27 17:24:50 +09:00
haerong22
74a0143945 다국어처리 2020-11-27 17:05:51 +09:00
haerong22
86887dcc32 유효성 검사 2020-11-27 16:21:09 +09:00
haerong22
ce2fdbc33a delete api 2020-11-26 19:00:14 +09:00
haerong22
3e23fb3611 exception handling : aop 2020-11-26 18:51:51 +09:00
haerong22
74ee92c8ec http stauts code handling 2020-11-26 18:39:53 +09:00
haerong22
2df8b99bfb 사용자 추가 api 2020-11-26 18:19:53 +09:00
haerong22
71481e070e get user api 2020-11-26 18:01:23 +09:00
haerong22
cf3f1b684c init , port 변경 2020-11-26 16:42:22 +09:00
haerong22
3a09cf48fc no message 2020-11-26 15:17:32 +09:00
haerong22
d745710e33 restuarant api 2020-11-23 19:40:03 +09:00
haerong22
b9ae7e22da 의존성 주입 2020-11-23 04:19:47 +09:00
haerong22
4045d3d38b 가게 상세 페이지 2020-11-22 19:55:57 +09:00
haerong22
136357901a TDD practice 2020-11-22 19:35:29 +09:00
4693 changed files with 1002350 additions and 290 deletions

348
.gitignore vendored
View File

@@ -1,288 +1,72 @@
# Created by https://www.toptal.com/developers/gitignore/api/intellij,intellij+all,intellij+iml,gradle,java
# Edit at https://www.toptal.com/developers/gitignore?templates=intellij,intellij+all,intellij+iml,gradle,java
### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Intellij Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
.idea/**/sonarlint/
# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
.idea/**/sonarIssues.xml
# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
.idea/**/markdown-navigator.xml
.idea/**/markdown-navigator-enh.xml
.idea/**/markdown-navigator/
# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
.idea/$CACHE_FILE$
# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
.idea/codestream.xml
# Azure Toolkit for IntelliJ plugin
# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
.idea/**/azureSettings.xml
### Intellij+all ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
# AWS User-specific
# Generated files
# Sensitive or high-churn files
# Gradle
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
# Mongo Explorer plugin
# File-based project format
# IntelliJ
# mpeltonen/sbt-idea plugin
# JIRA plugin
# Cursive Clojure plugin
# SonarLint plugin
# Crashlytics plugin (for Android Studio and IntelliJ)
# Editor-based Rest Client
# Android studio 3.1+ serialized cache file
### Intellij+all Patch ###
# Ignore everything but code style settings and run configurations
# that are supposed to be shared within teams.
.idea/*
!.idea/codeStyles
!.idea/runConfigurations
### Intellij+iml ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
# AWS User-specific
# Generated files
# Sensitive or high-churn files
# Gradle
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
# Mongo Explorer plugin
# File-based project format
# IntelliJ
# mpeltonen/sbt-idea plugin
# JIRA plugin
# Cursive Clojure plugin
# SonarLint plugin
# Crashlytics plugin (for Android Studio and IntelliJ)
# Editor-based Rest Client
# Android studio 3.1+ serialized cache file
### Intellij+iml Patch ###
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
*.iml
modules.xml
.idea/misc.xml
*.ipr
### Java ###
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
### Gradle ###
.gradle
**/build/
!src/**/build/
build/
target/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Avoid ignore Gradle wrappper properties
!gradle-wrapper.properties
# Cache of project
.gradletasknamecache
# Eclipse Gradle plugin generated files
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### Gradle Patch ###
# Java heap dump
*.hprof
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/
# End of https://www.toptal.com/developers/gitignore/api/intellij,intellij+all,intellij+iml,gradle,java
# Compliled files
/target/
**/target
**/front-end/node_modules/**
**/front-end/static/**
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Node ###
dev.js
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
**/node_modules/**
**/.secret

View File

@@ -0,0 +1,21 @@
plugins {
id 'java'
}
group 'com.rxjava'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'io.reactivex.rxjava3:rxjava:3.1.3'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}

Binary file not shown.

View File

@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

185
RxJava/ReactiveStream/gradlew vendored Normal file
View File

@@ -0,0 +1,185 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MSYS* | MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

89
RxJava/ReactiveStream/gradlew.bat vendored Normal file
View File

@@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -0,0 +1,2 @@
rootProject.name = 'ReactiveStream'

View File

@@ -0,0 +1,41 @@
package _01_start;
import io.reactivex.rxjava3.core.Flowable;
import java.util.concurrent.TimeUnit;
public class AsyncEx {
private enum State {
ADD, MULTIPLY
}
private static State calcMethod;
public static void main(String[] args) throws InterruptedException {
calcMethod = State.ADD;
Flowable<Long> flowable =
Flowable.interval(300L, TimeUnit.MILLISECONDS)
.take(7)
.scan((sum, data) -> {
if (calcMethod == State.ADD) {
return sum + data;
} else {
return sum * data;
}
});
// 구독 후 받은 데이터 출력
flowable.subscribe(data -> System.out.println("data = " + data));
// Sleep 후 계산법 변경
// Bad case -> 외부의 데이터가 계산에 영향을 주면 안된다.
Thread.sleep(1000);
System.out.println("계산법 변경");
calcMethod = State.MULTIPLY;
Thread.sleep(2000);
}
}

View File

@@ -0,0 +1,15 @@
package _01_start;
import io.reactivex.rxjava3.core.Flowable;
public class ColdPublisherEx {
public static void main(String[] args) {
Flowable<Integer> flowable = Flowable.just(1, 2, 3, 4);
// 구독시 처음부터 타임라인을 재구성하여 모든 데이터를 받을 수 있다.
flowable.subscribe(data -> System.out.println("data = " + data));
flowable.subscribe(data -> System.out.println("data = " + data));
}
}

View File

@@ -0,0 +1,20 @@
package _01_start;
import io.reactivex.rxjava3.processors.PublishProcessor;
public class HotPublisherEx {
public static void main(String[] args) {
PublishProcessor<Integer> processor = PublishProcessor.create();
processor.subscribe(data -> System.out.println("subscribe1 = " + data));
processor.onNext(1);
processor.onNext(2);
// 구독한 시점 이후의 데이터만 받을 수 있다.
processor.subscribe(data -> System.out.println("subscribe2 = " + data));
processor.onNext(3);
processor.onNext(4);
}
}

View File

@@ -0,0 +1,16 @@
package _01_start;
import io.reactivex.rxjava3.core.Flowable;
public class OperatorEx {
public static void main(String[] args) {
Flowable<Integer> flowable =
Flowable.just(1, 2, 3, 4, 5, 6, 7, 8)
.filter(data -> data % 2 == 0 )
.map(data -> data * 2);
flowable.subscribe(data -> System.out.println("data = " + data));
}
}

View File

@@ -0,0 +1,76 @@
package _02_backpressure;
import io.reactivex.rxjava3.core.BackpressureOverflowStrategy;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import java.util.concurrent.TimeUnit;
public class BackPressureStrategyEx {
/*
BUFFER : 모든 데이터 버퍼링
DROP : 새로 생성한 데이터 삭제
LATEST : 버퍼가 비워질 때 까지 통지 데이터 대기
ERROR : 버퍼 크기 초과시 MissingBackpressureException
NONE : 특정 처리 수행 X
*/
public static void main(String[] args) throws InterruptedException {
// BUFFER 전략
// bufferStrategy();
// DROP 전략
// dropStrategy();
// LATEST 전략
latestStrategy();
Thread.sleep(3000L);
}
private static void latestStrategy() {
Flowable.interval(300L, TimeUnit.MILLISECONDS)
.doOnNext(data -> System.out.println("interval = " + data))
.onBackpressureLatest()
.observeOn(Schedulers.computation(), false, 1)
.subscribe(
data -> {
Thread.sleep(1000L);
System.out.println("data = " + data);
},
error -> System.out.println("error = " + error)
);
}
private static void dropStrategy() {
Flowable.interval(300L, TimeUnit.MILLISECONDS)
.doOnNext(data -> System.out.println("interval = " + data))
.onBackpressureDrop(drop -> System.out.println("drop = " + drop))
.observeOn(Schedulers.computation(), false, 1)
.subscribe(
data -> {
Thread.sleep(1000L);
System.out.println("data = " + data);
},
error -> System.out.println("error = " + error)
);
}
private static void bufferStrategy() {
Flowable.interval(300L, TimeUnit.MILLISECONDS)
.doOnNext(data -> System.out.println("interval = " + data))
.onBackpressureBuffer(
2,
() -> System.out.println("overflow"),
BackpressureOverflowStrategy.DROP_LATEST // ERROR, DROP_LATEST, DROP_OLDEST
)
.doOnNext(data -> System.out.println("buffer = " + data))
.observeOn(Schedulers.computation(), false, 1)
.subscribe(
data -> {
Thread.sleep(1000L);
System.out.println("data = " + data);
},
error -> System.out.println("error = " + error)
);
}
}

View File

@@ -0,0 +1,30 @@
package _02_backpressure;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import java.util.concurrent.TimeUnit;
public class MissingBackpressureExceptionEx {
public static void main(String[] args) throws InterruptedException {
/*
실행시 통지 속도보다 처리 속도가 느리기 때문에 MissingBackpressureException 발생
기본 버퍼가 128 이므로 128이상의 통지가 오면 예외발생
*/
Flowable.interval(1L, TimeUnit.MILLISECONDS) // 1ms 마다 숫자 통지
.doOnNext(data -> System.out.println("data = " + data)) // 통지된 데이터 출력
.observeOn(Schedulers.computation())
.subscribe(
data -> {
System.out.println("처리 대기중");
Thread.sleep(1000L); // 1초의 지연
System.out.println("data = " + data);
},
error -> System.out.println("error = " + error),
() -> System.out.println("completed")
);
Thread.sleep(2000L);
}
}

View File

@@ -0,0 +1,53 @@
package _03_basic;
import io.reactivex.rxjava3.core.BackpressureStrategy;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
public class FlowableEx {
public static void main(String[] args) {
Flowable<String> flowable = Flowable.create(emitter -> {
String[] data = {"Hello, World!", "Hello, RxJava!"};
for (String d : data) {
if (emitter.isCancelled()) {
return;
}
emitter.onNext(d);
}
emitter.onComplete();
}, BackpressureStrategy.BUFFER);
flowable.observeOn(Schedulers.computation())
.subscribe(new Subscriber<String>() {
private Subscription subscription;
@Override
public void onSubscribe(Subscription s) {
this.subscription = s;
this.subscription.request(1L); // 데이터 개수 요청
}
@Override
public void onNext(String s) {
System.out.println(s);
this.subscription.request(1L); // 다음에 받을 데이터 개수 요청
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("complete");
}
});
}
}

View File

@@ -0,0 +1,52 @@
package _03_basic;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class ObservableEx {
public static void main(String[] args) {
/*
observable 은 배압이 없기 때문에 데이터가 생성 될 때마다 바로 통지된다.
*/
Observable<String> observable = Observable.create(emitter -> {
String[] data = {"Hello, World!", "Hello, RxJava!"};
for (String d : data) {
if (emitter.isDisposed()) {
return;
}
emitter.onNext(d);
}
emitter.onComplete();
});
observable.observeOn(Schedulers.computation())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
// 구독 중 구독을 해지하려면 전달받은 Disposable 을 내부에 보관(dispose 메소드 호출)
}
@Override
public void onNext(@NonNull String s) {
System.out.println(s);
}
@Override
public void onError(@NonNull Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("complete");
}
});
}
}

View File

@@ -0,0 +1,11 @@
### Flowable, Observable
- Flowable : 배압 기능이 있다. 대량 데이터 처리, 네트워크 처리, I/O 처리
- Observable : 배압 기능이 없다. 소량 데이터 처리
### 통지 규칙
- null을 통지하면 안된다.
- 데이터 통지는 Optional이다.
- 완료나 에러 통지를 한 뒤에는 다른 통지를 해서는 안 된다.
- 통지를 할 때는 1건씩 순차적으로 통지해야 하며 동시에 통지하면 안 된다.

View File

@@ -0,0 +1,14 @@
package _01_lambda;
public interface ExInterface {
void getMsg();
default String defaultMethod() {
return "default method";
}
static void print(String msg) {
System.out.println("msg = " + msg);
}
}

View File

@@ -0,0 +1,17 @@
package _01_lambda;
public class LambdaEx_01 {
public static void main(String[] args) {
ExInterface.print("interface static method test");
ExInterface exInterface = () -> System.out.println("implement abstract method");
exInterface.getMsg();
String result = exInterface.defaultMethod();
System.out.println("result = " + result);
}
}

View File

@@ -0,0 +1,18 @@
package _01_lambda;
public class LambdaEx_02 {
public static void main(String[] args) {
// 람다 사용 X
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Run Thread");
}
}).start();
// 람다 사용
new Thread(() -> System.out.println("Lambda Run Thread")).start();
}
}

View File

@@ -0,0 +1,46 @@
package _01_lambda;
public class LambdaEx_03 {
@FunctionalInterface
interface MyFunction1 {
int calc(int a);
}
@FunctionalInterface
interface MyFunction2 {
int calc(int a, int b);
}
@FunctionalInterface
interface MyFunction3 {
void print();
}
public static void main(String[] args) {
// 파라미터가 1개인 람다식
MyFunction1 result1 = (x) -> { return x + x; };
MyFunction1 result2 = x -> x + x; // 괄호 생략 가능
System.out.println("result1 = " + result1.calc(5));
System.out.println("result2 = " + result2.calc(5));
// 파라미터가 2개인 람다식
MyFunction2 add = (x, y) -> x + y;
MyFunction2 minus = (x, y) -> x - y;
System.out.println("add = " + add.calc(1, 2));
System.out.println("minus = " + minus.calc(1, 2));
// 파라미터가 없는 람다식
MyFunction3 myFunction3 = () -> System.out.println("print method");
myFunction3.print();
// 함수형 인터페이스 파라미터로 전달
printSum(3, 4, (x, y) -> x * y);
}
static void printSum(int x, int y, MyFunction2 f) {
System.out.println(f.calc(x, y));
}
}

View File

@@ -0,0 +1,14 @@
package _01_lambda;
public class LambdaEx_04 {
@FunctionalInterface
interface MyFunction3 {
void print();
}
public static void main(String[] args) {
//
}
}

View File

@@ -0,0 +1,83 @@
package _02_functional_interface;
import java.io.BufferedReader;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.*;
/**
* Function : T -> R
* Consumer : T -> void
* Supplier : void -> T
* Operator : T -> T
* Predicate : T -> boolean
*
*/
public class FunctionalInterfaceEx_01 {
public static void main(String[] args) {
// 예외 throw 불가능 -> try catch 구문을 이용하여 예외처리를 한다.
Function<BufferedReader, String> f = bufferedReader -> {
try {
return bufferedReader.readLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
};
// Predicate 사용
List<String> list = Arrays.asList("", "test1", "test2", "test3", "");
List<String> result = filter(list, s -> !s.isEmpty()); // 리스트의 공백을 제거하는 predicate 전달
System.out.println("list = " + list);
System.out.println("result = " + result);
// Consumer 사용
List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5);
forEach(list2, i -> System.out.println(i)); // 리스트 값 출력하는 consumer 전달
// Function 사용
List<String> list3 = Arrays.asList("test1", "test22", "test333");
List<Integer> result3 = map(list3, s -> s.length()); // 각 요소의 길이 출력
System.out.println("result3 = " + result3);
// Operator 사용
UnaryOperator<String> u = str -> str + " test";
String result4 = u.apply("operator");
System.out.println("result4 = " + result4);
// Supplier 사용
Supplier<String> s = () -> "supplier";
String result5 = s.get();
System.out.println("result5 = " + result5);
}
public static <T, R> List<R> map(List<T> list, Function<T, R> f) {
List<R> result = new ArrayList<>();
for (T t : list) {
result.add(f.apply(t));
}
return result;
}
public static <T> void forEach(List<T> list, Consumer<T> c) {
for (T t : list) {
c.accept(t);
}
}
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
final List<T> result = new ArrayList<>();
for (T t : list) {
if (p.test(t)) {
result.add(t);
}
}
return result;
}
}

View File

@@ -0,0 +1,55 @@
package _03_stream;
import java.util.Arrays;
import java.util.List;
public class Dish {
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}
public String getName() {
return name;
}
public boolean isVegetarian() {
return vegetarian;
}
public int getCalories() {
return calories;
}
public Type getType() {
return type;
}
public enum Type {
MEAT, FISH, OTHER
}
@Override
public String toString() {
return name;
}
public static final List<Dish> menu = Arrays.asList(
new Dish("돼지고기", false, 800, Type.MEAT),
new Dish("소고기", false, 700, Type.MEAT),
new Dish("닭고기", false, 400, Type.MEAT),
new Dish("감자 튀김", true, 530, Type.OTHER),
new Dish("", true, 350, Type.OTHER),
new Dish("계절 과일", true, 120, Type.OTHER),
new Dish("피자", true, 550, Type.OTHER),
new Dish("연어", false, 450, Type.FISH)
);
}

View File

@@ -0,0 +1,28 @@
package _03_stream;
import java.util.Arrays;
public class StreamEx_01 {
public static void main(String[] args) {
String[] words = {"a", "bc", "def"};
// stream 사용 X
int count = 0;
for (String word : words) {
if (word.length() > 2) {
count++;
}
}
System.out.println("count = " + count);
// stream 사용
long streamCount = Arrays.stream(words)
.filter(word -> word.length() > 2)
.count();
System.out.println("streamCount = " + streamCount);
}
}

View File

@@ -0,0 +1,21 @@
package _03_stream;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class StreamEx_02 {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
// 스트림 생성
Stream<Integer> stream = list.stream(); // Collection
Stream<String> stringStream = Stream.of("a", "b", "c");// 배열
Stream<Double> ranStream = Stream.generate(Math::random); // 메소드 레퍼런스
IntStream intStream = new Random().ints(5); // 난수 스트림
}
}

View File

@@ -0,0 +1,26 @@
package _03_stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamEx_03 {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(3, 1, 5, 4, 2);
List<Integer> sortedList = list.stream()
.sorted() // 정렬
.toList(); // 새로운 List 에 저장
System.out.println("list = " + list);
System.out.println("sortedList = " + sortedList);
String[] words = {"a", "bc", "def"};
Stream<String> stream = Arrays.stream(words);
stream.forEach(System.out::println);
// long count = stream.count(); // 재사용 불가
// System.out.println("count = " + count);
}
}

View File

@@ -0,0 +1,15 @@
package _03_stream;
import java.util.stream.Stream;
public class StreamEx_04 {
public static void main(String[] args) {
Stream<String> stringStream = Stream.of("aa", "bb", "cc", "dd", "ee");
int sum = stringStream.parallel() // 병렬 스트림으로 전환
.mapToInt(String::length).sum();
System.out.println("sum = " + sum);
}
}

View File

@@ -0,0 +1,17 @@
package _03_stream;
import java.util.List;
public class StreamEx_05 {
public static void main(String[] args) {
List<String> names = Dish.menu.stream()
.filter(dish -> dish.getCalories() > 300)
.map(Dish::getName)
.limit(3)
.toList();
System.out.println("names = " + names);
}
}

View File

@@ -0,0 +1,16 @@
package _03_stream;
import java.util.List;
public class StreamEx_06 {
public static void main(String[] args) {
List<Dish> vegetarianMenu = Dish.menu.stream()
.filter(Dish::isVegetarian)
.toList();
System.out.println("vegetarianMenu = " + vegetarianMenu);
}
}

View File

@@ -0,0 +1,18 @@
package _03_stream;
import java.util.Arrays;
import java.util.List;
public class StreamEx_07 {
public static void main(String[] args) {
// distinct -> hashCode, equals 로 결정
List<Integer> list = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
list.stream()
.filter(i -> i % 2 == 0)
.distinct()
.forEach(System.out::println);
}
}

View File

@@ -0,0 +1,17 @@
package _03_stream;
import java.util.List;
public class StreamEx_08 {
public static void main(String[] args) {
// skip(n) n번째 요소 이후의 요소만 선택, 없으면 빈배열
List<Dish> dishes = Dish.menu.stream()
.filter(dish -> dish.getCalories() > 300)
.skip(2)
.toList();
System.out.println("dishes = " + dishes);
}
}

View File

@@ -0,0 +1,29 @@
package _03_stream;
import java.util.Arrays;
import java.util.List;
public class StreamEx_09 {
public static void main(String[] args) {
// map -> 다른 타입으로 변환
List<Integer> result = Dish.menu.stream()
.map(Dish::getName)// Dish -> String
.map(String::length)// String -> Integer
.toList();
System.out.println("result = " + result);
// flatMap
List<String> words = Arrays.asList("Hello", "world");
List<String> uniqueCharacter = words.stream()
.map(word -> word.split("")) // String -> String[] 이 되므로 Stream<String[]>
.flatMap(Arrays::stream) // Stream<String>
.distinct()
.toList();
System.out.println("uniqueCharacter = " + uniqueCharacter);
}
}

View File

@@ -0,0 +1,35 @@
package _03_stream;
import java.util.Optional;
public class StreamEx_10 {
public static void main(String[] args) {
if (isVegetarianFriendlyMenu()) {
System.out.println("Vegetarian friendly");
}
System.out.println(isHealthyMenu());
System.out.println(isHealthyMenu2());
findVegetarianDish()
.ifPresent(dish -> System.out.println(dish.getName()));
}
private static Optional<Dish> findVegetarianDish() {
return Dish.menu.stream().filter(Dish::isVegetarian).findAny();
}
private static boolean isHealthyMenu2() {
return Dish.menu.stream().noneMatch(dish -> dish.getCalories() >= 1000);
}
private static boolean isHealthyMenu() {
return Dish.menu.stream().allMatch(dish -> dish.getCalories() < 1000);
}
private static boolean isVegetarianFriendlyMenu() {
return Dish.menu.stream().anyMatch(Dish::isVegetarian);
}
}

View File

@@ -0,0 +1,28 @@
package _03_stream;
import java.util.Arrays;
import java.util.List;
public class StreamEx_11 {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(3, 4, 5, 1, 2);
Integer sum = numbers.stream().reduce(0, Integer::sum);
System.out.println("sum = " + sum);
numbers.stream().reduce(Math::min)
.ifPresent(System.out::println);
numbers.stream().reduce(Math::max)
.ifPresent(System.out::println);
List<String> strings = Arrays.asList("a", "b", "c");
strings.stream()
.filter(str -> !str.equals("b"))
.reduce((a, b) -> a + b)
.ifPresent(System.out::println);
}
}

View File

@@ -0,0 +1,21 @@
plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'io.reactivex.rxjava3:rxjava:3.1.6'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}

Binary file not shown.

View File

@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

234
RxJava/practice/gradlew vendored Normal file
View File

@@ -0,0 +1,234 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

89
RxJava/practice/gradlew.bat vendored Normal file
View File

@@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -0,0 +1,2 @@
rootProject.name = 'practice'

View File

@@ -0,0 +1,73 @@
package org.example.common;
public class Car {
private CarMaker carMaker;
private CarType carType;
private String carName;
private int carPrice;
private boolean isNew;
public Car(String carName){
this.carName = carName;
}
public Car(String carName, CarType carType){
this.carName = carName;
this.carType = carType;
}
public Car(CarMaker carMaker, String carName, CarType carType, int carPrice){
this.carMaker = carMaker;
this.carName = carName;
this.carType = carType;
this.carPrice = carPrice;
}
public Car(CarMaker carMaker, CarType carType, String carName, int carPrice, boolean isNew) {
this.carMaker = carMaker;
this.carType = carType;
this.carName = carName;
this.carPrice = carPrice;
this.isNew = isNew;
}
public CarMaker getCarMaker() {
return carMaker;
}
public void setCarMaker(CarMaker carMaker) {
this.carMaker = carMaker;
}
public CarType getCarType() {
return carType;
}
public void setCarType(CarType carType) {
this.carType = carType;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public int getCarPrice() {
return carPrice;
}
public void setCarPrice(int carPrice) {
this.carPrice = carPrice;
}
public boolean isNew() {
return isNew;
}
public void setNew(boolean aNew) {
isNew = aNew;
}
}

View File

@@ -0,0 +1,29 @@
package org.example.common;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class CarFilter {
// 사용자 정의 Predicate 사용
public static List<Car> filterCarByCustomPredicate(List<Car> cars, CarPredicate p) {
List<Car> resultCars = new ArrayList<>();
for(Car car : cars)
if (p.test(car)) {
resultCars.add(car);
}
return resultCars;
}
// java.util.function 패키지에 내장된 Predicate 사용
public static List<Car> filterCarByBuiltinPredicate(List<Car> cars, Predicate<Car> p) {
List<Car> resultCars = new ArrayList<>();
for(Car car : cars)
if (p.test(car)) {
resultCars.add(car);
}
return resultCars;
}
}

View File

@@ -0,0 +1,9 @@
package org.example.common;
public enum CarMaker {
HYUNDAE,
CHEVROLET,
KIA,
SSANGYOUNG,
SAMSUNG
}

View File

@@ -0,0 +1,5 @@
package org.example.common;
public interface CarPredicate {
boolean test(Car car);
}

View File

@@ -0,0 +1,7 @@
package org.example.common;
public enum CarType {
SEDAN,
SUV,
PICKUPTRUK
}

View File

@@ -0,0 +1,96 @@
package org.example.common;
import io.reactivex.rxjava3.core.Observable;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class SampleData {
public static CarMaker[] carMakersDuplicated = {
CarMaker.CHEVROLET,
CarMaker.HYUNDAE,
CarMaker.SAMSUNG,
CarMaker.SSANGYOUNG,
CarMaker.CHEVROLET,
CarMaker.HYUNDAE,
CarMaker.KIA,
CarMaker.SSANGYOUNG
};
public static CarMaker[] carMakers = {
CarMaker.CHEVROLET,
CarMaker.HYUNDAE,
CarMaker.SAMSUNG,
CarMaker.SSANGYOUNG,
CarMaker.KIA
};
public static List<Car> carList =
Arrays.asList(
new Car(CarMaker.CHEVROLET, "말리부", CarType.SEDAN, 23_000_000),
new Car(CarMaker.HYUNDAE, "쏘렌토", CarType.SUV, 33_000_000),
new Car(CarMaker.CHEVROLET, "트래버스", CarType.SUV, 50_000_000),
new Car(CarMaker.HYUNDAE, "팰리세이드", CarType.SEDAN, 28_000_000),
new Car(CarMaker.CHEVROLET, "트랙스", CarType.SUV, 18_000_000),
new Car(CarMaker.SSANGYOUNG, "티볼리", CarType.SUV, 23_000_000),
new Car(CarMaker.SAMSUNG, "SM6", CarType.SUV, 40_000_000),
new Car(CarMaker.SSANGYOUNG, "G4렉스턴", CarType.SUV, 43_000_000),
new Car(CarMaker.SAMSUNG, "SM5", CarType.SEDAN, 35_000_000)
);
// A, B, C 구간의 차량 속도 데이터
public static final Integer[] speedOfSectionA = {100, 110, 115, 130, 160};
public static final Integer[] speedOfSectionB = {85, 90, 100, 110, 105, 113, 125};
public static final Integer[] speedOfSectionC = {98, 88, 111, 123, 155, 124, 136, 143};
// 지점 A의 월별 매출
public static final List<Integer> salesOfBranchA = Arrays.asList(
15_000_000, 25_000_000, 10_000_000, 35_000_000, 23_000_000, 40_000_000, 50_000_000, 45_000_000,
35_000_000, 23_000_000, 15_000_000, 10_000_000
);
// 지점 B의 월별 매출
public static final List<Integer> salesOfBranchB = Arrays.asList(
11_000_000, 23_000_000, 15_000_000, 32_000_000, 13_000_000, 45_000_000, 55_000_000, 43_000_000,
25_000_000, 28_000_000, 19_000_000, 13_000_000
);
// 지점 C의 월별 매출
public static final List<Integer> salesOfBranchC = Arrays.asList(
12_000_000, 21_000_000, 19_000_000, 33_000_000, 33_000_000, 41_000_000, 52_000_000, 48_000_000,
32_000_000, 21_000_000, 18_000_000, 14_000_000
);
// 서울의 시간별 미세먼지 농도
public static final List<Integer> seoulPM10List = Arrays.asList(
45, 30, 68, 70, 100, 110, 120, 90, 80, 60, 50, 60, 70, 80, 100, 150, 140, 130, 170, 130, 90, 86, 67, 50
);
// 부산의 시간별 미세먼지 농도
public static final List<Integer> busanPM10List = Arrays.asList(
35, 30, 63, 50, 80, 90, 100, 80, 70, 50, 55, 60, 65, 75, 80, 90, 100, 90, 120, 110, 70, 66, 65, 55
);
// 인천의 시간별 미세먼지 농도
public static final List<Integer> incheonPM10List = Arrays.asList(
55, 40, 73, 70, 85, 99, 120, 85, 75, 73, 80, 70, 95, 95, 100, 120, 110, 120, 140, 120, 100, 125, 135, 125
);
// 1시간 동안 서울의 온도 변화 데이터
public static Integer[] temperatureOfSeoul = {10, 13, 14, 12, 11, 9};
// 1시간 동안 서울의 습도 변화 데이터
public static Integer[] humidityOfSeoul = {45, 35, 33, 43, 32, 62};
public static Observable<String> getSpeedPerSection(String section, long interval, final Integer[] speedData){
return Observable.interval(interval, TimeUnit.MILLISECONDS)
.take(speedData.length)
.map(Long::intValue)
.map(i -> section + " 지점의 차량 속도: " + speedData[i]);
}
}

View File

@@ -0,0 +1,19 @@
package org.example.ex01;
import java.util.Arrays;
import java.util.List;
public class DeclarativePrograming {
public static void main(String[] args){
// List에 있는 숫자들 중에서 6보다 큰 홀수들의 합계를 구하세요.
List<Integer> numbers = Arrays.asList(1, 3, 21, 10, 8, 11);
int sum = numbers.stream()
.filter(number -> number > 6 && (number % 2 != 0))
.mapToInt(number -> number)
.sum();
System.out.println("# 선언형 프로그래밍 사용: " + sum);
}
}

View File

@@ -0,0 +1,21 @@
package org.example.ex01;
import java.util.Arrays;
import java.util.List;
public class ImperativeProgramming {
public static void main(String[] args){
// List에 있는 숫자들 중에서 6보다 큰 홀수들의 합계를 구하세요.
List<Integer> numbers = Arrays.asList(1, 3, 21, 10, 8, 11);
int sum = 0;
for(int number : numbers){
if(number > 6 && (number % 2 != 0)){
sum += number;
}
}
System.out.println("# 명령형 프로그래밍 사용: " + sum);
}
}

View File

@@ -0,0 +1,18 @@
package org.example.ex01;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class ReactiveProgramming {
public static void main(String[] args) throws InterruptedException {
Observable.just(100, 200, 300, 400, 500)
.doOnNext(data -> System.out.println(Thread.currentThread().getName() + " : #doOnNext() : " + data))
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.filter(number -> number > 300)
.subscribe(num -> System.out.println(Thread.currentThread().getName() + " : result : " + num));
Thread.sleep(500);
}
}

View File

@@ -0,0 +1,12 @@
package org.example.ex02;
import io.reactivex.rxjava3.core.Observable;
public class MarbleExample01 {
public static void main(String[] args) {
Observable.just(1, 25, 9, 15, 7, 30)
.filter(x -> x > 10)
.subscribe(System.out::println);
}
}

View File

@@ -0,0 +1,12 @@
package org.example.ex02;
import io.reactivex.rxjava3.core.Observable;
public class MarbleExample02 {
public static void main(String[] args) {
Observable<Integer> observable = Observable.just(1, 25, 9, 15, 7, 30);
observable.subscribe(System.out::println);
}
}

View File

@@ -0,0 +1,13 @@
package org.example.ex03;
import io.reactivex.rxjava3.core.Flowable;
public class ColdPublisherEx {
public static void main(String[] args) {
Flowable<Integer> flowable = Flowable.just(1, 3, 5, 7);
flowable.subscribe(data -> System.out.println("구독자1: " + data));
flowable.subscribe(data -> System.out.println("구독자2: " + data));
}
}

View File

@@ -0,0 +1,19 @@
package org.example.ex03;
import io.reactivex.rxjava3.processors.PublishProcessor;
public class HotPublisherEx {
public static void main(String[] args) {
PublishProcessor<Integer> processor = PublishProcessor.create();
processor.subscribe(data -> System.out.println("구독자1: " + data));
processor.onNext(1);
processor.onNext(3);
processor.subscribe(data -> System.out.println("구독자2: " + data));
processor.onNext(5);
processor.onNext(7);
processor.onComplete();
}
}

View File

@@ -0,0 +1,35 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.BackpressureOverflowStrategy;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
public class BackpressureBufferEx01 {
public static void main(String[] args) {
System.out.println("# start : " + TimeUtil.getCurrentTimeFormatted());
Flowable.interval(300L, TimeUnit.MILLISECONDS)
.doOnNext(data -> Logger.log("#interval doOnNext()", data))
.onBackpressureBuffer(
2,
() -> Logger.log("overflow!"),
BackpressureOverflowStrategy.DROP_LATEST
)
.doOnNext(data -> Logger.log("#onBackpressureBuffer doOnNext()", data))
.observeOn(Schedulers.computation(), false, 1)
.subscribe(
data -> {
TimeUtil.sleep(1000L);
Logger.log(LogType.ON_NEXT, data);
},
error -> Logger.log(LogType.ON_ERROR, error)
);
TimeUtil.sleep(2800L);
}
}

View File

@@ -0,0 +1,35 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.BackpressureOverflowStrategy;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
public class BackpressureBufferEx02 {
public static void main(String[] args) {
System.out.println("# start : " + TimeUtil.getCurrentTimeFormatted());
Flowable.interval(300L, TimeUnit.MILLISECONDS)
.doOnNext(data -> Logger.log("#interval doOnNext()", data))
.onBackpressureBuffer(
2,
() -> Logger.log("overflow!"),
BackpressureOverflowStrategy.DROP_OLDEST
)
.doOnNext(data -> Logger.log("#onBackpressureBuffer doOnNext()", data))
.observeOn(Schedulers.computation(), false, 1)
.subscribe(
data -> {
TimeUtil.sleep(1000L);
Logger.log(LogType.ON_NEXT, data);
},
error -> Logger.log(LogType.ON_ERROR, error)
);
TimeUtil.sleep(2800L);
}
}

View File

@@ -0,0 +1,29 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
public class BackpressureDropEx {
public static void main(String[] args) {
System.out.println("# start : " + TimeUtil.getCurrentTimeFormatted());
Flowable.interval(300L, TimeUnit.MILLISECONDS)
.doOnNext(data -> Logger.log("#interval doOnNext()", data))
.onBackpressureDrop(dropData -> Logger.log(LogType.PRINT, dropData + " Drop!"))
.observeOn(Schedulers.computation(), false, 1)
.subscribe(
data -> {
TimeUtil.sleep(1000L);
Logger.log(LogType.ON_NEXT, data);
},
error -> Logger.log(LogType.ON_ERROR, error)
);
TimeUtil.sleep(5500L);
}
}

View File

@@ -0,0 +1,29 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
public class BackpressureLatestEx {
public static void main(String[] args) {
System.out.println("# start : " + TimeUtil.getCurrentTimeFormatted());
Flowable.interval(300L, TimeUnit.MILLISECONDS)
.doOnNext(data -> Logger.log("#interval doOnNext()", data))
.onBackpressureLatest()
.observeOn(Schedulers.computation(), false, 1)
.subscribe(
data -> {
TimeUtil.sleep(1000L);
Logger.log(LogType.ON_NEXT, data);
},
error -> Logger.log(LogType.ON_ERROR, error)
);
TimeUtil.sleep(5500L);
}
}

View File

@@ -0,0 +1,63 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.BackpressureStrategy;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.core.FlowableEmitter;
import io.reactivex.rxjava3.core.FlowableOnSubscribe;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
public class HelloRxJavaFlowableCreateEx {
public static void main(String[] args) throws InterruptedException {
Flowable<String> flowable =
Flowable.create(new FlowableOnSubscribe<String>() {
@Override
public void subscribe(FlowableEmitter<String> emitter) throws Exception {
String[] datas = {"Hello", "RxJava!"};
for(String data : datas) {
// 구독이 해지되면 처리 중단
if (emitter.isCancelled())
return;
// 데이터 통지
emitter.onNext(data);
}
// 데이터 통지 완료를 알린다
emitter.onComplete();
}
}, BackpressureStrategy.BUFFER); // 구독자의 처리가 늦을 경우 데이터를 버퍼에 담아두는 설정.
flowable.observeOn(Schedulers.computation())
.subscribe(new Subscriber<String>() {
// 데이터 개수 요청 및 구독을 취소하기 위한 Subscription 객체
private Subscription subscription;
@Override
public void onSubscribe(Subscription subscription) {
this.subscription = subscription;
this.subscription.request(Long.MAX_VALUE);
}
@Override
public void onNext(String data) {
Logger.log(LogType.ON_NEXT, data);
}
@Override
public void onError(Throwable error) {
Logger.log(LogType.ON_ERROR, error);
}
@Override
public void onComplete() {
Logger.log(LogType.ON_COMPLETE);
}
});
Thread.sleep(500L);
}
}

View File

@@ -0,0 +1,38 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.BackpressureStrategy;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
public class HelloRxJavaFlowableCreateLambdaEx {
public static void main(String[] args) throws InterruptedException {
Flowable<String> flowable =
Flowable.create(emitter -> {
String[] datas = {"Hello", "RxJava!"};
for(String data : datas) {
// 구독이 해지되면 처리 중단
if (emitter.isCancelled())
return;
// 데이터 발행
emitter.onNext(data);
}
// 데이터 발행 완료를 알린다
emitter.onComplete();
}, BackpressureStrategy.BUFFER);
flowable.observeOn(Schedulers.computation())
.subscribe(
data -> Logger.log(LogType.ON_NEXT, data),
error -> Logger.log(LogType.ON_ERROR, error),
() -> Logger.log(LogType.ON_COMPLETE)
);
Thread.sleep(500L);
}
}

View File

@@ -0,0 +1,54 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class HelloRxJavaObservableCreateEx {
public static void main(String[] args) throws InterruptedException {
Observable<String> observable =
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
String[] datas = {"Hello", "RxJava!"};
for (String data : datas) {
if (emitter.isDisposed())
return;
emitter.onNext(data);
}
emitter.onComplete();
}
});
observable.observeOn(Schedulers.computation())
.subscribe(new Observer<>() {
@Override
public void onSubscribe(Disposable disposable) {
// 아무 처리도 하지 않음.
}
@Override
public void onNext(String data) {
Logger.log(LogType.ON_NEXT, data);
}
@Override
public void onError(Throwable error) {
Logger.log(LogType.ON_ERROR, error);
}
@Override
public void onComplete() {
Logger.log(LogType.ON_COMPLETE);
}
});
Thread.sleep(500L);
}
}

View File

@@ -0,0 +1,33 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class HelloRxJavaObservableCreateLambdaEx {
public static void main(String[] args) throws InterruptedException {
Observable<String> observable =
Observable.create(emitter -> {
String[] datas = {"Hello", "RxJava!"};
for (String data : datas) {
if (emitter.isDisposed())
return;
emitter.onNext(data);
}
emitter.onComplete();
});
observable.observeOn(Schedulers.computation())
.subscribe(
data -> Logger.log(LogType.ON_NEXT, data),
error -> Logger.log(LogType.ON_NEXT, error),
() -> Logger.log(LogType.DO_ON_COMPLETE)
);
Thread.sleep(500L);
}
}

View File

@@ -0,0 +1,29 @@
package org.example.ex04;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
public class MissingBackpressureExceptionEx {
public static void main(String[] args) throws InterruptedException {
Flowable.interval(1L, TimeUnit.MILLISECONDS)
.doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
.observeOn(Schedulers.computation())
.subscribe(
data -> {
Logger.log(LogType.PRINT, "# 소비자 처리 대기 중..");
TimeUtil.sleep(1000L);
Logger.log(LogType.ON_NEXT, data);
},
error -> Logger.log(LogType.ON_ERROR, error),
() -> Logger.log(LogType.ON_COMPLETE)
);
Thread.sleep(2000L);
}
}

View File

@@ -0,0 +1,52 @@
package org.example.ex05;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.CompletableEmitter;
import io.reactivex.rxjava3.core.CompletableObserver;
import io.reactivex.rxjava3.core.CompletableOnSubscribe;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
/**
* Completable 을 사용하여 어떤 작업을 수행한 후, 완료를 통지하는 예제
*/
public class CompletableCreateEx {
public static void main(String[] args) throws InterruptedException {
Completable completable = Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(CompletableEmitter emitter) throws Exception {
// 데이터를 통지하는것이 아니라 특정 작업을 수행한 후, 완료를 통지한다.
int sum = 0;
for(int i =0; i < 100; i++){
sum += i;
}
Logger.log(LogType.PRINT, "# 합계: " + sum);
emitter.onComplete();
}
});
completable.subscribeOn(Schedulers.computation())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable disposable) {
// 아무것도 하지 않음
}
@Override
public void onComplete() {
Logger.log(LogType.ON_COMPLETE);
}
@Override
public void onError(Throwable error) {
Logger.log(LogType.ON_ERROR, error);
}
});
TimeUtil.sleep(1000L);
}
}

View File

@@ -0,0 +1,30 @@
package org.example.ex05;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
public class CompletableLamdaEx {
public static void main(String[] args){
Completable completable = Completable.create(emitter -> {
// 데이터를 발행하는것이 아니라 특정 작업을 수행한 후, 완료를 통지한다.
int sum = 0;
for(int i =0; i < 100; i++){
sum += i;
}
Logger.log(LogType.PRINT, "# 합계: " + sum);
emitter.onComplete();
});
completable.subscribeOn(Schedulers.computation())
.subscribe(
() -> Logger.log(LogType.ON_COMPLETE),
error -> Logger.log(LogType.ON_ERROR, error)
);
TimeUtil.sleep(1000L);
}
}

View File

@@ -0,0 +1,48 @@
package org.example.ex05;
import io.reactivex.rxjava3.core.Maybe;
import io.reactivex.rxjava3.core.MaybeEmitter;
import io.reactivex.rxjava3.core.MaybeObserver;
import io.reactivex.rxjava3.core.MaybeOnSubscribe;
import io.reactivex.rxjava3.disposables.Disposable;
import org.example.utils.DateUtil;
import org.example.utils.LogType;
import org.example.utils.Logger;
/**
* Maybe 클래스를 이용하여 데이터를 통지하는 예제
*/
public class MaybeCreateEx {
public static void main(String[] args){
Maybe<String> maybe = Maybe.create(new MaybeOnSubscribe<String>() {
@Override
public void subscribe(MaybeEmitter<String> emitter) throws Exception {
// emitter.onSuccess(DateUtil.getNowDate());
emitter.onComplete();
}
});
maybe.subscribe(new MaybeObserver<String>() {
@Override
public void onSubscribe(Disposable disposable) {
// 아무것도 하지 않음.
}
@Override
public void onSuccess(String data) {
Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data);
}
@Override
public void onError(Throwable error) {
Logger.log(LogType.ON_ERROR, error);
}
@Override
public void onComplete() {
Logger.log(LogType.ON_COMPLETE);
}
});
}
}

View File

@@ -0,0 +1,20 @@
package org.example.ex05;
import io.reactivex.rxjava3.core.Maybe;
import io.reactivex.rxjava3.core.Single;
import org.example.utils.DateUtil;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class MaybeFromSingle {
public static void main(String[] args){
Single<String> single = Single.just(DateUtil.getNowDate());
Maybe.fromSingle(single)
.subscribe(
data -> Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data),
error -> Logger.log(LogType.ON_ERROR, error),
() -> Logger.log(LogType.ON_COMPLETE)
);
}
}

View File

@@ -0,0 +1,23 @@
package org.example.ex05;
import io.reactivex.rxjava3.core.Maybe;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class MaybeJustEx {
public static void main(String[] args){
// Maybe.just(DateUtil.getNowDate())
// .subscribe(
// data -> Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data),
// error -> Logger.log(LogType.ON_ERROR, error),
// () -> Logger.log(LogType.ON_COMPLETE)
// );
Maybe.empty()
.subscribe(
data -> Logger.log(LogType.ON_SUCCESS, data),
error -> Logger.log(LogType.ON_ERROR, error),
() -> Logger.log(LogType.ON_COMPLETE)
);
}
}

View File

@@ -0,0 +1,21 @@
package org.example.ex05;
import io.reactivex.rxjava3.core.Maybe;
import org.example.utils.DateUtil;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class MaybeLambdaEx {
public static void main(String[] args){
Maybe<String> maybe = Maybe.create(emitter -> {
emitter.onSuccess(DateUtil.getNowDate());
// emitter.onComplete();
});
maybe.subscribe(
data -> Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data),
error -> Logger.log(LogType.ON_ERROR, error),
() -> Logger.log(LogType.ON_COMPLETE)
);
}
}

View File

@@ -0,0 +1,40 @@
package org.example.ex05;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.core.SingleEmitter;
import io.reactivex.rxjava3.core.SingleObserver;
import io.reactivex.rxjava3.core.SingleOnSubscribe;
import io.reactivex.rxjava3.disposables.Disposable;
import org.example.utils.DateUtil;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class SingleCreateEx {
public static void main(String[] args) {
Single<String> single = Single.create(new SingleOnSubscribe<String>() {
@Override
public void subscribe(@NonNull SingleEmitter<String> emitter) throws Throwable {
emitter.onSuccess(DateUtil.getNowDate());
}
});
single.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onSuccess(@NonNull String s) {
Logger.log(LogType.ON_SUCCESS, "# 날짜시간: " + s);
}
@Override
public void onError(@NonNull Throwable e) {
Logger.log(LogType.ON_ERROR, e);
}
});
}
}

View File

@@ -0,0 +1,18 @@
package org.example.ex05;
import io.reactivex.rxjava3.core.Single;
import org.example.utils.DateUtil;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class SingleCreateLambdaEx {
public static void main(String[] args) {
Single<String> single = Single.create(emitter -> emitter.onSuccess(DateUtil.getNowDate()));
single.subscribe(
data -> Logger.log(LogType.ON_SUCCESS, "# 날짜시간: " + data),
error -> Logger.log(LogType.ON_ERROR, error)
);
}
}

View File

@@ -0,0 +1,17 @@
package org.example.ex05;
import io.reactivex.rxjava3.core.Single;
import org.example.utils.DateUtil;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class SingleJustEx {
public static void main(String[] args) {
Single.just(DateUtil.getNowDate())
.subscribe(
data -> Logger.log(LogType.ON_SUCCESS, "# 날짜시간: " + data),
error -> Logger.log(LogType.ON_ERROR, error)
);
}
}

View File

@@ -0,0 +1,20 @@
package org.example.ex06;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
/**
* 함수 디스크립터의 Consumer 예제
*/
public class FunctionalDescriptorConsumer {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 6, 10, 30, 65, 70, 102);
forEachPrint(numbers, n -> System.out.println(n));
}
public static <T> void forEachPrint(List<T> numbers, Consumer<T> c) {
for(T number : numbers)
c.accept(number);
}
}

View File

@@ -0,0 +1,26 @@
package org.example.ex06;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
/**
* 함수 디스크립터의 Function 예제
*/
public class FunctionalDescriptorFunction {
public static void main(String[] args) {
List<Character> characterList = Arrays.asList('a', 'b', 'c', 'd', 'e');
List<Integer> asciiNumbers = map(characterList, character -> (int) character);
for(int asciiNumber : asciiNumbers)
System.out.println(asciiNumber);
}
public static <T, R> List<R> map(List<T> list, Function<T, R> f){
List<R> result = new ArrayList<>();
for(T t : list)
result.add(f.apply(t));
return result;
}
}

View File

@@ -0,0 +1,28 @@
package org.example.ex06;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
/**
* 함수 디스크립터의 Predicate 예제
*/
public class FunctionalDescriptorPredicate {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 6, 10, 30, 65, 70, 102);
List<Integer> result = filter(numbers, n -> n > 30);
for(int number : result)
System.out.println(number);
}
private static <T> List<T> filter(List<T> numbers, Predicate<T> p){
List<T> result = new ArrayList<>();
for(T number : numbers)
if(p.test(number))
result.add(number);
return result;
}
}

View File

@@ -0,0 +1,40 @@
package org.example.ex06;
import org.example.common.*;
import java.util.Arrays;
import java.util.List;
/**
* 사용자 정의 Predicate를 익명 클래스로 구현하는 예제
*/
public class FunctionalInterfaceEx {
public static void main(String[] args) {
List<Car> cars = Arrays.asList(
new Car(CarMaker.HYUNDAE, CarType.SUV, "팰리세이드", 28000000, true),
new Car(CarMaker.SAMSUNG, CarType.SEDAN, "SM5", 35000000, true),
new Car(CarMaker.CHEVROLET, CarType.SUV, "트래버스", 50000000, true),
new Car(CarMaker.KIA, CarType.SEDAN, "K5", 20000000, false),
new Car(CarMaker.SSANGYOUNG, CarType.SUV, "티볼리", 23000000, true)
);
List<Car> carsFilteredByPrice = CarFilter.filterCarByCustomPredicate(cars, new CarPredicate() {
@Override
public boolean test(Car car) {
return car.getCarPrice() > 30000000;
}
});
for(Car car : carsFilteredByPrice)
System.out.println("차 이름: " + car.getCarName() + ", 가격: " + car.getCarPrice());
List<Car> carsFilteredByCarType = CarFilter.filterCarByCustomPredicate(cars, new CarPredicate() {
@Override
public boolean test(Car car) {
return car.getCarType().equals(CarType.SUV);
}
});
for(Car car : carsFilteredByCarType)
System.out.println("차 이름: " + car.getCarName() + ", 차종: " + car.getCarType());
}
}

View File

@@ -0,0 +1,34 @@
package org.example.ex06;
import org.example.common.Car;
import org.example.common.CarFilter;
import org.example.common.CarMaker;
import org.example.common.CarType;
import java.util.Arrays;
import java.util.List;
/**
* 사용자 정의 Predicate를 람다 표현식으로 사용하는 예제
*/
public class FunctionalInterfaceToLamdaEx {
public static void main(String[] args) {
List<Car> cars = Arrays.asList(
new Car(CarMaker.HYUNDAE, CarType.SUV, "팰리세이드", 28000000, true),
new Car(CarMaker.SAMSUNG, CarType.SEDAN, "SM5", 35000000, true),
new Car(CarMaker.CHEVROLET, CarType.SUV, "트래버스", 50000000, true),
new Car(CarMaker.KIA, CarType.SEDAN, "K5", 20000000, false),
new Car(CarMaker.SSANGYOUNG, CarType.SUV, "티볼리", 23000000, true)
);
List<Car> carsFilteredByPrice =
CarFilter.filterCarByCustomPredicate(cars, (Car car) -> car.getCarPrice() > 30000000);
for(Car car : carsFilteredByPrice)
System.out.println("차 이름: " + car.getCarName() + ", 가격: " + car.getCarPrice());
List<Car> carsFilteredByCarType =
CarFilter.filterCarByCustomPredicate(cars, car -> car.getCarType().equals(CarType.SUV));
for(Car car : carsFilteredByCarType)
System.out.println("차 이름: " + car.getCarName() + ", 차종: " + car.getCarType());
}
}

View File

@@ -0,0 +1,35 @@
package org.example.ex06;
import org.example.common.Car;
import org.example.common.CarMaker;
import org.example.common.CarType;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 하나의 추상 메서드를 가지고 있는 기존 인터페이스를 구현하는 예제
*/
public class LegacyInterfaceEx {
public static void main(String[] args) {
List<Car> cars = Arrays.asList(
new Car(CarMaker.HYUNDAE, CarType.SUV, "팰리세이드", 28000000, true),
new Car(CarMaker.SAMSUNG, CarType.SEDAN, "SM5", 35000000, true),
new Car(CarMaker.CHEVROLET, CarType.SUV, "트래버스", 50000000, true),
new Car(CarMaker.KIA, CarType.SEDAN, "K5", 20000000, false),
new Car(CarMaker.SSANGYOUNG, CarType.SUV, "티볼리", 23000000, true)
);
Collections.sort(cars, new Comparator<Car>() {
@Override
public int compare(Car car1, Car car2) {
return car1.getCarPrice() - car2.getCarPrice();
}
});
for(Car car : cars)
System.out.println("차 이름: " + car.getCarName() + ", 가격: " + car.getCarPrice());
}
}

View File

@@ -0,0 +1,30 @@
package org.example.ex06;
import org.example.common.Car;
import org.example.common.CarMaker;
import org.example.common.CarType;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* 하나의 추상 메서드를 가지고 있는 기존 인터페이스를 함수형 인터페이스로 사용하는 예제
*/
public class LegacyInterfaceToFunctionalInterfaceEx {
public static void main(String[] args) {
List<Car> cars = Arrays.asList(
new Car(CarMaker.HYUNDAE, CarType.SUV, "팰리세이드", 28000000, true),
new Car(CarMaker.SAMSUNG, CarType.SEDAN, "SM5", 35000000, true),
new Car(CarMaker.CHEVROLET, CarType.SUV, "트래버스", 50000000, true),
new Car(CarMaker.KIA, CarType.SEDAN, "K5", 20000000, false),
new Car(CarMaker.SSANGYOUNG, CarType.SUV, "티볼리", 23000000, true)
);
Collections.sort(cars, (car1, car2) -> car1.getCarPrice() - car2.getCarPrice());
for(Car car : cars)
System.out.println("차 이름: " + car.getCarName() + ", 가격: " + car.getCarPrice());
}
}

View File

@@ -0,0 +1,14 @@
package org.example.ex07;
public class CarInventory {
private int incomingCount;
private int totalCount;
public CarInventory(int totalCount) {
this.totalCount = totalCount;
}
public int getExpectedTotalCount(int incomingCount){
return totalCount + incomingCount;
}
}

View File

@@ -0,0 +1,20 @@
package org.example.ex07;
import org.example.common.Car;
import java.util.function.Function;
/**
* Class Name::instance method 메서드 레퍼런스 예
*/
public class ClassNameInstanceMethodEx {
public static void main(String[] args) {
Function<Car, String> f1 = car -> car.getCarName();
String carName1 = f1.apply(new Car("트래버스"));
System.out.println(carName1);
Function<Car, String> f2 = Car::getCarName;
String carName2 = f2.apply(new Car("팰리세이드"));
System.out.println(carName2);
}
}

View File

@@ -0,0 +1,26 @@
package org.example.ex07;
import java.util.function.Function;
/**
* Class Name::static method 메서드 레퍼런스 예
*/
public class ClassNameStaticMethodEx {
public static void main(String[] args) {
// 람다 표현식 메서드 레퍼런스로 축약 전
Function<String, Integer> f1 = (String s) -> Integer.parseInt(s);
Integer result1 = f1.apply("3");
System.out.println(result1);
// 람다 표현식 메서드 레퍼런스로 축약 전
Function<String, Integer> f2 = s -> Integer.parseInt(s);
Integer result2 = f2.apply("3");
System.out.println(result2);
// 람다 표현식을 메서드 레퍼런스로 축약
Function<String, Integer> f3 = Integer::parseInt;
Integer result3 = f3.apply("3");
System.out.println(result3);
}
}

View File

@@ -0,0 +1,20 @@
package org.example.ex07;
import org.example.common.Car;
import java.util.function.Function;
/**
* Constructor::new 예
*/
public class ConstructorReferenceEx {
public static void main(String[] args) {
Function<String, Car> f1 = s -> new Car(s);
Car car1 = f1.apply("콜로라도");
System.out.println(car1.getCarName());
Function<String, Car> f2 = Car::new;
Car car2 = f2.apply("카니발");
System.out.println(car2.getCarName());
}
}

View File

@@ -0,0 +1,32 @@
package org.example.ex07;
import java.util.function.Function;
import java.util.function.IntUnaryOperator;
import java.util.function.UnaryOperator;
/**
* Object::instance method 예
*/
public class ObjectInstanceMethodExample {
public static void main(String[] args) {
final CarInventory carInventory = new CarInventory(10);
Function<Integer, Integer> f1 = count -> carInventory.getExpectedTotalCount(count);
int totalCount1 = f1.apply(10);
System.out.println(totalCount1);
Function<Integer, Integer> f2 = carInventory::getExpectedTotalCount;
int totalCount2 = f2.apply(20);
System.out.println(totalCount2);
// T -> T
UnaryOperator<Integer> f3 = carInventory::getExpectedTotalCount;
int totalCount3 = f3.apply(30);
System.out.println(totalCount3);
// Integer -> Integer
IntUnaryOperator f4 = carInventory::getExpectedTotalCount;
int totalCount4 = f4.applyAsInt(40);
System.out.println(totalCount4);
}
}

View File

@@ -0,0 +1,31 @@
package org.example.ex08;
import org.example.utils.LogType;
import org.example.utils.Logger;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
public class CarRepairShop {
public int getCarRepairCostSync(int brokens) {
return calculateCarRepair(brokens);
}
public Future<Integer> getCarRepairCostAsync(int brokens) {
return CompletableFuture.supplyAsync(() -> calculateCarRepair(brokens));
}
private int calculateCarRepair(int brokens){
Logger.log(LogType.PRINT, "# 차량 수리비 계산 중................");
delay();
return brokens * 20000;
}
private void delay(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,56 @@
package org.example.ex08;
import org.example.utils.LogType;
import org.example.utils.Logger;
import java.util.concurrent.Future;
public class FutureExampleASync {
public static void main(String[] args){
long startTime = System.currentTimeMillis();
Logger.log(LogType.PRINT, "# Start");
CarRepairShop shop = new CarRepairShop();
// 차량 수리비(시간이 더 오래 걸리는 미래에 끝날 일)
Future<Integer> future = shop.getCarRepairCostAsync(10);
// 회사에 병가 신청(짧은 처리 시간)
requestSickLeave("20170903-01");
// 보험 청구(짧은 처리 시간)
requestInsurance("44나4444");
try {
int carRepairCost = future.get();
Logger.log(LogType.PRINT, "# (1) 차량 수리비 계산이 완료되었습니다.");
Logger.log(LogType.PRINT, "# 차량 수리비는 " + carRepairCost + "원 입니다.");
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
double executeTime = (endTime - startTime) / 1000.0;
System.out.println();
System.out.println("# 처리 시간: " + executeTime);
}
private static void requestSickLeave(String empNumber) {
try {
Thread.sleep(1000);
Logger.log(LogType.PRINT, "# (2) 병가 신청이 완료되었습니다.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void requestInsurance(String carNumber) {
try {
Thread.sleep(1000);
Logger.log(LogType.PRINT, "# (3) 보험 접수가 완료 되었습니다.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,50 @@
package org.example.ex08;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class FutureExampleSync {
public static void main(String[] args){
long startTime = System.currentTimeMillis();
CarRepairShop shop = new CarRepairShop();
// 차량 수리비
int carRepairCost = shop.getCarRepairCostSync(10);
Logger.log(LogType.PRINT, "# (1) 차량 수리비 계산이 완료되었습니다.");
Logger.log(LogType.PRINT, "# 차량 수리비는 " + carRepairCost + "원 입니다.");
// 회사에 병가 신청
requestSickLeave("20170903-01");
// 보험 접수
requestInsurance("44나4444");
long endTime = System.currentTimeMillis();
double executeTime = (endTime - startTime) / 1000.0;
System.out.println();
System.out.println("# 처리 시간: " + executeTime + "");
}
private static void requestSickLeave(String empNumber) {
try {
Thread.sleep(1000);
Logger.log(LogType.PRINT, "# (2) 병가 신청이 완료되었습니다.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void requestInsurance(String carNumber) {
try {
Thread.sleep(1000);
Logger.log(LogType.PRINT, "# (3) 보험 접수가 완료 되었습니다.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,30 @@
package org.example.ex08;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import java.time.LocalTime;
/**
* 실제 구독이 발생할 때 Observable을 새로 반환하여 새로운 Observable을 생성한다.
* defer()를 활용하면 데이터 흐름의 생성을 지연하는 효과를 보여준다.
*/
public class ObservableDeferEx {
public static void main(String[] args) throws InterruptedException {
Observable<LocalTime> observable = Observable.defer(() -> {
LocalTime currentTime = LocalTime.now();
return Observable.just(currentTime);
});
Observable<LocalTime> observableJust = Observable.just(LocalTime.now());
observable.subscribe(time -> Logger.log(LogType.PRINT, " # defer() 구독1의 구독 시간: " + time));
observableJust.subscribe(time -> Logger.log(LogType.PRINT, " # just() 구독1의 구독 시간: " + time));
Thread.sleep(3000);
observable.subscribe(time -> Logger.log(LogType.PRINT, " # defer() 구독2의 구독 시간: " + time));
observableJust.subscribe(time -> Logger.log(LogType.PRINT, " # just() 구독자2의 구독 시간: " + time));
}
}

View File

@@ -0,0 +1,44 @@
package org.example.ex08;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class ObservableFromFutureEx {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Logger.log(LogType.PRINT, "# start time");
// 긴 처리 시간이 걸리는 작업
Future<Double> future = longTimeWork();
// 짧은 처리 시간이 걸리는 작업
shortTimeWork();
Observable.fromFuture(future)
.subscribe(data -> Logger.log(LogType.PRINT, "# 긴 처리 시간 작업 결과 : " + data));
Logger.log(LogType.PRINT, "# end time");
}
public static CompletableFuture<Double> longTimeWork(){
return CompletableFuture.supplyAsync(ObservableFromFutureEx::calculate);
}
private static Double calculate() {
Logger.log(LogType.PRINT, "# 긴 처리 시간이 걸리는 작업 중.........");
TimeUtil.sleep(6000L);
return 100000000000000000.0;
}
private static void shortTimeWork() {
TimeUtil.sleep(3000L);
Logger.log(LogType.PRINT, "# 짧은 처리 시간 작업 완료!");
}
}

View File

@@ -0,0 +1,17 @@
package org.example.ex08;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import java.util.Arrays;
import java.util.List;
public class ObservableFromIterableEx {
public static void main(String[] args){
List<String> countries = Arrays.asList("Korea", "Canada", "USA", "Italy");
Observable.fromIterable(countries)
.subscribe(country -> Logger.log(LogType.ON_NEXT, country));
}
}

View File

@@ -0,0 +1,23 @@
package org.example.ex08;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
/**
* polling 용도로 주로 사용.
*/
public class ObservableIntervalEx {
public static void main(String[] args){
System.out.println("# start : " + TimeUtil.getCurrentTimeFormatted());
Observable.interval(0, 1000L, TimeUnit.MILLISECONDS)
.map(num -> num + " count")
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
TimeUtil.sleep(3000);
}
}

View File

@@ -0,0 +1,15 @@
package org.example.ex08;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
/**
* 반복문으로 사용 가능
*/
public class ObservableRangeEx {
public static void main(String[] args){
Observable<Integer> source = Observable.range(0, 5);
source.subscribe(num -> Logger.log(LogType.ON_NEXT, num));
}
}

View File

@@ -0,0 +1,24 @@
package org.example.ex08;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
/**
* 설정한 시간이 지난 후에 특정 동작을 수행하고자 할때 사용
*/
public class ObservableTimerEx {
public static void main(String[] args){
Logger.log(LogType.PRINT, "# Start!");
Observable<String> observable =
Observable.timer(2000, TimeUnit.MILLISECONDS)
.map(count -> "Do work!");
observable.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
TimeUtil.sleep(3000);
}
}

View File

@@ -0,0 +1,18 @@
package org.example.ex09;
import io.reactivex.rxjava3.core.Observable;
import org.example.common.SampleData;
import org.example.utils.LogType;
import org.example.utils.Logger;
/**
* 이미 통지한 데이터와 같은 데이터는 제외하고 통지
* 유일한 값을 처리하고자 할때 사용
*/
public class ObservableDistinctEx01 {
public static void main(String[] args) {
Observable.fromArray(SampleData.carMakersDuplicated)
.distinct()
.subscribe(carMaker -> Logger.log(LogType.ON_NEXT, carMaker));
}
}

View File

@@ -0,0 +1,16 @@
package org.example.ex09;
import io.reactivex.rxjava3.core.Observable;
import org.example.common.CarMaker;
import org.example.common.SampleData;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class ObservableDistinctEx02 {
public static void main(String[] args) {
Observable.fromArray(SampleData.carMakersDuplicated)
.distinct()
.filter(carMaker -> carMaker == CarMaker.SSANGYOUNG)
.subscribe(carMaker -> Logger.log(LogType.ON_NEXT, carMaker));
}
}

View File

@@ -0,0 +1,19 @@
package org.example.ex09;
import io.reactivex.rxjava3.core.Observable;
import org.example.common.Car;
import org.example.common.SampleData;
import org.example.utils.LogType;
import org.example.utils.Logger;
/**
* 객체의 특정 필드를 기준으로 distinct 하는 예제
*/
public class ObservableDistinctEx03 {
public static void main(String[] args) {
Observable.fromIterable(SampleData.carList)
.distinct(Car::getCarMaker)
.subscribe(car -> Logger.log(LogType.ON_NEXT, car.getCarName()));
}
}

View File

@@ -0,0 +1,15 @@
package org.example.ex09;
import io.reactivex.rxjava3.core.Observable;
import org.example.common.CarMaker;
import org.example.common.SampleData;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class ObservableFilterEx01 {
public static void main(String[] args) {
Observable.fromIterable(SampleData.carList)
.filter(car -> car.getCarMaker() == CarMaker.CHEVROLET)
.subscribe(car -> Logger.log(LogType.ON_NEXT, car.getCarMaker() + " : " + car.getCarName()));
}
}

View File

@@ -0,0 +1,14 @@
package org.example.ex09;
import io.reactivex.rxjava3.core.Observable;
import org.example.common.CarMaker;
import org.example.common.SampleData;
public class ObservableFilterEx02 {
public static void main(String[] args) {
Observable.fromIterable(SampleData.carList)
.filter(car -> car.getCarMaker() == CarMaker.CHEVROLET)
.filter(car -> car.getCarPrice() > 30000000)
.subscribe(car -> System.out.println(car.getCarName()));
}
}

View File

@@ -0,0 +1,13 @@
package org.example.ex09;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
public class ObservableSkipEx01 {
public static void main(String[] args) {
Observable.range(1, 15)
.skip(3)
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
}
}

View File

@@ -0,0 +1,18 @@
package org.example.ex09;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
public class ObservableSkipEx02 {
public static void main(String[] args) {
Observable.interval(300L, TimeUnit.MILLISECONDS)
.skip(1000L, TimeUnit.MILLISECONDS)
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
TimeUtil.sleep(3000L);
}
}

View File

@@ -0,0 +1,16 @@
package org.example.ex09;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
/**
* 지정한 갯수만큼 데이터를 발행
*/
public class ObservableTakeEx01 {
public static void main(String[] args) {
Observable.just("a", "b", "c", "d")
.take(2)
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
}
}

Some files were not shown because too many files have changed in this diff Show More