롬복

이동영·2025년 6월 15일

웹개발

목록 보기
8/36

개념

롬복(lombok)은 코드를 간소화해 주는 라이브러리이다. 개발을 하다 보면 getter(), setter(), constructor(), toString()과 같은 필수 메서드들을 사용하게 되는데, 이를 매번 작성하는 것은 생각보다 번거롭다. 그 반복을 없애기 위해 나온 도구가 바로 롬복이다.
필수 코드를 간편하게 작성할 수 있을 뿐만 아니라, 로깅 기능을 통해서 println()문을 개선할 수 있다.

기존 코드 리팩터링

1. 라이브러리 설치

우선 롬복 라이브러리를 받아 오기 위해 build.gradle 파일을 연다.

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

의존성에 이 두 코드를 입력하여 동기화를 하면, 롬복 라이브러리를 자동으로 다운로드 받아 준다.

2. DTO 리팩터링

우선 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() 메서드를 삭제하여 코드가 매우 짧아졌다.

3. 엔티티 리팩터링

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;
}

4. 컨트롤러 리팩터링

다음은 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()과는 달리, 어떤 데이터가 언제 저장 됐는지 시간 정보도 남게 된다.

0개의 댓글