겉바속촉

[점프투스프링부트] 1-05. 스프링부트 도구 설치 본문

IT 일기 (상반기)/SPRING 기초

[점프투스프링부트] 1-05. 스프링부트 도구 설치

겉바속촉 2023. 2. 22. 11:21
728x90
반응형

 

점프투스프링부트 1-05

 

 

 

목표 : 스프링부트 개발을 도와주는 도구들에 대해서 알아보기

 

 

1. Spring Boot Devtools

먼저 스프링부트 로컬 서버를 시작한 후 이전 장에서 작성했던 HelloController를 다음과 같이 수정

2023.02.21 - [IT 일기 (상반기)/SPRING 기초] - [점프투스프링부트] 1-04. 스프링부트 맛보기

 

[점프투스프링부트] 1-04. 스프링부트 맛보기

점프투스프링부트 1-04 목표 브라우저 주소창에 http://localhost:8080/hello 라는 URL을 입력했을 때 브라우저 화면에 "Hello World"라는 문구를 출력하는 웹 프로그램을 작성해 볼 것 이 프로그램이 동작하

2-juhyun-2.tistory.com

 

Hello World에서 Hello SBB로 수정합니다.

package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
	@GetMapping("/hello")
	@ResponseBody
	public String hello() {
		return "Hello SBB";
	}

}

 

하지만 http://localhost:8080/hello URL을 호출하더라도 여전히 "Hello World" 문자열이 출력되 것을 알 수 있습니다.

 

이유는 프로그램이 변경되더라도 로컬서버가 변경된 클래스를 리로딩하지 않기 때문입니다. 이것은 개발을 진행하는 동안에는 꽤 불편한 일이다. 프로그램을 수정하고 변경된 사항을 확인하려면 매번 서버를 재시작 해야 하기 때문이다. 이 문제를 해결하려면 Spring Boot Devtools를 설치해야 한다.

 

Spring Boot Devtools는 스프링부트 개발시 도움을 주는 도구이다. Spring Boot Devtools를 설치하면 서버 재시작 없이도 클래스 변경시 서버가 자동으로 재기동 된다.

Spring Boot Devtools를 사용하기 위해서는 그레이들(Gradle)로 설치해야 한다.

다음과 같이 build.gradle 파일을 수정하자.

 

dependencies 항목에 developmentOnly 'org.springframework.boot:spring-boot-devtools'를 추가했다.

 

 

[developmentOnly]

Gradle의 developmentOnly는 개발환경에만 적용되는 설정이다. 즉, 운영환경에 배포되는 jar, war 파일에는 developmentOnly로 설치된 라이브러리는 제외된다.

build.gradle 파일의 내용을 적용하려면 다음처럼 build.gradle 파일을 선택한후 오른쪽 마우스 버튼을 눌러 [Gradle -> Refresh Gradle Project]를 선택하여 필요한 라이브러리를 다운로드해야 한다.

 

 

설치가 완료되면 다음과 같이 Boot Dashboard의 서버명이 sbb에서 sbb[devtools]로 바뀐다.

서버를 재시작한 후에 Spring Boot Devtools가 적용되었으니 브라우저에서 다시 http://localhost:8080/hello URL을 호출해 보자. 서버를 재시작 했기 때문에 "Hello SBB" 라는 문자열이 출력될 것이다.

서버 재시작 없이도 변경사항이 적용되는지 확인하기 위해 출력 문자열을 다시 변경하고 서버 재시작 없이 브라우저에서 해당 URL 호출해보자. 그럼 다음과 같이 바뀐 문자열에 출력되는 것을 알 수 있다.

 

 

 

2. Live Reload

HelloController의 출력 문자열을 변경하면 Spring Boot Devtools에 의해 수정사항이 잘 적용되는 것을 확인할 수 있었다. 하지만 브라우저 주소창에서 URL을 다시 호출하던가 브라우저 리프레시(Refresh)를 해야만 변경된 내용을 확인할 수 있다.

Spring Boot Devtools의 Live Reload 기능을 사용하면 브라우저 재호출(또는 리프레시) 없이 변경 사항을 확인할 수 있다. 다만 Live Reload 기능은 크롬 브라우저의 확장 프로그램을 통해서만 가능하다.

 

크롬 브라우저에 LiveReload++ 확장 프로그램을 설치하자.

그리고 크롬 브라우저 확장 프로그램 관리에서 다음처럼 LiveReload++를 사용하도록 설정하자.

 

이제 STS에서 프로그램을 수정하면 서버는 물론 브라우저도 리로딩되어 변경된 내용을 추가 작업 없이 즉시 확인할 수 있다.

 

 

 

3. 롬복

롬복(lombok)은 자바 클래스에 Getter, Setter, 생성자 등을 자동으로 만들어 주는 도구이다.

SBB 프로젝트를 진행하면서 데이터를 처리하기 위한 엔티티 클래스나 DTO 클래스등을 사용해야 하는데 이때 클래스의 속성들에 대한 Getter, Setter를 만들어야 한다. 물론 Getter, Setter 메서드를 직접 만들어도 되지만 롬복(lombok)을 사용하면 좀 더 깔끔한 소스코드를 만들수 있다.

 

<롬복 설치>

롬복을 사용하려면 플러그인을 먼저 설치 해야한다. 다음의 URL에서 롬복 플러그인을 다운로드하자.

그리고 다운로드한 lombok.jar 파일을 다음과 같이 설치하자.

D:\Downloads>java -jar lombok.jar

 

그러면 다음과 같은 경고 메시지가 나타난다.

롬복 플러그인이 설치된 IDE를 찾을 수 없다는 경고 메시지이다. "확인"을 눌러 메시지창을 닫자. 그러면 다음과 같은 화면이 나타난다.

 

 다음 순서로 롬복을 설치하자.

  1. "Specify location"을 눌러 롬복 플러그인을 사용할 IDE인 STS가 설치된 경로를 선택한다.

  1. "Install / Update"를 눌러 롬복 플러그인을 설치한다.
  2. "Quit Installer"를 눌러 설치 프로그램을 종료한다.

 

 

그리고 STS를 종료하고 다시 시작한후 build.gradle 파일을 다음과 같이 수정하자.

(... 생략 ...)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

(... 생략 ...)

롬복 관련 라이브러리를 설치하고 컴파일시 롬복이 적용되도록 했다.

build.gradle 파일을 수정한 후에는 반드시 [Gradle -> Refresh Gradle Project]를 선택하여 라이브러리를 다운로드 해야 한다.

 

compileOnly

build.gradle 파일의 compileOnly는 해당 라이브러리가 컴파일 단계에서만 필요한 경우에 사용한다.

 

annotationProcessor

컴파일 단계에서 애너테이션을 분석하고 처리하기 위해 사용한다.

 

 

 

<Getter, Setter>

 

다음처럼 HelloLombok 클래스를 작성하여 롬복이 정상적으로 동작하는지 확인해 보자.

아래 코드 작성시 오류가 없어야 한다.

[파일명:/sbb/src/main/java/com/mysite/sbb/HelloLombok.java]

package com.mysite.sbb;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class HelloLombok {
	
	private String hello;
	private int lombok;
	
	public static void main(String[] args) {
		HelloLombok helloLombok = new HelloLombok();
		helloLombok.setHello("헬로");
		helloLombok.setLombok(5);
		
		System.out.println(helloLombok.getHello());
		System.out.println(helloLombok.getLombok());
	}

}

 

 

HelloLombok 클래스에 hello, lombok 2개의 속성을 추가한 후 클래스명 바로 위에 @Getter, @Setter라는 애너테이션을 적용했더니 Getter, Setter 메서드를 추가하지 않아도 setHello, setLombok, getHello, getLombok 등의 메서드를 사용할수 있게 되었다.

롬복으로 컴파일된 클래스에는 Getter와 Setter 메서드가 실제로 포함된다.

 

 

RequiredArgsConstructor

이번에는 HelloLombok 클래스를 다음과 같이 수정해 보자.

package com.mysite.sbb;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
public class HelloLombok {
	
	private final String hello;
	private final int lombok;
	
	public static void main(String[] args) {
		HelloLombok helloLombok = new HelloLombok("헬로", 5);
		System.out.println(helloLombok.getHello());
		System.out.println(helloLombok.getLombok());
	}
}

 

hello, lombok 속성에 final을 적용하고 롬복의 @RequiredArgsConstructor 애너테이션을 적용하면

해당 속성을 필요로하는 생성자가 롬복에 의해 자동으로 생성된다.

(※ final이 없는 속성은 생성자에 포함되지 않는다.)

final을 적용했기 때문에 @Setter는 의미가 없으며 Setter 메서드들도 사용할수 없다.
final은 한번 설정한 값을 변경할수 없게 하는 키워드이다.

 

즉, 다음과 같이 생성자를 직접 작성한 경우와 동일하다.

package com.mysite.sbb;

import lombok.Getter;

@Getter
public class HelloLombok {

    private final String hello;
    private final int lombok;

    public HelloLombok(String hello, int lombok) {
        this.hello = hello;
        this.lombok = lombok;
    }

    public static void main(String[] args) {
        HelloLombok helloLombok = new HelloLombok("헬로", 5);
        System.out.println(helloLombok.getHello());
        System.out.println(helloLombok.getLombok());
    }
}

@RequiredArgsConstructor 애너테이션은 이후 진행되는 챕터에서 의존성 주입(Dependency Injection)시 사용된다.

DI(Dependency Injection) - 스프링이 객체를 대신 생성하여 주입한다.

 

 

 

728x90
반응형