J2SE·J2EE·J2ME로 나뉜 Java 플랫폼의 역할
J2SE, J2EE, J2ME의 구성과 적용 환경을 비교하고 Java SE·Jakarta EE·모바일 Java로 이어진 변화를 정리한다.
2026-08-14 · 최초 발행 2026-01-12
하나의 언어에서 갈라진 실행 환경
Java는 1995년 선마이크로시스템즈에서 “Write Once, Run Anywhere”라는 철학과 함께 등장했다. JVM 위에서 바이트코드를 실행해 플랫폼 독립성을 확보하고, 객체지향 구조와 가비지 컬렉션으로 재사용성과 메모리 관리를 지원하는 언어이자 플랫폼이었다.
하지만 데스크톱 프로그램, 대규모 서버, 휴대폰과 PDA는 필요한 API와 사용 가능한 자원이 달랐다. 이 차이를 반영해 Java 2 계열은 표준 환경인 J2SE, 엔터프라이즈 환경인 J2EE, 경량 장치용 J2ME로 분화됐다. 공통 언어와 javac, JVM을 공유하면서도 각 환경에 맞는 API를 별도로 제공하는 구조다.
초기의 JDK 1.0과 1.1을 거쳐 Java 2(JDK 1.2)에서 큰 변화가 있었고, 이 시기에 J2SE·J2EE·J2ME라는 명칭이 사용됐다. Java 5 이후에는 각각 Java SE, Java EE, Java ME로 이름이 바뀌었다. 현재 Java SE는 오라클이 관리하고, 이전 Java EE는 이클립스 재단 아래 Jakarta EE가 됐으며, Java ME는 레거시 플랫폼으로 취급된다.
J2SE는 표준 Java 실행 기반이다
J2SE는 데스크톱과 워크스테이션을 겨냥한 표준 에디션이다. 핵심 Java 언어와 API를 제공하며, 다른 에디션이 확장하는 기반이기도 하다. Windows, Linux, macOS에서의 실행 환경, Swing·AWT GUI, 소켓과 HTTP 클라이언트 같은 네트워킹 기능, JDBC 기반 데이터베이스 접근이 여기에 속한다.
J2SE 1.2는 1998년에 Swing과 Collections를 도입했고, J2SE 1.3은 2000년에 HotSpot JVM을 포함했다. J2SE 1.4는 2002년에 정규표현식과 NIO를, J2SE 5.0은 2004년에 제네릭과 Annotation을 추가했다.
개발 측면에서는 JDK가 컴파일과 도구 사용을 담당한다. javac는 컴파일러, java는 런처, javadoc는 문서 생성 도구이며 jar와 jdb도 JDK에 포함된다. 실행 환경인 JRE는 JVM, rt.jar, java.lang·java.util·java.io 등의 표준 API로 구성된다. JVM은 클래스 로더, 바이트코드 검증기, 인터프리터 또는 JIT 컴파일러, 가비지 컬렉터를 통해 실행과 보안 검증, 메모리 관리를 수행한다.
표준 API에는 기본 클래스와 스레드를 제공하는 java.lang, 컬렉션·날짜·난수를 다루는 java.util, 스트림 입출력의 java.io, 버퍼와 채널을 다루는 java.nio가 있다. GUI는 java.awt, javax.swing, java.awt.event를 중심으로 구성되며, 네트워크는 java.net, java.rmi, javax.net.ssl을 사용한다. 데이터베이스 연결에는 java.sql과 javax.sql의 DataSource, 커넥션 풀이 활용된다.
이 에디션은 비즈니스 애플리케이션, Eclipse와 IntelliJ IDEA 같은 개발 도구, 금융 터미널, 과학·엔지니어링 도구에 쓰였다. 파일 관리, 데이터 처리, 백업, 모니터링 유틸리티와 프로그래밍·알고리즘·소프트웨어 공학 교육도 대표적인 적용 영역이다.
J2EE는 서버의 공통 서비스를 분리했다
J2EE는 J2SE 위에 엔터프라이즈 애플리케이션용 기능을 더한 플랫폼이다. 분산 다계층 구조와 컴포넌트 기반 개발을 전제로 하며, 부하 증가에 대응하는 확장성, 고가용성, 인증·권한·암호화, ACID 트랜잭션, 벤더 독립적 API를 목표로 삼았다.
핵심은 비즈니스 로직과 인프라 서비스를 분리하는 데 있다. 웹 브라우저나 두꺼운 클라이언트가 클라이언트 계층을 이루고, 웹 계층에서는 Servlet과 JSP가 요청을 처리한다. 비즈니스 계층은 EJB가 맡으며, 데이터베이스와 레거시 시스템은 엔터프라이즈 정보 시스템 계층으로 연결된다.
컨테이너는 실행과 운영 책임을 나눈다. 웹 컨테이너는 Servlet과 JSP를 실행하고, EJB 컨테이너는 엔터프라이즈 빈을 관리한다. 애플리케이션 클라이언트 컨테이너와 애플릿 컨테이너도 각각 클라이언트와 애플릿 실행 환경을 제공한다. JNDI는 네이밍과 디렉터리 기능을, JTA는 트랜잭션을, JMS는 메시징을, JAAS는 보안 기능을 담당한다.
Servlet은 HTTP 요청과 세션을 처리하며 동적 웹 콘텐츠를 생성하는 서버 측 Java 클래스다. JSP는 HTML 안에 Java 코드를 포함하고 Servlet으로 변환되며, JSTL과 EL을 사용할 수 있다. EJB는 Session Bean으로 비즈니스 로직을 처리하고, Entity Bean은 데이터 영속성을 담당하던 레거시 방식이며, Message-Driven Bean은 비동기 메시징에 사용된다. 이 컨테이너는 트랜잭션, 보안, 동시성 관리도 맡는다.
JPA는 객체와 관계형 데이터를 매핑하는 ORM API로 Entity Bean을 대체했다. JPQL을 제공하고 하이버네이트와 EclipseLink가 구현체로 쓰인다. JMS는 큐 기반 Point-to-Point와 토픽 기반 Publish-Subscribe 메시징을 지원하며 메시지 브로커와 통합된다. JNDI는 DataSource와 EJB 같은 자원을 찾고 LDAP, DNS와 연결한다.
전자상거래, 포털, 소셜 네트워크, SaaS 애플리케이션은 웹 계층 활용 사례다. ERP, CRM, SCM, 금융 시스템과 온라인 뱅킹, 증권 거래, 항공 예약, 통신 과금처럼 대규모 트랜잭션을 처리하는 시스템도 J2EE의 대상이었다.
J2ME는 제한된 장치를 위한 Java였다
J2ME는 휴대폰, PDA, 셋톱박스, 임베디드 시스템처럼 자원이 제한된 장치를 위한 Java 플랫폼이다. J2SE의 서브셋으로 구성됐고, 모듈화와 경량화를 통해 작은 메모리 풋프린트와 제한된 처리 능력, 배터리 제약, 다양한 디바이스를 다뤘다. 메모리 요구량은 수백 KB 수준부터 시작한다.
구조는 Configuration, Profile, Optional Packages로 나뉜다. Configuration은 기본 런타임과 라이브러리를 정의하고, Profile은 장치 유형별 API를 더하며, Optional Packages는 추가 기능을 제공한다.
CLDC(Connected Limited Device Configuration)는 휴대폰과 센서처럼 매우 제한된 장치를 위한 구성으로, 작은 JVM인 KVM과 최소 API를 사용한다. CDC(Connected Device Configuration)는 셋톱박스와 차량 시스템처럼 상대적으로 자원이 많은 장치에 사용되며 Full JVM과 J2SE에 가까운 API를 제공한다.
CLDC 기반 MIDP(Mobile Information Device Profile)는 휴대폰과 PDA를 대상으로 LCDUI, 게임 API, HTTP·HTTPS 네트워킹, RMS 레코드 저장 기능을 제공한다. CDC 기반 Personal Profile은 PDA와 셋톱박스에서 AWT 기반 GUI와 Applet을 지원한다. Foundation Profile 역시 CDC 기반이며, GUI 없이 임베디드 서버와 네트워크 장치의 네트워킹을 중심으로 한다.
피처폰 게임, 간단한 2D 게임, 네트워크 멀티플레이어, 벨소리와 배경화면은 J2ME가 활용된 모바일 영역이다. 뉴스·날씨, 메신저, 모바일 뱅킹, 위치 기반 서비스도 대상이었으며, 셋톱박스, 차량 내비게이션, 산업 제어 장치, POS 단말기에도 적용됐다. Android 이전 모바일 플랫폼으로 널리 쓰였지만 현재는 거의 사용되지 않고, IoT 일부 분야에서 제한적으로 활용된다.
API 범위와 자원이 에디션을 가른다
J2ME는 자원 제약 장치를 전제로 최소 핵심 API만 제공한다. 메모리 범위는 수백 KB ~ 수 MB이고 복잡도는 낮으며, 휴대폰, PDA, 셋톱박스, 임베디드 시스템, 센서와 IoT 디바이스가 대상이다.
J2SE는 수십 MB ~ 수백 MB의 메모리 범위에서 핵심 API와 GUI, 네트워크, 데이터베이스 기능을 제공한다. 복잡도는 중간 수준이며 Windows PC, macOS, Linux 데스크톱, 워크스테이션, 개발 환경을 겨냥한다. Swing·AWT, java.nio, java.sql, java.rmi이 J2SE에서 추가되는 대표 API다.
J2EE는 수백 MB ~ 수 GB 범위의 메모리를 사용하며, J2SE에 EJB, 웹, 메시징 API를 더한다. 애플리케이션 서버, 클라우드 인프라, 엔터프라이즈 데이터센터, 마이크로서비스 플랫폼에서 높은 복잡도의 서버 시스템을 구성한다. javax.servlet, javax.ejb, javax.jms, javax.persistence가 이 계열의 API다.
세 에디션은 java.lang과 java.util, java.io를 공유하지만 J2ME에서는 일부 기능이 제한적이다. J2ME는 javax.microedition.lcdui, javax.microedition.rms, javax.microedition.io처럼 모바일 UI, 레코드 저장, 제한적 네트워킹을 위한 별도 API를 사용한다.
도구 선택도 대상 플랫폼에 따라 달랐다. J2ME에는 Wireless Toolkit(WTK), NetBeans Mobility Pack, Eclipse ME, 에뮬레이터가 쓰였고, J2SE 개발에는 Eclipse, IntelliJ IDEA, NetBeans, Visual Studio Code가 사용된다. J2EE 개발에서는 Eclipse with WTP(Web Tools Platform), IntelliJ IDEA Ultimate, NetBeans와 Tomcat, JBoss, WebLogic 같은 애플리케이션 서버가 함께 사용된다.
Java EE 이후와 모바일 Java의 변화
Java EE는 2017년에 오라클에서 이클립스 재단으로 이관됐다. 상표권 문제로 Jakarta EE라는 이름으로 바뀌었고, 오픈소스 커뮤니티 주도 개발로 이어졌다. 패키지명도 javax.*에서 jakarta.*로 변경됐으며, 릴리스 주기와 마이크로서비스·클라우드 네이티브 지원이 강화됐다.
Jakarta Servlet, Jakarta RESTful Web Services(JAX-RS), Jakarta Persistence(JPA), Jakarta Contexts and Dependency Injection(CDI), MicroProfile은 이 전환 이후의 주요 기술이다.
Java SE도 계속 발전했다. Java SE 8은 LTS 릴리스로 2014년에 람다와 스트림 API를 도입했고, Java SE 11은 2018년에 HTTP/2 클라이언트를 제공했다. Java SE 17은 2021년에 Sealed Classes와 Pattern Matching을, Java SE 21은 2023년에 Virtual Threads와 Structured Concurrency를 포함한 LTS 릴리스다. G1GC, ZGC, Shenandoah GC 같은 성능 개선, var, 레코드, switch 표현식, Java Platform Module System(JPMS)도 이 흐름에 속한다. 새 버전은 6개월마다 릴리스된다.
J2ME는 2008년 Android가 Dalvik/ART VM 기반으로 등장하고 iOS가 Swift와 Objective-C를 중심으로 자리 잡으면서 쇠퇴했다. 스마트폰 보급은 피처폰 시장을 축소했고, J2ME는 사실상 레거시가 됐다. 현재 Android 개발에는 Java 또는 Kotlin이 사용되며, 크로스 플랫폼 개발에는 Flutter와 React Native가 쓰인다. IoT에서는 Java SE Embedded와 MicroProfile, 네이티브 이미지 컴파일에는 GraalVM이 활용된다.
Java 생태계의 방향도 Spring Boot, Quarkus, Micronaut 기반의 클라우드 네이티브 개발, 경량화와 빠른 시작을 지향하는 마이크로서비스, AWS Lambda Java 런타임을 이용하는 서버리스, Docker와 Kubernetes 기반 컨테이너 운영으로 옮겨가고 있다.