칼럼

난 정말 Java 를 좋아한 적이 없다구요

원래 다른 글을 쓰려다가 그냥 갑자기 생각나서 써본다. 아, 글 제목은 <난 정말 Java 를 공부한 적이 없다구요> 라는 책에서 따왔다. 일단, 난 자바를 싫어하니까.

 

어찌되었든 내가 자바를 싫어하는 몇 가지 이유를 적어보고자 한다. 사실 대부분은 감정적인 것들이다. 자바를 전혀 안 해봤다면 싫어할 이유는 없겠지만, 자바를 경험했기에 싫어하는 이유또한 생기는 것이다. 내가 좋아했던 PHP 도 안티가 많다. 그들이 PHP 를 싫어하는 이유를 나는 이해하고 있으므로 다른 이들도 내가 자바를 싫어하는 이유 또한 공감해주리라 믿는다.

 

내가 아래에서 서술하는 것들은 자바 언어가 추구하는 것들이기도 하며 장점이 될 수도 있으나, 이 점이 싫으니까 안 하는 것이다. 따라서 단점이 아니라 장점이라고 반박을 한다고 한들 아무런 상관없다. 싫은건 싫은 것이다.

public class HelloWorld

자바는 다른 언어에 비해 엄격하게 객체지향 구조를 추구한다. 일단 Hello, world 를 하나 만들려고하면 Class 를 하나 만들어야 하고 거기에 정적 메인 메서드를 하나 만들어서 넣어야 한다. 

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world");
    }
}

언어의 유연함이 떨어진다. 이러한 구조는 체계적이라는 점이 장점으로 다가올 수도 있다. 하지만 이렇게 유연함이 없기때문에 난 자바가 싫다. 어째서 Hello, world 하나 찍는데 클래스를 만들고 정적 메서드까지 만들어야 하는 등 객체지향적 구조를 만들어야 하는 것인가? 파이썬처럼 그냥 간단하게 하면 좋을텐데.

print 'Hello, world' # Python

HashMap<String, String> m = new HashMap<String, String>();

HashMap 하나를 만들기 위해 제네릭이 필요하고 타입을 명시해야 한다. 자바는 모두가 알다시피 정적 컴파일 언어이다. 그래서 런타임에 타입을 추론하지 않는다. 미리 타입을 결정하고 가기 때문에 타입을 명시한다. 물론 타입을 명시하는 일은 프로그램을 읽을 때 명확함을 부여하며, 예외처리나 유지보수에 좋다고 볼 수 있다. 자바는 타입에 유독 집착이 심한 편이다. 물론 요즘 자바는 어떤지 잘 모르겠다. C++ 처럼 auto 키워드를 도입하여 자동 타입추론이라도 생겼을라나? 타협해서 Go 처럼은 어떤가.

var 키워드가 추가되었다고 들었다. 하지만 느낌상 자바 개발자들은 이를 싫어할 것 같다.
m := make(map[string]string) // Go

타입은 선택적으로 명시할 수 있도록 하는 것을 좋아한다. 타입을 명시하는 것을 좋아하는 것은 아무래도 마이크로소프트인지라 C 계열에서도 타입이 중요시되고, Javascript 언어에 한계를 느낀 마소가 Typescript 를 만든 것은 타입을 좋아하기 때문이다.

const m = new Map() // Javascript
const m: Map<string, string> = new Map<string, string>() // Typescript :(

System.out.println();

모두가 알다시피 자바는 엄격한 객체지향을 추구하므로 계층화가 되어있다. 모든 것이 객체로 취급되지는 않지만, 출력을 하나 하기위해 System 클래스의 out 이라는 정적 프로퍼티에 접근하여 println() 이라는 메서드에 접근한다. 어째서 그래야하지?! 자바는 패키지 또한 계층화가 되어있어 어떠한 메서드를 사용하기 위해서는 계층구조를 알아둘 필요가 있다. 다른 언어도 클래스와 계층구조는 존재하지만 자바처럼 엄격하지는 않으며 선택적이라고 볼 수 있다.

 

다음은 스프링 프레임워크에서 사용하는 일부 클래스다. 스프링을 자세히 알지는 못하지만, 얼마나 계층화되어있는지는 짐작할 수 있다. (홀리쉣)

org.springframework.web.servlet.view.InternalResourceViewResolver

806

806 페이지는 Java Specification 문서의 분량이다. Go 언어는 100 페이지 정도. 자바 언어는 역사가 긴 만큼 그 내용또한 방대하다. 아래의 페이지에서 The Java Language Specification, Java SE 15 Edition PDF 문서의 분량을 보자.

 

https://docs.oracle.com/javase/specs

물론 언어를 알기 위해 명세까지 굳이 살펴볼 필요는 없겠지만, 내용이 너무 방대하다. 배워야 할 것이 많다. 참고로 언어의 첫 걸음인 문법 입문서적 <Java의 정석> 은 천 페이지가 넘는다. 첫 프로그래밍 언어로 자바를 익히기 위해 저 책을 산다면, 지루해서 죽지 않을까.

 

<1,022>

그리고, 스프링 프레임워크 

스프링 프레임워크는 자바의 웹 프레임워크다. 국내에서 많이 사용한다. 안드로이드를 공부하는 사람이 아니라면, 대체로 자바를 공부한 이후 스프링 프레임워크도 같이 익힌다. 전자정부 프레임워크의 기반으로써도 사용되고 있기 때문이다. 나도 스프링 프레임워크는 잠깐 사용해보았다. 웹 백엔드 개발자의 일자리 또한 스프링 프레임워크가 제일 많다.

 

2위 ― <스프링>, 4위 ― <스프링 부트>


와! 그럼 스프링을 배워볼까?

<토비의 스프링> 은 스프링 프레임워크의 정석과도 같은 책이다. ― <1,720>

 

스프링 하나만 해도 레거시 스프링, 스프링 부트, 스프링 MVC, 스프링 시큐리티, JPA 등을 익혀야 한다. 안정성이 중요한 솔루션이나 대기업에서 자바/스프링을 많이 사용하는 것은 다른 언어/프레임워크 보다도 다소 체계적이기 때문인 것으로 추측해본다.

Jsp, Servlet

아, 필수는 아니지만, 스프링을 배우기 전에 Jsp, Servlet 을 먼저 하는 것이 좋지 않을까?

 

Jsp, Servlet 을 알고 있으면 Spring 의 좋은 점을 알 수 있다고 한다. ― <832>

AOP, IoC, Bean, VO, DAO, DTO ―

자바에서 나온 개념들은 참 많다. 다른 언어에서 이는 선택적이지만, 자바, 특히 스프링 프레임워크에서는 위의 개념들은 필수적으로 사용된다. 그 외에 싱글톤, 팩토리 메서드, 브릿지, 명령 패턴 등 디자인 패턴도 알아두면 좋다. 와우!

다른 분야도 그 정도인데?

다른 분야도 할게 많은데 내가 너무 징징댄다고 생각하는 사람도 있을 것이다. 다른 분야도 보면 공부할 내용이 제법 많으니까. 그런데 생각해보자. 개발업계는 수시로 바뀌고 새로운 언어도 등장하며 또 다른 기술이 등장한다. 언제까지 자바만 할 수도 없고, 자바라는 기술이 이제 더는 오랜 시간 유지될 것이라는 보장도 없다. 또한 일하다보면 C#, PHP, Python 과 같은 다양한 언어를 접해야 할 경우가 생긴다.

 

게다가 백엔드는 공부해야 할 것이 언어 뿐만 있는 것은 아니다. CD/CI, DevOps 등 전부는 아니더라도 어느정도 알고 있어야해서 Docker(컨테이너 가상화), 쿠버네티스(컨테이너 오케스트레이션)는 대략 알아야하고 리눅스(운영체제)데이터베이스 관련 지식도 있어야한다. 프론트엔드 지식도 있는 것을 우대사항으로 가지고 있는 경우도 있어서 HTML/CSS, Javascript ES6+ 는 기본이고 리액트, 뷰처럼 프론트엔드 프레임워크 지식도 일부 알아야한다.

 

프로그래밍 언어 하나에 이렇게 오랜시간 투자하는 것은 좋아하지 않는다. 소프트웨어 공학, 컴퓨터 구조와 같은 컴퓨터 공학적 지식이나 디자인 패턴, SOLID, DRY 같은 소프트웨어 설계에서 공통적으로 사용할 수 있는 지식이라면 지속적으로 공부해두면 좋겠지만 말이다. 여기까지의 내용을 한 마디로 정리하면 다음과 같다.

 

Java is verbose

 

여기도 자바, 저기도 자바

아래의 그래프는 프로그래머스 2020 설문조사 결과 중 일부이다. 2020년, PHP 언어가 가지는 의미에서도 언급하였지만, 자바는 다른 언어들 중 사용자가 가장 많다고 볼 수 있다. 프로그래머스는 국내 기준이므로 스택오버플로우보다는 이것을 보는 것이 국내 개발 동향을 알기에는 조금 더 적합하다.

 

자바의 사용자가 정말 많음을 새삼 느낀다.

이 사항은 오직 내 가치관에 따르는 것이지만, 국내엔 자바 개발자가 많아서 한글로 된 자료도 풍부하고 찾기도 쉬운 편. 그래서 그런지 희소가치가 떨어지고 그저 그런 개발자가 될 가능성도 다소 존재한다. 국비지원을 포함한 많은 학원에서 자바를 가르치고 있다. 역시 더도 말고 취직엔 자바인가?!

 

자바와 관련된 일자리는 php, asp, .NET 을 합친 것보다 많다. ― <잡코리아>

아, 참고로 고인물을 넘어선 10년차가 넘는 석유급 자바 개발자도 제법 있으니 주의. 여담으로 자바 개발자 중에선 PHP 를 싫어하는 비율이 제법 높은 것 같다. 어쩔 수 없다. 상성이다.