[시작하며]
3학년 1학기 들어서야 학교 교육과정 이외의 개발공부를 시작한 나인데,
내가 고른 것은 Java를 사용하는 스프링이다.
우선 과거에 html/css를 잠깐 찍먹해보면서 느낀 바로는 프론트엔드 쪽은 나랑 영 맞지 않는 것 같았고,
사용자에게 직접적으로 드러나기에 디자인적인 감각도 중요한 부분을 차지한다는 점이 나에게는 머리 아프게 다가왔다.
따라서 자연스럽게 소거법으로 제일 먼저 떠오르는 백엔드를 한번 시작해보기로 마음먹었다.
스프링을 고르게 된 이유는 사실 거창한 것이 아니라 동아리에서 스프링 스터디를 운영하기 때문이었다.
(이전에는 스프링이라는 것이 존재하는 것도 잘 몰랐으니)
node.js 스터디였으면 node.js로 백앤드 공부를 시작하지 않았을까..라는 생각이 들기도 한다.
Spring을 공부하기에 앞서, 최소한의 Java 문법에 대한 학습이 선행되어야 한다는 점을 깨닫고 Java를 공부하고 있다.
오픈소스SW개발방법 및 도구에서 한 가지 프로그래밍 언어에 대해 전반적으로 조사해오라는 과제가 나왔기에 이번 기회에 좀 확실하게 자바에 대해 알아보고자 한다.
[Java의 역사]
Java는 1991년부터 썬 마이크로시스템즈의 James Gosling과 다른 연구원들이 개발한 언어로 당시에는 "Green Project"라는 이름으로 시작되었었고 1995년 Java라는 이름으로 정식 출시되었다.
처음 출시되었을 때의 슬로건은 "Write Once, Run Anywhere"였다.
이는 컴퓨터마다 다른 코드를 작성해야 하는 전통적인 어셈블리어의 기존 단점을 보완하는 것으로 컴퓨터가 달라도 하나의 통일된 코드 실행할 수 있다는 Java의 장점을 부각하였다.
이것이 가능한 이유는 Java의 조금은 특이한 컴파일 과정에 있다.
[Java 컴파일 과정]
1. 자바 개발자들이 .java파일을 생성하고 빌드
2. Java Compiler가 javac이라는 명령어를 통해 .class파일들을 생성, .class파일(바이트코드 파일)은 컴퓨터가 이해할 수 없는 반기계어 형식
3. JVM의 클래스로더(Class Loader)가 이를 받고, 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data Area의 Method Area), 즉 JVM의 메모리에 올림.
4. 이후 실행엔진(Execution Engine)이 JVM 메모리에 올라온 바이트 코드들을 실행하는 방식이 2가지 존재.
->Interpreter와 JIT(Just-In-Time) Compiler방식
-인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행, 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가짐.
-JIT컴파일러 : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식
하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠름.
마지막 바이트코드를 실행하는 방식에서 두 가지 방식으로 유연하게 대처한다는 점이 조금 신기하게 다가왔다.
어떠한 경우에 인터프리터 방식을 취하고 어떠한 경우 JIT컴파일러 방식을 취하는지 궁금해졌다.(기회가 된다면 추후에 알아보기)
[C 컴파일 과정]
C언어의 경우 간략하게 알아보면,
전처리기 -> 컴파일러 -> 어셈블러 -> 링커의 과정을 거쳐 실행파일이 만들어진다.
풀어서 설명하면,
전처리기는 매크로 치환 및 적용, 헤더파일 삽입을 하는 과정으로 말 그대로 컴파일 하기 전 준비를 하는 과정이다.
이후, 컴파일러를 통해 인간과 컴퓨터언어의 중간 단계인 어셈블리 코드가 되었다가
어셈블러를 거쳐 컴퓨터만이 이해할 수 있는 최종 기계어로 변환된다(이를 Object파일이라고 함)
마지막으로 링커를 통해 이전 단계의 오브젝트 파일들과 프로그램에서 사용되는 표준 C라이브러리, 사용자 라이브러리들을 모두 합치는 과정을 통해 실행파일이 만들어진다.
곰곰히 생각해보면, 둘 다 바이트 코드와 어셈블리 코드의 반기계어로 변환되는 과정까지는 비슷한데
자바의 경우 이후 실행파일을 생성하기까지의 처리를 JVM이라는 별도의 프로그램이 중간에 대신 받아 처리해준다는 점에서 차이가 나타나는 듯하다.
이 JVM(Java Virtual Machine)이 설치될 수 있는 환경이라면, 운영체제에 상관없이 같은 자바 코드에 대해 같은 실행결과를 가질 수 있다는 것이 자바가 가지는 호환성의 핵심이 되는 것이다.
[Java의 가비지 콜렉터]
또 자바에는 Garbage Collector(가비지 콜렉터)라는 엄청나게 편리한 기능이 존재한다.
C/C++에서 new를 통한 동적할당을 배울 때, 필요가 없어지면 이를 곧바로 해제해주는 것이 매우 중요하다고 배웠다.
그런데 Java는 이러한 해제 과정이 필요없이 시간이 지남에 따라 그때그때 쓰이지 않는 Heap영역의 객체들을 삭제하는 GC가 존재하기에 이러한 부분에 있어서 신경을 써주지 않아도 된다.
조금 더 자세히 알아보면, Heap영역이 Young, Old, Permanent으로 나뉘어 관리되며
새로 생성된 객체는 Young에 저장되고 시간이 지남에 따라 Old로 옮겨지게 된다.
그리고 Old영역에 데이터가 어느정도 쌓이면 참조되지 않는 객체들을 검사하여 이를 삭제하는 과정이 GC인 것이다.
(Permanent는 JVM에서 사용하는 힙 메모리 영역)
[Java 기반 프레임워크(Spring)]
Java 백엔드하면 반사적으로 떠오르는 스프링에 대해 간단히 알아보자
2002년 로드 존슨이 당시의 웹 애플리케이션을 개발하기 위한 기술인 EJB를 대체하는 기술을 그의 저서
Expert One-on-One J2EE Design and Development에서 공개한 것을 계기로 발전했다고 하고, EJB시절을 '겨울'로 빗대어 겨울 후의 '봄'으로 새롭게 시작한다는 의미로 Spring이라는 이름을 가지게 되었다.
여기까지 간단한 배경을 알아보았다면
과연 스프링은 무엇을 가능하게 해주는 기술이기에 이처럼 각광받는 것일까?라는 의문점을 해소해보자
스프링과 스프링부트(Spring Boot)ㅣ정의, 특징, 사용 이유, 생성 방법
스프링은 Java 백엔드 개발에 있어 떼어놓을 수 없는 프레임워크입니다. Java 백엔드의 핵심 기술이 되는 스프링 프레임워크와 스프링 부트가 무엇인지, 나아가 스프링 부트를 활용하여 프로젝트
www.codestates.com
에 정말 상세히 잘 설명되어 있는데
스프링의 정의는 다음과 같다.
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크
이를 풀어서 설명하면
-애플리케이션의 로직 자체에 더 집중하여 비즈니스 로직을 구현할 수 있게 해주는
-오픈소스 기반의
-기존 기술을 사용할 때에 불가피하게 작성해야만 했던 불필요하게 복잡한 코드를 제거하여 코드의 복잡성을 낮출 수 있는
-애플리케이션을 개발하는 데에 있어 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대를 제공하는
툴로써 정리가 가능하다.
스프링의 자세한 내막은 차차 공부하면서 알아가보도록 해야겠다.
[참고]
[Java] 자바 컴파일 과정 & JVM 내부 구조
자바 컴파일 과정, JVM 내부 구조
velog.io
https://gracefulprograming.tistory.com/16
[C언어 강좌-2] C언어 컴파일 과정
안녕하세요 피터입니다. 오늘은 지난시간에 이어 C언어의 컴파일 과정에 대해 설명드리겠습니다.앞서 여러분이 작성했던 Hello world 코드가 컴퓨터에서 실행이 되려면 우선 컴파일(Compile) 과정을
gracefulprograming.tistory.com
'CS > 오픈소스SW개발방법및도구' 카테고리의 다른 글
| MVC 패턴에 대해 알아보기 (0) | 2023.06.05 |
|---|---|
| c++ UnitTest(Visual studio 2022 활용) (0) | 2023.05.19 |
| Alphine Linux에 대해 알아보기 (0) | 2023.04.15 |
| Draw.io를 이용한 FlowChart 만들어보기 (0) | 2023.04.09 |
| LINE TODAY 서비스 개발 및 도입에 활용된 애자일 기법 (0) | 2023.04.04 |