본문 바로가기

Dev/Spring

[Spring] Spring Boot 시작하기 (3) - Lombok 사용 기본

 

 

포스팅 시리즈

 

 

 

이번 포스팅에서는 Spring Boot에서 Lombok을 사용해 데이터 모델을 핸들링하는 기본 방법에 대해 다뤄보겠습니다.

lombok은 Java에서 데이터 모델을 더 효율적이고 간결하게 정의할 수 있도록 도와주는 편리한 라이브러리입니다.

 

보통의 경우, Java에서 데이터 모델을 정의 할 때는 아래와 같이 작성합니다.

 

// 기존의 모델 객체 정의 형태

class Salary{
    private int id;
    private String name;
    private String email;
    
    public void setId(int id){
    	this.id = id;
    }
    
    public int getId(){
    	return this.id;
    }
    
    public void setName(String name){
    	this.name = name;
    }
    
    public String getName(){
    	return this.name;
    }
    
    public void setEmail(String email){
    	this.email = email;
    }
    
    public String getEmail(){
    	return this.email;
    }
}

 

보통 private 변수를 선언하고 get, set 메서드를 통해 간접적으로 데이터에 접근하는 형태가 일반적입니다.

lombok 라이브러리를 사용하면 어노테이션을 추가해주는 것으로 get, set 메서드를 생성할 필요 없이 동일한 효과를 발휘하는 코드를 작성할 수 있습니다.

위 모델에 lombok을 적용 했을때의 코드는 아래와 같습니다.

 

// lombok 적용

@Data
class Salary{
    private int id;
    private String name;
    private String email;
}

코드를 보면 @Data 어노테이션이 추가되고 set, get 메서드가 없는 것을 확인할 수 있습니다.

과거의 방식과 비교했을 때 엄청나게 코드의 분량이 줄어든 것을 볼 수 있습니다.

 

@Data 어노테이션을 사용하면 클래스 내부에 있는 모든 변수에 get, set 메서드를 자동으로 생성해줍니다.

 

만약 모델 객체에서 일부에만 getter, setter 메서드를 적용해야 할 경우 아래와 같이 작성할 수 도 있습니다.

 

// lombok 적용

class Salary{
    @Getter @Setter private int id;
    @Getter @Setter private String name;
    private String email;
}

 

본 시리즈의 첫번째 포스팅에서 lombok 설치를 다뤘는데, 이번 포스팅에서도 재차 설명하겠습니다.

 

1. lombok 라이브러리 설치

아래의 사이트에서 lombok 설치 파일을 확보합니다.

projectlombok.org/download

 

Download

 

projectlombok.org

 

다운로드한 lombok.jar 파일을 더블 클릭해 설치를 진행합니다.

 

 

lombok 인스톨러가 자동으로 현재 PC에 설치되어있는 IDE를 스캔합니다.

만약 자신이 사용하고 있는 IDE가 스캔되지 않는다면 Spectify location 버튼을 눌러 수동으로 IDE 실행 파일 경로를 등록합니다.

 

2. build.gradle에 의존성 주입

build.gradle 파일을 열고 dependencies 블록 안에 아래의 의존성 정보를 삽입합니다.

 

//lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

 

의존성 정보가 입력되었다면 꼭 프로젝트 우 클릭 -> Gradle -> Refresh Gradle Project 버튼을 눌러 새로고침을 해 주어야 정상적으로 적용이 됩니다.

 

이것으로 lombok 라이브러리에서 제공해주는 어노테이션을 사용할 수 있습니다.

 

3. Model 객체 생성 및 lombok 적용

먼저, Model 객체를 관리할 파일을 생성합니다.

저는 com.example.demo.model 패키지를 생성하고 그 안에 SalaryModel이라는 이름의 Model Class를 생성하겠습니다.

그리고 SalaryModel의 데이터 구성을 아래 코드와 같이 지정합니다.

 

package com.example.demo.model;

import lombok.Data;

@Data
public class SalaryModel {
	private int id;
	private String name;
	private String email;	
}

 

이제 컨트롤러에서 이 모델을 호출해 데이터를 세팅해서 View로 전송해보겠습니다.

이전 포스팅에서 정의했던 HomeController에서 아래의 코드와 같이 SalaryModel을 호출하고 데이터를 삽입합니다.

 

@Controller
public class HomeController {
	@RequestMapping(value = "/home", method=RequestMethod.GET)
	public ModelAndView goHome(HttpServletRequest request) {
		ModelAndView mav = new ModelAndView();

		//salary 객체 리스트 변수
		List<SalaryModel> salaryList = new ArrayList<SalaryModel>();
		
		
		//Salary model
		SalaryModel salaryModel = new SalaryModel();
		
		// 첫 번째 데이터
		salaryModel = new SalaryModel();
		salaryModel.setId(1);
		salaryModel.setName("AAA");
		salaryModel.setEmail("AAA@example.com");		
		salaryList.add(salaryModel);
		
		
		// 두 번째 데이터
		salaryModel = new SalaryModel();
		salaryModel.setId(2);
		salaryModel.setName("BBB");
		salaryModel.setEmail("BBB@example.com");
		salaryList.add(salaryModel);

		
		// 세 번째 데이터
		salaryModel = new SalaryModel();
		salaryModel.setId(3);
		salaryModel.setName("CCC");
		salaryModel.setEmail("CCC@example.com");
		salaryList.add(salaryModel);
		
		
		mav.addObject("salaryList",salaryList);
		mav.setViewName("content/home");
		
		return mav;
	}
}

 

총 3개의 모델 데이터를 리스트에 삽입하고 ModelAndView 객체의 allObject 메서드를 통해 home.html로 데이터를 보내고 있습니다.

 

이제, 컨트로러에서 보내주는 데이터를 페이지에 파싱 합니다.

<!-- home.html -->
<table border="1">
    <tr>
        <th>id</th>
        <th>name</th>
        <th>email</th>
    </tr>
    <th:block th:each="salary : ${salaryList}">
        <tr>
            <td th:text="${ salary.id }"></td>
            <td th:text="${ salary.name }"></td>
            <td th:text="${ salary.email }"></td>
        </tr>
    </th:block>
</table>

 

thymeleaf의 th:each를 통해 리스트를 순회하며 각 모델에 담겨 있는 id, name, email을 뿌려주고 있습니다.

이제 localhost:8080/home에 접속해서 데이터가 정상적으로 전달되었는지 확인합니다.

 

컨트롤러에서 정의한 값이 정상적으로 출력되고 있음을 확인했습니다.

 

4. Builder 어노테이션 사용

위 코드는 getter, setter를 사람이 직접 타이핑하는 것 외 모델을 사용하는 방식은 기존 방식과 크게 다르지 않음을 알 수 있습니다.

 

여기서, Model 객체에서 Builder 어노테이션을 추가하면 외부에서 약간 다른 스타일로 모델을 핸들링할 수 있습니다.

SalaryModel에 아래와 같이 @Builder 어노테이션을 추가해 주세요.

 

package com.example.demo.model;

import lombok.Builder;
import lombok.Data;

@Builder @Data
public class SalaryModel {
	private int id;
	private String name;
	private String email;	
}

 

이제, HomeController에서 데이터 get, set 함수를 아래와 같이 변경합니다.

 

@Controller
public class HomeController {
	@RequestMapping(value = "/home", method=RequestMethod.GET)
	public ModelAndView goHome(HttpServletRequest request) {
		ModelAndView mav = new ModelAndView();

		//salary 객체 리스트 변수
		List<SalaryModel> salaryList = new ArrayList<SalaryModel>();
		
		//salaryModle
		SalaryModel salaryModel;
		
		// 첫 번째 데이터
		salaryModel = SalaryModel.builder()
				.id(1)
				.name("AAA")
				.email("AAA@example.com").build();
		salaryList.add(salaryModel);
		
		
		// 두 번째 데이터
		salaryModel = SalaryModel.builder()
				.id(2)
				.name("BBB")
				.email("BBB@example.com").build();
		salaryList.add(salaryModel);

		
		// 세 번째 데이터
		salaryModel = SalaryModel.builder()
				.id(3)
				.name("CCC")
				.email("CCC@example.com").build();
		salaryList.add(salaryModel);
		
		
		mav.addObject("salaryList",salaryList);
		mav.setViewName("content/home");
		
		return mav;
	}
}

 

getter, setter와 비교했을 때 보다 깔끔하고 읽기 쉬운 코드로 변화한 것을 알 수 있습니다.

 

그런데, 이때 salaryModel에서 null을 허용하지 않는 데이터를 정의해야 할 때가 있습니다.

그때는 SalaryModel에 @NonNull 어노테이션을 추가해 주면 됩니다.

 

@Builder @Data
public class SalaryModel {	
	private int id;
	@NonNull private String name; // null 값을 허용하지 않는다.
	private String email;
}

 

이때, 이 name 변수의 값을 지정하지 않고 데이터를 빌드해버리면 어떻게 될까요?

 

 

위와 같이 non-null로 설정되었지만 null값이 세팅되었다고NullPointerException 예외가 발생합니다.

 

그렇다면 null 값이 들어왔을 때 기본값을 설정해 주어 exception이 발생하지 않도록 하고 싶을 수 있습니다.

이럴 경우 어떻게 해야 할까요?

그럴 때는 @Builder.Default 어노테이션을 사용하면 됩니다.

 

package com.example.demo.model;

import lombok.Builder;
import lombok.Data;
import lombok.NonNull;

@Builder @Data
public class SalaryModel {	
	private int id;	
	@NonNull @Builder.Default private String name = "NULL NAME";
	private String email;
}

 

만약 name 값이 null인 상태로 빌드가 되면 자동으로 "NULL NAME" 값이 삽입 되게 됩니다.

 

 

여기까지 lombok을 사용하는 기본 방법에 대해 포스팅해 보았습니다.

lombok은 포스팅에서 설명한 기능 외에도 다양한 기능을 지원합니다.

향후 이 lombok의 기능에 대해 더 상세히 다뤄보겠습니다.

 

lombok에 대해 자세히 알고 싶으신 분들은 아래의 링크를 참고해 주세요.

www.projectlombok.org/features/all

 

Stable

 

www.projectlombok.org

 

다음 포스팅에서는 Spring Boot와 Mysql 연동 방법에 대해 다뤄보도록 하겠습니다.