Java

Java란?
- Java는 프로그래밍 언어 및 소프트웨어 플랫폼으로, 노트북, 컴퓨터, 모바일 디바이스, 게임 콘솔, 의료 장비 등을 포함하여 수십억 개의 디바이스에서 실행
- 규칙과 구문은 C 및 C++ 언어를 기반
- 컴퓨터에서 프로그램용 코드를 작성한 후 모바일 디바이스로 간편하게 옮길 수 있는 이식성
- 한 번 작성하고 어디에서나 실행 가능
Java와 JavaScript의 차이
- Javascript는 컴파일할 필요가 없지만 Java 코드는 컴파일 필요
- Javascript는 웹 브라우저에서만 실행되지만 Java는 어디에서나 실행 가능
작동 방식
- Java는 프로그래밍 언어와 소프트웨어 플랫폼으로 구성된 기술
- 프로그래밍 언어로 프로그램을 제작 -> 컴파일러가 프로그램을 Java 바이트 코드, 즉 Java 런타임 환경(JRE)의 일부인 JVM(Java Virtual Machine)으로 변환
- Java 바이트 코드는 JVM을 지원하는 모든 시스템에서 수정 없이 실행되므로, 어디에서나 Java 코드를 실행 가능
중요한 이유
- 조직에서 이미 Java로 작성된 수천, 수백만 줄의 프로덕션 코드가 있을 가능성이 높으므로 Java에 관한 일정 수준의 전문 지식이 필요
- Java 언어는 Android 운영 체제의 핵심을 이루며, 스마트폰에서 큰 비중을 차지
- 머신 러닝 및 데이터 사이언스 에플리케이션에서 많이 사용되는 언어
기술적 이점
- 상호 운용성
- 이기종 디바이스 간 상호 운용성
- 새로운 엔터프라이즈 애플리케이션 개발 시 강점을 가짐
- 플랫폼 확장성
- 광범위한 유스케이스에 하나의 단일 시스템을 사용가능
- 데스크탑 에플리케이션은 리스소가 제한된 소형 디바이스에서 실행되도록 손쉽게 조정 가능
- 시간과 비용이 많이 드는 개발 주기를 스킵 가능
- 적응성
- 일반적인 IOT 애플리케이션은 수많은 이기종 디바이스를 상호 연결하는데, 이 작업이 Java를 실행함으로써 크게 간소화 시킴
Spring

특징
- 자바 언어 기반의 프레임워크, 자바로 다양한 어플리케이션을 만들기 위한 프로그래밍 틀
- 복잡하지 않고 경량화 된 에플리케이션 프레임워크
- 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
- 좋은 객체 지향 어플리케이션을 개발할 수 있도록 개발자를 돕는 프레임워크
스프링 프레임워크의 특징
- POJO(Plain Old Java Object)
- Java EE를 사용할 때에 비해 특정 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기가 용이하고, 객체가 가벼움
- 관점 지향 프로그래밍 (Aspect Oriented Programming, AOP)
- 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리
- AOP는 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법
- 코드가 중복될 경우 실용성과 가독성이 떨어져 개발 속도에 좋지 않은데, 중복된 코드를 최대한 배제하는 방법으로 중복되는 기능들을 전부 빼놓고 필요할때만 호출하여 쓰면서 효율성을 높임
- 의존성 주입(Dependency Injection, DI)
- 프로그램에서 구성 요소의 의존 관계가 소스코드 내부가 아닌 외부의 설정 파일을 통해 정의 되는 방식
- 코드 간의 재사용을 높이고, 소스코드를 다양한 곳에 사용하며 모듈 간의 결합도를 낮춤
- 대표적으로 라이브러리나 API, 프레임워크를 연동 할 때 연결하는 소스코드를 직접 작성하지 않고 외부 파일을 연결해 불러오는 방식
- 제어 반전(Inversion of Control, IOC)
- IOC는 객체의 생성부터 소멸까지 개발자가 아닌 스프링컨테이너가 대신 해주는 것
- 제어권이 개발자가 아닌 IOC에 있고, IOC가 개발자의 코드를 호출해 필요한 객체를 생성, 소멸 하며 생명주기를 관리하는 것
- 개발자는 Java 코딩시 new 연산자, 인터페이스 호출, 뎅이터 클래스 호출 방식으로 객체를 생성, 소멸시킴
- Bean 생명주기 관리
- 스프링 프레임워크는 Bean 이라는 이름으로 프레임워크에서 사용되는 Java 객체의 생성, 소멸을 직접 관리
- 우선순위 설정, Configutation을 통해 코드로 작성해두고, 필요한 객체만을 사용 가능
장점
- 개발기간 단축 및 개발역량 평준화
- 프레임워크이기 때문에, 개발자의 수준과 실력에 상관없이 일정 수준의 품질을 기대 가능
- 담당자 혹은 개발자가 도중에 바뀌더라도, 유지보수에 관한 리스크를 줄일 수 있음
단점
- 많은 기능을 제공하고 탑재하고 있으므로, 기능을 익히기 위해 많은 노력이 필요
- 무거운 프레임워크
Spring과 Spring boot의 차이
- 스프링은 프레임워크이고, 스프링 부트는 스프링 프레임워크를 기반으로 한 도구
- 스프링은 설정 파일을 작성해야 하지만, 스프링 부트는 자동 설정을 제공하여 간편하게 개발
- 스프링 부트는 내장 서버를 제공하여 쉽게 웹 에플리케이션을 실행 가능
- 스프링은 스프링 프레임워크를 보다 세밀하게 제어하는 경우에, 스프링 부트는 빠르고 간단하게 스프링 에플리케이션을 개발하는 경우에 사용
마무리
내가 이제 주로 사용하게 될 Java에 관해 찾아보고 공부해보았다. 알아보기 전에는 그냥 Java가 국내에서 많이 사용되어서 공부해야 된다고 생각했는데, 왜 사용되고 어떻게 사용되는지 찾아보니깐
Java가 많이 사용되는 이유는 한 번 작성하면 다양한 디바이스에서 쉽게 사용될 수 있는 이점 때문이라는 것을 알게되었다. 그리고 스프링이 자바와 같은 언어가 아니라 자바 언어 기반의 프레임워크 라는 것을 알게 된점이 좋았다. 하지만 스프링을 익히기 위해서 많은 노력이 필요할 것 같다. 그러나 익히게 된다면 개발기간을 단축시킬수 있고 일정 수준의 품질이 보장되기때문에 필수로 알아야 할 것 같다. 