Java: 248개의 글
Java 버전별 특징들을 찾아보면서 좋은 글이 있어 해당 글을 정리한 포스팅입니다. 따라서 잘못된 내용이 존재할 수 있습니다! 어떤 자바 버전을 사용해야 할까? 최신 Java 버전은 이제 6개월마다 따른다. 수많은 새로운 버전이 출시됨에 따라 기본적으로 다음과 같은 사용 시나리오가 존재 기업의 기존 프로젝트에서는 Java 8을 사용해야 하는 경우가 많음 일부 레거시 프로젝트는 Java 1.5(2004년 출시) 또는 1.6(2006년 출시)에서 중단되기도 함 최신 IDE, 프레임워크 및 빌드 도구를 사용하고 그린 필드 프로젝트를 시작하는 경우 Java 11(LTS) 또는 최신 Java 17 LTS를 망설임 없이 사용할 수 있다. 안드로이드 개발의 특별한 분야가 있는데, 자바 버전은 기본적으로 자바 7에 고..
Scouter 신버전 (2.10.0) 에서 WebFlux 를 지원한다고 한다. 다음에 써봐야지! --- 많은 팀, 회사에서 Webflux 를 도입, 테스트, 실패(?) 등을 겪는 이야기를 많이 듣고 있다. 왜 도입을 시도하고, 어떤 이유로 실패를 하는지 등에 대해 정리해보고자 한다. 이론과 실전은 다르기에, 직접 스트레스 테스트를 진행해 보았고, Thread 구조, CPU 사용량, Memory 사용량, 응답시간 등을 보며 이해하고자 노력했다. 알아보고자 하는 내용 1. Webflux (nio) 는 MVC (bio) 보다 빠를까? 2. webflux 에 blocking 로직이 들어가더라도 MVC 보다 빠를까? (blocking: JDBC query 실행 같은 Async 를 지원하지 않는 로직을 의미..
자바 8의 함수형을 이용하면 가독성 있는 한 줄의 코드로 그룹화를 구현할 수 있다. 예를 들어 고기를 포함하는 그룹, 생선을 포함하는 그룹, 나머지 그룹으로 메뉴를 그룹화할 수 있다. 팩토리 메서드 Collectors.groupingBy를 이용하자. Map dishesByType = menu.stream().collect(groupingBy(Dish::getType)); {FISH=[parawns, salmon], OTHER=[french fries, rice, season fruit, pizza], MEAT=[pork, beef, chicken]} Dish.Type과 일치하는 모든 요리를 추출하는 함수를 groupingBy 메서드로 전달. 이 함수를 기준으로 스트림이 그룹화되므로 이를 분류 함수(cla..
컬렉터란 무엇인가? Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정한다. 명령형 코드에서는 문제 해결하는 과정에서 다중 루프와 조건문을 추가하며 가독성과 유지보수성이 크게 떨어진다. 반면 함수형 프로그래밍에서는 필요한 컬렉터를 쉽게 추가할 수 있다. 고급 리듀싱 기능을 수행하는 컬렉터 collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이 컬렉터의 최대 장점이다. 스트림에 collect를 호출하면 스트림의 요소에 (컬렉터로 파라미터화된) 리듀싱 연산이 수행된다. 내부적으로 리듀싱 연산이 일어나는 모습 명령형 프로그래밍에서는 우리가 직접 구현해야 했던 작업이 자동으로 수행된다. collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 ..
spring boot 2.5 버전 이상 사용시 Spring Security의 기본적인 정책은 URL에 더블슬래시가 들어가는 것을 허용하지 않는다. 예를 들면, test라는 리소스를 요청할 때 > http://localhost:8080/api/test 라는 URL을 사용한다고 해보자. WEB 소스에서 baseURL 을 잘못설정 뭐 그러한 이유로 http://localhost:8080/api//test 로 요청이 들어오면 서버에서는 아래와 같은 에러가 발생한다. org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized. at org.spr..
Stream이란? 컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해준다. 파이프 라인 방식의 코딩이 가능하도록 한다 간단 코드로 맛보기 // 리스트 출력 // 기존 방식 for (Integer num : list) { System.out.println(num); } // Stream 사용 list.stream().forEach(System.out::println); // 짝수 출력 // 기존 방식 for (Integer num : list) { if(num % 2 == 0) System.out.println(num); } // Stream 사용 list.stream().filter(n -> n % 2 == 0).forEach(System...
추상 클래스내 함수 구현 처럼 Interface 클래스 내에 함수를 선언 및 구현할 수 있도록 한다. Interface 구현 클래스에서 Override 할 수 있다. 왜? 나왔을까? "하위 호환성" 때문에 등장 인터페이스에 신규 함수 선언시 기존에 상속받아 구현하던 클래스에 모두 빨간불이 들어와 직접 구현을해야하는 상황을 방지하기 위해 등장함. 간단 코드로 보기 public class DefaultClass{ public interface TestInterface { // 선언 후 구현까지 해야한다. default void defaultFunction(){ System.out.println("this is default function"); } } private static class SubClass11..
/** * 이메일 masking 후 리턴 * 변환 실패시 입력값 그대로 리턴 * 이메일 아이디 앞 2자리 노출 * 마스킹 처리는 글자수 상관없이 5자리로 노출 * */ public String maskingEmail(String email){ try{ if(StringUtils.isEmpty(email) || !email.contains("@")){ return email; } String[] emailSplited = email.split("@"); if(emailSplited.length != 2){ return email; } if(emailSplited[0].length()
/** * 핸드폰번호 masking 후 리턴 * 변환 실패시 입력값 그대로 리턴 * */ public String maskingPhoneNumber(String phoneNumber){ try{ if(StringUtils.isEmpty(phoneNumber)){ return phoneNumber; } phoneNumber = phoneNumber.replaceAll("[^0-9]",""); // 숫자만 추출 if(!(phoneNumber.length() == 10 || phoneNumber.length() == 11)){ return phoneNumber; } if(phoneNumber.length() == 10){ // 10자리인 경우. 000-***-0000로 지환 return phoneNumber...