본문 바로가기
Java/Java

표준과 구현

by oneny 2023. 7. 31.
표준과 구현이 우리가 개발하는 환경에서 어디서 어떻게 쓰이는지 살펴보자.

 

JCP, JSR, TCK, JDK

 

JCP, JSR, TCK란 무엇인가

 

The Java Community Process(SM) Program

Welcome to jcp.org, home of the Java Community ProcessSM (JCPSM) Program. The JCP is the mechanism for developing standard technical specifications for Java technology. Anyone can register for the site and participate in reviewing and providing feedback fo

www.jcp.org

Java를 개발한 Sun Microsystems(현 Oracle에 인수됨)는 Java 기술 사양의 개발 및 개정을 위해 JCP(Java Community Process) 프로그램을 도입했다. 이는 Java 기술에 의존하는 전 세계 개발자와 조직을 위해 만들어졌으며 누구든 참여할 수 있다.

 

JSR(Java Specification Request)은 JCP를 통해 Java 플랫폼에 대한 기술 제안 및 최종 사양이다. JSR은 정해진 프로세스에 따라 진행되며 승인이 되면 표준이 되어 OpenJDK로 구현되며 Oracle을 포함한 여러 벤더사에서 OpenJDK를 기반으로 JDK를 구현한다. 즉, JSR이 Java와 JVM에서 지켜야하는 표준이 되는 것이다.

 

TCK(Technology Compatibility Kit)를 통해 해당 JDK가 JSR 표준에 맞게 구현되었는지 테스트할 수 있으며 통과 시 인증을 받을 수 있고, 인증 주관은 Oracle 사에서 하고 있다. 즉, 여기서 우리가 알 수 있는 것은 원칙적으로 JVM은 누구나 만들 수 있다는 것이다. 따라서 이러한 Specification에 기반해서 만들어낸 구현체들 배포하는 조직이나 사람들이 생겨나는데 일반적으로 이들을 Vendor라고 한다. 가장 유명한 것은 Oracle에 Hotspot이 있고, IBM에서 만든 JVM도 유명하다.

 

JDK의 플랫폼에 따른 차이

IBM라는 기업에서는 별도의 운영체체를 갖고 있으며, 그 OS에 최적화되어 있는 JDK를 개발하여 사용하고 있다. 즉, 각 Java 버전에서 제공되어야 하는 표준 문서가 만들어지면 그 기준에 해당하는 각 벤더에 맞는 JDK를 별도로 만들 수 있는 것이다. 이렇게 JSP에서 승인된 표준에 따라 OpenJDK를 기반으로 JDK를 구현한 덕분에 어떤 OS에서 개발하든지 JDK의 버전만 맞으면 컴파일하여 애플리케이션 실행을 문제없이 할 수 있다. 예를 들어, Oracle에서 만든 JDK로 개발하고 IBM에서 만든 JDK에서 컴파일하더라도 내부 동작 구조는 조금 다를지 몰라도 표준을 지켜 JDK를 개발한 덕분에 전혀 문제가 발생하지 않고 컴파일이 잘 될 것이다.

그리고 흔히 사용하는 IntelliJ에서도 IntelliJ에서 사용하고 있는 JDK가 있고, 우리 컴퓨터 시스템에 설치한 JDK가 따로 있지만 표준을 지킨 덕분에 버전만 맞는다면 문제없이 잘 사용할 수 있다.

 

API(Application Programming Interface)

 

Overview (Java SE 17 & JDK 17)

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

공개 API(exported API), 줄여서 API(application programming interface)는 프로그래머가 클래스, 인터페이스, 패키지를 통해 접근할 수 있는 모든 클래스, 인터페이스, 생성자, 멤버, 직렬화된 형태(serialized form)을 말한다. 즉, JDK를 설치하면 자바 시스템을 제어하기 위한 API를 제공해주고, 자바 개발자들은 자바에서 제공한 표준 API를 이용해서 자바 애플리케이션을 만들게 된다. 이 때, API를 사용하는 프로그램 작성자(사람)를 그 API의 사용자(user)라 하고, API를 사용하는 클래스(코드)는 그 API의 클라이언트(client)라 한다.

 

우리는 아래에 기능 목록처럼 자바에서 제공하는 기본 패키지에 저장된 표준 API를 사용하여 내부 동작은 어떻게 되는지는 몰라도 위 사이트를 통해 API의 목록과 사용법이 체계적으로 정리된 문서를 이용하여 원하는 API를 찾아 사용할 수 있다.

  • java.lang.*: 자바 프로그래밍을 위한 가장 기본적인 패키지와 클래스들
  • java.util.*: 프로그램을 제어하기 위한 클래스와 데이터를 효율적으로 저장하기 위한 클래스들
  • java.io.*: 키보드, 모니터, 프린터, 파일 등을 제어할 수 있는 클래스들
  • java.net.*: 통신을 위한 기능들

 

OS와 하드웨어

OS의 중요한 역할 중 하나는 외부 장치(이하 디바이스)를 조작하는 일이다. 윈도우, macOS, 리눅스 등 같은 OS가 없으면 여러 개의 프로세스가 각각 디바이스를 조작하는 코드를 작성해야 한다. 이렇게 해도 동작은 하겠지만 다음과 같은 단점이 있다.

  • 모든 애플리케이션 개발자가 디바이스의 스펙을 상세히 알아야만 디바이스를 조작할 수 있다.
  • 개별 개발이므로 개발 비용이 커진다.
  • 멀티 프로세스가 동시에 디바이스를 조작할 경우 예상 외의 동작이 발생할 수 있다.

이러한 단점 때문에 OS에서는 디바이스 드라이버라고 하는 프로그램을 통해 디바이스를 다룬다. 따라서 디바이스 드라이버를 통해서만 프로세스가 디바이스를 조작할 수 있다.

 

위 그림처럼 프로세스는 디바이스 드라이버를 통해 디바이스에 접근한다. 세상에는 여러 종류의 디바이스가 있는데 디바이스가 디바이스 드라이버 표준을 따른다면 OS는 디바이스의 종류가 같으면 같은 인터페이스로 조작할 수 있다. 이렇게 표준을 따른 덕분에 개발자가 직접 디바이스를 조작해야하는 부담을 줄일 수 있고, 디바이스 드라이버는 커널 모드에서 동작하기 때문에 프로그래머의 버그나 해킹 목적으로 의도된 특정 프로세스가 직접 하드웨어에 접근하는 것을 차단할 수 있다.

 

 

끝으로

개발자는 표준을 알면 내부 구현체는 상관치 않고 해당 표준에 따라 개발을 할 수 있다. 위 예시 외에도 아직 공부해본 적은 없지만 Redis를 가지고 캐시같은 것들을 구현할 때도 Jedis를 쓰든 Lettuce를 쓰든 스프링에서 동일하게 동작할 것인데 모두 표준과 구현을 분리하여 각 구현체만 바꿔줄 수 있는 덕분이지 않을까 생각한다. 즉, 여러 구현체들이 하나의 표준을 지킴으로써 내부 동작은 다를 수 있어도 결국 표준 내에서 돌아가기 때문에 내부 동작은 상관하지 않고 표준을 지킨 구현체를 사용할 수 있는 것이다. 이러한 이유가 표준과 구현을 분리하는 데에는 이유가 있다.

 

 

 

출처

[Java] 인터페이스(Interface) 개념과 구현하기

[JAVA 참고] JCP, JSR, TCK란 무엇인가

[10분 테코톡] 김김의 JVM Specification

[JAVA : 메서드]5. JAVA 표준 API

[자바의 신] 19장.이쯤에서 자바의 역사와 JVM에 대해서 알아보자.

[실습과 그림으로 배우는 리눅스 구조 : 개발자가 알아야 하는 OS와 하드웨어의 기초]