λͺ©λ‘πŸ’» Java Study/Java 이둠 정리 (26)

Coding Planet

μ„œλΈ”λ¦Ώμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ 츑에 JavaScript Alert μ°½ ν‘œμ‹œν•˜κΈ° : PrintWriter

ν˜„μž¬ κ°œλ°œμ€‘μΈ μ›ΉνŽ˜μ΄μ§€ 둜그인 μ‹œ SpringSecurityLoginFilterλ₯Ό νƒ€λ©΄μ„œ ν•„μš”ν•œ 절차λ₯Ό λ”°λ₯΄κ³  μžˆλ‹€. ν˜„μž¬ νŽ˜μ΄μ§€λŠ” μ‚¬μš©μžκ°€ κ°€μž…μ‹ μ²­μ„ ν•˜λ©΄ κ΄€λ¦¬μžκ°€ 승인 ν›„ μ‚¬μ΄νŠΈλ₯Ό μ΄μš©ν•  수 μžˆλ‹€. μ΄ λ•Œ μ‚¬μš© μƒνƒœ(κ°€μž…μ‹ μ²­ or κ°€μž…μŠΉμ€)을 μ‘°νšŒν•œ ν›„ κ°€μž…λŒ€κΈ° μƒνƒœλΌλ©΄ alert창을 λ„μš°κ³  λ‹€μ‹œ 둜그인 νŽ˜μ΄μ§€λ‘œ λ³΄λ‚΄μ•Όν•œλ‹€.  Java μ„œλΈ”λ¦Ώμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ— JavaScript Alert 창을 λ„μš°λ €λ©΄, HttpServletResponse 객체λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. λ‹€μŒμ€ κ°€μž… μ‹ μ²­ μƒνƒœκ°€ '승인 λŒ€κΈ°(A)'인 경우, μ‚¬μš©μžμ—κ²Œ μƒνƒœλ₯Ό μ•Œλ¦¬κ³  둜그인 νŽ˜μ΄μ§€λ‘œ λ¦¬λ””λ ‰μ…˜ν•˜λŠ” 예제 μ½”λ“œμ΄λ‹€. if ("A".equals(loginVO.getUserSttus())) { httpResponse.setConte..

μ§€λ„€λ¦­μŠ€(Generics) 핡심 μ •λ¦¬ν•˜κΈ° - 지넀릭 클래슀

μžλ°” μž…λ¬Έ λ ˆλ²¨μ—μ„œ 개발자 λ¬Έμ„œλ₯Ό λ³΄κ±°λ‚˜ github의 λ‹€λ₯Έ μ½”λ“œλ“€μ„ 보닀 보면 Box와 같은 λ‚―μ„  ν˜•νƒœμ˜ λ¬Έμž₯을 λ§Œλ‚˜κ²Œ λœλ‹€. μ΄λŸ¬ν•œ 것듀이 μ§€λ„€λ¦­μŠ€μΈλ° 남ꢁ성 μ €μžμ˜ μžλ°”μ˜ 정석을 μ°Έκ³ ν•˜μ—¬ μž…λ¬Έμˆ˜μ€€μ—μ„œ κ°„λ‹¨ν•˜κ²Œ μ‚΄νŽ΄λ³΄κ³ μž ν•œλ‹€. μ–΄λ ΅λ‹€λ©΄ κ°•μ‘°λœ λ‚΄μš©λ§Œ 봐도 λŒ€μΆ© 감을 μž‘μ„ 수 μžˆλ‹€. | μ§€λ„€λ¦­μŠ€λž€? μ§€λ„€λ¦­μŠ€λŠ” λ‹€μ–‘ν•œ νƒ€μž…μ˜ 객체듀을 λ‹€λ£¨λŠ” λ©”μ„œλ“œλ‚˜ μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μ— 컴파일 μ‹œ 의 νƒ€μž…μ²΄ν¬(compile-time type check)λ₯Ό ν•΄μ£ΌλŠ” κΈ°λŠ₯이닀. 객체의 νƒ€μž…μ„ 컴파일 μ‹œμ— μ²΄ν¬ν•˜κΈ° λ•Œλ¬Έμ— 객체의 νƒ€μž… μ•ˆμ „μ„±μ„ 높이고 ν˜•λ³€ν™˜μ˜ λ²ˆκ±°λ‘œμ›€μ΄ 쀄어든닀. -μžλ°”μ˜ 정석 1. 컴파일 μ‹œ 의 νƒ€μž…μ²΄ν¬(compile-time type check) μ§€λ„€λ¦­μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄, μ»¬λ ‰μ…˜μ— μ €μž₯λ˜λŠ” 객체의 νƒ€μž…μ„ 컴파일 μ‹œμ ..

λžŒλ‹€μ‹ - λ©”μ„œλ“œ μ°Έμ‘°(μƒμ„±μžμ˜ λ©”μ„œλ“œ μ°Έμ‘° μ˜ˆμ‹œ 포함)

λžŒλ‹€μ‹μ— κ΄€ν•œ κ°œκ΄„μ μΈ ν¬μŠ€νŠΈλŠ” μ•„λž˜ μ°Έμ‘°! https://sharonprogress.tistory.com/330 λžŒλ‹€μ‹(Lamda expression) 총정리와 ν™œμš©μ˜ˆμ œ μ•„λž˜ 포슀트의 μ˜ˆμ‹œ 및 λ‚΄μš©μ€ 남ꢁ성 μ €μžμ˜ μžλ°”μ˜ 정석을 많이 μ°Έκ³ ν–ˆλ‹€. | λžŒλ‹€μ‹μ΄λž€ λžŒλ‹€μ‹μ€ κ°„λ”˜νžˆ λ§ν•΄μ„œ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ '식(expression)'으둜 ν‘œν˜„ν•œ 것이닀. μžλ°” 8λΆ€ν„° λ“±μž₯ν•œ κ°œλ…μœΌ sharonprogress.tistory.com μ•ž μ„  ν¬μŠ€νŠΈμ—μ„œ μ„€λͺ…ν•œλŒ€λ‘œ λžŒλ‹€μ‹μ€ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•΄ κ°„λž΅ν•˜λ©΄μ„œ λͺ…ν™•ν•˜κ²Œ μ‹μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ„λ‘ν•˜λŠ” ν‘œν˜„μ‹μ΄λ‹€. 이에 더해 λžŒλ‹€μ‹μ΄ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œ ν˜ΈμΆœν•˜λŠ” κ²½μš°μ—λŠ” 'λ©”μ„œλ“œ μ°Έμ‘°(method reference)'λΌλŠ” λ°©λ²•μœΌλ‘œ λžŒλ‹€μ‹μ„ λ”μš± κ°„λž΅ν•˜κ²Œ μ“Έ 수 μžˆλ‹€. | λ©”μ„œ..

λžŒλ‹€μ‹(Lamda expression) 총정리와 ν™œμš©μ˜ˆμ œ

μ•„λž˜ 포슀트의 μ˜ˆμ‹œ 및 λ‚΄μš©μ€ 남ꢁ성 μ €μžμ˜ μžλ°”μ˜ 정석을 많이 μ°Έκ³ ν–ˆλ‹€. | λžŒλ‹€μ‹μ΄λž€ λžŒλ‹€μ‹μ€ κ°„λ”˜νžˆ λ§ν•΄μ„œ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ '식(expression)'으둜 ν‘œν˜„ν•œ 것이닀. μžλ°” 8λΆ€ν„° λ“±μž₯ν•œ κ°œλ…μœΌλ‘œ 객체지ν–₯언어인 μžλ°”μ— ν•¨μˆ˜ν˜• ν™œμš©μ„ λ”ν•΄μ£Όμ—ˆλ‹€. λžŒλ‹€μ‹μ€ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜μ–΄μ§€λŠ” 것이 κ°€λŠ₯ν•˜κ³ , λ©”μ„œλ“œμ˜ 결과둜 λ°˜ν™œλ  μˆ˜λ„ μžˆλ‹€. λžŒλ‹€μ‹μœΌλ‘œ 인해 λ©”μ„œλ“œλ₯Ό λ³€μˆ˜μ²˜λŸΌ λ‹€λ£¨λŠ” 것이 κ°€λŠ₯해진 것이닀. λ©”μ„œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ©”μ„œλ“œμ˜ 이름과 λ°˜ν™˜κ°’μ΄ μ—†μ–΄μ§€λ―€λ‘œ λžŒλ‹€μ‹μ„ '읡λͺ…ν•¨μˆ˜'라고 ν•˜κΈ°λ„ ν•œλ‹€. μ•„λž˜ μ‹μ—μ„œ (i) -> (int)(Math.random()*5+1) 뢀뢄이 λžŒλ‹€μ‹μ΄λ‹€. int[] arr = new int[5]; Arrays.setAll(arr, (i) -> (int)(Math..

[Java] λ©”μ„œλ“œμ™€ ν•¨μˆ˜μ˜ μ°¨μ΄λŠ”?

| μžλ°”μ˜ 정석(남ꢁ μ„± μ €μž) 발췌 μ „ν†΅μ μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•¨μˆ˜λΌλŠ” 이름은 μˆ˜ν•™μ—μ„œ λ”°μ˜¨ κ²ƒμž…λ‹ˆλ‹€. μˆ˜ν•™μ˜ ν•¨μˆ˜μ™€ κ°œλ…μ΄ μœ μ‚¬ν•˜κΈ° λ•Œλ¬Έμ΄μ£ . κ·ΈλŸ¬λ‚˜ 객체지ν–₯κ°œλ…μ—μ„œλŠ” ν•¨μˆ˜(function)λŒ€μ‹  객체의 ν–‰μœ„λ‚˜ λ™μž‘μ„ μ˜λ―Έν•˜λŠ” λ©”μ„œλ“œ(method)λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ©”μ„œλ“œλŠ” ν•¨μˆ˜μ™€ 같은 μ˜λ―Έμ΄μ§€λ§Œ, νŠΉμ • ν΄λž˜μŠ€μ— λ°˜λ“œμ‹œ 속해야 ν•œλ‹€λŠ” μ œμ•½μ΄ 있기 λ•Œλ¬Έμ— 기쑴의 ν•¨μˆ˜μ™€ 같은 의미의 λ‹€λ₯Έ μš©μ–΄λ₯Ό μ„ νƒν•΄μ„œ μ‚¬μš©ν•œ κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이제 λžŒλ‹€μ‹μ—μ„œλŠ” λ©”μ„œλ“œκ°€ ν•˜λ‚˜μ˜ 독립적인 κΈ°λŠ₯을 ν•˜κΈ°λ•Œλ¬Έμ— ν•¨μˆ˜λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. | 컴퓨터 μ–Έμ–΄ λ‚΄μ—μ„œ λ©”μ„œλ“œμ™€ ν•¨μˆ˜μ˜ 차이 컴퓨터 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ "λ©”μ„œλ“œ(method)"와 "ν•¨μˆ˜(function)" μš©μ–΄λŠ” μ’…μ’… ν˜Όμš©λ˜μ§€λ§Œ, κ·Έλ“€ μ‚¬μ΄μ—λŠ” λͺ…ν™•ν•œ 차이점이 μžˆλ‹€...

경쟁쑰건(Race Condition)κ³Ό Lock - κ°œλ…κ³Ό μ˜ˆμ‹œ ν•œλ²ˆμ— μ •λ¦¬ν•˜κΈ°

ConCurrentHashMapκ³Ό HashTable을 κ³΅λΆ€ν•˜λ©΄μ„œ 경쟁쑰건과 Lock이 μ£Όμš” ν‚€μ›Œλ“œλ‘œ λ“±μž₯ν–ˆλ‹€. μŠ€λ ˆλ“œλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ λΉˆλ²ˆν•˜κ²Œ λ“±μž₯ν•˜κΈ° λ•Œλ¬Έμ— 두 κ°œλ… λͺ¨λ‘ 어렴풋이 μ•Œκ³  있긴 ν•˜μ§€λ§Œ 이번 κΈ°νšŒμ— μ •λ¦¬ν•˜κ³  κ°€μ•Όκ² λ‹€. | 경쟁 쑰건 (Race Condition)κ³Ό Lock 경쟁 쑰건은 λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ—μ„œ 두 개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ λ°μ΄ν„°λ‚˜ μžμ›μ— λ™μ‹œμ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ” λ¬Έμ œμ΄λ‹€. μ΄λŸ¬ν•œ μƒν™©μ—μ„œ μŠ€λ ˆλ“œλ“€μ˜ μ‹€ν–‰ μˆœμ„œμ— 따라 ν”„λ‘œκ·Έλž¨μ˜ κ²°κ³Όκ°€ λ‹¬λΌμ§ˆ 수 있으며, μ΄λŠ” λ°μ΄ν„°μ˜ 일관성과 정확성을 ν•΄μΉ  수 μžˆλ‹€. 경쟁 쑰건을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ 동기화 λ©”μ»€λ‹ˆμ¦˜(λŒ€ν‘œμ μœΌλ‘œ Lock)을 μ‚¬μš©ν•˜μ—¬ μŠ€λ ˆλ“œλ“€μ΄ μžμ›μ— μ•ˆμ „ν•˜κ²Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•΄μ•Όν•œλ‹€. Lock은 λ™μ‹œμ— μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 같은 μžμ›μ— ..

ThreadLocalκ³Ό ThreadLocalUtil

|ThreadLocalμ΄λž€ ThreadLocal은 Java의 μŠ€λ ˆλ“œ 둜컬 λ³€μˆ˜λ₯Ό 관리할 수 μžˆλ„λ‘ ν•˜λŠ” κΈ°λŠ₯이닀. μ§€κΈˆκΉŒμ§€ λ³€μˆ˜λ“€μ€ 클래슀, λ©”μ„œλ“œ λ ˆλ²¨μ—μ„œ κ΄€λ¦¬λ˜μ—ˆλŠ”λ° μŠ€λ ˆλ“œλ³„λ‘œ μ €μž₯되고 관리할 수 μžˆλŠ” 것이닀. 즉, ν•œ μŠ€λ ˆλ“œμ—μ„œ μ„€μ •ν•œ ThreadLocal λ³€μˆ˜μ˜ 값은 λ‹€λ₯Έ μŠ€λ ˆλ“œμ™€ κ³΅μœ λ˜μ§€ μ•ŠμœΌλ©°, 각 μŠ€λ ˆλ“œλŠ” ν•΄λ‹Ή λ³€μˆ˜μ˜ μžμ‹ λ§Œμ˜ 독 립적인 값을 μœ μ§€ν•˜κ²Œ λœλ‹€. 이λ₯Ό 톡해 μŠ€λ ˆλ“œ κ°„ 데이터 격리가 이루어져 μŠ€λ ˆλ“œ μ•ˆμ „μ„±(thread-safety)을 확보할 수 μžˆλ‹€. 더 κ°„λ‹¨νžˆ μ„€λͺ…ν•˜μžλ©΄ threadLocalλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ 각 μŠ€λ ˆλ“œλ§ˆλ‹€ 독립적인 λ³€μˆ˜λ₯Ό κ°€μ§€κ²Œ 되고 각 값은 get(), set() λ©”μ„œλ“œλ₯Ό 톡해 μ ‘κ·Όν•  수 있게 λœλ‹€. **thread-safety λ©€ν‹° μŠ€λ ˆλ”© ..

데λͺ¬μ“°λ ˆλ“œ(daemon thread) - μ‚¬μš©ν•˜λŠ” μ΄μœ μ™€ java μ½”λ“œ 예

"Daemon" μ΄λΌλŠ” λ‹¨μ–΄λŠ” μ›λž˜ 그리슀 μ‹ ν™”μ˜ λ³΄ν˜Έμ‹  λ˜λŠ” μ‹ μ˜ 지배λ₯Ό λ°›λŠ” μ˜ν˜Όμ„ μ˜λ―Έν•˜λŠ” λ‹¨μ–΄μ—μ„œ μœ λž˜λ¬μœΌλ‚˜, μ»΄ν“¨νŒ… λΆ„μ•Όμ—μ„œ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€λ‚˜ μ„œλΉ„μŠ€λ₯Ό μ˜λ―Έν•œλ‹€. 보톡 μ‚¬μš©μžμ˜ 직접적인 κ°œμž…μ—†μ΄ λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜λ©° μ‹œμŠ€ν…œ 관리, μžμ› 관리, 파일 전솑, λ„€νŠΈμ›Œν¬ μ„œλΉ„μŠ€ 제곡 λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ 가리킨닀. μš΄μ˜μ²΄μ œλ‚˜ μ„œλ²„μ—μ„œλŠ” λ‹€μ–‘ν•œ 데λͺ¬μ΄ μ‹œμŠ€ν…œμ˜ 기본적인 κΈ°λŠ₯을 μ§€μ›ν•˜κΈ° μœ„ν•΄ μ‹€ν–‰λ˜κ³  μžˆλŠ”λ° 이 ν¬μŠ€νŠΈμ—μ„œλŠ” 데λͺ¬μ“°λ ˆλ“œ(daemeon thread)λ₯Ό μ€‘μ μ μœΌλ‘œ μ‚΄νŽ΄ 보고자 ν•œλ‹€. | 데λͺ¬ μ“°λ ˆλ“œ(daemon thread) 데λͺ¬ μ“°λ ˆλ“œλŠ” μΌλ°˜μ“°λ ˆλ“œ(데λͺ¬ μ“°λ ˆλ“œκ°€ μ•„λ‹Œ μ“°λ ˆλ“œ)의 μž‘μ—…μ„ λ•λŠ” 보쑰적인 역할을 μˆ˜ν–‰ν•˜λŠ” μ“°λ ˆλ“œμ΄λ‹€. μ£Ό μ“°λ ˆλ“œ(μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”μΈμ“°λ ˆλ“œ)κ°€ μ’…..