이전 컨트롤러 파일에서
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"; --- 실행한 후, 문자열을 바꿔도 리로딩되지 않는다.
}
}
프로그램을 수정하고, 변경된 사항을 확인하려면, 매번 서버를 재시작해야하기 때문이다.
이 문제를 해결하려면, Spring Boot Devtools 설치를 해야 한다.
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'
}
developmentOnly란?
- 개발 환경에만 적용되는 설정이다. 즉, 운영환경에 배포되는 jar, war 파일에는 developmentOnly 로 설치된 라이브러리는 제외된다.
작성 완료 이후 Gradle Refresh

좌측 하단에 재시작 누르고, 변경 적용되는지 확인해보자.

서버를 재시작 하지 않아도 문자열이 잘 출력된다.

문자열을 고치고, 새로고침을 하면 IDE에서는 리로딩되면서,
화면에서는 바뀐 문자열로 바뀐 것을 확인했다.

위에서는 새로고침을 해야만 변경된 내용을 확인할 수 있다.
(Chrome 확장프로그램) Live Reload 기능을 사용하면, 브라우저 리프레시 없이 변경사항을 확인할 수 있다.

확장 프로그램을 켜놓았고, 문자열을 바꿔보기로 한다.

약 2초 정도의 지연 시간이 있는 것 같으나, 빨리 바뀌는 편인 것 같다!
자바 클래스에 Getter, Setter, 생성자 등을 자동으로 (깔끔하게 소스코드를) 만들어주는 도구.
Intellij - 파일 - 설정

lombok 검색 후 확인
build.gradle 파일에 내용을 추가하자. 수정한 다음에는 gradle refresh과정을 하도록 하자.
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'
}
compileOnly : 해당 라이브러리가 컴파일 단계에서만 사용되도록 한다.
annotationProcessor : 컴파일 단계에서 애너테이션을 분석, 처리하기 위해 사용한다.
Getter, Setter 넣고 동작되는지 확인하자.

디렉토리는 다음과 같다.
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());
}
}
main 실행시키기
롬복으로 컴파일 된 클래스에는 Getter와 Setter 메서드가 실제로 포함된다.

main함수에 오른쪽 마우스 눌러서 실행시키기

우측 하단에 물어보길래 확인 눌렀다.... ㅋㅋㅋㅋㅋ

콘솔에 "헬로"와 5가 출력되는 것을 확인할 수 있다.
클래스 파일 수정하기
package com.mysite.sbb;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@RequiredArgsConstructor
@Getter
//@Setter
public class HelloLombok {
private final String hello;
private final int lombok;
public static void main(String[] args) {
HelloLombok helloLombok = new HelloLombok("hihi", 567);
//helloLombok.setHello("헬로");
//helloLombok.setLombok(5);
System.out.println(helloLombok.getHello());
System.out.println(helloLombok.getLombok());
}
}
@RequiredArgsConstructor
변수 hello, lombok 속성에 final을 적용하고, 롬복의 @RequiredArgsConstructor 애너테이션을 적용하면, 해당 속성을 필요로 하는 생성자가 롬복에 의해 자동으로 생성된다.
(✅ final이 없는 속성은 생성자에 포함되지 않는다)

final을 적용했기 때문에, @Setter는 의미가 없으며, Setter 메서드들도 사용할 수 없다. 한 번 설정한 값을 변경할 수 없게 하는 키워드이다.
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) : 스프링이 객체를 대신 생성하여 주입한다.