본문 바로가기
IT 개발 이야기/Java

Java 17로 업데이트: 금융권에서 고려해야 할 사항과 코드 수정 가이드

by 개발자 Aiden 2023. 4. 28.
반응형

최근 Java 17의 출시와 함께 많은 개발자들이 이전 버전에서의 업그레이드를 고려하고 있습니다. 특히 금융권에서는 안정성과 보안이 매우 중요하기 때문에, 새로운 버전으로의 전환은 신중하게 접근해야 합니다. 이전에 저희가 '금융권 자바 버전 업그레이드 필요성과 추천: Java 17 도입 전략'이라는 주제로 글을 작성한 바 있습니다. 그 글에서는 Java 17의 도입이 가져올 이점과 함께 도입 전략에 대해 다루었습니다.

하지만, 실제로 Java 17로 업그레이드를 진행하려면 어떤 코드적인 변화가 필요한지, 어떤 API나 라이브러리가 변경되었는지 등의 구체적인 사항을 알아야 합니다. 이번 글에서는 그러한 구체적인 내용을 다루어, Java 17로의 업그레이드를 고려하는 개발자들에게 도움이 되고자 합니다.

Java17-자바버전업데이트

안녕하세요! 이번 글에서는 이전 버전의 Java에서 최신 버전인 Java 17로 업그레이드할 때 고려해야 할 사항과 코드 수정 예시에 대해 다루겠습니다. 이전에 작성한 '금융권 자바 버전 업그레이드 필요성과 추천: Java 17 도입 전략'에서는 업그레이드 필요성과 도입 전략에 대해 다루었습니다. Java 17의 도입으로 보안, 성능, 기능 측면에서 이점이 있지만 호환성 문제와 소스 코드 수정이 필요한 경우도 있습니다. 이 글에서는 API 변경, 언어 구성 요소 수정, 외부 라이브러리 사용 등의 예시를 통해 Java 17로의 업그레이드 과정에서 발생할 수 있는 문제를 최소화하는 방법에 대해 알아보겠습니다.


Java 17에서의 API 및 라이브러리 변화

1. java.util.stream.Collectors

이 클래스는 자바 8에서 추가된 스트림 API에서 사용되는 유틸리티 클래스로, 스트림 API에서 제공하는 다양한 연산들을 수행할 수 있는 메서드들을 제공합니다. 스트림 API를 사용하면 컬렉션을 처리하고, 데이터를 변환하고, 집계할 수 있는 간결하고 효율적인 방법을 제공합니다.

Java 6 )

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
StringBuilder joinedNames = new StringBuilder();
for (String name : names) {
  if (joinedNames.length() > 0) {
    joinedNames.append(", ");
  }
  joinedNames.append(name);
}
System.out.println(joinedNames.toString()); // Alice, Bob, Charlie


Java 17 ) 스트림 API 사용 예시.

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
String joinedNames = names.stream().collect(Collectors.joining(", "));
System.out.println(joinedNames); // Alice, Bob, Charlie

 

2. java.time.LocalDate 및 java.time.LocalDateTime

Java 17에서는 java.time 패키지의 LocalDate와 LocalDateTime 클래스의 기능이 개선되었습니다. 이를 통해 날짜와 시간 정보를 더욱 간결하고 명확하게 다룰 수 있게 되었습니다. 이전 버전의 자바에서는 Joda-Time 라이브러리를 사용하거나 java.util.Date 및 java.util.Calendar 클래스를 사용해야 했으나, Java 8에서 도입된 java.time 패키지에서는 이러한 문제를 해결할 수 있게 되었습니다. Java 17에서는 이전 버전보다 더욱 향상된 기능을 사용할 수 있으며, LocalDate와 LocalDateTime 클래스를 사용하여 코드를 더욱 간결하고 명확하게 작성할 수 있습니다.

Java 6 ) 날짜와 시간의 차이 예시.

Calendar startDate = new GregorianCalendar(2023, Calendar.JANUARY, 1);
Calendar endDate = new GregorianCalendar(2023, Calendar.DECEMBER, 31);
long daysBetween = (endDate.getTimeInMillis() - startDate.getTimeInMillis()) / TimeUnit.DAYS.toMillis(1);
System.out.println(daysBetween); // 364


Java 17
날짜와 시간의 차이 예시.

LocalDate startDate = LocalDate.of(2023, 1, 1);
LocalDate endDate = LocalDate.of(2023, 12, 31);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println(daysBetween); // 364

 

3. java.util.Objects.requireNonNull

Java 17에서는 java.util.Objects 클래스에 requireNonNull 메서드가 추가되었습니다. 이 메서드는 매개변수가 null인 경우 NullPointerException을 발생시킵니다. 이를 통해 null 체크를 간단하게 수행할 수 있으며, 코드의 안정성을 높일 수 있습니다. 이전에는 null 체크를 수동으로 수행해야 했으나, 이제는 requireNonNull 메서드를 사용하여 더욱 쉽게 null 체크를 수행할 수 있게 되었습니다.

Java 6 ) 매개변수가 null인지 확인하고, 그렇지 않은 경우에만 처리 예시.

public void setName(String name) {
  if (name == null) {
    throw new NullPointerException("Name must not be null");
  }
  this.name = name;
}


Java 17
) 매개변수가 null인지 확인하고, 그렇지 않은 경우에만 처리 예시.

public void setName(String name) {
  this.name = Objects.requireNonNull(name, "Name must not be null");
}

 

반응형


4. java.net.http.HTTP Client

Java 11부터 도입된 java.net.http 패키지는 기존 Java 6의 HttpURLConnection에 비해 더 간결하고 사용하기 쉬운 API를 제공합니다. 새로운 HTTP 라이브러리는 HTTP/1.1과 HTTP/2 프로토콜을 모두 지원하며, 비동기 및 동기 요청을 모두 처리할 수 있습니다. 이를 통해 더욱 효율적이고 안정적인 HTTP 통신을 구현할 수 있습니다.

Java 6 ) 기존 HttpURLConnection 사용 예시.

URL url = new URL("https://aday7.tistory.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();


Java 17 
) HttpClient 사용 예시.

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
  .uri(URI.create("https://aday7.tistory.com"))
  .GET()
  .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
int responseCode = response.statusCode();

 


Java 17에서 제거된 기능 및 API

1. sun.misc.Unsafe

이 클래스는 공식적으로 지원되지 않는 내부 API로, Java 9부터는 더 이상 사용되지 않습니다. 이 클래스는 시스템 레벨에서의 메모리 조작 등의 작업을 수행할 수 있는 기능을 제공하며, 안정성 문제를 일으킬 수 있는 위험이 있기 때문에 공식 API로는 지원되지 않습니다. 대신 VarHandle 또는 MethodHandles.Lookup와 같은 다른 방법을 사용해야 합니다.

Java 6 ) sun.misc.Unsafe 코드 사용 예시.

import sun.misc.Unsafe;

public class UnsafeExample {
  public static void main(String[] args) {
    Unsafe unsafe = Unsafe.getUnsafe();
    long address = unsafe.allocateMemory(100);
    unsafe.freeMemory(address);
  }
}


Java 17 ) VarHandle 코드 사용 예시.

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.nio.ByteBuffer;

public class VarHandleExample {
  public static void main(String[] args) {
    VarHandle handle = MethodHandles.byteBufferViewVarHandle(int[].class, true);
    ByteBuffer buffer = ByteBuffer.allocate(100);
    handle.set(buffer, 0, 42);
    int value = (int) handle.get(buffer, 0);
    System.out.println("Value: " + value);
  }
}


위의 예제와 같이, Java 17로 마이그레이션 하면서 제거된 기능 및 API를 대체하여 코드를 변경해야 합니다. 이렇게 하면 코드가 최신 버전의 Java에서 원활하게 실행될 것입니다.

 

Java 17에서의 언어 구 요소 변화

1. 람다 표현식 및 메서드 참조

Java 8부터 람다 표현식(lambda expression)과 메서드 참조(method reference) 기능이 추가되었습니다. 이를 사용하면 코드를 더 간결하게 작성할 수 있습니다. 람다 표현식은 익명 함수를 작성할 수 있도록 해주는 기능으로, 불필요한 코드를 제거하고 가독성을 높여줍니다. 메서드 참조는 메서드를 참조할 수 있도록 해주는 기능으로, 람다 표현식보다 더 간결한 코드를 작성할 수 있습니다.

Java 6 ) 람다 표현식을 사용하지 않은 코드 예시.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class LambdaExample {
  public static void main(String[] args) {
    List<String> names = new ArrayList<>();
    names.add("Alice");
    names.add("Bob");
    names.add("Charlie");

    Collections.sort(names, new Comparator<String>() {
      public int compare(String s1, String s2) {
        return s1.compareTo(s2);
      }
    });
    System.out.println(names);
  }
}


Java 17 ) 람다 표현식을 사용한 코드 예시.

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class LambdaExample {
  public static void main(String[] args) {
    List<String> names = new ArrayList<>();
    names.add("Alice");
    names.add("Bob");
    names.add("Charlie");

    names.sort((s1, s2) -> s1.compareTo(s2));
    System.out.println(names);
  }
}

 


2. try-with-resources 문

Java 7부터 try-with-resources 문이 도입되어, 자원을 사용한 후에 자동으로 닫아주는 역할을 합니다. try-with-resources 문을 사용하면 명시적으로 close() 메서드를 호출하지 않아도 되므로, 코드를 간결하고 안전하게 작성할 수 있습니다. 이 기능은 AutoCloseable 인터페이스를 구현한 리소스를 사용하는 경우에만 작동합니다. Java 6 이하에서는 try-finally 문을 사용하여 리소스를 명시적으로 닫아야 했지만, Java 7부터는 try-with-resources 문을 사용하여 더욱 간결하고 안전한 코드를 작성할 수 있습니다.

Java 6 ) try-with-resources를 사용하지 않은 코드 예시.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesExample {
  public static void main(String[] args) {
    BufferedReader reader = null;
    try {
      reader = new BufferedReader(new FileReader("file.txt"));
      String line = reader.readLine();
      System.out.println(line);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (reader != null) {
        try {
          reader.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}


Java 17 ) try-with-resources를 사용한 코드 예시.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesExample {
  public static void main(String[] args) {
    try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
      String line = reader.readLine();
      System.out.println(line);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

 

3. String switch

Java 7 이전에는 switch 문의 조건으로 정수, 열거형(enum), 문자(char) 등의 타입만 사용할 수 있었습니다. 하지만 Java 7에서는 문자열도 switch 문의 조건으로 사용할 수 있게 되었습니다. 이를 통해 문자열을 처리하는 코드를 간결하게 작성할 수 있습니다.

Java 6 ) switch 표현식을 사용하지 않은 코드 예시.

public class SwitchExample {
  public static void main(String[] args) {
    String day = "MONDAY";
    String dayType;

    switch (day) {
      case "MONDAY":
      case "TUESDAY":
      case "WEDNESDAY":
      case "THURSDAY":
      case "FRIDAY":
        dayType = "Weekday";
        break;
      case "SATURDAY":
      case "SUNDAY":
        dayType = "Weekend";
        break;
      default:
        dayType = "Invalid";
    }
    System.out.println(dayType); // Weekday
}


Java 17 ) switch 표현식을 사용한 코드 예시.

public class SwitchExample {
  public static void main(String[] args) {
    String day = "MONDAY";
    String dayType = switch (day) {
      case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> "Weekday";
      case "SATURDAY", "SUNDAY" -> "Weekend";
      default -> "Invalid";
    };
    System.out.println(dayType); // Weekday
  }
}

 

 

4. var 키워드

Java 10부터 도입된 'var' 키워드는 로컬 변수의 타입 추론을 허용하여 코드를 간결하게 작성할 수 있게 해 줍니다. 이전 버전의 Java에서는 명시적으로 변수 타입을 선언해야 했지만, Java 10 이후부터는 'var' 키워드를 사용해 타입을 추론할 수 있습니다. 하지만, 'var' 키워드는 로컬 변수에만 사용할 수 있으며, 필드, 메서드 매개변수, 반환 값 등에는 사용할 수 없습니다.

Java 6 ) 기존 변수 타입 선언 예시.

List<String> names = new ArrayList<String>();
names.add("Alice");
names.add("Bob");


Java 17 ) 'var' 키워드로 변수 선언 예시.

var names = new ArrayList<String>();
names.add("Alice");
names.add("Bob");

 

5. Optional 클래스

Java 8부터 도입된 Optional 클래스는 null 값을 처리할 때 발생할 수 있는 문제점을 해결하기 위한 방법입니다. 이전 버전의 Java에서는 null 값이 반환되거나 전달될 가능성이 있는 경우, 명시적으로 null 체크를 해야 했습니다. 그러나 Optional을 사용하면 값의 존재 여부를 명시적으로 처리할 수 있어 코드의 가독성을 높이고, NullPointerException을 방지할 수 있습니다.

Java 6 ) Optional 클래스를 사용하지 않은 코드 예시.

public String findUserNameById(int id) {
  User user = findUserById(id);
  return (user != null) ? user.getName() : "Not Found";
}


Java 17 ) Optional 클래스를
 사용한 코드 예시.

public Optional<String> findUserNameById(int id) {
  Optional<User> user = findUserById(id);
  return user.map(User::getName).orElse("Not Found");
}

 


코드 수정 전략 및 팁

  1. 변경 사항을 미리 파악하고 준비하기
    Java 6에서 Java 17로 업그레이드하기 전에 변경 사항을 미리 파악하고 준비하는 것이 중요합니다. 이를 위해 공식 문서를 확인하고, 변경되는 API, 라이브러리, 언어 구성 요소 등을 검토하여 프로젝트에 어떤 영향을 줄 수 있는지 파악하세요. 이 과정에서 개발팀이 함께 논의하고, 필요한 수정 사항을 정리하세요.

  2. 테스트를 통해 호환성 및 기능 확인하기
    업그레이드 후 코드의 호환성 및 기능을 확인하려면 꼼꼼한 테스트를 진행해야 합니다. 단위 테스트, 통합 테스트, 시스템 테스트 등 다양한 수준의 테스트를 계획하고 실행하여 코드 변경이 시스템에 어떤 영향을 주는지 확인하세요. 이를 통해 잠재적인 문제를 조기에 발견하고 수정할 수 있습니다.

  3. 필요한 경우 외부 라이브러리나 도구 사용하기
    Java 17로 업그레이드하면서 더 이상 지원되지 않는 기능이나 라이브러리가 있다면, 대체할 수 있는 외부 라이브러리나 도구를 찾아 사용할 수 있습니다. 예를 들어, Java 17에서 제거된 기능을 계속 사용하고 싶다면, 해당 기능을 제공하는 외부 라이브러리를 찾아 적용하거나, 자체적으로 구현하여 프로젝트에 통합할 수 있습니다. 이를 통해 업그레이드 과정에서 발생할 수 있는 문제를 최소화하고, 프로젝트의 안정성을 유지할 수 있습니다.


이번 글에서는 Java 17로 업그레이드할 때 고려해야 할 사항과 코드 수정 예시, 코드 수정 전략 및 팁에 대해 다루었습니다. 이를 참고하여 Java 17로의 업그레이드를 성공적으로 수행하시길 바랍니다.


※ 금융 데이터 분석을 위한 Python 프로그래밍: 주식 및 환율 데이터 수집 방법

 

금융 데이터 분석을 위한 Python 프로그래밍: 주식 및 환율 데이터 수집 방법

이 글에서는 Python을 활용한 금융 데이터 분석에 초점을 맞추어, 주식 및 환율 데이터를 어떻게 수집하고 저장하는지에 대한 실질적인 방법을 제공합니다. FinanceDataReader라는 강력한 라이브러리

aday7.tistory.com

반응형

댓글


loading