λͺ©λ‘πŸ’» Java Study (32)

Coding Planet

AJAXλ₯Ό μ΄μš©ν•œ 파일 λ‹€μš΄λ‘œλ“œ μ‹œ ν•œκΈ€ 파일λͺ… 깨짐 문제 ν•΄κ²°ν•˜κΈ°

문제 상황 μ„€λͺ…μ΅œκ·Ό ν”„λ‘œμ νŠΈμ—μ„œ AJAXλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„λ‘œλΆ€ν„° νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•  λ•Œ ν•œκΈ€ 파일λͺ…이 κΉ¨μ§€λŠ” ν˜„μƒμ„ κ²ͺμ—ˆλ‹€. λ™μΌν•œ 파일 λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯을 form 제좜 λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν–ˆμ„ λ•ŒλŠ” μ΄λŸ¬ν•œ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜λ‹€.882ECA99EEB84A7ECB18FEDB5B3%84_240715-240726.xlsx -> μ΄λŸ°μ‹μœΌλ‘œ ν•œκΈ€ 깨짐 μ›μΈ 뢄석AJAX와 form 제좜 λ°©μ‹μ˜ 차이점Form 제좜 방식: λΈŒλΌμš°μ €κ°€ 기본적으둜 μ œκ³΅ν•˜λŠ” λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯을 ν™œμš©ν•œλ‹€. λΈŒλΌμš°μ €λŠ” Content-Disposition 헀더λ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜κ³ , 파일λͺ… 인코딩을 μ•Œμ•„μ„œ μ²˜λ¦¬ν•œλ‹€. λ”°λΌμ„œ Form ν˜•μ‹μ˜ νŒŒμΌλ‹€μš΄λ‘œλ“œμ—μ„œλŠ” 파일λͺ…이 μ œλŒ€λ‘œ 좜λ ₯됬닀.AJAX 방식: XMLHttpRequest λ˜λŠ” Fetch APIλ₯Ό μ‚¬μš©ν•˜μ—¬ λΉ„..

μ„œλΈ”λ¦Ώμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ 츑에 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은 λ™μ‹œμ— μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 같은 μžμ›μ— ..