[Spring Boot] 롬복과 리팩터링

coldrice99·2024년 8월 29일
0

오늘은 스프링부트에서 롬복(Lombok)을 활용한 코드 리팩터링과 로깅 기능에 대해 학습했다. 롬복은 코드를 간소화하고 반복을 최소화해주는 라이브러리로, 이를 통해 코드의 가독성과 유지보수성을 크게 향상시킬 수 있다.

롬복(Lombok)이란?

롬복은 자바 코드에서 반복적으로 사용되는 필수 코드를 줄여주는 라이브러리이다. 이를 통해 코드를 간소화하고, 반복적인 코드 작성을 최소화할 수 있다. 특히, 롬복을 사용하면 로깅(logging) 기능도 쉽게 추가할 수 있는데, 이는 println 메서드를 대체하여 프로그램의 수행 과정을 기록으로 남기는 역할을 한다.

실습: 롬복을 사용한 리팩터링

이번 실습에서는 롬복을 활용하여 기존 코드를 리팩터링하고, println 메서드를 로깅으로 변환하는 작업을 진행했다.

1. 롬복 설치

먼저, 롬복을 설치해야 한다. build.gradle 파일의 dependencies 부분에 다음 코드를 추가한다:

dependencies {
    // 롬복 추가
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-mustache'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

이렇게 의존성을 추가하면, 롬복 라이브러리를 사용할 수 있다. 최신 IntelliJ IDE에서는 롬복 플러그인이 기본적으로 포함되어 있으므로, 별도의 플러그인 설치는 필요하지 않다.

2. DTO 리팩터링

첫 번째 리팩터링 대상은 DTO이다. dto/ArticleForm 파일에서 생성자와 toString 메서드를 롬복을 사용해 간소화할 수 있다.

리팩터링 전 코드:

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

리팩터링 후 코드:

@AllArgsConstructor
@ToString
public class ArticleForm {
    private String title;
    private String content;

    public Article toEntity() {
        return new Article(null, title, content);
    }
}

이렇게 하면 코드가 간결해지고, 가독성이 향상된다.

3. 엔티티 리팩터링

두 번째 리팩터링 대상은 엔티티이다. DTO와 마찬가지로, entity/Article 파일에서 롬복 어노테이션을 사용해 코드를 간소화한다:

리팩터링 전 코드:

@Entity
public class Article {
    @Id
    @GeneratedValue
    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 + '\'' +
                '}';
    }
}

리팩터링 후 코드:

@Entity
@AllArgsConstructor
@ToString
public class Article {
    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String title;

    @Column
    private String content;
}

생성자와 toString 메서드를 롬복 어노테이션으로 대체하여 코드를 간결하게 만들었다.

4. 컨트롤러에서 로깅 적용

세 번째 리팩터링 대상은 컨트롤러이다. 현재 ArticleController에서는 println을 사용해 데이터를 확인하고 있다. 하지만, 실제 서버 환경에서는 println을 사용하는 것이 적합하지 않다. 이는 기록이 남지 않고 성능에도 악영향을 미치기 때문이다.

이러한 문제를 해결하기 위해 로깅 기능을 사용한다. @Slf4j 어노테이션을 추가하면, log.info() 메서드를 사용할 수 있다:

리팩터링 전 코드:

@Controller
public class ArticleController {

    @Autowired
    private ArticleRepository articleRepository;

    @GetMapping("/articles/new")
    public String newArticleForm() {
        return "articles/new";
    }

    @PostMapping("/articles/create")
    public String createArticle(ArticleForm form) {
        System.out.println(form.toString());  // println() 으로 데이터 확인
        Article article = form.toEntity();
        System.out.println(article.toString());  // println() 으로 데이터 확인
        Article saved = articleRepository.save(article);
        System.out.println(saved.toString());  // println() 으로 데이터 확인
        return "";
    }
}

리팩터링 후 코드:

@Controller
@Slf4j // 로깅을 위한 롬복 어노테이션
public class ArticleController {

    @Autowired
    private ArticleRepository articleRepository;

    @GetMapping("/articles/new")
    public String newArticleForm() {
        return "articles/new";
    }

    @PostMapping("/articles/create")
    public String createArticle(ArticleForm form) {
        log.info(form.toString());    // println() 을 로깅으로 대체!
        Article article = form.toEntity();
        log.info(article.toString()); // println() 을 로깅으로 대체!
        Article saved = articleRepository.save(article);
        log.info(saved.toString());   // println() 을 로깅으로 대체!
        return "";
    }
}

println 메서드를 log.info()로 대체함으로써, 로그를 남기고 코드의 가독성을 높일 수 있다.

요약

이번 학습을 통해 롬복을 활용한 리팩터링로깅 기능을 익혔다. 롬복을 사용하여 반복적인 코드를 줄이고, 코드의 가독성을 높일 수 있었다. 또한, println을 로깅으로 대체하여 로그 시스템을 간단하게 구현할 수 있었다.


https://github.com/coldrice99/Spring-boot-study.git

profile
서두르지 않으나 쉬지 않고

0개의 댓글