[금융 IT] JAVA 버전 업그레이드

한강섭·2025년 5월 17일

금융 IT

목록 보기
2/8
post-thumbnail

보안이 중요한 금융권에서 사용 언어의 버전을 업그레이드 한다는 것은 매우 어렵고, 신중하게 접근해야 한다.
하지만 JAVA는 계속해서 업그레이드 되어가고 있고, 시대의 흐름을 놓친다는 것은 도태된다는 것!

어떤 방식으로 JAVA의 버전을 업그레이드 할 수 있을지 알아보자


🤔 왜?

금융권은 안정성과 보안이 매우 중요한 요소이기 때문에, 많은 금융 기관들이 검증된 기술인 자바를 사용하고 있다. 하지만 자바의 오래된 버전을 사용하면서 발생하는 보안과 성능 문제는 무시할 수 없는 문제이다.

🔒 보안 측면

오래된 버전의 자바는 취약점이 발견되거나 지원이 중단되어 새로운 보안 패치를 받지 못할 수 있다. 최신 버전의 자바는 이러한 취약점을 해결하고 더 강력한 보안 기능을 제공한다.

⚡ 성능 개선

자바 버전을 업그레이드하면 성능 개선의 이점을 누릴 수 있다. 가비지 컬렉션, JIT 컴파일러, 실행 시간 최적화 등의 성능 개선 기능을 지원한다. 이를 통해 더 빠르고 효율적으로 동작할 수 있다.

🧩 새로운 기능 및 최신 라이브러리

새로운 기능과 최신 라이브러리를 활용할 수 있어, 개발자들은 더 효율적인 코드를 작성할 수 있고, 혁신적인 금융 서비스를 구현하는 데 필요한 기능을 활용할 수 있다. 또한 최신 버전의 자바는 다양한 오픈소스 프로젝트와 통합되어 있어 얻을 수 있는 지원과 정보가 풍부하다.

이처럼 자바 버전 업그레이드는 보안, 성능, 기능 측면에서 금융 기관에 큰 이점을 제공하기 때문에 금융 기관들은 버전 업그레이드를 반드시 고려해야 한다.


📊 어려움

🔄 3rdParty 제품 호환성

금융 기관에서 사용하는 다양한 3rdParty 제품들은 자바 버전 업그레이드와 호환성 문제를 야기할 수 있다. 특정 라이브러리가 최신 버전의 자바를 지원하지 않거나, 업데이트된 자바와 충돌할 수도 있다.

🧩 소스 코드 수정 작업의 복잡성

기존 코드의 수정이 필요한 경우가 많다. 문법 변경, API 변경, 라이브러리 업데이트를 해야할 가능성이 높다. 이러한 수정 작업은 많은 시간 (돈) 이 필요하며, 실수로 인한 문제도 조심해야 한다.


🚀 대응 전략

명확히 현황을 분석하고, 중요 시스템의 우선순위를 결정해서 대응 범위 및 방법을 설정한다.
그리고 테스트 전략을 수립하여 금융 시스템에 맞게 치밀하게 대응하여야 한다.


🌟 자바 버전 선정 (17)

안정성, 보안, 성능 및 지원 기간 등 여러 요소를 고려해야 한다. 현재 자바의 LTS 버전인 Java 11과 Java 17이 가장 널리 사용되고 있으며, 이 버전들은 꾸준한 업데이트와 개선을 통해 안정적인 성능과 보안을 제공한다.

☕ Java 17

  1. 성능 개선 : Java 17에서는 가비지 컬렉션 알고리즘이 개선되어 메모리 관리 효율이 향상되었다. 또한 컴파일러 최적화 기술이 업그레이드되어 실행 속도와 응답 시간이 개선되었다.

  2. 생산성 향상 : Java 17은 패턴 매칭, 레코드, Sealed 클래스 등과 같은 새로운 언어 기능을 도입하여 개발자들의 생산성을 향상시켰다.

  3. 보안 강화 : Java 17은 암호화 및 인증 알고리즘의 최신 표준을 지원하여 웹 서비스 및 애플리케이션의 보안을 강화한다.

  4. 모듈 시스템 : Java 17은 JPMS(Java Platform Module System)를 통해 애플리케이션의 구조와 캡슐화를 개선하며, 라이브러리 의존성 관리를 효과적으로 할 수 있다.

  5. 최신 라이브러리 지원 : Java 17과 호환되는 최신 버전의 라이브러리와 프레임워크가 지속적으로 출시되고 있다. 이를 통해 개발자들이 더 높은 수준의 애플리케이션을 개발할 수 있다.


🔍 추가된 API 및 라이브러리

1. java.util.stream.Collectios (java 8에서 추가)

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.printIn(joinedNames. toString()); // Alice, Bob. Charlie

java 17

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

효율적인 변환, 집계

2. java.time.LocalDate 및 java.time.LocalDateTime (java 8에서 추가)

java 6

Calendar startDate = new GregorianCalendar(2023, Calendar. JANUARY, 1);
Calendar endDate = new GregorianCalendar(2023, Calendar. DECEMBER, 31);
long daysBetween = (endDate.getTimelnMillis() - startDate.getTimelnMillis()) / TimeUnit
System.out.printIn(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.printIn(daysBetween); // 364

간결하고 명확!

3. java.util.Objects.requireNonNull (java 17에서 추가)

java 6

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

java 17

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

더욱 안정적인 null 체크

4. java.net.http.HTTP Client (java 11부터 도입)

java 6 (HttpURLConnection)

URL url = new URL("https://velog.io/@hks_0827/posts");
HttpURLConnection connection = (HttpURLConnection) url. openConnection();
connection. setRequest Method( "GET");
int responseCode = connection. get ResponseCode();

java 17 (HttpClient)

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

간결성!


🚫 제거된 기능 및 API

1. sun.misc.Unsafe (java 9 부터 삭제)

VarHandle 또는 MethodHandles.Lookup 로 대체!

java 6

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

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.printIn("Value: " + value);
  }
}

🛠️ 언어 구성 요소 변화

1. 람다 표현식 및 메서드 참조 (java 8부터 추가)

java 6

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.printIn(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.printIn(names);
  }
}

가독성이 좋아진다!

2. try-with-resources 문

java 6

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.printIn(line);
    } catch (IOException e) {
    	e.printStackTrace();
    } finally {
      if (reader != null) {
      	try {
      		reader .close();
      } catch (IOException e) {
      	e.printStackTrace();
		}
	  }
    }
  }
}

java 17

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에서 도입)

java 6

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.printIn(dayType); // Weekday
  }
}

java 17

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.printIn(dayType); // Weekday
  }
}

간결성!

4. var 키워드 (java 10부터 도입)

java 6

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

java 17

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

하지만 var 는 금융권에 적합하지 않다는 생각.. (가독성이 떨어진다)

5. Optional 클래스 (java 8부터 도입)

java 6

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

java 17

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

Option 클래스로 null 값을 처리할 때 발생할 수 있는 문제점을 해결!
NullPointerException을 방지


java 6 과 java 17 을 면밀히 비교 분석해보았다. 다양한 이점이 있는 것은 확실하지만 결국 방대한 시간과 자원이 필요한 대작업이 될 것이다.(코드의 양이 매우 방대할 것이다)

그럼에도 점점 최신화 되는 자료와 개발자들에 잘 어울러지고, 좋은 사용자 경험을 위해서는 필요한 일이다!

변경 사항을 미리 정리 후 준비하고, 코드 변경이 시스템에 어떤 영향을 주는 지 확인 한 후 업그레이드 과정을 잘 수행하는 것이 중요할 것이다.


📚 참고 자료

금융권 자바 버전 업그레이드 필요성과 추천 Java 17 도입 전략

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

profile
기록하고 공유하는 개발자

2개의 댓글

comment-user-thumbnail
2025년 5월 17일

와 퀄 뭐죠 금융권에서 자바가 이렇게 사용되는군요..

1개의 답글