롬복(lombok)은 코드를 간소화해 주는 라이브러리이다. 개발을 하다 보면 getter(), setter(), constructor(), toString()과 같은 필수 메서드들을 사용하게 되는데, 이를 매번 작성하는 것은 생각보다 번거롭다. 그 반복을 없애기 위해 나온 도구가 바로 롬복이다.
필수 코드를 간편하게 작성할 수 있을 뿐만 아니라, 로깅 기능을 통해서 println()문을 개선할 수 있다.
우선 롬복 라이브러리를 받아 오기 위해 build.gradle 파일을 연다.
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
의존성에 이 두 코드를 입력하여 동기화를 하면, 롬복 라이브러리를 자동으로 다운로드 받아 준다.
우선 ArticleForm 클래스를 연다.
package com.example.firstproject.dto;
import com.example.firstproject.entity.Article;
public class ArticleForm {
private String title;
private String content;
// 전송받은 제목과 내용을 필드에 저장하는 생성자 추가
public ArticleForm(String title, String content) {
this.title = title;
this.content = content;
}
@Override
public String toString() {
return "ArticleForm{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
public Article toEntity() {
return new Article(null, title, content);
}
}
⬇️refactoring
package com.example.firstproject.dto;
import com.example.firstproject.entity.Article;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor // 새 어노테이션 추가
@ToString // 새 어노테이션 추가
public class ArticleForm {
private String title;
private String content;
public Article toEntity() {
return new Article(null, title, content);
}
}
이전 코드와 비교해보면, @AllArgsConstructor, @ToString 이렇게 두 어노테이션을 추가하였고, 생성자와 toString() 메서드를 삭제하여 코드가 매우 짧아졌다.
Article 클래스를 연다.
package com.example.firstproject.entity;
import jakarta.persistence.*;
@Entity
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String title;
@Column
private String content;
public Article(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
⬇️refactoring
package com.example.firstproject.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor // Article() 생성자 대체
@ToString // toString() 메서드 대체
@Entity
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String title;
@Column
private String content;
}
다음은 ArticleController다.
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
import com.example.firstproject.entity.Article;
import com.example.firstproject.repository.ArticleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class ArticleController {
@Autowired // 스프링 부트가 미리 생성해 놓은 리파지터리 객체 주입(DI)
private ArticleRepository articleRepository;
@GetMapping("/articles/new")
public String newArticleForm() {
return "articles/new";
}
@PostMapping("/articles/create")
public String createArticle(ArticleForm form) { // 폼 데이터를 DTO로 받기
System.out.println(form.toString()); // DTO에 폼 데이터가 잘 담겼는지 확인
// 1. DTO를 엔티티로 변환
Article article = form.toEntity();
System.out.println(article.toString()); // DTO가 엔티티로 잘 변환되는지 확인 출력
// 2. 리파지터리로 엔티티를 DB에 저장
Article saved = articleRepository.save(article); // article 엔티티를 저장해 saved 객체에 반환
System.out.println(saved.toString()); // article이 DB에 잘 저장되는지 확인 출력
return "";
}
}
⬇️refactoring
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
import com.example.firstproject.entity.Article;
import com.example.firstproject.repository.ArticleRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Slf4j // 로깅 기능
@Controller
public class ArticleController {
@Autowired // 스프링 부트가 미리 생성해 놓은 리파지터리 객체 주입(DI)
private ArticleRepository articleRepository;
@GetMapping("/articles/new")
public String newArticleForm() {
return "articles/new";
}
@PostMapping("/articles/create")
public String createArticle(ArticleForm form) { // 폼 데이터를 DTO로 받기
log.info(form.toString()); // 로깅 코드 추가
// 1. DTO를 엔티티로 변환
Article article = form.toEntity();
log.info(article.toString()); // 로깅 코드 추가
// 2. 리파지터리로 엔티티를 DB에 저장
Article saved = articleRepository.save(article); // article 엔티티를 저장해 saved 객체에 반환
log.info(saved.toString()); // 로깅 코드 추가
return "";
}
}
이렇게 바꿔주고 스프링 부트를 실행후, localhost:8080/articles/new 에서 값을 입력하면


이렇게 로그가 찍히는 걸 볼 수 있다.
그런데 이전 println()과는 달리, 어떤 데이터가 언제 저장 됐는지 시간 정보도 남게 된다.