Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.011USD
STEEM
0.004STEEM
SBD
0.008SBD
Effective Power
5.007SP
├── Own SP
0.125SP
└── Incoming Deleg
+4.882SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.004STEEM
STEEM POWER
Own SP
0.125SP
Delegated Out
0.000SP
Delegation In
4.882SP
Effective Power
5.007SP
Reward SP (pending)
0.009SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.008SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.004 STEEM",
  "vesting_shares": "203.233111 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7940.426695 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.008 SBD",
  "conversions": []
}

Account Info

namejb7959
id1040263
rank1,310,612
reputation213699173
created2018-06-09T11:37:36
recovery_accountsteem
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-06-24T10:52:12
last_root_post2018-06-14T04:08:30
last_vote_time2018-06-24T10:51:36
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares203.233111 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7940.426695 VESTS
reward_vesting_balance18.279916 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-06-14T04:13:18
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM6KLsFd2CVyS6i5FCemoqq6LCVpfRzChtZN9zrcHcyp2R6Nw4n4",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "balance": "0.000 STEEM",
  "can_vote": true,
  "comment_count": 0,
  "created": "2018-06-09T11:37:36",
  "curation_rewards": 0,
  "delegated_vesting_shares": "0.000000 VESTS",
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779068733
  },
  "guest_bloggers": [],
  "id": 1040263,
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmPZh4gLzf7e7HJiwtwFF99WzLQBRbYcqDtgaoYyMKg7hj/DoubleM_Squre.png\",\"name\":\"doublem.org\",\"location\":\"SEOUL\",\"website\":\"http://doublem.org\"}}",
  "last_account_recovery": "1970-01-01T00:00:00",
  "last_account_update": "2018-06-14T04:13:18",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_post": "2018-06-24T10:52:12",
  "last_root_post": "2018-06-14T04:08:30",
  "last_vote_time": "2018-06-24T10:51:36",
  "lifetime_vote_count": 0,
  "market_history": [],
  "memo_key": "STM6FsWtSZJejDALs5oEjBJ912xFuRU6L1GDNzgry7qsUKav8fzDw",
  "mined": false,
  "name": "jb7959",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "other_history": [],
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM8KJHejMGwoKksYEL44mzU6fXR3ViUgxzipATQa4FtwWZtzAfjn",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "pending_claimed_accounts": 0,
  "post_bandwidth": 0,
  "post_count": 2,
  "post_history": [],
  "posting": {
    "account_auths": [],
    "key_auths": [
      [
        "STM7YMRs5Knu5VWSG8uty3gDDfXm75dVP46MyrkFkTaiSYcd3TQJ8",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmPZh4gLzf7e7HJiwtwFF99WzLQBRbYcqDtgaoYyMKg7hj/DoubleM_Squre.png\",\"name\":\"doublem.org\",\"location\":\"SEOUL\",\"website\":\"http://doublem.org\"}}",
  "posting_rewards": 18,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "proxy": "",
  "received_vesting_shares": "7940.426695 VESTS",
  "recovery_account": "steem",
  "reputation": 213699173,
  "reset_account": "null",
  "reward_sbd_balance": "0.008 SBD",
  "reward_steem_balance": "0.004 STEEM",
  "reward_vesting_balance": "18.279916 VESTS",
  "reward_vesting_steem": "0.009 STEEM",
  "savings_balance": "0.000 STEEM",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "sbd_balance": "0.000 SBD",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "tags_usage": [],
  "to_withdraw": 0,
  "transfer_history": [],
  "vesting_balance": "0.000 STEEM",
  "vesting_shares": "203.233111 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "vote_history": [],
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779068733
  },
  "voting_power": 0,
  "withdraw_routes": 0,
  "withdrawn": 0,
  "witness_votes": [],
  "witnesses_voted_for": 0,
  "rank": 1310612
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.882 SP to @jb7959
2026/05/18 01:45:33
delegateejb7959
delegatorsteem
vesting shares7940.426695 VESTS
Transaction InfoBlock #106145246/Trx 3246f0a9071e196f0f0c73b4fe32c17a3d654680
View Raw JSON Data
{
  "block": 106145246,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "7940.426695 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-18T01:45:33",
  "trx_id": "3246f0a9071e196f0f0c73b4fe32c17a3d654680",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 3.215 SP to @jb7959
2026/05/12 09:57:42
delegateejb7959
delegatorsteem
vesting shares5228.216290 VESTS
Transaction InfoBlock #105983042/Trx f1f7879049cc43ee28409e19703abfbb91940e82
View Raw JSON Data
{
  "block": 105983042,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "5228.216290 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-12T09:57:42",
  "trx_id": "f1f7879049cc43ee28409e19703abfbb91940e82",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 4.890 SP to @jb7959
2026/04/26 01:04:00
delegateejb7959
delegatorsteem
vesting shares7952.942451 VESTS
Transaction InfoBlock #105512854/Trx baf35a1b6dd06f47b32204781c7841ad815858c7
View Raw JSON Data
{
  "block": 105512854,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "7952.942451 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-04-26T01:04:00",
  "trx_id": "baf35a1b6dd06f47b32204781c7841ad815858c7",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 3.240 SP to @jb7959
2026/01/23 11:51:18
delegateejb7959
delegatorsteem
vesting shares5269.763109 VESTS
Transaction InfoBlock #102856669/Trx 045c9b4516b9b4dd0e2eeece188da15dd9d7e7e6
View Raw JSON Data
{
  "block": 102856669,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "5269.763109 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-01-23T11:51:18",
  "trx_id": "045c9b4516b9b4dd0e2eeece188da15dd9d7e7e6",
  "trx_in_block": 5,
  "virtual_op": 0
}
steemdelegated 3.341 SP to @jb7959
2024/12/17 07:08:06
delegateejb7959
delegatorsteem
vesting shares5433.982306 VESTS
Transaction InfoBlock #91303021/Trx 2ef4dfaf1065874bbf55e6996bb9e4836505542f
View Raw JSON Data
{
  "block": 91303021,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "5433.982306 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2024-12-17T07:08:06",
  "trx_id": "2ef4dfaf1065874bbf55e6996bb9e4836505542f",
  "trx_in_block": 4,
  "virtual_op": 0
}
steemdelegated 3.445 SP to @jb7959
2023/11/13 22:50:30
delegateejb7959
delegatorsteem
vesting shares5603.115838 VESTS
Transaction InfoBlock #79857213/Trx 08cc57a37c40de8e3bd96489ae424947ff8e9923
View Raw JSON Data
{
  "block": 79857213,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "5603.115838 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-11-13T22:50:30",
  "trx_id": "08cc57a37c40de8e3bd96489ae424947ff8e9923",
  "trx_in_block": 3,
  "virtual_op": 0
}
steemdelegated 5.251 SP to @jb7959
2023/09/21 23:36:48
delegateejb7959
delegatorsteem
vesting shares8540.394624 VESTS
Transaction InfoBlock #78349964/Trx fa5b17f68f307693b59bda75ce4d4fa2af4116f7
View Raw JSON Data
{
  "block": 78349964,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "8540.394624 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-09-21T23:36:48",
  "trx_id": "fa5b17f68f307693b59bda75ce4d4fa2af4116f7",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 5.388 SP to @jb7959
2022/11/03 13:10:15
delegateejb7959
delegatorsteem
vesting shares8762.076062 VESTS
Transaction InfoBlock #69115013/Trx 0a13302677cd31d48249453a6485a33b3a1a5345
View Raw JSON Data
{
  "block": 69115013,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "8762.076062 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-11-03T13:10:15",
  "trx_id": "0a13302677cd31d48249453a6485a33b3a1a5345",
  "trx_in_block": 4,
  "virtual_op": 0
}
steemdelegated 5.523 SP to @jb7959
2022/01/17 12:18:45
delegateejb7959
delegatorsteem
vesting shares8982.609293 VESTS
Transaction InfoBlock #60811033/Trx 2b6208bd6719840a8bd059df8ebb9edb89ae41b8
View Raw JSON Data
{
  "block": 60811033,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "8982.609293 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-01-17T12:18:45",
  "trx_id": "2b6208bd6719840a8bd059df8ebb9edb89ae41b8",
  "trx_in_block": 26,
  "virtual_op": 0
}
steemdelegated 5.636 SP to @jb7959
2021/06/14 02:10:18
delegateejb7959
delegatorsteem
vesting shares9166.377951 VESTS
Transaction InfoBlock #54609342/Trx 5276d95997016fadd0a71fa933fb2b7624087071
View Raw JSON Data
{
  "block": 54609342,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "9166.377951 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2021-06-14T02:10:18",
  "trx_id": "5276d95997016fadd0a71fa933fb2b7624087071",
  "trx_in_block": 4,
  "virtual_op": 0
}
steemdelegated 5.751 SP to @jb7959
2020/12/11 12:27:15
delegateejb7959
delegatorsteem
vesting shares9353.799925 VESTS
Transaction InfoBlock #49356745/Trx b8953affd4c002c4ab5e6dff32ae2c3c60cf3264
View Raw JSON Data
{
  "block": 49356745,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "9353.799925 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-11T12:27:15",
  "trx_id": "b8953affd4c002c4ab5e6dff32ae2c3c60cf3264",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 1.176 SP to @jb7959
2020/12/06 06:04:03
delegateejb7959
delegatorsteem
vesting shares1912.543513 VESTS
Transaction InfoBlock #49208301/Trx 361616607ed77790788e9d9bfcfb2dbcc1cfc35b
View Raw JSON Data
{
  "block": 49208301,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "1912.543513 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-06T06:04:03",
  "trx_id": "361616607ed77790788e9d9bfcfb2dbcc1cfc35b",
  "trx_in_block": 3,
  "virtual_op": 0
}
steemdelegated 5.755 SP to @jb7959
2020/12/05 16:05:27
delegateejb7959
delegatorsteem
vesting shares9360.007779 VESTS
Transaction InfoBlock #49191845/Trx fca5ad7f6d77f271307c843c7b9947e7310ee013
View Raw JSON Data
{
  "block": 49191845,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "9360.007779 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-05T16:05:27",
  "trx_id": "fca5ad7f6d77f271307c843c7b9947e7310ee013",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 1.181 SP to @jb7959
2020/11/02 18:23:12
delegateejb7959
delegatorsteem
vesting shares1920.017158 VESTS
Transaction InfoBlock #48261038/Trx 75cf79be8d7a32417deeb6b285f0739d6faba60f
View Raw JSON Data
{
  "block": 48261038,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "1920.017158 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-11-02T18:23:12",
  "trx_id": "75cf79be8d7a32417deeb6b285f0739d6faba60f",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 5.880 SP to @jb7959
2020/05/09 07:02:45
delegateejb7959
delegatorsteem
vesting shares9562.813138 VESTS
Transaction InfoBlock #43218567/Trx 9b8a6f5dc21d7dfbbbc203f50c86ff6c30f08304
View Raw JSON Data
{
  "block": 43218567,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "9562.813138 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-09T07:02:45",
  "trx_id": "9b8a6f5dc21d7dfbbbc203f50c86ff6c30f08304",
  "trx_in_block": 33,
  "virtual_op": 0
}
steemdelegated 1.201 SP to @jb7959
2020/05/08 10:50:45
delegateejb7959
delegatorsteem
vesting shares1953.311140 VESTS
Transaction InfoBlock #43194895/Trx 7e198514bf5657882805bb4ab5f664b17e2a17f4
View Raw JSON Data
{
  "block": 43194895,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "1953.311140 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-08T10:50:45",
  "trx_id": "7e198514bf5657882805bb4ab5f664b17e2a17f4",
  "trx_in_block": 17,
  "virtual_op": 0
}
steemdelegated 5.966 SP to @jb7959
2019/09/04 21:08:06
delegateejb7959
delegatorsteem
vesting shares9703.488898 VESTS
Transaction InfoBlock #36137627/Trx 982f9630ea32dac46c1823ca6dda5b048529145e
View Raw JSON Data
{
  "block": 36137627,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "9703.488898 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-09-04T21:08:06",
  "trx_id": "982f9630ea32dac46c1823ca6dda5b048529145e",
  "trx_in_block": 27,
  "virtual_op": 0
}
2019/06/09 13:04:24
authorsteemitboard
bodyCongratulations @jb7959! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/https://steemitboard.com/@jb7959/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@jb7959) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=jb7959)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorjb7959
parent permlinkdip
permlinksteemitboard-notify-jb7959-20190609t130423000z
title
Transaction InfoBlock #33648963/Trx 753b8dae377f110de390b83d7cf3fc99ec93e292
View Raw JSON Data
{
  "block": 33648963,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @jb7959! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/https://steemitboard.com/@jb7959/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@jb7959) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=jb7959)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "jb7959",
      "parent_permlink": "dip",
      "permlink": "steemitboard-notify-jb7959-20190609t130423000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-06-09T13:04:24",
  "trx_id": "753b8dae377f110de390b83d7cf3fc99ec93e292",
  "trx_in_block": 5,
  "virtual_op": 0
}
steemdelegated 6.088 SP to @jb7959
2018/09/23 11:52:03
delegateejb7959
delegatorsteem
vesting shares9901.669618 VESTS
Transaction InfoBlock #26195438/Trx 3a385e24099b37d60444232c28a96dd85a9973f2
View Raw JSON Data
{
  "block": 26195438,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "9901.669618 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-09-23T11:52:03",
  "trx_id": "3a385e24099b37d60444232c28a96dd85a9973f2",
  "trx_in_block": 5,
  "virtual_op": 0
}
2018/06/24 10:52:12
authorjb7959
body좋은글 감사합니다! 두번은 읽어봐야겠네요
json metadata{"tags":["kr-series"],"app":"steemit/0.1"}
parent authorarmdown
parent permlink01
permlinkre-armdown-01-20180624t105210615z
title
Transaction InfoBlock #23600532/Trx ae9bfa5c208f9f7f60442cb672c88fe293f529a0
View Raw JSON Data
{
  "block": 23600532,
  "op": [
    "comment",
    {
      "author": "jb7959",
      "body": "좋은글 감사합니다!  두번은 읽어봐야겠네요",
      "json_metadata": "{\"tags\":[\"kr-series\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "armdown",
      "parent_permlink": "01",
      "permlink": "re-armdown-01-20180624t105210615z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-24T10:52:12",
  "trx_id": "ae9bfa5c208f9f7f60442cb672c88fe293f529a0",
  "trx_in_block": 4,
  "virtual_op": 0
}
jb7959upvoted (100.00%) @armdown / 01
2018/06/24 10:51:36
authorarmdown
permlink01
voterjb7959
weight10000 (100.00%)
Transaction InfoBlock #23600520/Trx 99dfb69b6c3cf2a43d1ec3776848157f2532d328
View Raw JSON Data
{
  "block": 23600520,
  "op": [
    "vote",
    {
      "author": "armdown",
      "permlink": "01",
      "voter": "jb7959",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-24T10:51:36",
  "trx_id": "99dfb69b6c3cf2a43d1ec3776848157f2532d328",
  "trx_in_block": 5,
  "virtual_op": 0
}
jb7959received 0.004 STEEM, 0.008 SBD, 0.011 SP author reward for @jb7959 / dip
2018/06/21 04:08:30
authorjb7959
permlinkdip
sbd payout0.008 SBD
steem payout0.004 STEEM
vesting payout18.279916 VESTS
Transaction InfoBlock #23506069/Virtual Operation #5
View Raw JSON Data
{
  "block": 23506069,
  "op": [
    "author_reward",
    {
      "author": "jb7959",
      "permlink": "dip",
      "sbd_payout": "0.008 SBD",
      "steem_payout": "0.004 STEEM",
      "vesting_payout": "18.279916 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-21T04:08:30",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 5
}
jb7959upvoted (100.00%) @coduck / cardano-ada-1
2018/06/16 01:06:57
authorcoduck
permlinkcardano-ada-1
voterjb7959
weight10000 (100.00%)
Transaction InfoBlock #23358499/Trx d557345202244e84315667326225a039d2892d00
View Raw JSON Data
{
  "block": 23358499,
  "op": [
    "vote",
    {
      "author": "coduck",
      "permlink": "cardano-ada-1",
      "voter": "jb7959",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-16T01:06:57",
  "trx_id": "d557345202244e84315667326225a039d2892d00",
  "trx_in_block": 54,
  "virtual_op": 0
}
codingmanupvoted (30.00%) @jb7959 / dip
2018/06/14 10:47:12
authorjb7959
permlinkdip
votercodingman
weight3000 (30.00%)
Transaction InfoBlock #23312509/Trx 04eb1cd4aef2b170e475225ca8e07c41e48418d1
View Raw JSON Data
{
  "block": 23312509,
  "op": [
    "vote",
    {
      "author": "jb7959",
      "permlink": "dip",
      "voter": "codingman",
      "weight": 3000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T10:47:12",
  "trx_id": "04eb1cd4aef2b170e475225ca8e07c41e48418d1",
  "trx_in_block": 25,
  "virtual_op": 0
}
wonsamaupvoted (1.00%) @jb7959 / dip
2018/06/14 05:01:06
authorjb7959
permlinkdip
voterwonsama
weight100 (1.00%)
Transaction InfoBlock #23305591/Trx e38e4d04595d66cbf53f1cb29fb5a4d058af8542
View Raw JSON Data
{
  "block": 23305591,
  "op": [
    "vote",
    {
      "author": "jb7959",
      "permlink": "dip",
      "voter": "wonsama",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T05:01:06",
  "trx_id": "e38e4d04595d66cbf53f1cb29fb5a4d058af8542",
  "trx_in_block": 9,
  "virtual_op": 0
}
2018/06/14 04:38:39
authorintroduce.bot
body✅ @jb7959, I gave you an upvote on your first post! **Please give me a follow** and I will give you a follow in return!<br><br>Please also take a moment to read [this post](https://steemit.com/spam/@pleasestop/introducing-pleasestop-here-to-reduce-comment-spam) regarding bad behavior on Steemit.
json metadata
parent authorjb7959
parent permlinkdip
permlinkintroduce-bot-re-jb7959dip
title
Transaction InfoBlock #23305142/Trx f2ca51240e34cc8b544eebd4b545cc28297b4e80
View Raw JSON Data
{
  "block": 23305142,
  "op": [
    "comment",
    {
      "author": "introduce.bot",
      "body": "✅  @jb7959, I gave you an upvote on your first post! **Please give me a follow** and I will give you a follow in return!<br><br>Please also take a moment to read [this post](https://steemit.com/spam/@pleasestop/introducing-pleasestop-here-to-reduce-comment-spam) regarding bad behavior on Steemit.",
      "json_metadata": "",
      "parent_author": "jb7959",
      "parent_permlink": "dip",
      "permlink": "introduce-bot-re-jb7959dip",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:38:39",
  "trx_id": "f2ca51240e34cc8b544eebd4b545cc28297b4e80",
  "trx_in_block": 30,
  "virtual_op": 0
}
introduce.botupvoted (3.37%) @jb7959 / dip
2018/06/14 04:38:39
authorjb7959
permlinkdip
voterintroduce.bot
weight337 (3.37%)
Transaction InfoBlock #23305142/Trx 1deda7f94fd378c2da50a8afbff90122860e66f9
View Raw JSON Data
{
  "block": 23305142,
  "op": [
    "vote",
    {
      "author": "jb7959",
      "permlink": "dip",
      "voter": "introduce.bot",
      "weight": 337
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:38:39",
  "trx_id": "1deda7f94fd378c2da50a8afbff90122860e66f9",
  "trx_in_block": 12,
  "virtual_op": 0
}
jb7959followed @asbear
2018/06/14 04:33:36
idfollow
json["follow",{"follower":"jb7959","following":"asbear","what":["blog"]}]
required auths[]
required posting auths["jb7959"]
Transaction InfoBlock #23305041/Trx aeb0287cbd5af2790d6681794d3f0210d2fe2bdb
View Raw JSON Data
{
  "block": 23305041,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"jb7959\",\"following\":\"asbear\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "jb7959"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:33:36",
  "trx_id": "aeb0287cbd5af2790d6681794d3f0210d2fe2bdb",
  "trx_in_block": 51,
  "virtual_op": 0
}
jb7959upvoted (100.00%) @asbear / 5ui1b3
2018/06/14 04:33:30
authorasbear
permlink5ui1b3
voterjb7959
weight10000 (100.00%)
Transaction InfoBlock #23305039/Trx d761920db8408cbf71c7bc8737acac0490212a06
View Raw JSON Data
{
  "block": 23305039,
  "op": [
    "vote",
    {
      "author": "asbear",
      "permlink": "5ui1b3",
      "voter": "jb7959",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:33:30",
  "trx_id": "d761920db8408cbf71c7bc8737acac0490212a06",
  "trx_in_block": 9,
  "virtual_op": 0
}
2018/06/14 04:32:36
idfollow
json["follow",{"follower":"jb7959","following":"nhj12311","what":["blog"]}]
required auths[]
required posting auths["jb7959"]
Transaction InfoBlock #23305021/Trx ca7c5dbed0bf78730f7aa595d669a998dbaff978
View Raw JSON Data
{
  "block": 23305021,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"jb7959\",\"following\":\"nhj12311\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "jb7959"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:32:36",
  "trx_id": "ca7c5dbed0bf78730f7aa595d669a998dbaff978",
  "trx_in_block": 11,
  "virtual_op": 0
}
2018/06/14 04:17:06
authortradingideas
permlinksteem-js-test
voterjb7959
weight10000 (100.00%)
Transaction InfoBlock #23304711/Trx 177ebb3b7d5409c2199c6a978bb84e1bfe21bdde
View Raw JSON Data
{
  "block": 23304711,
  "op": [
    "vote",
    {
      "author": "tradingideas",
      "permlink": "steem-js-test",
      "voter": "jb7959",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:17:06",
  "trx_id": "177ebb3b7d5409c2199c6a978bb84e1bfe21bdde",
  "trx_in_block": 7,
  "virtual_op": 0
}
jb7959upvoted (100.00%) @codingman / tmp36-lcd16x2
2018/06/14 04:14:42
authorcodingman
permlinktmp36-lcd16x2
voterjb7959
weight10000 (100.00%)
Transaction InfoBlock #23304663/Trx 307c2e1a88382c80cb6732a8267f0d94d83c2cdd
View Raw JSON Data
{
  "block": 23304663,
  "op": [
    "vote",
    {
      "author": "codingman",
      "permlink": "tmp36-lcd16x2",
      "voter": "jb7959",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:14:42",
  "trx_id": "307c2e1a88382c80cb6732a8267f0d94d83c2cdd",
  "trx_in_block": 21,
  "virtual_op": 0
}
meglanafishaupvoted (100.00%) @jb7959 / dip
2018/06/14 04:13:57
authorjb7959
permlinkdip
votermeglanafisha
weight10000 (100.00%)
Transaction InfoBlock #23304648/Trx cc818a1fae674929f25c383fc91079263fb47c17
View Raw JSON Data
{
  "block": 23304648,
  "op": [
    "vote",
    {
      "author": "jb7959",
      "permlink": "dip",
      "voter": "meglanafisha",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:13:57",
  "trx_id": "cc818a1fae674929f25c383fc91079263fb47c17",
  "trx_in_block": 33,
  "virtual_op": 0
}
jb7959updated their account properties
2018/06/14 04:13:18
accountjb7959
json metadata{"profile":{"profile_image":"https://cdn.steemitimages.com/DQmPZh4gLzf7e7HJiwtwFF99WzLQBRbYcqDtgaoYyMKg7hj/DoubleM_Squre.png","name":"doublem.org","location":"SEOUL","website":"http://doublem.org"}}
memo keySTM6FsWtSZJejDALs5oEjBJ912xFuRU6L1GDNzgry7qsUKav8fzDw
Transaction InfoBlock #23304635/Trx c22b6b54fab152628cd5bd3d44e824f20bf43719
View Raw JSON Data
{
  "block": 23304635,
  "op": [
    "account_update",
    {
      "account": "jb7959",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmPZh4gLzf7e7HJiwtwFF99WzLQBRbYcqDtgaoYyMKg7hj/DoubleM_Squre.png\",\"name\":\"doublem.org\",\"location\":\"SEOUL\",\"website\":\"http://doublem.org\"}}",
      "memo_key": "STM6FsWtSZJejDALs5oEjBJ912xFuRU6L1GDNzgry7qsUKav8fzDw"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:13:18",
  "trx_id": "c22b6b54fab152628cd5bd3d44e824f20bf43719",
  "trx_in_block": 67,
  "virtual_op": 0
}
jb7959published a new post: dip
2018/06/14 04:10:48
authorjb7959
body@@ -179,109 +179,93 @@ %EB%8B%A4.%0A%0A -%3Cimg src=%22//doublems.github.io/assets/postphoto/20180614/1.jpg%22 title=%22%22 width=%22100%25%22 height=%22100%25%22%3E +(https://cdn.steemitimages.com/DQmP2avnCCRBLjsYaRKEKbfPmfuo5xbCzJqf1D4P1qYf2Rk/1.jpg) %0A%0A%EC%86%8C%ED%94%84 @@ -10840,8 +10840,16 @@ ing_lab) +!%5B1.jpg%5D
json metadata{"tags":["software","kr","dip","hollywood-principle","developer"],"image":["https://cdn.steemitimages.com/DQmP2avnCCRBLjsYaRKEKbfPmfuo5xbCzJqf1D4P1qYf2Rk/1.jpg","//doublems.github.io/assets/postphoto/20180614/2.jpg","//doublems.github.io/assets/postphoto/20180614/3.jpg","//doublems.github.io/assets/postphoto/20180614/4.jpg","//doublems.github.io/assets/postphoto/20180614/5.jpg","//doublems.github.io/assets/postphoto/20180614/6.jpg","//doublems.github.io/assets/postphoto/20180614/7.jpg"],"links":["https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98_%EB%B6%84%EB%A6%AC_SoC","http://doublem.org/Hollywood-Principle/","https://dzone.com/articles/the-hollywood-principle","https://en.wikipedia.org/wiki/Dependency_inversion_principle","http://vandbt.tistory.com/42","https://medium.com/@smartbosslee/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%AC-separation-of-concerns-soc-8a8d09df066d","https://en.wikipedia.org/wiki/Living_lab"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinksoftware
permlinkdip
title헐리우드원칙과 DIP구현
Transaction InfoBlock #23304585/Trx 666a8980bf47ea3e0221725431024cf12884fd57
View Raw JSON Data
{
  "block": 23304585,
  "op": [
    "comment",
    {
      "author": "jb7959",
      "body": "@@ -179,109 +179,93 @@\n %EB%8B%A4.%0A%0A\n-%3Cimg src=%22//doublems.github.io/assets/postphoto/20180614/1.jpg%22 title=%22%22  width=%22100%25%22 height=%22100%25%22%3E\n+(https://cdn.steemitimages.com/DQmP2avnCCRBLjsYaRKEKbfPmfuo5xbCzJqf1D4P1qYf2Rk/1.jpg)\n %0A%0A%EC%86%8C%ED%94%84\n@@ -10840,8 +10840,16 @@\n ing_lab)\n+!%5B1.jpg%5D\n",
      "json_metadata": "{\"tags\":[\"software\",\"kr\",\"dip\",\"hollywood-principle\",\"developer\"],\"image\":[\"https://cdn.steemitimages.com/DQmP2avnCCRBLjsYaRKEKbfPmfuo5xbCzJqf1D4P1qYf2Rk/1.jpg\",\"//doublems.github.io/assets/postphoto/20180614/2.jpg\",\"//doublems.github.io/assets/postphoto/20180614/3.jpg\",\"//doublems.github.io/assets/postphoto/20180614/4.jpg\",\"//doublems.github.io/assets/postphoto/20180614/5.jpg\",\"//doublems.github.io/assets/postphoto/20180614/6.jpg\",\"//doublems.github.io/assets/postphoto/20180614/7.jpg\"],\"links\":[\"https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98_%EB%B6%84%EB%A6%AC_SoC\",\"http://doublem.org/Hollywood-Principle/\",\"https://dzone.com/articles/the-hollywood-principle\",\"https://en.wikipedia.org/wiki/Dependency_inversion_principle\",\"http://vandbt.tistory.com/42\",\"https://medium.com/@smartbosslee/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%AC-separation-of-concerns-soc-8a8d09df066d\",\"https://en.wikipedia.org/wiki/Living_lab\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "software",
      "permlink": "dip",
      "title": "헐리우드원칙과 DIP구현"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:10:48",
  "trx_id": "666a8980bf47ea3e0221725431024cf12884fd57",
  "trx_in_block": 45,
  "virtual_op": 0
}
jb7959published a new post: dip
2018/06/14 04:08:30
authorjb7959
body### 들어가며 다른사람들과 함께 \'일\'을 하다보면 다양한 \'일\'을 겪는다. 그 일들은 고객의 문제와 해결이며, 필요성과 욕구 사이의 줄타기이다. 줄타기 사이에서 우리의 역할은 문제를 정의하는 일을 할 수도, 문제를 해결하는 방법을 만드는 일을 할 수도, 필요와 욕구 사이를 적절히 조율하는 일을 할 수도 있다. <img src="//doublems.github.io/assets/postphoto/20180614/1.jpg" title="" width="100%" height="100%"> 소프트웨어는 무엇이고, 개발은 무엇인가? 아마, 소프트웨어는 문제를 해결하는 방법이며 개발은 문제를 해결하는 일을 만드는 일이라고 할 수 있을 것이다. 그렇다면, **\'문제정의 → 해결방안설계 → 해결방안구현 → 문제해결\'** 이라는 방법으로 순차적으로 처리를 할 수 있을까? 위와 같은 일은 큰 맥락으로 이뤄지지만, 나의 학교에서의 프로젝트 경험으로도, 기업단위의 프로젝트경험에서도 매끄럽게 이뤄지지 않았다. 가장 큰 문제는 문제정의를 문제라고 생각하는 실제 경험자가 정의하지 않고, 할 수도 없는 상황이 많다. 이를 해결하기 위해, 소프트웨어 개발방법론에는 Agile이라는 방법도 있고, 일반 과학연구방법론쪽에서는 Living-Lab이라는 개념을 도입하기도 한다. 두개의 방법 모두 실제문제경험을 할 수 있는 고객,소비자,사용자를 문제정의의 대상객체에서 정의를 내리는 주체로 만들고 지속적인 반복 해결을 통하여 문제를 해결하자라는 개념이다. 아직까지는 나의 경우 경험이 부족하여 식견이 짧아, 어떤 방안이 더욱 효율적인지는 판단이 어렵다.  하지만, 위와 같은 방법론적인 방안외에 내가 프로그래밍(coding)을 통해서 할 수 있는 일은 어떤것이 있을까하고 고민하던 중 아래와 같은 원칙을 발견하고 적용해보려고 한다.  #### 헐리우드원칙 사전적 정의는 없지만, 많은 위키와 글들에서 아래와 같이 말한다. "Don't call us, we'll call you" 우리한테 연락하지 마세요. 우리가 연락할께요 <img src="//doublems.github.io/assets/postphoto/20180614/2.jpg" title="" width="100%" height="100%"> \'내\'가 할 수 있는 일과 \'남\'이 할 수 있는 일을 구분하는 것이다. 인력채용과정에서 구직자가 주도적으로 할 수 있는 일은 \'자기소개서 및 이력서\' 작성 및 제출이 최선이다. 제출이후에 벌어지는 일들은 각 구인기업의 방법에 따라 다르다. 구직자는 서류통과 이후 기업에서 요청하는데로 반응하여 행동 할 수 밖에 없다. 구직을 위해서라면 기업요청에 맞춰 유연하게 대응해야한다. <img src="//doublems.github.io/assets/postphoto/20180614/3.jpg" title="" width="100%" height="100%"> 위의 경우 구직자의 서류가 모두 통과 되었다고 하자, 그렇다면 구직자는 세가지의 채용 프로세스에 따라서 행동을 해야 한다. 여기서 문제는 세가지의 채용프로세스이고, 해결을 위해서는 구직자가 각 채용프로세스에 맞춰서 행동해야 한다. 프로그래밍을 한다면 어떻게 할 것인가? 아래에서 getResult 함수는 각각의 회사채용방식에 맞게 코드를 작성 할 것인가? 지원자 객체는 이름과 점수(학점), 현재회사, 고용유무상태를 확인한다. Node.JS 예시 ```` //서버 var express = require(\'express\'); var router = express.Router(); /\* GET home page. \*/ //구직자 router.get(\'/\', function(req, res, next) { var applicant = {name: \'jerry\', score: 10, company:\'\', isHired:\'\'}; var result = getResult(applicant); res.render(\'index\', { result:result}); }); function getResult(applicant){ return applicant } //결과(웹) extends layout block content h1= title p Welcome to \#{result.company} p \#{result.name}은 \#{result.company}의 채용전형 결과 \#{result.score}로 \#{result.isHired}하셨습니다. ```` A기업의 채용프로세스는 다음과 같다. >- 지원자의 이름은 지원번호와 함께 나타난다. >- 지원자의 점수는 10을 곱하여 합격유무가 결정된다. ```` A 기업 function getResult(applicant){ applicant.name = (\"지원번호 000123/\"+applicant.name); var companyScore = (applicant.score \* 10); if(companyScore \>99){ applicant.isHired =\"합격\"; }else { applicant.isHired = \"불합격\"; } return applicant } ```` 여기서 B기업의 프로세스를 추가하려면 아래와 같은 선택지가 있다. >a\. getResult를 삭제 혹은 주석처리 >b\. getResult2 라는 새로운 이름의 함수선언 및 Route.get(\'/\')의 getResult 호출 변경 a안은 A기업의 프로세스를 재사용 할 수 없다.  a안을 따르는 순간 A기업의 getResult를 사용하던 모든 함수는 장애가 발생한다. (강제로 B기업 프로세스로 적용) b안은 함수의 이름을 관리해야하며, 잘못된 함수의 이름은 다른사람으로 하여금 혼돈 및 오용가능성을 높일 수 있다. 또한 Route.get(\'/\')에서 필요로 하는 요소 (이름, 회사명, 점수, 합격유무) 프로퍼티가 존재하지 않을경우 잘못된 페이지가 나타난다. 잘못된 페이지는 잘못된 응용이다.  (아래 B기업의 결과를 보고 싶다면 반드시 결과(웹) 템플릿의 호출 프로퍼티 식별자 명을 바꿔야 한다.) ```` B 기업 function getResult(applicant){ applicant.B\_NAME = (applicant.name); var BS = (applicant.score \* 6); if(BS \>90){ applicant.hired =\"합격\"; }else { applicant.hired = \"불합격\"; } return applicant } ```` ### 의존성역전의 원칙 Dependency Inversion Principle 이라고 한다. (이하 DIP) , 의존이란 \'다른것에 의지하여 존재함\'이라는 뜻이다. 객체 지향 프로그래밍에서 의존 관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존 관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고 있다. 첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.\ 둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다. 이 원칙은 \'상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다\'는 객체 지향적 설계의 대원칙을 제공한다. 상위 모듈이 하위모듈에 의존하지 말라고 한다. 우리의 예를 들면, 구직자가 보고 싶어하는 페이지(웹템플릿)이 상위모듈이다. (이 페이지에는 구직자의 목표인 구직결과가 나타나있다.) 하지만, 지금까지의 프로그래밍 결과로는 상위모듈이 하위모듈에 의존하고 있는 모습이다. <img src="//doublems.github.io/assets/postphoto/20180614/4.jpg" title="" width="100%" height="100%"> >*A* ***policy*** *is* *a* *set* *of* *ideas* *or* *plans* *that is* *used* *as* *a* *basis* *for* *making* *decisions*, *especially* *in* *politics*, *economics*, *orbusiness*. Policy는 계획이나 아이디어의 모음이며, 의사결정을 하는데 쓰인다. - 콜린스코빌드영영사전 지극히도 구직을 하기 위한 Policy 수준내용이 반영된 구현체(웹템플릿)이 채용프로세스를 담고있는 함수들에 의존을 하고 있다.  위에서 보았겠지만, b안(*getResult2 라는 새로운 이름의 함수선언 및 Route.get(\'/\')의 getResult 호출 변경*)을 따르는 경우에는 필연적으로 웹템플릿을 수정 할 수 밖에 없다. <img src="//doublems.github.io/assets/postphoto/20180614/5.jpg" title="" width="100%" height="100%"> <img src="//doublems.github.io/assets/postphoto/20180614/6.jpg" title="" width="100%" height="100%"> DIP는 이를 해결하기 위해 Interface를 사용하라고 한다. 어떤 뜻일까? ### 사용예시 상위 예시에서는 getResult를 정의하고 사용 할 수 있다. 그러나, applicant의 프로퍼티에 대해서 강력한 제약사항을 선언 할 수 없었다. 이것은 관심사의 분리 정도밖에 기능을 할 수 없는 것으로 보인다.  >separation of concerns; SoC관심사의 분리, 관심의 분리 >(소프트웨어 공학) 프로그램을 기능 면에서 가능한 중복이 아닌 여러 모듈로 명확히 나누는 것\ 여기서, 관심 = 프로그램의 기능, 행동, 목적\ 큰 문제를 작은 부분들의 문제로 분할하면 해결이 용이함\ 모든 프로그래밍 패러다임의 지향점\ 모듈성과 캡슐화가 중요함\ //예시\ MVC 디자인 패턴 - 데이터와 표현 분리\ 서비스 지향 설계 - 관심을 서비스로 분리\ 절차적 프로그래밍\ 객체지향프로그래밍 - 데이터에 대한 관심을 클래스와 객체로 분리\ 관점지향프로그래밍 AOP\ 역할지향프로그래밍\ 주제지향프로그래밍\ - [[https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98\_%EB%B6%84%EB%A6%AC\_SoC]{.underline}](https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98_%EB%B6%84%EB%A6%AC_SoC) 잠깐! 여기서 생각해보자. 지금까지 우리는 구직자의 행위와 함께 구인기업의 채용프로세스를 정의하는 제3자, 전지적작가시점에서 코드를 작성했다. 만약, 구인기업의 채용프로세스를 모른다고 가정한다면 어떻게 코드를 작성해야 할까? 막연히 프로세스를 알때까지 기다려야 할까? ```` /\* GET home page. \*/ router.get(\'/\', function(req, res, next) { var applicant = {name: \'Jerry Ahn\', score: 10, company:\'\',isHired:\'\'}; var result = ?????????????????? //여기는 어떻게 하나??? res.render(\'index\', { result:result}); }); ```` 이런경우 아래와 같이 작성을 하게 된다면 이후, 채용프로세스를 알때, 우리는 채용프로세스 함수를 인자로 넣어주기만 하면 된다.  (나중에 내가 선언을 해줘도 되고, 외부에서 모듈로 다운로드 받아도 된다.) **"Don't call us, we'll call you" 우리한테 연락하지 마세요. 우리가 연락할께요. 가 눈앞에 구현되는 순간이다.** ```` /\* GET home page. \*/ router.get(\'/\', function(req, res, next) { var applicant = {name: \'Jerry Ahn\', score: 10, company:\'\',isHired:\'\'}; var result = getResult(applicant,\'프로세스\');//시키는데로 반응하겠다. 헐리우드 원칙 적용 res.render(\'index\', { result:result}); }); //회사채용후 결과를 얻는 함수 //시키는데로 반응하겠다. 헐리우드 원칙 적용 //applicant는 name:String, score:integer, company:String, isHired:String 프로퍼티로 구성되어있습니다. function getResult(applicant,callback){ return callback(applicant); }; ```` 단지 JS로 구현한 코드에는 인터페이스의 강제성이 없어서 만약 applicant의 프로퍼티 타입이 다를경우를 해결하는 로직을 getResult에 구현해줘야한다.  **단, 해결로직은 getResult에만 포함해주면 된다. 이는 관심사의 분리를 통한 이점이다.** 다른사람과의 협업시에 한사람은 getResult만 신경쓰면 되며, 이를 사용하는 쪽에서는 다른 부분에만 관심을 두고 작업을 진행하면 된다. (사실. Interface라면 서로 합의가 된 상태에서 구현이 이뤄져야한다. 아니면, 누군가가 하나의 기준을 준수하고 따라줘야 한다. 프로퍼티가 다르다는 것은 인터페이스가 제 기능을 못하는것으로 봐도 될 것이다.)  ```` var express = require(\'express\'); var router = express.Router(); /\* GET home page. \*/ router.get(\'/\', function(req, res, next) { var applicant = {name: \'Jerry Ahn\', score: 10, company:\'\',isHired:\'\'}; var result = getResult(applicant,CompanyB); res.render(\'index\', { result:result}); }); //회사채용후 결과를 얻는 함수 //시키는데로 반응하겠다. 헐리우드 원칙 적용 //applicant는 name:String, score:integer, company:String, isHired:String 프로퍼티로 구성되어있습니다. function getResult(applicant,callback){ return callback(applicant); }; //A기업 function CompanyA(applicant){ applicant.name = (\"지원번호 000123/\"+applicant.name); applicant.company = \'A기업\'; var companyScore = (applicant.score \* 10); if(companyScore \>99){ applicant.isHired =\"합격\"; }else { applicant.isHired = \"불합격\"; } return applicant; } //B기업 function CompanyB(applicant){ applicant.company = \'B기업\'; var companyScore = (applicant.score \* 5); if(companyScore \>60){ applicant.isHired =\"합격\"; }else { applicant.isHired = \"불합격\"; } return applicant; } ```` 이를 자바에서 구현해보자. 자바의 경우에는 인터페이스를 구현시에는 강제성을 지닌다. 따라서 결과에 대한 보장을 받을 수 있다. 아래와 같이 구현시에는 지원서에 적힌 Company명을 가지고 분류하는 기능으로 자동화가 가능하다. 이기능을 구현시에는 이부분의 코딩은 완료가 된다. → Factory Pattern 을 통한 활용이 가능 ```` package Controller; import model.Applicant; import model.CompanyA; import model.HiringProcess; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Map; \@Controller public class IndexController { \@RequestMapping(\"/\") public String welcome(Model model) { Applicant jerry = new Applicant(\"jerry\",10); HiringProcess result = new CompanyA(); // 채용프로세스 타입을 보장받는다. // (지금은 CompanyA를 넣었지만, 지원서에 적힌 Company명을 가지고 분류하는 기능으로 자동화가 가능하다. 이기능을 구현시에는 이부분의 코딩은 완료가 된다.) model.addAttribute(\"result\", result.getResult(jerry)); return \"welcome\"; } } \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-- package model; public class Applicant { private String name; private String company; private int score; private String isHired; public Applicant(String name, int score){ this.name = name; this.score = score; this.company = \"\"; this.isHired =\"미정\"; } \..... Getter, Setter} \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-- package model; //채용프로세스 인터페이스 public interface HiringProcess { Applicant getResult(Applicant applicant); } \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-- package model; public class CompanyA implements HiringProcess { \@Override public Applicant getResult(Applicant applicant) { applicant.setName((\"지원번호 000123/\"+applicant.getName())); int companyScore = (applicant.getScore() \* 10); if(companyScore \>99){ applicant.setIsHired(\"합격\"); }else { applicant.setIsHired(\"불합격\"); } return applicant; } } ```` <img src="//doublems.github.io/assets/postphoto/20180614/7.jpg" title="" width="100%" height="100%"> - 추후 OCP 연계 및 자동화기능을 수행하는 Factory를 만들어보자. 참고자료 -------- - [[http://doublem.org/Hollywood-Principle/]{.underline}](http://doublem.org/Hollywood-Principle/) - [[https://dzone.com/articles/the-hollywood-principle]{.underline}](https://dzone.com/articles/the-hollywood-principle) - [[https://en.wikipedia.org/wiki/Dependency\_inversion\_principle]{.underline}](https://en.wikipedia.org/wiki/Dependency_inversion_principle) - [[http://vandbt.tistory.com/42]{.underline}](http://vandbt.tistory.com/42) - [[https://medium.com/\@smartbosslee/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%AC-separation-of-concerns-soc-8a8d09df066d]{.underline}](https://medium.com/@smartbosslee/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%AC-separation-of-concerns-soc-8a8d09df066d) - [[https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98\_%EB%B6%84%EB%A6%AC\_SoC]{.underline}](https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98_%EB%B6%84%EB%A6%AC_SoC) - [[https://en.wikipedia.org/wiki/Living\_lab]{.underline}](https://en.wikipedia.org/wiki/Living_lab)
json metadata{"tags":["software","kr","dip","hollywood-principle","developer"],"image":["//doublems.github.io/assets/postphoto/20180614/1.jpg","//doublems.github.io/assets/postphoto/20180614/2.jpg","//doublems.github.io/assets/postphoto/20180614/3.jpg","//doublems.github.io/assets/postphoto/20180614/4.jpg","//doublems.github.io/assets/postphoto/20180614/5.jpg","//doublems.github.io/assets/postphoto/20180614/6.jpg","//doublems.github.io/assets/postphoto/20180614/7.jpg"],"links":["https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98_%EB%B6%84%EB%A6%AC_SoC","http://doublem.org/Hollywood-Principle/","https://dzone.com/articles/the-hollywood-principle","https://en.wikipedia.org/wiki/Dependency_inversion_principle","http://vandbt.tistory.com/42","https://medium.com/@smartbosslee/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%AC-separation-of-concerns-soc-8a8d09df066d","https://en.wikipedia.org/wiki/Living_lab"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinksoftware
permlinkdip
title헐리우드원칙과 DIP구현
Transaction InfoBlock #23304539/Trx 85bbf0f0e18f71068e0fed344a54fda42738d93b
View Raw JSON Data
{
  "block": 23304539,
  "op": [
    "comment",
    {
      "author": "jb7959",
      "body": "### 들어가며\n\n다른사람들과 함께 \\'일\\'을 하다보면 다양한 \\'일\\'을 겪는다. 그 일들은\n고객의 문제와 해결이며, 필요성과 욕구 사이의 줄타기이다.\n\n줄타기 사이에서 우리의 역할은 문제를 정의하는 일을 할 수도, 문제를\n해결하는 방법을 만드는 일을 할 수도, 필요와 욕구 사이를 적절히 조율하는\n일을 할 수도 있다.\n\n<img src=\"//doublems.github.io/assets/postphoto/20180614/1.jpg\" title=\"\"  width=\"100%\" height=\"100%\">\n\n소프트웨어는 무엇이고, 개발은 무엇인가? 아마, 소프트웨어는 문제를\n해결하는 방법이며 개발은 문제를 해결하는 일을 만드는 일이라고 할 수 있을\n것이다.\n\n그렇다면, **\\'문제정의 → 해결방안설계 → 해결방안구현 → 문제해결\\'**\n이라는 방법으로 순차적으로 처리를 할 수 있을까?\n\n위와 같은 일은 큰 맥락으로 이뤄지지만, 나의 학교에서의 프로젝트\n경험으로도, 기업단위의 프로젝트경험에서도 매끄럽게 이뤄지지 않았다.\n\n가장 큰 문제는 문제정의를 문제라고 생각하는 실제 경험자가 정의하지 않고,\n할 수도 없는 상황이 많다.\n\n이를 해결하기 위해, 소프트웨어 개발방법론에는 Agile이라는 방법도 있고,\n일반 과학연구방법론쪽에서는 Living-Lab이라는 개념을 도입하기도 한다.\n\n두개의 방법 모두 실제문제경험을 할 수 있는 고객,소비자,사용자를\n문제정의의 대상객체에서 정의를 내리는 주체로 만들고 지속적인 반복 해결을\n통하여 문제를 해결하자라는 개념이다.\n\n아직까지는 나의 경우 경험이 부족하여 식견이 짧아, 어떤 방안이 더욱\n효율적인지는 판단이 어렵다. \n\n하지만, 위와 같은 방법론적인 방안외에 내가 프로그래밍(coding)을 통해서\n할 수 있는 일은 어떤것이 있을까하고 고민하던 중 아래와 같은 원칙을\n발견하고 적용해보려고 한다. \n\n#### 헐리우드원칙\n\n사전적 정의는 없지만, 많은 위키와 글들에서 아래와 같이 말한다.\n\n\"Don't call us, we'll call you\" 우리한테 연락하지 마세요. 우리가\n연락할께요\n\n<img src=\"//doublems.github.io/assets/postphoto/20180614/2.jpg\" title=\"\"  width=\"100%\" height=\"100%\">\n\n\\'내\\'가 할 수 있는 일과 \\'남\\'이 할 수 있는 일을 구분하는 것이다.\n\n인력채용과정에서 구직자가 주도적으로 할 수 있는 일은 \\'자기소개서 및\n이력서\\' 작성 및 제출이 최선이다. 제출이후에 벌어지는 일들은 각\n구인기업의 방법에 따라 다르다.\n\n구직자는 서류통과 이후 기업에서 요청하는데로 반응하여 행동 할 수 밖에\n없다.\n\n구직을 위해서라면 기업요청에 맞춰 유연하게 대응해야한다.\n\n<img src=\"//doublems.github.io/assets/postphoto/20180614/3.jpg\" title=\"\"  width=\"100%\" height=\"100%\">\n\n위의 경우 구직자의 서류가 모두 통과 되었다고 하자, 그렇다면 구직자는\n세가지의 채용 프로세스에 따라서 행동을 해야 한다.\n\n여기서 문제는 세가지의 채용프로세스이고, 해결을 위해서는 구직자가 각\n채용프로세스에 맞춰서 행동해야 한다.\n\n프로그래밍을 한다면 어떻게 할 것인가?\n\n아래에서 getResult 함수는 각각의 회사채용방식에 맞게 코드를 작성 할\n것인가?\n\n지원자 객체는 이름과 점수(학점), 현재회사, 고용유무상태를 확인한다.\n\nNode.JS 예시\n````\n//서버\n\nvar express = require(\\'express\\');\n\nvar router = express.Router();\n\n/\\* GET home page. \\*/\n\n//구직자\n\nrouter.get(\\'/\\', function(req, res, next) {\n\nvar applicant = {name: \\'jerry\\', score: 10, company:\\'\\',\nisHired:\\'\\'};\n\nvar result = getResult(applicant);\n\nres.render(\\'index\\', { result:result});\n\n});\n\nfunction getResult(applicant){\n\nreturn applicant\n\n}\n\n//결과(웹)\n\nextends layout\n\nblock content\n\nh1= title\n\np Welcome to \\#{result.company}\n\np \\#{result.name}은 \\#{result.company}의 채용전형 결과\n\\#{result.score}로 \\#{result.isHired}하셨습니다.\n````\n\nA기업의 채용프로세스는 다음과 같다.\n\n>-   지원자의 이름은 지원번호와 함께 나타난다.\n>-   지원자의 점수는 10을 곱하여 합격유무가 결정된다.\n\n\n````\nA 기업\n\nfunction getResult(applicant){\n\napplicant.name = (\\\"지원번호 000123/\\\"+applicant.name);\n\nvar companyScore = (applicant.score \\* 10);\n\nif(companyScore \\>99){\n\napplicant.isHired =\\\"합격\\\";\n\n}else {\n\napplicant.isHired = \\\"불합격\\\";\n\n}\n\nreturn applicant\n\n}\n````\n\n여기서 B기업의 프로세스를 추가하려면 아래와 같은 선택지가 있다.\n\n>a\\. getResult를 삭제 혹은 주석처리\n\n>b\\. getResult2 라는 새로운 이름의 함수선언 및\nRoute.get(\\'/\\')의 getResult 호출 변경\n\na안은 A기업의 프로세스를 재사용 할 수 없다.  a안을 따르는 순간 A기업의\ngetResult를 사용하던 모든 함수는 장애가 발생한다. (강제로 B기업\n프로세스로 적용)\n\nb안은 함수의 이름을 관리해야하며, 잘못된 함수의 이름은 다른사람으로\n하여금 혼돈 및 오용가능성을 높일 수 있다. 또한 Route.get(\\'/\\')에서\n필요로 하는 요소 (이름, 회사명, 점수, 합격유무) 프로퍼티가 존재하지\n않을경우 잘못된 페이지가 나타난다.\n\n잘못된 페이지는 잘못된 응용이다.  (아래 B기업의 결과를 보고 싶다면\n반드시 결과(웹) 템플릿의 호출 프로퍼티 식별자 명을 바꿔야 한다.)\n\n````\nB 기업\n\nfunction getResult(applicant){\n\napplicant.B\\_NAME = (applicant.name);\n\nvar BS = (applicant.score \\* 6);\n\nif(BS \\>90){\n\napplicant.hired =\\\"합격\\\";\n\n}else {\n\napplicant.hired = \\\"불합격\\\";\n\n}\n\nreturn applicant\n\n}\n````\n\n### 의존성역전의 원칙\n\nDependency Inversion Principle 이라고 한다. (이하 DIP) , 의존이란\n\\'다른것에 의지하여 존재함\\'이라는 뜻이다.\n\n객체 지향 프로그래밍에서 의존 관계 역전 원칙은 소프트웨어 모듈들을\n분리하는 특정 형식을 지칭한다.\n\n이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는\n전통적인 의존 관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의\n구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고\n있다.\n\n첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈\n모두 추상화에 의존해야 한다.\\\n둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에\n의존해야 한다.\n\n이 원칙은 \\'상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다\\'는\n객체 지향적 설계의 대원칙을 제공한다.\n\n상위 모듈이 하위모듈에 의존하지 말라고 한다. 우리의 예를 들면, 구직자가\n보고 싶어하는 페이지(웹템플릿)이 상위모듈이다. (이 페이지에는 구직자의\n목표인 구직결과가 나타나있다.)\n\n하지만, 지금까지의 프로그래밍 결과로는 상위모듈이 하위모듈에 의존하고\n있는 모습이다.\n\n<img src=\"//doublems.github.io/assets/postphoto/20180614/4.jpg\" title=\"\"  width=\"100%\" height=\"100%\">\n\n>*A* ***policy*** *is* *a* *set* *of* *ideas* *or* *plans* *that\nis* *used* *as* *a* *basis* *for* *making* *decisions*, *especially* *in* *politics*, *economics*, *orbusiness*.\n\nPolicy는 계획이나 아이디어의 모음이며, 의사결정을 하는데 쓰인다. -\n콜린스코빌드영영사전\n\n지극히도 구직을 하기 위한 Policy 수준내용이 반영된 구현체(웹템플릿)이\n채용프로세스를 담고있는 함수들에 의존을 하고 있다. \n\n위에서 보았겠지만, b안(*getResult2 라는 새로운 이름의 함수선언 및\nRoute.get(\\'/\\')의 getResult 호출 변경*)을 따르는 경우에는 필연적으로\n웹템플릿을 수정 할 수 밖에 없다.\n\n<img src=\"//doublems.github.io/assets/postphoto/20180614/5.jpg\" title=\"\"  width=\"100%\" height=\"100%\">\n\n<img src=\"//doublems.github.io/assets/postphoto/20180614/6.jpg\" title=\"\"  width=\"100%\" height=\"100%\">\n\nDIP는 이를 해결하기 위해 Interface를 사용하라고 한다. 어떤 뜻일까?\n\n### 사용예시\n\n상위 예시에서는 getResult를 정의하고 사용 할 수 있다.\n\n그러나, applicant의 프로퍼티에 대해서 강력한 제약사항을 선언 할 수\n없었다. 이것은 관심사의 분리 정도밖에 기능을 할 수 없는 것으로 보인다. \n\n>separation of concerns; SoC관심사의 분리, 관심의 분리\n\n>(소프트웨어 공학) 프로그램을 기능 면에서 가능한 중복이 아닌 여러 모듈로\n명확히 나누는 것\\\n여기서, 관심 = 프로그램의 기능, 행동, 목적\\\n큰 문제를 작은 부분들의 문제로 분할하면 해결이 용이함\\\n모든 프로그래밍 패러다임의 지향점\\\n모듈성과 캡슐화가 중요함\\\n//예시\\\nMVC 디자인 패턴 - 데이터와 표현 분리\\\n서비스 지향 설계 - 관심을 서비스로 분리\\\n절차적 프로그래밍\\\n객체지향프로그래밍 - 데이터에 대한 관심을 클래스와 객체로 분리\\\n관점지향프로그래밍 AOP\\\n역할지향프로그래밍\\\n주제지향프로그래밍\\\n-\n[[https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98\\_%EB%B6%84%EB%A6%AC\\_SoC]{.underline}](https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98_%EB%B6%84%EB%A6%AC_SoC)\n\n잠깐! 여기서 생각해보자. 지금까지 우리는 구직자의 행위와 함께 구인기업의\n채용프로세스를 정의하는 제3자, 전지적작가시점에서 코드를 작성했다.\n\n만약, 구인기업의 채용프로세스를 모른다고 가정한다면 어떻게 코드를\n작성해야 할까? 막연히 프로세스를 알때까지 기다려야 할까?\n\n````\n/\\* GET home page. \\*/\n\nrouter.get(\\'/\\', function(req, res, next) {\n\nvar applicant = {name: \\'Jerry Ahn\\', score: 10,\ncompany:\\'\\',isHired:\\'\\'};\n\nvar result = ?????????????????? //여기는 어떻게 하나???\n\nres.render(\\'index\\', { result:result});\n\n});\n````\n\n이런경우 아래와 같이 작성을 하게 된다면 이후, 채용프로세스를 알때,\n우리는 채용프로세스 함수를 인자로 넣어주기만 하면 된다. \n\n(나중에 내가 선언을 해줘도 되고, 외부에서 모듈로 다운로드 받아도 된다.)\n\n**\"Don't call us, we'll call you\" 우리한테 연락하지 마세요. 우리가\n연락할께요. 가 눈앞에 구현되는 순간이다.**\n\n````\n/\\* GET home page. \\*/\n\nrouter.get(\\'/\\', function(req, res, next) {\n\nvar applicant = {name: \\'Jerry Ahn\\', score: 10,\ncompany:\\'\\',isHired:\\'\\'};\n\nvar result = getResult(applicant,\\'프로세스\\');//시키는데로 반응하겠다.\n헐리우드 원칙 적용\n\nres.render(\\'index\\', { result:result});\n\n});\n\n//회사채용후 결과를 얻는 함수 //시키는데로 반응하겠다. 헐리우드 원칙\n적용\n\n//applicant는 name:String, score:integer, company:String, isHired:String\n프로퍼티로 구성되어있습니다.\n\nfunction getResult(applicant,callback){\n\nreturn callback(applicant);\n\n};\n````\n\n단지 JS로 구현한 코드에는 인터페이스의 강제성이 없어서 만약 applicant의\n프로퍼티 타입이 다를경우를 해결하는 로직을 getResult에 구현해줘야한다. \n\n**단, 해결로직은 getResult에만 포함해주면 된다. 이는 관심사의 분리를\n통한 이점이다.** 다른사람과의 협업시에 한사람은 getResult만 신경쓰면\n되며, 이를 사용하는 쪽에서는 다른 부분에만 관심을 두고 작업을 진행하면\n된다.\n\n(사실. Interface라면 서로 합의가 된 상태에서 구현이 이뤄져야한다.\n아니면, 누군가가 하나의 기준을 준수하고 따라줘야 한다. 프로퍼티가\n다르다는 것은 인터페이스가 제 기능을 못하는것으로 봐도 될 것이다.) \n\n````\nvar express = require(\\'express\\');\n\nvar router = express.Router();\n\n/\\* GET home page. \\*/\n\nrouter.get(\\'/\\', function(req, res, next) {\n\nvar applicant = {name: \\'Jerry Ahn\\', score: 10,\ncompany:\\'\\',isHired:\\'\\'};\n\nvar result = getResult(applicant,CompanyB);\n\nres.render(\\'index\\', { result:result});\n\n});\n\n//회사채용후 결과를 얻는 함수 //시키는데로 반응하겠다. 헐리우드 원칙\n적용\n\n//applicant는 name:String, score:integer, company:String, isHired:String\n프로퍼티로 구성되어있습니다.\n\nfunction getResult(applicant,callback){\n\nreturn callback(applicant);\n\n};\n\n//A기업\n\nfunction CompanyA(applicant){\n    applicant.name = (\\\"지원번호 000123/\\\"+applicant.name);\n    applicant.company = \\'A기업\\';\n    var companyScore = (applicant.score \\* 10);\n    if(companyScore \\>99){\n        applicant.isHired =\\\"합격\\\";\n    }else {\n        applicant.isHired = \\\"불합격\\\";\n    }\n    return applicant;\n}\n\n//B기업\n\nfunction CompanyB(applicant){\n    applicant.company = \\'B기업\\';\n    var companyScore = (applicant.score \\* 5);\n    if(companyScore \\>60){\n        applicant.isHired =\\\"합격\\\";\n    }else {\n        applicant.isHired = \\\"불합격\\\";\n    }\n\n    return applicant;\n}\n````\n\n이를 자바에서 구현해보자. 자바의 경우에는 인터페이스를 구현시에는\n강제성을 지닌다. 따라서 결과에 대한 보장을 받을 수 있다.\n\n아래와 같이 구현시에는 지원서에 적힌 Company명을 가지고 분류하는\n기능으로 자동화가 가능하다. 이기능을 구현시에는 이부분의 코딩은 완료가\n된다. → Factory Pattern 을 통한 활용이 가능\n\n````\npackage Controller;\nimport model.Applicant;\nimport model.CompanyA;\nimport model.HiringProcess;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport java.util.Map;\n\n\\@Controller\npublic class IndexController {\n    \\@RequestMapping(\\\"/\\\")\n    public String welcome(Model model) {\n    Applicant jerry = new Applicant(\\\"jerry\\\",10);\n    HiringProcess result = new CompanyA(); // 채용프로세스 타입을 보장받는다.\n    // (지금은 CompanyA를 넣었지만, 지원서에 적힌 Company명을 가지고\n    분류하는 기능으로 자동화가 가능하다. 이기능을 구현시에는 이부분의 코딩은\n    완료가 된다.)\n    model.addAttribute(\\\"result\\\", result.getResult(jerry));\n    return \\\"welcome\\\";\n    }\n}\n\n\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\--\npackage model;\npublic class Applicant {\nprivate String name;\nprivate String company;\nprivate int score;\nprivate String isHired;\npublic Applicant(String name, int score){\nthis.name = name;\nthis.score = score;\nthis.company = \\\"\\\";\nthis.isHired =\\\"미정\\\";\n}\n\n\\..... Getter, Setter}\n\n\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\--\n\npackage model;\n//채용프로세스 인터페이스\npublic interface HiringProcess {\nApplicant getResult(Applicant applicant);\n}\n\n\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\--\n\npackage model;\npublic class CompanyA implements HiringProcess {\n\n    \\@Override\n    public Applicant getResult(Applicant applicant) {\n        applicant.setName((\\\"지원번호 000123/\\\"+applicant.getName()));\n        int companyScore = (applicant.getScore() \\* 10);\n        if(companyScore \\>99){\n          applicant.setIsHired(\\\"합격\\\");\n        }else {\n          applicant.setIsHired(\\\"불합격\\\");\n        }\n        return applicant;\n    }\n}\n````\n<img src=\"//doublems.github.io/assets/postphoto/20180614/7.jpg\" title=\"\"  width=\"100%\" height=\"100%\">\n\n-   추후 OCP 연계 및 자동화기능을 수행하는 Factory를 만들어보자.\n\n참고자료\n--------\n\n-   [[http://doublem.org/Hollywood-Principle/]{.underline}](http://doublem.org/Hollywood-Principle/)\n-   [[https://dzone.com/articles/the-hollywood-principle]{.underline}](https://dzone.com/articles/the-hollywood-principle)\n-   [[https://en.wikipedia.org/wiki/Dependency\\_inversion\\_principle]{.underline}](https://en.wikipedia.org/wiki/Dependency_inversion_principle)\n-   [[http://vandbt.tistory.com/42]{.underline}](http://vandbt.tistory.com/42)\n-   [[https://medium.com/\\@smartbosslee/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%AC-separation-of-concerns-soc-8a8d09df066d]{.underline}](https://medium.com/@smartbosslee/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%AC-separation-of-concerns-soc-8a8d09df066d)\n-   [[https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98\\_%EB%B6%84%EB%A6%AC\\_SoC]{.underline}](https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98_%EB%B6%84%EB%A6%AC_SoC)\n-   [[https://en.wikipedia.org/wiki/Living\\_lab]{.underline}](https://en.wikipedia.org/wiki/Living_lab)",
      "json_metadata": "{\"tags\":[\"software\",\"kr\",\"dip\",\"hollywood-principle\",\"developer\"],\"image\":[\"//doublems.github.io/assets/postphoto/20180614/1.jpg\",\"//doublems.github.io/assets/postphoto/20180614/2.jpg\",\"//doublems.github.io/assets/postphoto/20180614/3.jpg\",\"//doublems.github.io/assets/postphoto/20180614/4.jpg\",\"//doublems.github.io/assets/postphoto/20180614/5.jpg\",\"//doublems.github.io/assets/postphoto/20180614/6.jpg\",\"//doublems.github.io/assets/postphoto/20180614/7.jpg\"],\"links\":[\"https://zetawiki.com/wiki/%EA%B4%80%EC%8B%AC%EC%9D%98_%EB%B6%84%EB%A6%AC_SoC\",\"http://doublem.org/Hollywood-Principle/\",\"https://dzone.com/articles/the-hollywood-principle\",\"https://en.wikipedia.org/wiki/Dependency_inversion_principle\",\"http://vandbt.tistory.com/42\",\"https://medium.com/@smartbosslee/%EA%B4%80%EC%8B%AC%EC%82%AC%EC%9D%98-%EB%B6%84%EB%A6%AC-separation-of-concerns-soc-8a8d09df066d\",\"https://en.wikipedia.org/wiki/Living_lab\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "software",
      "permlink": "dip",
      "title": "헐리우드원칙과 DIP구현"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-14T04:08:30",
  "trx_id": "85bbf0f0e18f71068e0fed344a54fda42738d93b",
  "trx_in_block": 9,
  "virtual_op": 0
}
steemdelegated 18.620 SP to @jb7959
2018/06/09 12:44:06
delegateejb7959
delegatorsteem
vesting shares30281.670445 VESTS
Transaction InfoBlock #23171446/Trx 6594d2e92058745167b6dc678b85accbf1e65690
View Raw JSON Data
{
  "block": 23171446,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "jb7959",
      "delegator": "steem",
      "vesting_shares": "30281.670445 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-09T12:44:06",
  "trx_id": "6594d2e92058745167b6dc678b85accbf1e65690",
  "trx_in_block": 41,
  "virtual_op": 0
}
steemcreated a new account: @jb7959
2018/06/09 11:37:36
active{"account_auths":[],"key_auths":[["STM6KLsFd2CVyS6i5FCemoqq6LCVpfRzChtZN9zrcHcyp2R6Nw4n4",1]],"weight_threshold":1}
creatorsteem
delegation30690.000000 VESTS
extensions[]
fee0.100 STEEM
json metadata{}
memo keySTM6FsWtSZJejDALs5oEjBJ912xFuRU6L1GDNzgry7qsUKav8fzDw
new account namejb7959
owner{"account_auths":[],"key_auths":[["STM8KJHejMGwoKksYEL44mzU6fXR3ViUgxzipATQa4FtwWZtzAfjn",1]],"weight_threshold":1}
posting{"account_auths":[],"key_auths":[["STM7YMRs5Knu5VWSG8uty3gDDfXm75dVP46MyrkFkTaiSYcd3TQJ8",1]],"weight_threshold":1}
Transaction InfoBlock #23170116/Trx f17ffbd2367ac6c8e874a13926a89c81fd19755a
View Raw JSON Data
{
  "block": 23170116,
  "op": [
    "account_create_with_delegation",
    {
      "active": {
        "account_auths": [],
        "key_auths": [
          [
            "STM6KLsFd2CVyS6i5FCemoqq6LCVpfRzChtZN9zrcHcyp2R6Nw4n4",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "creator": "steem",
      "delegation": "30690.000000 VESTS",
      "extensions": [],
      "fee": "0.100 STEEM",
      "json_metadata": "{}",
      "memo_key": "STM6FsWtSZJejDALs5oEjBJ912xFuRU6L1GDNzgry7qsUKav8fzDw",
      "new_account_name": "jb7959",
      "owner": {
        "account_auths": [],
        "key_auths": [
          [
            "STM8KJHejMGwoKksYEL44mzU6fXR3ViUgxzipATQa4FtwWZtzAfjn",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "posting": {
        "account_auths": [],
        "key_auths": [
          [
            "STM7YMRs5Knu5VWSG8uty3gDDfXm75dVP46MyrkFkTaiSYcd3TQJ8",
            1
          ]
        ],
        "weight_threshold": 1
      }
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-09T11:37:36",
  "trx_id": "f17ffbd2367ac6c8e874a13926a89c81fd19755a",
  "trx_in_block": 7,
  "virtual_op": 0
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://cdn.steemitimages.com/DQmPZh4gLzf7e7HJiwtwFF99WzLQBRbYcqDtgaoYyMKg7hj/DoubleM_Squre.png","name":"doublem.org","location":"SEOUL","website":"http://doublem.org"}
JSON METADATA
profile{"profile_image":"https://cdn.steemitimages.com/DQmPZh4gLzf7e7HJiwtwFF99WzLQBRbYcqDtgaoYyMKg7hj/DoubleM_Squre.png","name":"doublem.org","location":"SEOUL","website":"http://doublem.org"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://cdn.steemitimages.com/DQmPZh4gLzf7e7HJiwtwFF99WzLQBRbYcqDtgaoYyMKg7hj/DoubleM_Squre.png",
      "name": "doublem.org",
      "location": "SEOUL",
      "website": "http://doublem.org"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://cdn.steemitimages.com/DQmPZh4gLzf7e7HJiwtwFF99WzLQBRbYcqDtgaoYyMKg7hj/DoubleM_Squre.png",
      "name": "doublem.org",
      "location": "SEOUL",
      "website": "http://doublem.org"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM8KJHejMGwoKksYEL44mzU6fXR3ViUgxzipATQa4FtwWZtzAfjn1/1
Active
Single Signature
Public Keys
STM6KLsFd2CVyS6i5FCemoqq6LCVpfRzChtZN9zrcHcyp2R6Nw4n41/1
Posting
Single Signature
Public Keys
STM7YMRs5Knu5VWSG8uty3gDDfXm75dVP46MyrkFkTaiSYcd3TQJ81/1
Memo
STM6FsWtSZJejDALs5oEjBJ912xFuRU6L1GDNzgry7qsUKav8fzDw
{
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM8KJHejMGwoKksYEL44mzU6fXR3ViUgxzipATQa4FtwWZtzAfjn",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM6KLsFd2CVyS6i5FCemoqq6LCVpfRzChtZN9zrcHcyp2R6Nw4n4",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting": {
    "account_auths": [],
    "key_auths": [
      [
        "STM7YMRs5Knu5VWSG8uty3gDDfXm75dVP46MyrkFkTaiSYcd3TQJ8",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "memo": "STM6FsWtSZJejDALs5oEjBJ912xFuRU6L1GDNzgry7qsUKav8fzDw"
}

Witness Votes

0 / 30
No active witness votes.
[]