티스토리 뷰

728x90
반응형

JDK 17 설치

 

1. apt 업데이트

$ sudo apt-get update && sudo apt-get upgrade

apt : Advanced Packaging Tool *.deb 형식의 패키지들을 관리(설치, 삭제, 업데이트)해주는 툴

 

2. openjdk-11-jdk 설치

$ sudo apt-get install openjdk-17-jdk

OpenJDK는 "썬 마이크로시스템즈(Sun Microsystems)"가 만든 JDK의 오픈소스 프로젝트

 

3. 환경설정

$ vim ~/.bashrc

# 파일 맨 아래 부분에 2줄의 코드 추가
# ~/.bashrc
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
export PATH=$PATH:$JAVA_HOME/bin
# export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH --> 추후 외부 라이브러리 사용 시 필요하면

tomcat이 JAVA_HOME 변수를 사용하기 때문에 반드시 JAVA_HOME 변수가 시스템 변수에 정의

또한 쉘에서 java라는 키워드로 java를 실행하기 위해서 JAVA_HOME 디렉토리에 java 실행 파일이 위치해 있는 /bin을 추가하여 환경 변수를 등록

참고: .bashrc에 대해 알아보기

$ which java
/usr/bin/java
$ readlink -f /usr/bin/java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
$ dirname /usr/lib/jvm/java-11-openjdk-amd64/bin/java
/usr/lib/jvm/java-17-openjdk-amd64/bin
$ dirname /usr/lib/jvm/java-11-openjdk-amd64/bin
/usr/lib/jvm/java-17-openjdk-amd64
  • which : 실행 파일 경로 찾기
  • readlink -f : 심볼링 링크가 연결된 원본의 파일명
  • dirname : 입력된 경로(또는 경로+파일)로부터 디렉토리를 추출

위와 같이 하지 않고 /usr/lib/jvm/java-17-openjdk-amd64 경로를 직접 넣어줘도 됨

# 현재 실행된 쉘에 적용하기
$ source ~/.bashrc
$ echo $JAVA_HOME
/usr/lib/jvm/java-17-openjdk-amd64

4. 설정 후 자바 설치 확인하기

$ java -version
openjdk version "17.0.17" 2022-10-18
OpenJDK Runtime Environment (build 17.0.17+8-post-Ubuntu-1ubuntu220.04)
OpenJDK 64-Bit Server VM (build 17.0.17+8-post-Ubuntu-1ubuntu220.04, mixed mode, sharing)

버전 변경을 위한 Alternatives

Alternatives는 기본 커맨드의 심볼릭 링크를 관리해주는 리눅스 프로그램

PATH를 버전마다 직접 설정하는 대신 명령어로 쉽게 버전 변경이 가능

데비안 계열의 리눅스(우분투)에서는 update-alternatives가 제공

# 실행 파일을 등록하는 명령어
$ update-alternatives --install [symbolic link path] java [real path] number

# 11버전의 java를 등록하는 예시
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 2

# java 버전을 변경하는 옵션
$ sudo update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      auto mode
  1            /usr/lib/jvm/java-17-openjdk-amd64/bin/java      1         manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/bin/java       2         manual mode
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/java-17-openjdk-amd64/bin/java to provide /usr/bin/java (java) in manual mode

만약 위와 같이 했는데도 가끔 버전이 java8로 고정되어 바뀌지 않는데, 그 이유는 어떤 이유에서 인지 java8을 설치하면 which java의 경로가 /usr/lib/jvm/java-8-openjdk-amd64/bin//java로 바뀔 때가 있기 때문이다.

update-alternatives/usr/bin/java와 링크하고 있는 디렉토리를 변경해주기 때문에 자바의 버전이 비뀌지 않는다.

갑자기 왜 which java의 경로가 바뀌었냐면, 아래와 같이 환경변수 PATH/usr/lib/jvm/java-8-openjdk-amd64/bin/이 먼저 등록되어 있어서다.

$ echo $PATH
/usr/lib/code-server/lib/vscode/bin/remote-cli:/usr/lib/jvm/java-8-openjdk-amd64/bin/:/usr/lib/jvm/java-8-openjdk-amd64/bin/:/usr/lib/jvm/java-8-openjdk-amd64/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin

위와 같은 경우 환경 변수를 설정하는 파일들을 수정해 주거나, 그냥 아래와 같이 해당 디렉토리를 삭제하는 명령어를 수행하면 다시 which java의 경로가 /usr/bin/java로 변경된다.

$ which java
/usr/lib/jvm/java-8-openjdk-amd64/bin//java

$ sudo rm -rf /usr/lib/jvm/java-8-openjdk-amd64/
$ which java
/usr/bin/java
$ java -version
openjdk version "17.0.17" 2022-10-18
OpenJDK Runtime Environment (build 17.0.17+8-post-Ubuntu-1ubuntu220.04)
OpenJDK 64-Bit Server VM (build 17.0.17+8-post-Ubuntu-1ubuntu220.04, mixed mode, sharing)

프로젝트 생성

Code Server를 사용한다면 아래의 포스팅 글을 참고하여 Extensions 설치 및 프로젝트 생성 방법 참고

프로젝트 선택(Spring Initializr)

  • Project: Gradle - Groovy Project
  • Spring Boot: 3.0.0
  • Language: Java
  • Java: 17
  • groupId: com.example
  • artifactId: practice

Dependencies:

  • Spring Web
  • Thymeleaf

Gradle 전체 설정(build.gradle)

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.0'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

동작 확인

기본 메인 클래스 실행(src/main/java/com/example/practice/PracticeApplication.java)

package com.example.practice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class PracticeApplication {

    public static void main(String[] args) {
        SpringApplication.run(PracticeApplication.class, args);
    }

}

스프링 부트 메인 실행 후 에러페이지로 간단하게 동작 확인(http://퍼블릭 IPv4 주소:8080)

라이브러리 살펴보기

 

Gradle은 의존관계가 있는 라이브러리를 함께 다운로드 한다.

 

스프링 부트 라이브러리

  • spring-boot-starter-web
    • spring-boot-starter-tomcat: 톰캣 (웹서버)
    • spring-webmvc: 스프링 웹 MVC
  • spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
  • spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
    • spring-boot
      • spring-core
    • spring-boot-starter-logging
      • logback, slf4j

테스트 라이브러리

  • spring-boot-starter-test
    • junit: 테스트 프레임워크
    • mockito: 목 라이브러리
    • assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
    • spring-test: 스프링 통합 테스트 지원

View 환경설정

스프링 부트가 제공하는 Welcome Page 기능

static/index.html 을 올려두면 Welcome page 기능을 제공한다.

Spring Boot supports both static and templated welcome pages. It first looks for an index.html file in the configured static content locations. If one is not found, it then looks for an index template. If either is found, it is automatically used as the welcome page of the application.

Spring Boot는 정적 및 템플릿 시작 페이지를 모두 지원합니다. 먼저 구성된 정적 콘텐츠 위치에서 index.html 파일을 찾습니다. 하나가 없으면 인덱스 템플릿을 찾습니다. 둘 중 하나가 발견되면 자동으로 애플리케이션의 시작 페이지로 사용됩니다.

참고 : Spring 3.0.0 공식 문서

resources/static/index.html

<!DOCTYPE HTML>
<html>
    <head>
     <title>Hello</title>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
<body>
    Hello
    <a href="/hello">hello</a>
</body>
</html>

thymeleaf 템플릿 엔진

src/main/java/com/example/practice/controller/HelloController.java

@Controller
public class HelloController {

 @GetMapping("hello")
 public String hello(Model model) {
     model.addAttribute("data", "Hello~ ");
     return "hello";
 }
}

resources/templates/hello.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<title>Hello</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
	<p th:text="'안녕하세요. ' + ${data}" >안녕하세요~</p>
</body>
</html>

 

실행: http://퍼블릭 IPv4 주소:8080/hello

 

컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버( viewResolver )가 화면을 찾아서 처리한다.

  • 스프링 부트 템플릿엔진 기본 viewName 매핑
  • resources:templates/ +{ViewName}+ .html

참고: spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다.

dependencies {
    // 추가
    compileOnly("org.springframework.boot:spring-boot-devtools")
}

빌드하고 실행하기

.jar 패키지 파일로 빌드한 후 java 명령어로 실행할 수 있음.

  1. $ ./gradlew build
  2. $ cd build/libs
  3. $ java -jar practice-0.0.1-SNAPSHOT.jar
  4. 실행 확인

References

728x90
반응형
댓글