[사전캠프] Java, Spring 톺아보기

2024. 8. 17. 21:37내일배움캠프

※ 참고 : '톺아보다' 는 '틈이 있는 곳은 모조리 더듬어 뒤지며 찾다' 라는 의미이다.

 

1. Java 란?

 오늘날 널리 사용되는 객체 지양 프로그래밍 언어 및 소프트웨어 플랫폼으로 구성된 기술이다. Java 가 널리 사용되게 된 이유 중 하나는 바로 '이식성' 이라고 한다. PC 나 노트북에서 Java 프로그램용 코드를 작성했다면 이것을 모바일 디바이스로 매우 간편하게 옮길 수 있다. 이는 개발 당시 "한 번 작성하고 어디서든 실행하는 것" 이 주 목표였기에 어찌보면 당연한 것이다.

 

 흔히 착각할 수 있는 JavaScript 와는 크게 다르다는 것을 알아두어야 할 것이다. 가장 큰 차이는 컴파일의 유무로 실행되는 애플리케이션의 차이도 있다. Java 의 경우 개발 당시 목표처럼 어디에서나 실행될 수 있으나 JavaScript 는 웹 브라우저에서만 실행된다.

 

 Java 를 다루기 위해서는 JDK(Java Development Kit, 자바 개발 도구)를 다운받아야 하며, 프로그램을 제작하면 컴파일러가 프로그램을 Java 바이트 코드, JVM(Java Virtual Machine)으로 변환한다. 이 Java 바이트 코드는 JVM 을 지원하는 모든 시스템에서 그대로 실행되므로 어디에서나 Java 코드를 실행할 수 있는 것이다.

 

 Java 의 소프트웨어 플랫폼은 JVM, Java API 및 완전한 개발 환경으로 구성되며, Java 의 언어와 소프트웨어 플랫폼을 함께 활용하면 엔터프라이즈 소프트웨어 개발을 위한 강력하고 입증된 기술이 개발된다.

  • JVM : Java 바이트 코드를 파싱하고 해석(실행)
  • Java API : 기본 객체, 라이브러리 세트(네트워킹 및 보안 기능 포함), XML(eXtensible Markup Language), 웹 서비스로 구성

 Java 는 아래와 같은 이점으로 사용을 고려해야 할 확실한 이유가 있는 기술이다.

  • 상호 운용성(이식성) : 다른 기종 디바이스 간 상호 운용이 가능한 점, 가장 강력한 이점이며 이유이다. 객체 지향 아키텍처를 사용해 프로그램과 재사용 가능한 코드를 작성해 개발 주기 단축은 물론 엔터프라이즈 애플리케이션의 수명 자체를 연장할 수 있다.
  • 플랫폼 확장성 : 핵심 속성으로 기존 데스크탑 애플리케이션을 손쉽게 조정하여 모바일 및 소형 디바이스에 실행되도록 한다. 반대로 모바일 쪽에서 데스크탑으로 마이그레이션하고 안드로이드 플래폼용 비즈니스 앱을 개발, 현재 데스크탑 소프트웨어를 통합하여 시간/비용이 많이 투자되는 개발 주기를 스킵할 수 있다.
  • 적응성 : 수 많은 다른 기종의 디바이스와 연결하는데 모든 디바이스가 Java 를 실행하기에 연결에 대한 작업이 크게 간소화 됨, 새로운 라이브러리가 지속적으로 개발되고 공유되는 것 또한 영향이 있다.

 이러한 이유로 Java 는 어찌보면 필요뿐만 아니라 굉장히 중요한 언어가 아닐까라는 생각이 든다. 심지어 현재 웹 개발자를 목표로 하기에 더욱이 Java 란 기술이 새삼 중요하다는 것을 한 번더 느낀다.

 

 

2. Spring

2-1. Spring 의 특징과 장점

 'Spring' 은 '좋은 객체 지향 애플리케이션' 개발이라는 목표로 만들어진 프레임워크이다. 목표에 걸맞게 객체 지향 언어의 대표격인 'Java' 를 기반으로 하고 있으며, 객체 지향 언어(Java)가 가진 가장 강력한 부분을 살릴 수 있게 설계 되었다. 여러 정보를 찾아 보면서 이러한 특징히 곧 'Spring' 의 장점으로 이어진다 생각했다.

 

 '좋은 객체 지향 애플리케이션' 을 만들기 위해선 당연하지만 '좋은 객체 지향 프로그래밍' 을 해야 할 것이다. 그런데 '좋은 객체 지향 프로그래밍' 은 무엇일까?, '객체 지향 프로그래밍' 은 컴퓨터 프로그램을 단순 명령어의 목록 따위로 보는 것이 아니라 여러개의 독립 단위(객체)로 파악하고자 하는 것을 말한다. 여기서 '객체' 는 객체 간 메시지를 주고 받으며 데이터 처리를 할 수 있다. 또한 '객체' 는 프로그램을 유연하고 변경이 용이하고 확장 가능한 설계가 가능해져 대규모 소프트웨어 개발에도 적합하다.

 

 다시 돌아와서 Spring 은 'DI(dependency injection, 의존관계 및 의존성 주입)', 'DI 컨테이너 제공' 등과 같은 기술로 '좋은 객체 지향 프로그래밍' 을 가능하게 하며, 클라이언트에 영향을 주지 않고 기능을 확장 가능하다는 장점이 있다.

 

2-2. Spring 의 단점

 꼭 Spring 만의 문제가 아닐테지만 일단 계속되는 업데이트와 프레임워크의 추가로 정말 방대한 기술들의 집합체가 되었다. 그만큼 편리해지기도 했지만 기술의 양이 많기에 정말로 Spring 을 잘 다루기 위해서는 필요로하는 기술에 시간과 노력이 필요하다(사실 개인적으로 단점이 딱히 느껴지지 않아 억지로 적어보았다).

 

2-3. Spring 과 Spring boot 의 차이

 Spring 을 배우거나 접하게 되면 Spring 과 Spring boot, Spring Framework 라는 다른 용어를 사용하는 걸 보고 당황하는 경우가 더러 있을 것이다.

 

 일단 Spring Framework 에 대해 말하자면 'Framework(프레임워크)' 는 프로그램의 기반(기초)을 설계(구축)할 수 있는 미리 구현된 코드들의 집합이라 할 수 있다. 이 프레임워크가 '뼈' 가되어 우리는 구현하고자 하는 프로그램에 필요한 '뼈대' 를 구축하고, '뼈대' 에 '살' 을 붙이기 위해 필요한 코드를 추가적으로 작성하게 된다. 아래는 기술별 구분한 Spring Framework 들이다.

  • 핵심 기술 : 스프링 DI 컨테이너, AOP, 이벤트 등
  • 웹 기술 : 스프링 MVC, 스프링 WebFlux 등
  • 데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원
  • 기술 통합 : 캐시, 이메일, 원격접근, 스케줄링
  • 언어 : 코틀린, 그루비
  • 테스트 : 스프링 기반 테스트

 자 이렇게 많은 프레임워크들이 Spring 에 존재하다보니 프로그램의 '뼈대' 를 구축할 때 불편함을 느낀 개발자들을 위해 만들어진 것이 바로 'Spring boot' 이다. 현재에는 'Spring boot' 의 사용이 기본이 되었을 정도로 스프링 프레임워크를 사용하는데 굉장한 편리함을 갖는다. '톰 캣' 같은 웹 서버를 내장해 별도의 웹 서버 설치가 불필요하고 손 쉬운 빌드 구성을 위한 'starter dependency' 를 제공하며 그 밖에도 많은 기능을 제공한다.

 

 즉, 'Spring Framework' 는 개발을 할 때 개발의 뼈대가 될 수 있는 다양한 코드 및 기술을 사용할 수 있도록 미리 구현된 기술(코드 집합)이다. 그리고 'Spring boot' 는 이러한 'Spring Framewokr' 들을 손 쉽게 사용하기 위해 개발된 기술인 것 이다. 그리고 이렇게 'Spring boot' 와 'Spring Framework' 등을 포함한 스프링 생태계를 'Spring' 이라고 하며, 문맥에 따라 '스프링DI 컨테이너 기술' 이나 '스프링 프레임워크' 도 'Spring' 이라 말하기도 한다.

 

2-4. Spring 과 Java 그리고 Kotlin

 요즘 대부분의 개발자나 회사들이 'Java + Spring' 을 기반으로해 개발을 한다. 그리고 또 하나로 'Spring + Kotlin' 을 사용한 개발을 많이 한다 들었다. Java 의 강점인 객체 지향 프로그래밍을 더욱 극대화하기 위해 만들어진 것이 Spring 인데 어떻게 Kotlin 과 같이 사용하게 되었을까? Kotlin 은 기본적으로 Java 100% 호환되도록 설계된 것이 크다. 이미 Java 로 구현된 라이브러리 및 프레임워크 등을 그대로 가져다가 사용할 수 있어 그냥 정말 사용 언어만 바꿔 기존의 프로그램이나 프로젝트에 적용이 가능한 것이다. 하지만 단순히 이것만으로 'Kotlin 을 사용해볼까?' 하는 생각은 들지 않을 것이다.

 

 Kotlin 은 한 발짝 더 나아가 Java 가 가지고 있던 문제점들을 해결해 좀 더 매력적인 언어로 느껴지게 하였다. 대표적으로 코드 작성의 간결성과 이로인한 생산성의 증가가 어필 포인트의 하나이다. Java 를 사용해본 사용자로 느낄 수 있는 Getter, Setter, 생성자 등의 번거로운 사전 준비용 코드(?)들을 Kotlin 에서는 묵시적으로 제공해 코드가 깔끔해지고 작성에도 번거로움이 덜 해졌다. 또한 안전성의 이슈로 null 에 대한 방지 대책이 Java 보다 잘 잡혀있어 기존에 null 에 대한 방지로직에 대한 번거로움을 단순 연산자나 타입에 명시적으로 표기로 대체하여 훨씬 편리하다.

 

 그 밖에도 많은 장점이 있어 사용하겠지만 현재로서 Kotlin 을 따로 사용해보지 못한 나로썬 여기까지 찾아본 내용을 토대로 정리하였다.