개발자입니다
[비트캠프] 36일차(8주차1일) - Java 개요, 설치, SpringBoot 개념 및 설치 본문
[비트캠프] 36일차(8주차1일) - Java 개요, 설치, SpringBoot 개념 및 설치
끈기JK 2022. 12. 26. 09:43
Web Application Architecture by Java
Web Browser(client) 에서 요청을 Web Server(Server)로 하면 응답을 HTTP로 한다.
Web Browser 에서 실행하는 프로그램은 다음과 같다. HTML, CSS, JavaScript + jQuery, Bootstrap + React
Mobile은 다음이 추가된다. Java/kotlin, Objective-C/Swift, React Native
Mobile에서 요청을 Web Server에 하고 응답을 받는다.
Web Server에서 WAS(Web Application Server)로 동적자원 실행을 위임하고 WAS는 결과를 응답한다.
Web Server에서 HTML, CSS, JavaScript 같은 정적자원(실행하지 않고 그대로 읽어 리턴해 주는 것, static resource) 을 read 한다.
WAS에서 Servlet/JSP/... 실행하고 결과를 받는다.
WAS에서 질의(SQL)를 Database로 하고 결과를 받는다. Databse는 질의 내용으로 파일을 write하고 수신 데이터를 read 한다.
Nodejs Web Application Architecture
NodeJS Web 에서는 Server가 NodeJS로 바뀐다.
NodeJS가 HTML, CSS, JavaScript 같은 정적 자원을 read 한다.
NodeJS가 JavaScript를 실행하는데 여기에는 express.js, request 객체 등이 있다.
SpringBoot Web Application Architecture
SpringBoot Web Application Architecture에서는 Server가 Tomcat Server + Spring Framework 로 바뀐다.
Tomcat 이 HTML, CSS, JavaScript 같은 정적자원을 read 한다. Spring Framework 이 Java를 실행한다.
Spring Boot에서 SQL 질의를 Database에 하고 결과를 받는다. Database는 질의 내용으로 파일을 write하고 수신 데이터를 read 한다.
SpringBoot 기술 스택
Tomcat Server 위에서 Jakarta EE API (Java EE API) 를 사용한다. 이 기술을 사용해서 Spring Framework를 동작한다. 이 위에서 Java App, Mybatis, JDBC API, JSP 및 Thymeleaf (HTML 생성기술)를 사용한다.
Java App은 Spring Framework 위에서 사용하지만 Jakarta Server만 있어도 사용 가능하다.
→ 모든 것들은 Java로 만들어졌다.
그리고 이 모든 것들은 JVM (Java Virtual Machine*) 위에서 동작한다. JVM은 실행도구이다. (*Interpreter, Player, Viewer, Runtime Engine)
Java로 .java 소스파일을 생성하고 이를 컴파일해서 .class 바이트코드를 만든다. 이를 이용해 Java App을 동작한다.
컴파일 할때 개발 도구가 쓰이는데 Java Compiler, Debugger, Profiler, Java Archive, Java Doc... 이 있다. 이를 Java Development Kit 이라 한다.
Java 프로그래밍 준비
① JDK 다운로드 및 설치 → java.oracle.com
② 환경 변수 설정 → JAVA_HOME : JDK 설치 폴더
→ PATH : JDK/bin 폴더 경로 추가
JAVA_HOME : JDK가 설치된 폴더 경로. Java App. 이 JDK를 찾을 때 이 환경 변수를 이용한다.
PATH : 실행 프로그램이 있는 폴더 경로. CLI에서 프로그램 이름으로 바로 실행하고 싶을때
(Windows) 자바 환경변수 설정한다.
PS C:\Users\bitcamp\git\bitcamp-ncp> echo %JAVA_HOME%
%JAVA_HOME%
# 위 명령이 안되면 아래처럼 입력한다. 모든 사용자가 아닌 로컬로 설치된다.
PS C:\Users\bitcamp\git\bitcamp-ncp> setx JAVA_HOME JDK설치폴더
# JDK설치폴더 : "C:\Program Files\Java\jdk-17.0.5"
PATH 설정한다.
PS C:\Users\bitcamp\git\bitcamp-ncp> setx PATH "C:\Program Files\Java\jdk-17.0.5\bin;%PATH%"
성공: 지정한 값을 저장했습니다.
③ 빌드 도구 설치 및 설정
빌드 도구 : 프로젝트 폴더를 준비, JDK 이용하여 컴파일 실행 테스트 수행, 아카이브(archive) 파일(배포 파일: .jar, .war, .ear, .zip 등)을 생성 → gradle.org
gradle 설치
scoop 검색 후 사이트 들어가서 명령어 2줄 차례대로 입력한다.
PS C:\Users\bitcamp> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\Users\bitcamp> irm get.scoop.sh | iex
Initializing...
Downloading...
Extracting...
Creating shim...
Adding ~\scoop\shims to your path.
Scoop was installed successfully!
Type 'scoop help' for instructions.
scoop 설치 후 아래 명령어로 gradle 설치한다.
C:\Users\bitcamp> scoop install gradle
④ (무료) Eclipse IDE 설치 및 설정 (IDE : Integrated Development Environment)
소스 편집, JDK를 이용한 빌드 작업, 테스팅 등 개발 전반의 작업을 수행할 수 있도록 도와주는 프로그램
실무에서는 (상용) Intelli J 많이 씀
eclipse.org에서 다운받는다.
Enterprise 선택 후 설치한다.
환경 변수 설정한 대로 경로 나온다.
App. 개발과 실행
① 인터프리터 방식 : hello.js 파일을 $ node hello.js 명령어를 사용해 NodeJS를 통해 OS에 실행한다.
② 컴파일 방식 : hello.c 소스 파일을 C Compiler에 load 한다. $ gcc -o hello.exe hello.c 명령어로 컴파일 한다. 생성된 hello.exe 기계어 파일을 hello.exe 명령어로 OS에 실행한다.
③ 하이브리드(hybrid) 방식 : Hello.java 소스 파일을 Java Compiler에 load 한다. $ javac Hello.java 명령어로 컴파일해서 Hello.class 파일로 만든다. 이 파일은 가상 기계어(중간언어, = bytecode = p-code = IR (Intermediate Representation)) 이며, JVM에 load해서 $ java Hello 명령어로 OS에 실행한다.
이때 helllo.class 까지는 컴파일 방식, 이후부터는 인터프리터 방식이다.
자바의 캐치프레이즈 "Write Once, Run Anywhere!"
Hybrid 방식을 도입한 이유
순수 컴파일 방식보다 나은 이유
① OS 마다 따로 컴파일 할 필요가 없다. 동일한 바이트코드 생성
② OS용 JVM이 설치되어 있다면 실행할 수 있다.
순수 인터프리터 방식보다 나은 이유
③ 컴파일 과정에 문법의 오류를 모두 찾아낸다 → 실행할 때마다 문법 오류 검사를 하는 순수 인터프리터 방식보다 실행속도가 빠르다
④ 완전 기계어는 아니지만 기계어에 가까운 언어로 변환된 명령을 실행하기 때문에 소스에 작성된 명령을 실행하는 것보다 실행속도가 빠르다.
Hello.java 소스 파일을 컴파일해서 Hello.class 바이트코드(가상 기계어)로 만든다. 여기서 컴파일 할때
-문법 검사 수행 → 문법 오류를 모두 찾아낸다
-최적화 → 실행 성능 향상
Hello.class 파일을 window용 JVM 을 이용해서 Windows에서 실행한다.
mac용 JVM 을 이용해서 mac OS에서 실행한다.
Linux용 JVM 을 이용해서 Linux에서 실행한다.
여기서 JVM을 바이트코드 플레이어
인터프리터
런타임 엔진
버추얼 머신이라 한다.
LLVM 컴파일
Low Level Virtual Machine
① LLVM 이전
같은 언어 hello.c 를 윈도우용 C Compiler를 이용해 기계어로 바꾸고 Windows에서 실행한다.
같은 언어 hello.c 를 맥용 C Compiler를 이용해 기계어로 바꾸고 macOS에서 실행한다.
같은 언어 hello.c 를 리눅스용 C Compiler를 이용해 기계어로 바꾸고 Linux에서 실행한다.
→ 컴파일러를 만드는 입장에서 C 언어를 해석하는 부분은 같다. 중복 개발이다.
다른 언어 hello.c 를 C Compiler를 이용해 기계어로 바꾸고 Windows에서 실행한다.
다른 언어 hello.cpp 를 C++ Compiler를 이용해 기계어로 바꾸고 Windows에서 실행한다.
다른 언어 hello.py 를 Python Compiler를 이용해 기계어로 바꾸고 Windows에서 실행한다.
→ 컴파일러를 만드는 입장에서 기계어로 바꾸는 부분은 같다.
기존 방식의 문제점
Compiler 제작자는 C 언어, C++ 언어, Python 언어, ... 를 알아야 한다.
또한 Windows + Intel CPU, Window + ARM CPU, ... 를 알아야 한다.
→ 여러 언어와 여러 기계어를 다뤄야 하는 부담이 있다.
LLVM 방식을 사용하는 이유
새 프로그래밍 언어와 컴파일러를 만들기 쉽다.
② LLVM 이후
C 언어, C++ 언어, Python 언어, ...를 컴파일하여 IR(Intermediate Representation, 중간언어)로 바꾼다 -- 1단계 컴파일
→ 컴파일러 제작자는 한 개의 기계어(가상기계어)만 다루면 된다.
IR 을 컴파일하여 Windows + Intel, Windows + ARM, Linux + Intel, Linux + ARM, ... 로 바꾼다 -- 2단계 컴파일
→ 컴파일러 제작자는 한 개의 언어(가상기계어)만 다루면 된다.
LLVM 컴파일 과정
C 소스 hello.c 를 컴파일해서 .ll, .bc LLVM Assembly (= LLVM bitecode = LLVM bytecode) 로 바꾼다 -- Front-end
명령어 최적화 한다 -- Middle-end
이를 컴파일하여 기계어로 바꾼다 -- Back-end
C언어에서 Front-end 의 대표 컴파일러는 clang 컴파일러이다.
Java와 LLVM
Java 소스파일인 .java를 컴파일하면 bytecode인 .class가 만들어진다.
kotlin 소스파일인 .kt를 컴파일하면 같은 .class가 만들어 진다.
Groovy 소스파일인 .groovy를 컴파일하면 같은 .class가 만들어 진다.
Scala 소스파일인 .scala를 컴파일하면 같은 .class가 만들어 진다.
→ 이 언어들을 자바 호환 언어라 한다.
.class 파일은 JVM을 거쳐 실행한다.
JDK, JRE, JVM
JDK, JRE는 제품명이다.
.class는 JVM(java.exe)이 있어야 실행된다.
.class는 Java Library를 call 한다. 그러려면 JVM에서도 Java Library가 필요하다.
JVM 와 Java Library를 믂어 JRE(Java Runtime Environment)라 한다.
JVM, Java Library에 개발 도구(컴파일러 - 예 javac.exe , 디버거 등)를 포함한 것을 JDK(Java Development Kit)라 한다.
Java EE, Java SE, Java ME
Java EE (Enterprise Edition) → 기업용 Application 제작에 필요한 도구 (Servlet/JSP API, EJB, Web Service, ...)
Java SE (Standard Edition) → Java App. 제작 필수 도구 → JDK, JRE, Server 용 JRE (JRE without UI API + 서버 전용 도구)
Java ME (Micro Edition) → 임베디드(embedded) App. (H/W에 삽입되는 App) 제작에 필요한 도구
→ 이것 모두 제품 분류명이다.
우리는 굵은 글씨 두 개 사용한다.
Eclipse IDE
Eclipse IDE는 개발 플랫폼이다. 여기에 plug-in(JDT, CDT, ...)을 더하면 개발 도구 확장이 된다.
Java Project 폴더 준비
① 프로젝트 폴더 생성
c:\Users\bitcamp\git\bitcamp-ncp\
→ boot-app\ (boot-project에서 변경)
② 'boot-app\' 폴더를 Java 프로젝트 폴더로 초기화
PS C:\Users\bitcamp\git\bitcamp-ncp\boot-app> gradle init # 자바 프로젝트 폴더로 만들기
Welcome to Gradle 7.6!
Here are the highlights of this release:
- Added support for Java 19.
- Introduced `--rerun` flag for individual task rerun.
- Improved dependency block for test suites to be strongly typed.
- Added a pluggable system for Java toolchains provisioning.
For more details see https://docs.gradle.org/7.6/release-notes.html
Starting a Gradle Daemon (subsequent builds will be faster)
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3
Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1
Select build script DSL: # Domain-Specific Language
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
# Enter
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 1
Project name (default: boot-app): # Enter
Source package (default: boot.project): bitcamp.bootapp
> Task :init
Get more help with your project: https://docs.gradle.org/7.6/samples/sample_building_java_applications.html
BUILD SUCCESSFUL in 15m 47s
2 actionable tasks: 2 executed
패키지 → 회사.프로젝트명 (회사: 도메인 명)
bitcamp.bootapp
bitcamp.co.kr.bootapp → kr.co.bitcamp.bootapp 에서 kr.co 생략
③ 기본 예제 프로그램 실행
PS C:\Users\bitcamp\git\bitcamp-ncp\boot-app> gradle -q run
Hello World!
boot-app 폴더 구조는 다음과 같다.
SpringBoot 프로젝트 만들기
spring.io 사이트 방문 → Spring Boot 메뉴 → Spring Initializr 실행
아래와 같이 설정한다.
Dependencies 를 ADD 해서 3가지를 추가한다.
EXPLORE 에서 필요한 코드 복사한다. 세부적인 내용을 알 필요는 없다.
// bitcamp-ncp\boot-app\app\build.gradle
// Gradle 도구의 기능을 확장하는 설정
plugins {
// Gradle 에서 자바 애플리케이션을 실행시킬 수 있도록 기능을 추가한다.
id 'application' // java 플러그인 포함
// id 'java'
// Gradle 에서 스프링부트를 다룰 수 있도록 기능을 추가한다.
id 'org.springframework.boot' version '3.0.1'
// Gradle 에서 스프링부트 의존 라이브러리를 다룰 수 있도록 기능을 추가한다.
id 'io.spring.dependency-management' version '1.1.0'
}
// 배포 파일(.jar, .zip 등)을 만들 때 사용할 이름 설정
group = 'bitcamp'
version = '0.0.1-SNAPSHOT'
// 애플리케이션 개발에 사용하는 자바 언어의 최대 버전 설정. 예) 17버전까지의 문법만 사용!
sourceCompatibility = '17'
// Spring Configuration Processor 설정 정보
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
// 의존 라이브러리가 업로드 되어 있는 서버 정보
// 이 서버에서 라이브러리 파일을 다운로드 할 것이다.
repositories {
mavenCentral() // https://repo.maven.apache.org/maven2/
}
// 애플리케이션에서 사용하는 외부 라이브러리 정보
dependencies {
// Spring Boot 기본 라이브러리
implementation 'org.springframework.boot:spring-boot-starter-web'
// 개발하는 동안 사용하는 라이브러리
// 배포 파일을 만들 때 제외된다.
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// 스프링부트 관련 애노테이션 처리 라이브러리
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
// 단위테스트 할 때 사용하는 라이브러리
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'junit:junit:4.13.2'
// 일반 용도의 유틸리티 라이브러리
implementation 'com.google.guava:guava:31.1-jre'
}
// 애플리케이션 테스트에 사용할 단위 테스트 프레임워크 설정
tasks.named('test') {
useJUnitPlatform()
}
// run 명령으로 실행시킬 자바 클래스 이름
application {
mainClass = 'bitcamp.bootapp.App'
}
README.md 파일 및 applicaton.properties 를 추가한다.
Spring Boot Quick Start Guide에서 코드 추가한다.
// bitcamp-ncp\boot-app\app\src\main\java\bitcamp\bootapp\App.java
package bitcamp.bootapp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@GetMapping("/hello")
public String hello() {
return "Hello, world";
}
}
gradle run 후에 localhost:8080/hello 에 들어가서 보면 다음과 같이 나온다.
PS C:\Users\bitcamp\git\bitcamp-ncp\boot-app> gradle -q run
Java 에서 Spring Boot 까지
서버는 Spring Boot, 클라이언트는 Web Browser(HTML, CSS, JavaScript, jQeury, Bootstrap, ...)로 한다.
위 모든 것들은 Java에서 돌아간다.
조언
*TOPCIT 시험이라고 있다.
과제
/
'네이버클라우드 AIaaS 개발자 양성과정 1기 > Java' 카테고리의 다른 글
[Java] 예제 소스 정리 - 연산자(산술, 논리, 비트, 조건, 증감, 할당) (0) | 2022.12.29 |
---|---|
[Java] 예제 소스 정리 - 변수(원시 변수, 레퍼런스 변수, 형변환) (0) | 2022.12.29 |
[비트캠프] 39일차(8주차4일) - Java(변수, 메모리), myapp-01~02 (0) | 2022.12.29 |
[비트캠프] 38일차(8주차3일) - Java(클래스, public, import, main(), javadoc, 애노테이션, 리터럴, 부동소수점) (0) | 2022.12.28 |
[비트캠프] 37일차(8주차2일) - Java(gradle 디렉토리 구조와 사용, Eclipse IDE 준비, 소스 및 class 파일) (0) | 2022.12.27 |