자바 LTS 버전
자바는 3년 정도의 텀으로 LTS 릴리스가 제공됩니다.
보통 8년 이상의 장기 지원을 제공하는데 현재 LTS 지원 버전은 Java8, Java11, Java17, Java21입니다.
Java8은 여전히 많은 기업에서 사용 중이며, 레거시 시스템에서 널리 사용되고 있습니다.
spring3.x, springboot6.x 이상부터는 최소 Java17 버전을 요구하고 있습니다.
왜 LTS 버전을 사용해야 할까?
- 장기적인 지원
Long-Term Support의 이름과 같이 장기적으로 보안 업데이트와 버그 수정을 지원해줍니다. - 안정성
광범위하게 테스트되고 안정화된 후 릴리스되므로 높은 신뢰성을 갖고 있습니다. - 기업 환경에 적합
많은 기업에서는 규제 요구 사항을 충족하기 위해 장기적으로 지원되는 소프트웨어를 사용해야 합니다. - 커뮤니티 및 생태계 지원
LTS 버전은 많은 개발자와 기업에서 사용되므로, 강력한 커뮤니티와 생태계를 갖고 있습니다.
또한 주요 라이브러리와 프레임워크가 LTS 버전을 우선적으로 지원하기 때문에 호환성이 높습니다.
자바 버전 업그레이드를 꼭 해야할까?
하위 버전의 버전으로 짜여있는 프로젝트의 Java 버전을 업그레이드 할 땐 비용과 리소스가 필요하기 때문에 굳이 업그레이드 해야할까에 대한 고민이 생길 수 있습니다.
Java 버전 업그레이드는 보안, 성능, 새로운 기능 등 여러 측면에서 중요할 수 있지만, 결정은 각 조직의 상황과 필요에 따라 다릅니다.
아래의 업그레이드 결정을 내리기 위한 고려 사항을 바탕으로 업그레이드 여부를 신중하게 결정하시길 바랍니다.
- 현재 사용 중인 버전의 상태
- 지원 기간: 현재 사용 중인 Java 버전의 지원 종료일을 확인합니다.
- 보안 패치: 사용 중인 버전에 대한 보안 패치가 계속 제공되는지 확인합니다.
- 업그레이드의 비용과 리소스
- 테스트와 검증: 업그레이드 과정에서 애플리케이션을 철저히 테스트하고 검증할 필요가 있습니다.
- 호환성 문제: 기존 애플리케이션이 최신 버전과 호환되는지 확인하고, 호환성 문제를 해결할 수 있는지 평가합니다.
- 새로운 기능의 필요성
- 기능 요구 사항: 최신 Java 버전에서 제공하는 새로운 기능과 API가 프로젝트에 유용한지 평가합니다.
- 성능 요구 사항: 성능 개선이 필요한지, 최신 버전이 이를 제공하는지 확인합니다.
- 조직의 업그레이드 정책
- 주기적인 업그레이드 정책: 조직의 IT 정책에 따라 주기적으로 업그레이드가 필요한지 평가합니다.
- 장기적인 계획: 조직의 장기적인 소프트웨어 전략과 일치하는지 확인합니다.
어떤 자바 버전을 사용해야 할까?
- Java 8: 레거시 시스템을 유지하는 경우, 하지만 새로운 기능과 보안을 위해 업그레이드 필요.
- Java 11: 현재 널리 사용되고 있는 안정적인 LTS 버전, 대부분의 환경에 적합.
- Java 17: 최신 LTS 버전으로, 최신 기능과 장기 지원이 필요한 경우 추천.
- Java 21 및 그 이후 버전: 최신 기능이 필요하고 주기적으로 업그레이드가 가능한 환경에서 사용
자바 버전 특징
Java 8
[Oracle 공식 문서] What's new in Java 8
- 람다 표현식 (Lambda Expressions) : 익명 클래스를 간단히 표현할 수 있는 기능으로 코드 가독성과 간결성을 높입니다.
Arrays.sort(strArray, (String s1, String s2) -> s2.length() - s1.length());
- 메소드 참조 (Method References) : 기존 메소드를 참조하여 람다 표현식을 더 간결하게 작성할 수 있습니다.
getFiles().filter(FileFilters::fileIsPdf);
- 디폴트 메소드 (Default Methods) : 인터페이스에 기본 메소드를 정의하여 기존 코드를 깨지 않고 기능을 추가할 수 있습니다.
-
default public Stream<T> stream() { return StreamSupport.stream(spliterator(), false); }
-
- 스트림 API (Stream API) : 컬렉션 데이터의 반복, 필터링, 매핑 등을 간단하게 처리할 수 있는 API입니다.
-
List<String> filtered = list.stream() .filter(s -> s.startsWith("a")) .collect(Collectors.toList());
-
- Optional 클래스 : null 참조를 다루기 위한 컨테이너 클래스로, 보다 안전한 코드를 작성할 수 있습니다.
-
Optional<String> optional = Optional.of("Hello"); optional.ifPresent(System.out::println);
-
- 새로운 날짜와 시간 API (java.time 패키지) : Joda-Time 기반의 강력한 날짜와 시간 처리 기능을 제공합니다.
-
LocalDate date = LocalDate.now(); LocalTime time = LocalTime.now();
-
- Nashorn JavaScript 엔진 : JVM에서 JavaScript를 실행할 수 있는 엔진을 제공합니다.
-
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval("print('Hello, Nashorn');");
-
- Permanent Generation 제거 : JVM의 메모리 관리 방식이 개선되었습니다.
Java 11
[Oracle 공식 문서] What's new in Java 11
- 로컬 변수 타입 추론 (var 키워드) : var 키워드를 사용하여 로컬 변수의 타입을 추론할 수 있습니다.
-
var list = new ArrayList<String>(); list.add("Hello, Java 11");
-
- 새로운 HTTP 클라이언트 API : java.net.http 패키지에 새로운 HTTP 클라이언트를 도입하여, HTTP/2 및 WebSocket을 지원합니다.
-
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://example.com")) .build(); HttpResponse<String> response = client.send(request, BodyHandlers.ofString()); System.out.println(response.body());
-
- 읽기 쉬운 파일 메소드 : Files 클래스에 writeString, readString 메소드를 추가하여 파일을 더 쉽게 읽고 쓸 수 있게 했습니다.
-
Path path = Paths.get("example.txt"); Files.writeString(path, "Hello, World"); String content = Files.readString(path); System.out.println(content);
-
- 새로운 문자열 메소드 : String 클래스에 몇 가지 유용한 메소드가 추가되었습니다.
- isBlank(): 문자열이 공백인지 확인.
- lines(): 문자열을 라인 스트림으로 변환.
- strip(), stripLeading(), stripTrailing(): 공백을 제거.
- repeat(int count): 문자열을 반복.-
String str = " Hello, Java 11 "; System.out.println(str.isBlank()); // false System.out.println(str.strip()); // "Hello, Java 11" System.out.println(str.repeat(2)); // " Hello, Java 11 Hello, Java 11 "
-
- Epsilon 가비지 컬렉터 : Epsilon GC는 "No-Op" 가비지 컬렉터로, 메모리 할당과 해제의 성능을 테스트하는 데 유용합니다. 이는 실제로 메모리를 수집하지 않으며, 주로 성능 테스트 용도로 사용됩니다.
- Flight Recorder : Java Flight Recorder(JFR)는 JVM에서 실행되는 애플리케이션의 성능을 모니터링하고 분석할 수 있는 도구입니다. 이는 애플리케이션의 성능 문제를 식별하고 해결하는 데 매우 유용합니다.
- 기타 API 개선 : 많은 기존 API가 개선되었으며, 특히 네트워킹, 보안, I/O 관련 API가 업데이트되었습니다.
Optional 클래스에 isEmpty 메소드가 추가되었습니다.-
Optional<String> optional = Optional.of("Hello, Java 11"); System.out.println(optional.isEmpty()); // false
-
Java 17
[Oracle 공식 문서] What's new in Java 17
- 패턴 매칭 for switch (Preview) : switch 문에서 패턴 매칭을 사용하여 코드의 가독성을 높입니다.
-
switch (obj) { case Integer i -> System.out.println("Integer: " + i); case String s -> System.out.println("String: " + s); default -> System.out.println("Unknown type"); }
-
- Sealed Classes : 상속 구조를 제한하여 더 안전하고 예측 가능한 클래스 계층을 설계할 수 있게 합니다.
-
public abstract sealed class Shape permits Circle, Square {}
-
- Record Patterns (Preview) : 불변 데이터 객체를 간편하게 만들 수 있습니다.
-
public record Point(int x, int y) {}
-
- Foreign Function & Memory API (Incubator) : 자바 외부의 메모리와 함수를 안전하게 호출할 수 있는 API를 제공합니다.
- Deprecations and Removals : Applet API와 Security Manager가 제거되었습니다.
- Strong Encapsulation by Default : 강력한 캡슐화가 기본값으로 설정되어 모듈 간의 명시적 접근이 필요합니다.
Java 21
[Oracle 공식 문서] What's new in Java 21
- 패턴 매칭 for switch (Standard Feature) : 패턴 매칭이 switch 문에 완전히 통합되었습니다.
- Sequenced Collections : 목록 순서 유지 및 조작을 위한 새로운 컬렉션 인터페이스가 도입되었습니다.
-
List<String> names = List.of("Alice", "Bob", "Charlie");
-
- Virtual Threads : 수많은 경량 스레드를 쉽게 만들 수 있는 새로운 기능입니다.
-
Thread.startVirtualThread(() -> { System.out.println("Hello from a virtual thread"); });
-
- Foreign Function & Memory API (Standard Feature): 자바 외부의 메모리에 접근하고 외부 함수와 상호작용하는 기능이 표준화되었습니다.
- String Templates (Preview) : 문자열을 더 간편하게 포맷할 수 있는 템플릿 기능이 도입되었습니다.
-
String name = "Java"; String message = STR."Hello, \{name}!";
-
- Improved Garbage Collectors : ZGC 및 Shenandoah 가비지 컬렉터의 성능이 개선되었습니다.
- 새로운 JEPs : 다양한 JEPs(Java Enhancement Proposals)가 포함되어, 플랫폼의 전반적인 성능과 개발자 경험이 향상되었습니다.
'Etc' 카테고리의 다른 글
[Tool추천] 무료 Diagram 그리기 웹사이트 추천 (0) | 2024.06.08 |
---|---|
mac에서 자바 버전 확인 / 설치 / 자바 버전 여러개 쓰기 (0) | 2024.05.29 |