test-dies
์์ ์์ ๊ฐ์ง๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์คํธํ๋๊ฑธ ๋งํฌ๋ค์ด ๊ฐ์ง๊ณ ํ ์คํธํ๋๊ฑธ๋ก ๊ณ ์ณ์ ๊นํ์๋ค๊ฐ ์๋ก ์ฌ๋ ธ๋ค.
https://github.com/zerosumz/test-dies
์ด์๊ฐ๊น์ง ์ ์์๊ณ ๋ด๊ฐ ๋ญ ๋ง๋ ๊ฑฐ์ง;;

titsay
Sweet Seals For You, Always
EXPECTATIONS

โฃ Chile in a Photography โฃ

No title available
Noah Kahan
๐ฉต avery cochrane ๐ฉต

Kiana Khansmith
Mike Driver
trying on a metaphor
Misplaced Lens Cap
macklin celebrini has autism
No title available
he wasn't even looking at me and he found me
Xuebing Du

romaโ

โ

gracie abrams
No title available
๐

seen from United States
seen from United States
seen from United States

seen from Canada

seen from Netherlands

seen from Spain

seen from United States

seen from Poland

seen from United States
seen from France

seen from United Kingdom

seen from Hong Kong SAR China

seen from Indonesia
seen from United States

seen from Netherlands

seen from United States
seen from Malaysia
seen from Belgium
seen from Italy

seen from United States
@zerosumz-blog
test-dies
์์ ์์ ๊ฐ์ง๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์คํธํ๋๊ฑธ ๋งํฌ๋ค์ด ๊ฐ์ง๊ณ ํ ์คํธํ๋๊ฑธ๋ก ๊ณ ์ณ์ ๊นํ์๋ค๊ฐ ์๋ก ์ฌ๋ ธ๋ค.
https://github.com/zerosumz/test-dies
์ด์๊ฐ๊น์ง ์ ์์๊ณ ๋ด๊ฐ ๋ญ ๋ง๋ ๊ฑฐ์ง;;
๊ฐ๋จํ regex : named group ์ฐ๊ธฐ
regex ๋ฌธ๋ฒ์๋ named group ์ด ์๋ค. ๋ฐ๋ก ์ด๋ฐ ๊ฒ.
Pattern DATA_PATTERN = Pattern.compile("10\\|" + "(?<"+ APPROVAL_DATE +">\\d{8})\\|" + "(?<"+ CANCEL_DATE +">|\\d{8})\\|" + "(?<"+ TID +">.+)\\|" + "(?<"+ PARENT_TID +">.+)\\|" + "(?<"+ ORDER_NOTE +">.+)\\|" + "(?<"+ APPROVAL_PRICE +">\\d+)\\|" + "(?<"+ CANCEL_TYPE +">\\d)\\|" + "(?<"+ APPROVAL_NUMBER +">\\d+)\\|" + "(?<"+ OID +">\\d+)\\|" + "(?<"+ WHAT +">.*)\\|");
์ค๋ช ๋
ํ๋ฐ ์ด๊ฑด ์๋ฐ 1.7 ์ด์์์๋ง ์ง์ํ๋ค.ย
์ดํ์ ๋ฒ์ ์์ ์ธ๋ ค๋ฉด ์ด๋ ๊ฒย
com.github.tony19 named-regexp 0.2.3
๊ธฐ์ ์ ๊ฒธ์ํด์ผ ํ ๋ฏ.
๊ทธ๋. ์ค๊ณ์ ๋ํ ์๊ธฐ๋ค.
์ง๊ธ ๊ฒช๊ณ ์๋ ์ด ๋ฌด์ ๊ฐฑ๊ฐ์ ๊ตฌ๋ ํ ์ด์์ ๋ฉํ๋ ํ๋์ ๋ฐ๋ผ๋ณด๋ ์ฌ์ ์ผ๋ก.
์ค๊ณ ๊ทธ๋ฅ... ์ํ๋ฉด ์๋ ๊น?
๋ง์ ๋ฐฉ๋ฒ๋ก ์ด ์์ผ๋ฉฐ, ๊ทธ๊ฒ์ ์ดํดํด ์ฃผ๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๋ง์๋ ์๋๋ค.
์ข๋ ๊ฒธ์ํ๊ฒ, ๊ฐ๋ฐ ์ด๊ธฐ์ ์๋ง์ ์ํ์ฐฉ์ค๋ฅผ ํ ์ ์๊ณ , ๊ทธ๊ฒ์ด ์คํ๋ ค ๋ฐ๋์งํ๋ฉฐ, ์๋ฒฝํ ์ค๊ณ๋ฅผ ํ๊ณ ๊ทธ๊ฒ์ ๋ง์ ์ฌ๋๋ค์ด ๋์์ ๋ณ๋ ฌ-๊ฐ๋ฐํ ์ ์๋ค๋ ๋ฏธ์ , ์ฐฉ๊ฐ, ์ค๋ง์ ๋ฒ๋ฆฌ๋ ๊ฒ์ด ๋ ์ข๋ค๋ ๊ฒ์ ์ ๋ฐ ์์์ฃผ๊ธธ ๋ฐ๋๋ค.
๋น์ง๋์ค, ์ ๋ฌด, ๋ญ๊ฐ ์ํฐํ๋ผ์ด์ฆ ํผ์ณ ๋ฑ์ ๊ฑฐ์ฐฝํ ์ฝ์ ํ์ ๋์ ๋ง์ด ๋ฒ๊ณ ์ถ์๊ฒ์ ์ดํดํ๋๋ฐ,ย
๊ทธ๋๋ ์ค์ ๋ก ์ผ์ ํ๋ค๋ ๊ฒ์, ์ผ๋จ์ ์ฑ๊ณตํด์ผ ํ๋๊ฑฐ ์๋๊ฐ..
์ ๋ฐ ํ ์คํธ๊ฐ ๊ณง ๊ฐ๋ฐ์ด๊ณ ๊ฐ๋ฐ์ด ๊ณง ํ ์คํธ์์ ์ดํดํ๊ณ ,
์ค๊ณ๋ฏธ์ค๋ก ์๊ธด ์ทจ์ฝํ ๊ตฌ์กฐ๋ฅผ ํ ์คํธ ๊ธฐ๊ฐ์ ๋๋ ค์ ๋๋นตํ๋ ค๋ ์๋๋ฅผ ์ข ์ํ์ผ๋ฉด ์ข๊ฒ ๊ณ ,
๋ฌด์๋ณด๋ค๋ ์ค์ํ๊ฑด ์ค์ ๋ก ํํํ๋ ค ํ๋๊ฒ๊ณผ ์ฝ๋ํ์ง์ด๋ฉฐ
๊ทธ๊ฒ์ ๋ฐฉํดํ๊ฑฐ๋ ๊ธฐ๊ฐ์ ๊น์๋จน๋ ์ค๊ณ๋ ๊ทธ๋ฅ ์ธ๋ฐ์๋ ๊ตฌ์ ์ด์๋ ์ดํ๋ ์๋๊ฒ์ ๋ค๋ฆ ์์์ ์ข.
๊ทธ๋ ์ ์์ ๋ถ ๋๋ค .
์ข ์ฌ๋ผ์ ธ์ฃผ๋ฉด ์๋๊ฒ ์?
์ธ์ฆ(Authentication)๊ณผ ๊ถํ๊ด๋ฆฌ(Authorization)
์น ๊ฐ๋ฐ์ผ์ ํ๋ค๋ณด๋ฉด ๋๊ฐ์ง ๋ฌธ์ ๋ฅผ ํญ์ ๋ง๋๊ฒ ๋๋ค.
๋ฐ๋ก ์ธ์ฆ๊ณผ ๊ถํ๊ด๋ฆฌ์ด๋ค.ย
๋ฌผ๋ก ๋ก๊ทธ์ธ์ฒ๋ฆฌ์ ๋ก๊ทธ์ธ๊ฒ์ฌ๋ ์ด๋ฆ์ผ๋ก ๋ง์ด ๋ถ๋ ค์ง๊ณ ์๋ค. ์ด์ ํ๋ค..
SI๊ฐ๋ฐ์ผ์ ๋ง์ด ํ๋ฉด์ ๋ฅ๋ ๋ง์ด ์น์ ๊ธฐ ๋๋ฌธ์ ์ผ๋จ ๋๋ ์๊ณ ๋น ๋ฅด๊ณ ๊ฐ๋ณ๊ณ ์ค์ฉ์ ์ธ ๋ฐฉ์์ ์ ํธํ๋ ํธ์ด๋ผ๊ณ ํด๋๊ฒ ๋ค.
์๋ฐ ์น ํ๋ ์์ํฌ์ค ์ด ๋ ์ฃผ์ ์ ๋ํ ๊ฒ ๋๊ฐ๊ฐ ์๋ค.
์คํ๋ง ์ํ๋ฆฌํฐย http://projects.spring.io/spring-security/
์ํ์น ์๋กย http://shiro.apache.org/index.html
๊ฐ ๊ทธ๊ฒ์ด๋ค.
๋ ํ๋ ์์ํฌ์์ ๊ณตํต์ ์ผ๋ก ๋์ค๋ ๊ฐ๋ ๋ค์ด ์๊ณ ์ด๋ ์ํ์น ์๋ก ๊ณต์ ์ฌ์ดํธ์ ์ ์ค๋ช ๋์ด ์๋ค.
Subjectย - Security specific user 'view' of an application user. It can be a human being, a third-party process, a server connecting to you application application, or even a cron job. Basically, it is anything or anyone communicating with your application.
Principalsย - A subjects identifying attributes. First name, last name, social security number, username
Credentialsย - secret data that are used to verify identities. Passwords, Biometric data, x509 certificates,
Realmsย - Security specific DAO, data access object, software component that talkts to a backend data source. If you have usernames and password in LDAP, then you would have an LDAP Realm that would communicate with LDAP. The idea is that you would use a realm per back-end data source and Shiro would know how to coordinate with these realms together to do what you have to do.
ํ์ง๋ง ๋๋ ์ด๊ฒ๋ค์ด ์ธ๋ชจ์๋ค๊ณ ์๊ฐํ์ง ์๋๋ค. ์ด๊ฒ๋ค์ ๊ฐ๋ ์ ๋ชจ๋ ํ์ฌ ๊ฐ๋ฐ ๋๋ฉ์ธ์ ๋ค ์ฐ๊ฒจ๋ฃ๋ ๋ ธ๋ ฅ์ ๋นํด ์ป๋๊ฒ ๋๋ฌด ์ ๋ค. ์ ์ด์ ์ธ์ฆ๊ณผ ๊ถํ๊ด๋ฆฌ ๋ชจ๋ ์ ๋ฌด์ ์ผํ ์๋๊ฐ?
๊ทธ๋์ ์ฃผ๋ก ์ ๋ฌด์ ํ์ํ ์ธ์ฆ๊ณผ ๊ถํ๊ด๋ฆฌ ์ ์ฐจ๋ฅผ ๊ตฌํํ์ฌ ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์์์ ์๊ฐํ ๊ฐ๋ ๋ค์ ์ง์ ๊ตฌํํ๋ค๋ฉด ์ธ์ฆ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ์ ์ ํ ๊น?
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ฌ์ฉ์๋ฅผ ์กฐํํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ก๋ ์ฌ์ฉ์์ credential ์ ๋ณด๋ฅผ ํ ๋๋ก ์ฌ์ฉ์์ ํด๋น ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
์ธ์คํด์ค๋ฅผ ์ธ์ ์ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ถํ๊ด๋ฆฌ๋
์ฌ์ฉ์์ ํ์ ์ ๋ณด๋ฅผ ๊ธฐ์ ํ ์ ์๋ ์ด๋ ธํ ์ด์ ์ ๋ง๋ ๋ค.
์ด ์ด๋ ธํ ์ด์ ์ ๊ฐ๋จํ ์คํ๊ฐ๋ฅํ ์ ์ ๋ฆฌ์คํธ ์ ๋๋ง ๊ธฐ์ ํ๋ค.ย ํน์ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ ์ข๊ณ .
ํํ๋ค ์๊ณ ์๋ ์ธํฐ์ ํฐ๋ฅผ ๊ตฌํํ๋ค. ์ด๋ค ๋ฉ์๋์ ๋ํ ์คํ ์์ฒญ์ด ์ค๋ฉด ์ด๋ ธํ ์ด์ ์ ๊ธฐ์ ๋ ์ฌ์ฉ์ ํ์ ์ ์ฆ์ ๋น๊ตํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๊ถํ๊ด๋ฆฌ๊ฐ view ๋ก ์ค๊ฒ๋๋ฉด ๋๋ฆ์ tag ๋ค์ ๋ง๋ค์ด ๋๋๊ฒ ์ข์๋ฏ.
์ด๋ ๊ฒ ํ์๋ ์ข์์ ์,
์ธ์ ์ค์ฝํ๋ก ์ค์ ํด๋ ์ ์ ํ์ ์ ๋ณ๋์ ์ฒ๋ฆฌ์์ด ๊ทธ๋๋ก ์กฐํํ๋๊ฒ ๊ฐ๋ฅํ๋ค.
@Autowired @Qualifier("session") SessionUser sessionUser;
์ด๋ ๊ฒ ๋๋ฉด ํ ์คํธ ํ ๋๋ ๊ทธ์ ์ ์ ์ ์ ์ธ์คํด์ค๋ง ๋ง๋ค ๊ณ ๋ฏผ์ ํ๋ฉด ๋๋ค.
๊ฒ๋ค๊ฐ ์ด์งํผ ํด๋น ์ ์ ๋ ์๋ฅผ๋ค์ด ์์์ ์ด SessionUser ์ ํ์ฅ์ด๋ค. ๋ง์ฝ ๋ฉ์๋์ ์ด๋ฐ์์ผ๋ก
@RequireCredential(include={RootUser.class, AdminUser.class} , group={Wheel.class}) @RequestMapping(value = "/downloadExcel", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) public @ResponseBody .....
์ด๋ค๋ฉด ๊ฐ๋ ์ฑ๋ ์ถฉ๋ถํ ์ข์์ง ๊ฒ์ด๋ค.ย
http://ftp.gnu.org/gnu/emacs/windows/
์์ ์๋ ๋๊ฒ ๋ถ์ํ๊ณ ๊ทธ๋์ EmacsW32 ๊ฐ์๊ฑฐ ์ผ์๋๋ฐ, ๊ทธ๋๋ง๋ ์์ ์ด๋งฅ์ค ๋ฆด๋ฆฌ์ฆ๋ผ ์ธ๋งํ์ง๋ ์๊ณ ๊ทธ๋ฌ๋๋ฐ, ๊ณต์ ์ด๋งฅ์ค ๋น๋๊ฐ ๋๊ฒ ์์ ์ ์ด๊ณ ์๋์์ ์ธ๋งํ๊ตฐํจ. ใ ใ ใ
clojure cider์ด๋ haskell-mode ๊ฐ์๊ฑฐ ์ ์ฉํ๋๋ฐ ๋๊ฒ ์์ ์ ์ด๊ณ ์ธ๋งํจ. ใ ใ ใ
์คํ์์ค๋ ์ข์๊ฒ ์ด๋ ์๊ฐ์ ๊ฐ์๊ธฐ ๋๊ฒ ์ ๋ขฐ๊ฐ ์๊ฐ๊ณ ๊ทธ๋ ๋ ๊ฒ๋ค๋ ๊ธ์ ์ธ๋งํด์ง๋๊ฑฐ ๊ฐ์.
์ง์ง์ผ๊น?ย
myBatis ์ discriminator ์ฐ๊ธฐ
๋๋ต ์ฐ๋ฆฌ๋๋ผ ํ๋ก์ ํธ์์ orm ๋ฐ์๋ฅผ ์ฐ์ง ์๋ ์ด์ ๋( ๋ญ ๋ฌผ๋ก ์ฐ๋ ๋ฐ๋ ์๊ฒ ์ง๋ง?) ์กฐ๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์กด์ ์ธ ๊ฐ๋ฐ ๋ฐฉ์ ๋๋ฌธ์ด ์๋๊น? ํ๋ก์์ ๋ ํ์ ๋ฐ์๋ฅผ ์์ฒญ ๋จ์ฉํ๋ ?
์ฌํผ orm์ ๋ํ ๋ด ์ทจํฅ๋ ์๋๊ธฐ์ myBatis๋ฅผ ์ฆ๊ฒจ ์ฐ๊ฒ ๋๋ค. ย ๋ฌผ๋ก ์บ์ฌ ์ค์ ์ด ์ ์ ํ๊ฒ ์ ๋ค์ด๊ฐ ์๋ค๋ฉด ๊ฒฐ๊ณผ ๋งคํ์ ํฌ๊ฒ ์ ๊ฒฝ์ ์ฐ์ง ์์๋ ๋ ํ ์ง๋ง, ์ฐ์ฐ์ฐฎ๊ฒ๋ ํํ ๋ฐ๋์ IT ํ๋ก์ ํธ๋ค์ ์ด๋ฌํ ์บ์ฌ๋ฅผ ์ ์ ๊ฒฝ์ฐ์ง ์๋๋ค. (๋ชปํ๋ค). ๊ฒ๋ค๊ฐ ์ ํ๋ ๊ถํ ( ์ผ๊ฐ ๊ฐ๋ฐ์ ๋๋ถ๋์ด) ์ ๋ฒ์ ์์์ ๊ทธ๋๋ ํ๋ก์ ํธ๊ฐ ์ ๊ตด๋ฌ๊ฐ๊ฒ ํ๋ ค๋ฉด ์์๋งํ ๊ฒฐ๊ณผ ๋งคํ์ ์ ๊ฒฝ ์ฐ๊ฒ ๋ ์ ๋ฐ์ ์๋ค.ย
์๋ฅผ ๋ค์ด ํํ ๋ฐ๋์ ์ํ ํ๋ก๋ชจ์ ์ด ๋ค์๊ณผ ๊ฐ์ ๋ชจ์์ ์ทจํ๊ณ ์๋ค๊ณ ์๊ฐํด๋ณด์.
์ด๋ฌํ ๊ฒ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋งตํํ๋๋ฐ๋ย discriminator ์๋ฆฌ๋จผํธ๋ฅผ ์จ์ ๋งคํํด์ฃผ๊ฒ ๋๋ค.ย
<!-- ๋ฐ๋์ ํํ ์ฃผ๋ฌธ์ํ ํ๋ก๋ชจ์ --> <resultMap type="com.foo.model.promotion.RangedPromotion" id="RangedPromotion"> <id column="PROMOTION_ID"/> <result property="type" column="PROMOTION_TYPE"/> <result property="name" column="PROMOTION_NAME"/> <collection property="ranges" ofType="com.foo.model.promotion.PromotionRange"> <result property="guideLine" column="RANGE_GUIDE_LINE"/> <association property="discount" resultMap="RangeDiscount"/> <discriminator javaType="String" column="PROMOTION_TYPE"> <case value="20" resultType="com.foo.model.promotion.PricePromotionRange" /> <case value="21" resultType="com.foo.model.promotion.AmountPromotionRange" /> </discriminator> </collection> </resultMap>
์๋ฅผ ๋ค์๋ฉด ์ด๋ฐ ์์ด๋ค.
๋ด์ด๋ ์์ ๊ณผ
๋ค์ด๋ฐ์ ๋ํด
์กด๋ ์ค๋์ ์ฌ๋๋ค์ด ๋ง์ C ์ปดํ์ผ๋ฌ ์ ๊ทธ์ธ C ์ปดํ์ผ๋ฌ ์ง์์ผ๋ก ๋๋์ด ์ธ์ฐ๋ ์์ ๋ถํฐ ๋ณ์๋ช ์ ์ด๋ป๊ฒ ์ง์ ๊ฒ์ธ์ง์ ๋ํด ์ธ์์๋ ๊ฑธ๋ก ์๊ณ ์๋ค (๋๋ ๊ทธ ํ์ฐธ ์ดํ ์ธ๋์ด๋ฏ๋ก ์ ๋ชจ๋ฅด์ง๋ง)
์ด๋ฅผํ ๋ฉด ํ๊ฐ๋ฆฌ์ ํ๊ธฐ๋ฒ.
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
ํ ์ด์ง์ ์ ํ๋๊ฑฐ์ง? ๋์ฒด ์ธ์ ๊น์ง ์ด์ง๊ฑฐ๋ฆฌ๋ฅผ ํ๊ณ ์์ ์ ์ธ๊ฐ... ๋๋ฌด์ง ์์๋จน์์๊ฐ ์์ด..
๋ฌผ๋ก ์ธ์ฟก์ ๋ค์ ์ํด ์ด์ ์ด๋ฐ์ง์ ํ์ง ๋ง์๊ณ (๋ฌผ๋ก ์ธ์ฟก์์) ๋ง์ ๋ ผ์๊ฐ ์๋ ๋ชจ์์ด๋ค. ย ์ธ์ ๋ ๋ฌธ์ ๋ ํ์ฟก. ๋ ๋ด๊ฐ ์ผํ๋ ๊ณณ. ์ผ์ผ..
DB ์ปฌ๋ผ์ ๋ค์ด๋ฐ์ด ์ด๋ฐ ์์ด๋ผ ๋์ ํ ์ง์ฆ๋์ ์ผ ๋ชปํ ์์ค.. ํ ์ด๋ธ ์ด๋ฆ์ด COM114D ๊ฐ์ ๋ง์ฅ์ด ์๋๋ผ๋ W_EMT_STR_001 ๊ฐ์ด ์ง์ผ๋ฉด ์กธ๋ผ ์ง์ฆ.. ๋ ์ปฌ๋ผ์ด๋ฆ์ด PL_FLAG ๊ฑฐ๋ MEMBER_CODE ๊ฑฐ๋ CREDIT_YN ์ผ๋ก ํด๋๊ณ ๊ตณ์ด ๋ถ๋ฆฐํ์ ์ Y N ์ผ๋ก ์ ๊ณ ์๋๊ฑธ ๋ณด๋ฉด ์ฐธ ํ์จ๋์จ๋ค..
๊ทธ๋ฅ USER ๋ฉด USER ์ง ๋ญ๊ฐ ๋ ํ์ํ์ง..
ID๋ฉด ๊ทธ๋ฅ ์ปฌ๋ผ ์ด๋ฆ์ ID ๋ก ์ ์ผ๋ฉด ๋์์..
์ฃผ์๋ ๊ทธ๋ฅ ADDRESS ๋ผ๊ณ ์ ์ผ๋ผ๊ณ ADDR ๋ฐ์๊ฐ ์๋๋ผ.
USER ์ ADDRESS ์ ๊ด๊ณ๊ฐ ํ์ํ๋ฉด USER_ADDRESS ํ ์ด๋ธ์ ๋ง๋ค๋ฉด ๋ ๊ฑฐ ์๋๋.
์ฌ๊ธฐ์ USER_ID ๋ ADDRESS_ID ๋ง ์์ผ๋ฉด ๋์์..
์ด๊ฑฐ ๋ด๊ฐ ๋ง ์ฃผ์์ฌ๊ธฐ๋๊ฒ๋ ์๋๊ณ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ์๊ณ ๋์์๋ ์ข์ ์์์... ์ํฐ๋ธ๋ ์ฝ๋ ๊ฐ์๊ฑฐ..
์ด๊ฒ ๋ฌด์จ ๋ฑํ ์ด๋ ค์ด ํ๋ก๊ทธ๋๋ฐ ์ง์์ด๋ผ๋ ๊ฐ๊ฐ ํ์ํ ๊ฒ๋ ์๋๊ณ ..
์๊ทธ๋ฌ๋๊ฑฐ์ด..ใ ใ ๋ใ ฃใ ๋ผใ ๋ใ ๊ณ
์์ ํ์ผ์ ํ ์คํธ๋ฐ์ดํฐ๋ก ํ์ฉํ๊ธฐ
https://bitbucket.org/zerosumz/excel-fixture
์ฌ์ธ์ค ์๊ณ ๋ง๋ค์๋๋ฐ ์์ฌ์์ ์ค์ํ๊ฑฐ ๋ค ๋นผ๋จน๊ณ ๊ทธ๋ฅ ์ฌ๋ฆผ..
์กธ๋ ฌํ ๋ถ๋ถ์ด ๋ง์๋ฐ ์ด์ฉ ์ ์์ 'ใ '
JSP์ผ๋ก ์น ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, ๊ณ์์ ์ผ๋ก ๋ฐ๋ณต๋๋ JSP include์ ์ค์ด๊ณ , ์ด๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํํ์ ๋ ์ด์์์ ์ ์ฉํ๊ธฐ ์ํด์ ๊ณ ๋ฏผํ๋ค.
ํ์ง๋ง, Sitemesh, Tiles ๊ฐ์๊ฑด ์คํ๋ ค ์ด๋ค ์ด์ํ ํน์ ์๋ฐ/XML ํน์ ์ ๋ฌธํ์ ๋น ์ ธ ์ผ์ ์ํด ์ผ์ ๋ง๋๋ ๊ทธ๋ฐ์ชฝ์ด๊ณ , ๊ทธ๋ ๊ฒ ๊ฐ๋ ฅํ์ง๋ ์๊ณ , ์คํ๋ ค ๋ฌธ์ ๋ง ๋ ๋ง๋๋๊ฒ ์๋๊น ์ถ๋ค.
์ฌ์ค Apache Tiles์ ๋๋ง ๋๋ ํ๋ฅญํ๋ฐ, Sitemesh์ ๊ฒฝ์ฐ์ HTML์ ํ์ฑํ๊ณ ํ๋ ์โฆ ๋ฏฟ์์ด ์๊ฐ๋ ๊ตฌ์กฐ์ ์ค์ ๋ก ๊ทธ ๋ด๋ถ ๊ตฌํ๋ Servletโฆ
์คํธ๋ผ์ดํ! ํ์ ํ์
์คํ๋ง web mvc
์คํ๋ง์ ์ฐ๋๊ฒ ์ซ๊ธด ํ์ง๋ง web mvc ์์ ๋ ๊ฑด ๋ค ๋๋ค.
@Transactional @RequestMapping(value = "/save/{menuId}", method = RequestMethod.POST) public String savePost(@PathVariable("menuId") String menuId, HttpSession session, SearchParam searchParam, RedirectAttributes ra, @Valid Article article, @RequestParam("serializedFilesData") String serializedFilesData) throws PageNotFoundException, NotAllowedUserException { ... }
๊ทธ๋ฌ๋ ์ ๋ฐ ๋ค์์ฒ๋ผ ์ฐ์ง ๋ง์.
@RequestMapping(params = "cmd=search") public String search(HttpServletRequest request,HttpServletResponse response) throws Exception { ... }
์ข...
ํฐ
์ฒด์คํ์ ํฐ์ ๋๊ณ ํ์นธ ํน์ ๋์นธ์ ์ด๋์ํฌ ์ ์๋ค๊ณ ํ์.
์ด ํฐ์ด ์ฒด์คํ ๋๊น์ง ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ด ๋ช๊ฐ์ง๋ ์๊ฒ ๋๊ฐ? ํ๋ ๋ฌธ์ ๋ฅผ ๋๊ตฐ๊ฐ๊ฐ ๋ฌผ์ด๋ด์ ์ฝ๋๋ฅผ ์ง๋ณด์๋ค.
; n -> ๋จ์ ์นธ ์ (define (foo n) (cond ((= n 0) 1) ((< n 0) 0) (else (+ (foo (- n 1)) (foo (- n 2)))))) (display (foo 7))
๋งค์ฐ ๊ฐ๋จํ ๋ฌธ์ ๋ผ์ ์ฌ๊ธฐ์ ์ข๋ ์์ธํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋ก ์ฝ๋๋ฅผ ์ง๋ด.
(use 'clojure.pprint) (defn foo [m] (defn iter[n] (if (<= n 0) '(()) (filter (fn[x] (<= (reduce + x) m)) (mapcat (fn [current] (map (fn [result] (cons current result)) (foo (- n current)))) '(1 2))))) (iter m)) (pprint (foo 7))
((1 1 1 1 1 1 1) (1 1 1 1 1 2) (1 1 1 1 2 1) (1 1 1 2 1 1) (1 1 1 2 2) (1 1 2 1 1 1) (1 1 2 1 2) (1 1 2 2 1) (1 2 1 1 1 1) (1 2 1 1 2) (1 2 1 2 1) (1 2 2 1 1) (1 2 2 2) (2 1 1 1 1 1) (2 1 1 1 2) (2 1 1 2 1) (2 1 2 1 1) (2 1 2 2) (2 2 1 1 1) (2 2 1 2) (2 2 2 1))
spring test์ ์ฌ์ฉํ ์๊ฐ์ด๋ผ๋ฉด, ์์ง์ WEB-INF ์ดํ์ spring context ์ค์ ํ์ผ๋ค์ ๋๋ ๊ฒ๋ณด๋ค๋, classpath์ ์์นํ๋๋ก ํ์.
์ด์ฐจํผ test runner ์คํ ์์ ์ WEB-INF ์ดํ๋ฅผ ์ฐธ์กฐํ๊ธฐ๋ ์ด๋ ต๊ณ , ์ฒซ๋ฒ์งธ spring context ์ค์ ์ ์ธ์์ํค๋๋ผ๋. ๊ทธ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ํ์ผ์ด ์ญ์ WEB-INF์ ์์ผ๋ฉด ์๋นํ ๊ณจ์น๊ฐ ์ํ์ง๋ค. ์ฐจ๋ผ๋ฆฌ, ๋ฐ๋ก classpath*:์ผ๋ก ์ง์ ์ด ๊ฐ๋ฅํ๋๋ก classpath์ ์์ผ๋ฉด ์์ด ํธํ๋ค. ใ ใ ใ
ใ ใ ๋๋ ์ด๊ฑฐ ๋ฆฌ์์ค์ ๋ฃจํธํจํค์ง์ ๋ฃ๊ณ classpath:/ ๋ก ์ฐธ์กฐํ๋๋ก ํ๋๊ฑธ ์ข์ํจ. ๊ทธ๋ฆฌ๊ณ ์ด ํ์ผ์ ์๋ฏธ๋ก ๋ณด์ WEB-INF ๋ก ๊ฐ๋๊ฑด ์๋ชป๋๊ฒ ๊ฐํ.
์ค์ค.. ํ ๋ง ๋ฉ์ง๋ค. ์ด๊ฑฐ ๋ญ์.
์ฅ ์ด๊ฑฐ ์ธ์ ์ฉ๊บผ์ง
R๊น๊ณ ํจ ๋๋ ค๋ด.
๊ทธ๋ฅ lisp ํ๋๊ฒ ๋์๋ฏ
์ ์ด๊ฑธ ๊พธ์ญ๊พธ์ญ ํ๋๊ฑฐ์ง;;
ํ์ ์ ๊ธฐ๋ณธ์ ์ ๋ขฐ์ ์์ฌ์ํต, ๊ทธ๋ฆฌ๊ณ ์งง์ ํผ๋๋ฐฑ ์ฌ์ดํด์ด๋ค.
์ ๋๋ ์ด์ ์ฐฝ์กฐ๊ฒฝ์ ๊ฐ ๋ญ์ง ์์ ์์๊บผ์ผ!