πŸ“– Java&Spring 18

[λͺ¨λ˜μžλ°”μΈμ•‘μ…˜] Stream 슀트림 ν™œμš©

슀트림 ν™œμš© λͺ…μ‹œμ  반볡 λŒ€μ‹  filter와 collect 연산을 μ§€μ›ν•˜λŠ” 슀트림 APIλ₯Ό μ΄μš©ν•΄μ„œ 데이터 μ»¬λ ‰μ…˜ λ°˜λ³΅μ„ λ‚΄λΆ€μ μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆλ‹€. @Test void streamSample() { List nameList = new ArrayList(); nameList.add("럭슀"); nameList.add("룰루"); nameList.add("애쉬"); nameList.add("νŠΈλ¦°λ‹€λ―Έμ–΄"); // μ™ΈλΆ€ 반볡 List longNameList = new ArrayList(); for (String s : nameList) { if(s.length() > 5) { longNameList.add(s); } } // λ‚΄λΆ€ 반볡 List longNameStreamList = nameList.stream..

[λͺ¨λ˜μžλ°”μΈμ•‘μ…˜] Stream 슀트림

슀트림 (Stream) μ»¬λ ‰μ…˜(collections)둜 데이터λ₯Ό κ·Έλ£Ήν™”ν•˜κ³  μ²˜λ¦¬ν•  수 μžˆλ‹€. μ»¬λ ‰μ…˜μ€ λͺ¨λ“  μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ²˜λ¦¬ν•˜κ³ , λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μž‘μ—…μ— μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ€‘μš”ν•˜λ‹€.ν•˜μ§€λ§Œ 아직 μ™„λ²½ν•œ μ»¬λ ‰μ…˜ 연산을 μ§€μ›ν•˜λ €λ©΄ λΆ€μ‘±ν•˜λ‹€. μŠ€νŠΈλ¦Όμ΄λž€ 무엇인가 μŠ€νŠΈλ¦Όλ„ μžλ°” 8 API에 μƒˆλ‘œ μΆ”κ°€λœ κΈ°λŠ₯이닀. 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ½”λ“œλ₯Ό 질의둜 ν‘œν˜„ν•˜μ—¬ μ„ μ–Έν˜•μœΌλ‘œ μ»¬λ ‰μ…˜ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€. μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λ©΄ λ©€ν‹°μŠ€λ ˆλ“œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ 데이터λ₯Ό λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  수 μžˆλ‹€. @Test @DisplayName("μš”λ¦¬ 클래슀 μ •λ ¬ν•˜κΈ°") void sortExample() { List menuList = new ArrayList(); menuList.add(new Dish(100,"λ‹­κ°€μŠ΄μ‚΄")); m..

[λͺ¨λ˜μžλ°”μΈμ•‘μ…˜] λžŒλ‹€ (Lambda)

λžŒλ‹€ν‘œν˜„μ‹μ€ 읡λͺ…ν΄λž˜μŠ€μ²˜λŸΌ 이름이 μ—†λŠ” ν•¨μˆ˜μ΄λ‹€. λ©”μ„œλ“œλ₯Ό 인수둜 전달할 수 μžˆλŠ” μΉœκ΅¬μž…λ‹ˆλ‹€. λžŒλ‹€ μš©μ–΄ μžμ²΄λŠ” 미적뢄학 ν•™κ³„μ—μ„œ μœ λž˜λ˜μ—ˆλ‹΅λ‹ˆλ‹€. μ˜€λŠ˜μ€ λžŒλ‹€ λžŒλ‹€ν•˜λŠ” κ·Έ λžŒλ‹€μ— λŒ€ν•΄μ„œ 정리해보렀고 ν•©λ‹ˆλ‹€. λͺ¨λ˜μžλ°”μΈμ•‘μ…˜ μ±… μ‚¬λž‘ν•΄μš” 1. λžŒλ‹€λž€ 무엇인가? λžŒλ‹€ ν‘œν˜„μ‹: λ©”μ„œλ“œλ‘œ 전달할 수 μžˆλŠ” 읡λͺ… ν•¨μˆ˜λ₯Ό λ‹¨μˆœν™”ν•œ 것. λžŒλ‹€ νŠΉμ§• 1) 읡λͺ…이닀. λ©”μ„œλ“œμ™€ λ‹€λ₯΄κ²Œ 이름이 μ—†λ‹€. 2) ν•¨μˆ˜μ΄λ‹€. νŠΉμ • ν΄λž˜μŠ€μ— μ’…μ†λ˜μ§€ μ•ŠλŠ”λ‹€. κ·Έλž˜μ„œ ν•¨μˆ˜λΌκ³ λ„ 뢈림. ν•˜μ§€λ§Œ λ©”μ„œλ“œμ˜ νŠΉμ§• λ˜ν•œ 가짐. 3) 전달이 κ°€λŠ₯ν•˜λ‹€. λžŒλ‹€ ν‘œν˜„μ‹μ„ λ©”μ„œλ“œ 인수둜 μ „λ‹¬ν•˜κ±°λ‚˜ λ³€μˆ˜λ‘œ μ €μž₯ κ°€λŠ₯. 4) κ°„κ²°ν•˜λ‹€. 읡λͺ… 클래슀처럼 μ€‘λ³΅λ˜κ±°λ‚˜ 클래슀 생성을 μœ„ν•œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•  ν•„μš” μ—†μŒ. cf) λ©”μ„œλ“œμ˜ νŠΉμ§•μ€? - νŒŒλΌλ―Έν„° 리슀트, λ°”λ””,..

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (Functional Interface)

Javaμ—μ„œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 단일 좔상 λ©”μ„œλ“œ(Single Abstract Method, SAM)λ₯Ό 가진 μΈν„°νŽ˜μ΄μŠ€λ‹€. Java 8 μ΄μƒμ—μ„œλŠ” λžŒλ‹€ ν‘œν˜„μ‹ 및 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ§€μ›ν•œλ‹€. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜λŠ” λžŒλ‹€ ν‘œν˜„μ‹κ³Ό 연관이 μžˆλ‹€. (좔상 λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜λŠ” ν•΄λ‹Ή ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜μ˜ ν˜•νƒœλ₯Ό κ²°μ •ν•˜λŠ” 것) java.util.function νŒ¨ν‚€μ§€μ—λŠ” λ‹€μ–‘ν•œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ ν¬ν•¨λ˜μ–΄ 있음. Consumer μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€. @FunctionalInterface public interface Consumer { void accept(T t); } μ—¬κΈ°μ„œ acceptκ°€ 좔상 λ©”μ„œλ“œμ΄λ‹€. 이 λ©”μ„œλ“œλŠ” ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›κ³  λ°˜ν™˜κ°’μ΄ μ—†μΈ°. ..

[λͺ¨λ˜μžλ°”μΈμ•‘μ…˜] λ™μž‘ νŒŒλΌλ―Έν„°(Behavior Parameter)

λ™μž‘ νŒŒλΌλ―Έν„°λ₯Ό μ•„μ‹­λ‹ˆκΉŒ? ν”„λ‘œκ·Έλž˜λ° μ‹œ μ‚¬μš©ν•˜λŠ” "λ™μž‘"은 μ•„λž˜μ™€ 같은 것을 μ˜λ―Έν•©λ‹ˆλ‹€. a와 bλ₯Ό κ³±ν•˜λŠ” ν•¨μˆ˜κ°€ μžˆλ‹€κ³  ν•΄λ΄…μ‹œλ‹€. def multiply_numbers(a, b): result = a * b return result 이 ν•¨μˆ˜λŠ” νŒŒλΌλ―Έν„°λ‘œ 받은 κ³±ν•˜λŠ” "λ™μž‘"을 ν•˜λŠ”λ°μš©, a와 b의 값에 λ”°λΌμ„œ multiply_numbers ν•¨μˆ˜μ˜ κ²°κ³Ό 값은 λ‹¬λΌμ§€κ²Œ λ©λ‹ˆλ‹€. μ΄λ•Œ, a와 bλ₯Ό λ™μž‘ νŒŒλΌλ―Έν„°λΌκ³  ν•˜λŠ” κ±°μž–μŠ΄~ result1 = multiply_numbers(2, 3) # a=2, b=3을 μ „λ‹¬ν•˜μ—¬ 2 * 3 = 6이 λ°˜ν™˜λ¨ result2 = multiply_numbers(5, 7) # a=5, b=7을 μ „λ‹¬ν•˜μ—¬ 5 * 7 = 35κ°€ λ°˜ν™˜λ¨ μ΄λ ‡κ²Œ 말이져. a와 b의 값에 따라 resul..

NonNull μ‚¬λž‘...사...사...λž‘... κ·Έλƒ₯ μ’‹μ•„ν•©λ‹ˆλ‹€.

@NonNull은 μ‚¬μš©μžμ—κ²Œ null 체크 μž˜ν•˜μ‹­μ‡Ό ν•˜κ³  μ•Œλ €μ€„ 수 μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€ 보톡 μ‚¬μš©ν•  수 μžˆλŠ” μš©λ„λŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€ Record component / ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° / μƒμ„±μžμ˜ νŒŒλΌλ―Έν„° μš”λ ‡κ²Œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€ public void doSomething(@NonNull String input) { // input은 null일 수 μ—†μŒ // μ—¬κΈ°μ„œ μ•ˆμ „ν•˜κ²Œ input을 μ‚¬μš©ν•  수 있음!! } @NonNull을 μ•ˆ μ“°λ©΄ μ•„λž˜μ™€ 같이 ν–ˆκ² μ₯¬? 사싀 μ”¨μŸμ΄λŠ” μ•„λž˜μ˜ μ½”λ“œκ°€ 더 μ΅μˆ™ν•˜μ§€λ§Œ πŸ˜’ νŒŒλΌλ―Έν„°λ§Œ 보면 if λ¬Έ λ§Œλ“€μ–΄μ•Ό 직성이 ν’€λ¦¬λŠ” 편. public void doSomething(String input) { // input은 null이면 μ•„λ‹ˆλœλ‹€.. if( input == null ) {..

Intellij) JUnit5 μ„€μ •ν•  μ‚¬λžŒ 괌

μš”μ¦˜ μΌν•˜λ©΄μ„œ λ‚΄κ°€ 제일 μ‹ κ²½ μ“°κ³  μžˆλŠ” 것은 νžˆμŠ€ν† λ¦¬λ₯Ό 잘 λ‚¨κΈ°λŠ” 것이닀 λͺ¨λ“  일은 λˆ„κ΅¬λ‚˜ ν•  수 μžˆλ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μ§€λ§Œ μ½”λ“œλ§ˆλ‹€ μžˆλŠ” 사연은... κ·Έ μ‚¬λžŒλ°–μ— μ•Œ μˆ˜κ°€ μ—†λ‹€λŠ” 것이닀 πŸ₯Ή μ™œ κ·Έλ ‡κ²Œ μƒκ°ν•˜κ²Œ λλƒκ΅¬μš”? 저도 그러고 싢지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€ κ·Έλž˜μ„œ!! ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ—¬λŠλ•Œμ™€ 닀름없이 μž‘μ„±ν•˜λ˜ 쀑... κΈ°μ‘΄μ—λŠ” JUnit4 λ²„μ „μœΌλ‘œ μ‚¬μš©ν•˜κ³  μžˆμ—ˆλŠ”λ° λ‹€λ₯Έ λ‹΄λ‹Ήμžκ°€ ν…ŒμŠ€νŠΈ μ½”λ“œ μ‹€ν–‰ μ‹œ λΉ λ₯΄κ²Œ λ‚΄μš©μ„ νŒŒμ•…ν•˜μ‹œλ©΄ μ’‹κ² λ‹€κ³  생각이 λ“€μ—ˆλ‹€ κ²°λ‘ λΆ€ν„° λ¨Όμ € λ§ν•˜μžλ©΄.. ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ μ•„ 이런 ν…ŒμŠ€νŠΈ~λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•˜κΈΈ μ›ν–ˆλ‹€ 그러기 μœ„ν•΄μ„œλŠ” @DisplayName 같은 μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©μ΄ ν•„μš”ν–ˆκ³ , 이λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” JUnit 버전을 μ—…κ·Έλ ˆμ΄λ“œ ν•΄μ•Όν–ˆλ‹€ 1. JUnit5 μ˜μ‘΄μ„± μΆ”κ°€ (1) bu..

Error) java: class, interface, or enum expected ν•΄κ²°

File-Settings-Editor-File Encodings Path μΆ”κ°€ν•΄μ„œ μ—λŸ¬κ°€ λ‚œ 디렉터리 λ˜λŠ” νŒŒμΌμ— Encoding 섀정을 ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€ κ·Έλž˜λ„ μ•ˆλœλ‹€λ©΄ μƒˆλ‘œ νŒŒμΌμ„ μΆ”κ°€ν•˜κ³  μ½”λ“œλ₯Ό λ³΅λΆ™ν•˜λŠ”κ²Œ κ°€μž₯ λΉ λ¦…λ‹ˆλ‹€. μ € 같은 κ²½μš°μ—λŠ” λ‘œκ·Έλ‚˜ μ½”λ“œμ— 인코딩 섀정을 λ°”κΏ¨λŠ”λ°, μ €λŸ° μ—λŸ¬κ°€ μƒκΈ°λ”λΌκ΅¬μš” ν•œκΈ€μ΄ κΉ¨μ§€λŠ” ν˜„μƒμ΄ μƒκ²¨μ„œ ν•΄κ²°ν•˜λ €λ‹€κ°€ μ—λŸ¬λ₯Ό λ§Œλ‚˜κ²Œ 된; 원인은 BOM(Byte Order Mark) μ΄λΌλŠ” 것이 μƒκ²¨μ„œ κ·Έλ ‡μŠ΅λ‹ˆλ‹€. μœ λ‹ˆμ½”λ“œμ˜ 인코딩 λ°©μ‹μ—λŠ”μ€ λΉ…μ—”λ””μ•ˆ(BE)κ³Ό λ¦¬ν‹€μ—”λ””μ•ˆ(LE)이 μžˆμŠ΅λ‹ˆλ‹€. λ‘˜μ˜ μ°¨μ΄λŠ” λ°”μ΄νŠΈλ₯Ό μ½λŠ” μˆœμ„œμ˜ 차이인데, 이 것을 νŒŒμΌμ— λͺ…μ‹œν•˜κΈ° μœ„ν•΄ μ•žμ— 인코딩별 BOM 값을 살짝 λ„£μ–΄ λ†“μŠ΅λ‹ˆλ‹€.

🌸 startsWith()/endWith() λ¬Έμžμ—΄μ˜ μ‹œμž‘κ³Ό 끝

startsWith()와 endWith()λŠ” ν•¨μˆ˜λͺ…μœΌλ‘œ μœ μΆ”ν•΄λ³Ό 수 μžˆλ“―μ΄, λ¬Έμžμ—΄μ— λŒ€ν•΄ νŠΉμ • 문자둜 μ‹œμž‘ν•˜λŠ”μ§€/λλ‚˜λŠ”μ§€λ₯Ό 확인할 수 μžˆλŠ” ν•¨μˆ˜ μž…λ‹ˆλ‹€. μ•„λž˜λŠ” κ°„λ‹¨ν•œ μ˜ˆμ‹œ μž…λ‹ˆλ‹€. String str = "@@myId"; System.out.println(str.startsWith("@")); // true System.out.println(str.endWith("@")); // false 이런 μ‹μœΌλ‘œ νŠΉμ • λ¬Έμžμ—΄μ— λŒ€ν•œ 확인을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. νšŒμ›κ°€μž… ν•˜λ €λŠ” μ‚¬μš©μžκ°€ μœ νš¨ν•˜μ§€ μ•Šμ€ λ¬Έμžμ—΄μ„ μ‚¬μš©ν•˜μ§€λŠ” μ•ŠλŠ”μ§€, μ‹œμž‘/끝 λ¬Έμžμ—΄μ— 있으면 μ•ˆλ˜λŠ” λ¬Έμžμ—΄μ΄ μžˆλŠ”μ§€ λ“±λ“± 확인할 λ•Œ ν™œμš©λ  수 μžˆκ² λ„€μš€ startsWith() Syntax public boolean startsWith(String chars)..

@JsonProperty와 @JsonNaming

ν΄λΌμ΄μ–ΈνŠΈμ™€ 연동 κ·œκ²©μ„ μ •μ˜ν•˜λ©°, JSON ν˜•μ‹μ„ λ³€κ²½ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ›λž˜ μ‚¬μš©ν•˜λ˜ 연동 방식은 카멜 μΌ€μ΄μŠ€ (Camel Case) λ°©μ‹μ΄μ—ˆλŠ”λ°, 연동에 μžˆμ–΄ μ΅œλŒ€ν•œ λΉ λ₯΄κ²Œ μ„œλΉ„μŠ€λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œ λ‹€ μ†Œλ¬Έμžλ‘œ λ³€κ²½ν•΄λ‹¬λΌλŠ” μš”κ΅¬μ‚¬ν•­μ΄ μžˆμ–΄μ„œ @JsonPropertyλ₯Ό μ‚¬μš©ν•΄μ„œ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. κΈ°μ‘΄μ—λŠ” REST API λ©”μ‹œμ§€λ₯Ό 받을 λ•Œ @RequestBodyλ₯Ό μ‚¬μš©ν•΄μ„œ μ²˜λ¦¬ν•˜κ³  μžˆμ—ˆμ–΄μ„œ λ³€μˆ˜ 이름을 λ°”κΎΈλŠ”κ±΄ λΉ„νš¨μœ¨μ μ΄μ—ˆλ‹€ πŸ’¦ πŸ•’ JSON λͺ…λͺ… κ·œμΉ™ 3가지 ν‘œμ€€μ€ μ•„λ‹ˆμ§€λ§Œ μ•„λž˜μ˜ 3가지 μŠ€νƒ€μΌλ‘œ 많이 μ‚¬μš©ν•œλ‹€. Pascal camelCase snake_case λ§Œμ•½ λ‚΄ 이름을 ν‘œν˜„ν•˜κΈ° μœ„ν•œ 넀이밍을 ν•˜κ³  μžˆλ‹€λ©΄ // Pascal MyName // camelCase myName // snake_case my_n..