목차

    Spring 버전 별 특징

    • spring 3.0
    • spring 4.0
    • spring 5.0

    Spring 3.0

    spring 3.0 부터 java 5 가 지원된다. 기존에 유지하던 하위호환성에 Generic이나 가변인자(varargs) 등과 같은 개선사항이 추가된다.

    • 전체 프레임 워크를 하나의 spring.jar 파일로 제공하던 부분을 여러개의 jar 파일로 나누어 제공한다.
    • SPEL(Spring Expression Language)가 도입되었다.
    • Rest API에 대한 지원이 추가 되었다.
    • xml 지원
    • Java annotation을 이용해서 DI의 지원
    • Java 5의 기능(제네릭, 가변 매개변수 등)을 사용하여 개정되었다.
      • 이로 인해서 BeanFactory 등 핵심 API가 업데이트 되었다.
    • @Async 주석을 통해 비동기 메서드 호출을 지원하기 시작했다.
    • 하나의 Spring.jar로 제공하던 것을 여러 Spring 모듈의 jar 파일로 나누어 제공하기 시작했다.
      (ex : spring-core, spring-web 등)
    • SPEL(Spring Expression Language) 가 도입되어 XML및 Annotation 기반 Bean정의에서 사용할 수 있게 되었다.
      • 이로 인해서 외부 프로퍼티 파일이나 환경변수에서 값을 가져오기 쉬워졌다.
    • Java 클래스로부터 @Configuration, @Bean 등의 Annotation을 사용해서 직접 메타 데이터를 설정하고, DI 지원을 받을 수 있다.
    • OXM(Object Xml Mapping)을 사용하여 Bean을 XML형태로 관리할 수 있게 되었다.
    • Rest API 에 대한 지원이 추가되었다.
      • 서버로서는 기존 MVC Framework 레벨에서 Annotation 기반 확장이 추가되었다.
      • 클라이언트로서는 RestTemplate 을 추가해 지원한다.
    • H2등의 Embeded Database를 지원한다.
    • 2016년 12월 31일부로 개발 및 지원이 종료되었다.

    Spring 4.0

    spring 3.0 이 java 5+ 버전들에 대해 지원을 한다면 spring 4.0 버전은 java 8의 특징을 적용할 수 있게 지원한다.

    • POM 설정을 도와준다.
    • Hibernate 3.6이상, EhCache 2.1 이상, Groovy 1.8이상, Joda-Time 2.0 이상 새로운 Dependency 지원
    • java6, java7, java8 의 고유 기능 지원 
      • 람다식, Optional, Callback, Interface 등의 기능을 스프링 레벨에서 사용가능
    • Java EE6, 7 에 대한 고려, JPA 2.0과 Servelet 3.0에 대한 지원이 포함
    • Groovy를 이용한 Bean 설정이 가능하다.
    • Core 컨테이너들의 기능 지원이 확대되었다. 먼저 Repository 들이 더 쉽게 Inject 될 수 있으며, 각종 Metadata Annotation 들을 이용한 Custom Annotation 작성이 가능하다. 
    • Web 개발 하기 위한 도구들이 생김. @RestController
    • Web Socket이나 STOMP 등의 프로토콜을 같이 지원한다.
    • 테스트 환경이 개선되었다.
    • Core Container 들의 기능 지원이 확대되었다.
      • 예를 들어, Spring Data Repository 를 사용하고 있다면 간단한 구현으로 주입할 수 있다. (@Autowired Repository<Customer> customerRepository)
      • meta-annotation 지원과 함께 custom-annotation 을 만들 수 있다.
      • Bean 관리가 더 용이해졌다.
        • @Order 어노테이션을 통해 배열과 리스트 형태의 Bean을 정렬 할 수 있다.
        • @Lazy 어노테이션을 통해 Lazy Injection이 가능하다.

    Spring 5.X 

    spring 5.X은 JDK 8+, 9등에 대해서 지원하며 Java8을 표준으로 사용한다.

    • 전체 프레임워크가 Java8을 기반 소스코드로 삼으며, 제네릭과 람다 등을 통해 가독성을 향상 되었다.
    • JDK 9와도 완벽 호환된다.
    • Jackson2.9, Protobuf 3, Reactor 3.1과의 호환 추가
    • Spring WebFlux 추가, 비동기와 넌 블로킹 이벤트 루프 모델 사용가능
    • Kotlin 지원
    • Junit 5 지원
    • 5.0.x 버전은 2020년 10월까지 지원되며, 5.1.x 버전과 5.2.x 버전은 각각 20년 10월, 21말까지 확발히 개발될 것이다. 

    Java 버전 별 특징 

    java 8 - 17 특징

    Java 8

    Java 8은 대규모 릴리스였다. 

    • Lambda
    • stream
    • interface default method
    • Optinal
    • new Data and Time API(LocalDateTime)

    Lambda

    Java 8 이전 익명 클래스의 사용을 람다를 이용하여 더욱 간결하고 직관적으로 구현

    before

    Runnable runnable = new Runnable(){
       @Override
       public void run(){
         System.out.println(*"Hello world !"*);
       }
     };

    after

    Runnable runnable = () -> System.out.println(*"Hello world two!"*);

    Stream

    Java 8은 스트림 API를 통해 컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제와 멀티코어 활용 어려움이라는 두 가지 모두 해결

    List<String> list = Arrays.asList(*"franz"*, *"ferdinand"*, *"fiel"*, *"vom"*, *"pferd"*);
    list.stream()
        .filter(name -> name.startsWith(*"f"*))
        .map(String::toUpperCase)
        .sorted()
        .forEach(System.out::println);

    Java 9 

    Java 9는 다음과 같은 몇 가지 추가 사항이 포함된 상당히 큰 릴리즈

    모듈 시스템 등장 및 try-with-resources 문 또는 다이아몬드 연산자(<>) 확장, HTTP클라이언트와 같은 몇 가지 다른 개선 사항 존재

    컬렉션

    컬렉션에는 list, set, map을 쉽게 구성할 수 있는 몇 가지 추가 기능

    List<String> list = List.of(*"one"*, *"two"*, *"three"*);
    Set<String> set = Set.of(*"one"*, *"two"*, *"three"*);
    Map<String, String> map = Map.of(*"foo"*, *"one"*, *"bar"*, *"two"*);

    스트림

    takeWhile, dropWhile, iterate 메서드의 형태로 몇 가지 추가 기능

    Stream<String> stream = Stream.iterate(*""*, s -> s + *"s"*)
      .takeWhile(s -> s.length() < 10);

    Java 10

    가비지 컬렉션 등과 같은 Java 10에 몇 가지 변경 사항이 존재

    개발자로서 보게 될 유일한 실제 변경 사항은 로컬 변수 유형 추론이라고도 하는 "var" 키워드의 도입

    • var 키워드
    • 병렬 처리 가비지 컬렉션 도입으로 인한 성능 향상
    • JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능

    지역 변수 유형 추론: var-keyword

    // Pre-Java 10
    String myName = "Marco";
    
    // With Java 10
    var myName = "Marco"

    Java 11

    Java 11은 개발자의 관점에서 볼 때 약간 작은 릴리스

    • Oracle JDK와 OpenJDK 통합
    • Oracle JDK가 구독형 유료 모델로 전환
    • 서드파티 JDK 로의 이전 필요
    • lambda 지역변수 사용법 변경
    • 기타 추가

    Strings & Files

    Strings and Files에는 몇 가지 새로운 메서드 추가

    *"Marco"*.isBlank();
    *"Mar\nco"*.lines();
    *"Marco  "*.strip();
    
    Path path = Files.writeString(Files.createTempFile(*"helloworld"*, *".txt"*), *"Hi, my name is!"*);
    String s = Files.readString(path);

    Run Source Files

    Java 10부터 Java 소스 파일 을 먼저 컴파일 하지 않고도 실행할 수 있다. 스크립팅을 향한 한 걸음

    ubuntu@DESKTOP-168M0IF:~$ java MyScript.java

    Java 12

    Java 12에는 몇 가지 새로운 기능과 정리가 포함 되어 있지만

    • 언급할 가치가 있는 것은 유니코드 11 지원과 새로운 스위치 표현식의 preview 뿐

    Java 13

    여기 에서 전체 기능 목록을 찾을 수 있지만 기본적으로 유니코드 12.1 지원과 두 가지 새롭거나 개선된 preview 기능(향후 변경될 수 있음)이 제공

    스위치 표현식(preview)

    이제 스위치 표현식이 값을 반환 가능하며 fall-through/break 문제 없이 표현식에 람다 스타일 구문을 사용 가능

    before

    switch(status) {
      case SUBSCRIBER:
        *// code block*break;
      case FREE_TRIAL:
        *// code block*break;
      default:
        *// code block*}

    after(람다 스타일)

    boolean result = switch (status) {
        case SUBSCRIBER -> true;
        case FREE_TRIAL -> false;
        default -> throw new IllegalArgumentException(*"something is murky!"*);
    };

    Multiline Strings (Preview)

    \n 같은 표현 안써도 인식함

     

    String htmlBeforeJava13 = *"<html>\n"* +
                  *"    <body>\n"* +
                  *"        <p>Hello, world</p>\n"* +
                  *"    </body>\n"* +
                  *"</html>\n"*;
    String htmlWithJava13 = *"""
                  <html>
                      <body>
                          <p>Hello, world</p>
                      </body>
                  </html>
                  """*;

    Java 14

    • 스위치 표현시 표준화
    • instanceof 패턴 매칭 (preview)
    • record (data object) 선언 기능 추가 (preview)

    스위치 표현(Standard)

    버전 12 및 13에서 preview 였던 스위치 표현식 이 이제 표준화 되었다.

    int numLetters = switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> 6;
        case TUESDAY                -> 7;
        default      -> {
          String s = day.toString();
          int result = s.length();
          yield result;
        }
    };

    record(preview)

    Java로 많은 상용구를 작성하는 고통을 완화하는 데 도움이 되는 레코드 클래스가 있다.

    데이터, (잠재적으로) getter/setters, equals/hashcode, toString만 포함하는 이 Java 14 이전 클래스

    final class Point {
        public final int x;
        public final int y;
    
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
        *// state-based implementations of equals, hashCode, toString// nothing else*

    레코드를 사용

    record Point(int x, int y) { }

    유용한 NullPointerExceptions

    마지막으로 NullPointerExceptions는 정확히 어떤 변수가 null 인지 설명한다 .

    author.age = 35;
    ---
    Exception in thread *"main"* java.lang.NullPointerException:
         Cannot assign field *"age"* because *"author"* is null

    Pattern Matching For InstanceOf (Preview)

    이전에는 다음과 같이 instanceof 내부에서 객체를 캐스팅 필요

    if (obj instanceof String) {
        String s = (String) obj;
        *// use s*}

    이제 이 작업을 수행하여 캐스트를 효과적으로 삭제 가능

    if (obj instanceof String s) {
        System.out.println(s.contains(*"hello"*));
    }

    Java 15

    • Text-Blocks / Multiline Strings
    • Records & Pattern Matching(2차 preview, 상단 Java 14 참조)
    • 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC)
    • 레코드 (2차 preview, 상단 Java 14 참조)
    • Sealed Classes - Preview
    • Nashorn JavaScript Engine 제거

    Text-Blocks / Multiline Strings

    Java 13의 실험 기능으로 도입된 여러 줄 문자열은 이제 프로덕션 준비 완료

    String text = *"""
                    Lorem ipsum dolor sit amet, consectetur adipiscing \
                    elit, sed do eiusmod tempor incididunt ut labore \
                    et dolore magna aliqua.\
                    """*;

    Sealed Classes - Preview

    • 상속 가능한 클래스를 지정할 수 있는 봉인 클래스가 제공된다.
    • 상속 가능한 대상은 상위 클래스 또는 인터페이스 패키지 내에 속해 있어야 한다.
    public abstract sealed class Shape
        permits Circle, Rectangle, Square {...}

    즉, 클래스가 public인 동안 하위 클래스로 허용되는 유일한 Shape 클래스들은 Circle, Rectangle 및 Square 이다.

     

    Java 16

    • Pattern Matching for instanceof
    • Unix-Domain Socket Channels
    • Foreign Linker API - Preview
    • Records & Pattern Matching

    Unix-Domain Socket Channels

    이제 Unix 도메인 소켓에 연결할 수 있다(macOS 및 Windows(10+)에서도 지원됨).

     socket.connect(UnixDomainSocketAddress.of(
            *"/var/run/postgresql/.s.PGSQL.5432"*));

    Foreign Linker API - Preview

    JNI(Java Native Interface)에 대한 계획된 교체로, 기본 라이브러리에 바인딩할 수 있다(C 생각).

     

    Java 17

    Java 17은 Java 11 이후의 새로운 Java LTS(장기 지원) 릴리스

    • Pattern Matching for switch (Preview)
    • Sealed Classes (Finalized)
    • Foreign Function & Memory API (Incubator)
    • Deprecating the Security Manager

     

    Pattern Matching for switch (Preview)

    이제 객체를 전달하여 기능을 전환하고 특정 유형을 확인할 수 있다.

    public String test(Object obj) {
    
        return switch(obj) {
    
        case Integer i -> *"An integer"*;
    
        case String s -> *"A string"*;
    
        case Cat c -> *"A Cat"*;
    
        default -> *"I don't know what it is"*;
    
        };
    
    }

    Sealed Classes (Finalized)

    Java 15에서 preview 제공되었던 기능 완료

    Foreign Function & Memory API (Incubator)

    Java Native Interface(JNI)를 대체한다. 기본 함수를 호출하고 JVM 외부의 메모리에 액세스할 수 있다. 지금은 C가 C++, 포트란과 같은 추가 언어 지원 계획을 가지고 있다고 생각

    Deprecating the Security Manager

    자바 1.0 이후로 보안 관리자가 존재해 왔었지만 현재는 더 이상 사용되지 않으며 향후 버전에서는 제거될 예정

     

    Spring Boot

    Spring Boot 1.1 (Release 2014.05)

    • Java 1.6 이상
    • Spring Framework 4.0.5
    • Tomcat 7.0.54, Hibernate 4.3.1

    Spring Boot 1.5 (Release 2017.01)

    • Java 8 이상
    • Spring Framework 4.3
    • Tomcat 8.5, Hibernate 5.0
    • ConfigurationProperties 에 JSR303 지원

    Spring Boot 2.0.0 (Release 2018.03)

    • Java 8 , Java 9 tested
    • Spring Framework 5.0
    • Tomcat 8.5, Hibernate 5.2

    Spring Boot 2.1.0(Release 2018.10)

    • Java 11 Support (Java 8 ~ 11)
    • Spring Framework 5.1
    • Tomcat 9, Hibernate 5.3

     

     

    참고

    https://velog.io/@ljo_0920/java-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%B0%A8%EC%9D%B4-%ED%8A%B9%EC%A7%95

     

    'Java' 카테고리의 다른 글

    [Java] Java 8 에서의 변경사항  (0) 2022.05.05
    추상클래스 vs 인터페이스  (0) 2022.04.07
    GC (Garbage Collector)  (0) 2022.04.06
    객체의 래퍼클래스(WrapperClass)  (0) 2021.09.16
    IntelliJ IDEA 단축키  (0) 2021.01.28

    + Recent posts