나는 지금까지 우테코를 진행하면서 자바 11 버전으로 진행해왔다.
이번 프로젝트를 진행하면서 자바 버전에 대한 이야기가 나왔는데 17을 쓰자는 크루의 의견도 있었다.
사실 나의 의견은 지금까지 반년동안 자바 11을 사용해왔기 때문에 자바 11을 사용해도 되지 않을까? 였지만 17 과 11의 명확한 차이를 알고 사용을 결정하는 것이 좋을 것 같아 알아보게 되었다.
자바 버전 선택
먼저 사람들은 java 8, 11 ,17 버전을 현재까지 주로 사용을 하고 있었다. 그 이유로써는 LTS 즉 Long Term Support이기 때문이다.
출시 몇년동안 보안, 버그 수정이 이루어지기 때문에 이와 같은 버전을 사용하는 것이다.
자바9, 10, 12, 13, 14, 15, 16은 각각 자바 17에 모든 내역이 모두 들어있기 때문에 LTS버전만 지원해도 되는 것이다.
- 자바 8 : 2030년 12월
- 자바 11 : 2026년 9월
- 자바 17 : 2029년 9월
- 자바 21 : 2031년 9월
버전 선택 의견
나는 버전을 선택함에 있어서 확실하게 ~~이유로 ~~버전을 사용하자! 라는 의견을 원했다.
버전을 선택함에 있어서 많은 의견들을 들었는데
- 제일 늦게까지 지원하는 버전을 사용하자
- 가장 많이 사용하는 버전을 사용하자
- 최신 기술을 사용하고자
- 21 버전 부터 큰 변화가 생길 예정이므로 최소 17이상 사용하자
- 스프링 부트 3.x 를 사용할 수 있다
등등의 많은 의견을 들었다.
제일 늦게까지 지원하는 버전을 사용하자
위에서도 보았듯이 자바 8 과 21이 가장 늦게까지 지원하는 버전인데 기간이 오래된 8 버전 또한 늦게까지 지원해주기 때문에 의미가 없다고 생각했다.
가장 많이 사용하는 버전을 사용하자
데이터를 보면 가장 많이 사용하는 자바 버전은 자바 8 이었다.
최신 기술을 사용하고자
나의 개인적인 의견은 자바 8을 사용하더라도 stream과 같은 기술을 사용하지 않을 수 있고 자바 17을 사용하더라도 자바 17의 기술을 사용하지 않을 수 있다고 생각한다.
그래서 최신 기술을 사용하고자 한다면 어떤 버전의 어떤 기술이 우리 프로젝트에서 쓰일 것이다 라는 생각을 해야할 것 같았다.
21 버전 부터 큰 변화가 생길 예정이므로 최소 17이상 사용하자
https://www.youtube.com/watch?v=FvDSL3pSKNQ
스프링 부트 3.x 를 사용할 수 있다
그럼 무엇이 바뀌었는가 ?
이런 부분이 바뀐다고 하는데 ..
- Java 17 이상 지원 (Kotlin 1.7 이상)
- Servlet, JPA 네임공간을 javax -> Jakarta 로 대체
- Tomcat 10.1, Jetty 11, Undertow 2.3 등과 같은 최신 웹 서버와 호환을 통해 스프링 부트에서 더 많은 기능이 있는 톰캣 사용하도록 확장
- GraalVM 기반의 Spring Native 지원
- Spring Webflux 에서 MultipartForm upload 스트리밍 API 지원
- HTTP/RSocket Interface Client 제공
- HTTP API 에러 처리를 위한 RFC 7807 스펙 지원
- Logback, Log4j2 날짜 및 시간 기본값 표준 ISO-8601 을 따름
- Deprecated 된 모든 코드 제거
등등이 있다고 한다.
바뀐 부분에 대해 알아봤지만 사실 얼마나 크게 나에게 효과적일 지는 잘 모르겠다 . .
자바 버전 별 특징
자바 8
- 32비트를 지원하는 마지막 공식 버전이다
- 날짜 및 시간 API (LocalDateTime) 을 사용할 수 있다.
- 람다 표현식을 사용할 수 있다.
- Stream API를 사용할 수 있다.
- 메서드 참조가 가능하다.
자바 11
- Open JDK와 Oracle JDK가 통합되었다.
- 람다 지역변수 var 키워드 사용 가능하다.
- 새로운 HTTP 클라이언트 API를 사용할 수 있다.
- 컬렉션, 스트림 등에 메소드 추가할 수 있다.
자바 17
- record class 키워드를 사용할 수 있다.
- Sealed class 를 사용할 수 있다.
- 패턴 매칭 기능을 사용할 수 있다.
- Stream.toList() 사용 가능하다.
- 텍스트 블록 기능을 사용가능하다.
어떤 버전을 쓸까 ?
일단 위의 정리를 해보고 든 생각은 자바 17을 쓰는 것도 괜찮겠다 라는 의견이다.
가장 크게 느꼈던 부분들은
- 스프링 부트 3.x ~
- 아직 사용해보지 않아서 어떤 기능들이 더 좋은지에 대해 잘 모르겠다. 하지만 앞으로 스프링 부트 개선 버전을 사용함에 있어서 자바 17 이후 버전만 가능하기에 새로운 스프링부트를 사용함에 있어서 자바 17은 불가피하다. 새로운 기술도 사용해보고 싶고 어떤점이 개선되었는지 알아가면 좋을 것 같다.
- 또한 우리 플젝은 잘 되어서 성장할거라 업그레이드도 해야되니까 ^^
- record class
- 11버전에서는 롬복을 사용해서 어노테이션을 통해 처리를 해왔는데 이를 조금 더 효율적으로 간결하게 처리할 수 있다. 롬복 보다는 record가 낫다고 생각하지만 아직 record보단 롬복이 익숙하다 …
- 스위치 식
- 이런식으로 작성하는게 좀 편해보인다.
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
- 텍스트 블록
- 이런 식으로 텍스트 블록을 간편하게 사용할 수 있다 !!!!!!!
String text = """
{
"name": "kim dong hae",
"age": 23,
"address": "seoul"
}
""";
- Stream.toList() 사용 가능하다.
- 간단하게 list를 만들 수 있다.
List<String> peopleName = people.stream()
.map(Person::name)
.collect(Collectors.toList());
List<String> peopleName = people.stream()
.map(Person::name)
.toList();
위와 같이 단순하게 봤음에도 자바 17에서 내가 당장 편하게 느낄 수 있는 기능들이 좀 있다고 생각했다.
버전을 올리고 낮추고에 상관없이 내가 사용할 버전의 기능이 내가 생각하기에 좀 더 편리하며, 자주 사용할 것 같다면 그 버전을 선택하는 것이 좋을 것 같다.
그래서 난 자바 17도 괜찮은 것 같다.
'코코코딩공부 > JAVA' 카테고리의 다른 글
[JAVA] 정적 팩토리 메소드 (0) | 2023.04.07 |
---|---|
[Gradle] dependency 차이점 (CompileOnly, RuntimeOnly, api, implementation) (0) | 2023.03.27 |
[JAVA] 캐싱 (0) | 2023.03.19 |
[JAVA] 상속 과 조합 (0) | 2023.03.13 |
[JAVA] VO(Value Object) 란 무엇인가 ? (0) | 2023.03.12 |