백엔드/코딩 자율학습 스프링 부트 3 자바 백엔드 개발 입문 1~2장

4장. 롬복과 리팩터링

dlng23 2024. 12. 21. 14:29

4.1 롬복이란

롬복: 코드를 간소화해주는 라이브러리

롬복을 사용하면 필수 코드를 간편하게 작성할 수 있음

 

로깅: 프로그램의 수행 과정을 기록으로 남기는 것

리팩터링: 코드의 기능에는 변함이 없이 코드의 구조 또는 성능을 개선하는 작업

 

 

4.2 롬복을 활용해 리팩터링하기

롬복 설치하기

1. firstproject > src 아래에 build.gradle 파일명 앞에 코끼리 아이콘이 존재함을 볼 수 있음

이 파일에 롬복 추가 → 더블 클릭하여 코드 열기

 

2. dependencies {} 블록에 아래의 코드 추가

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

 

3.  편집기에 나타난 코끼리 모양의 새로고침 아이콘 클릭

(추가한 코드를 감지해 롬복 관련 라이브러리를 인터넷에서 자동으로 다운로드함)

 

4. 다운로드가 끝난 후 [Gradle] 탭을 클릭하면 롬복이 포함된 것을 확인할 수 있음

 

DTO 리팩터링하기

1. 프로젝트 탐색기에서 com.example.firstproject > dto > ArticleForm 열기

ArticleForm() 생성자와 toString() 메서드 존재 

 

ArticleForm() 생성자 간소화

  1. ArticleForm() 생성자 코드 전체 지움
  2. ArticleForm 클래스 위에 @AllArgsConstructor 어노테이션 추가
    title과 content를 매개변수로 하는 생성자가 자동으로 만들어짐

toString() 메서드 간소화

  1. toString() 메서드 코드 전체 지움
  2. @ToString 어노테이션 추가
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);
    }
}

 

2. 제대로 동작하는지 확인

localhost:8080/articles/new에 접속한 후 제목과 내용 입력하고 [Submit] 버튼 클릭

 

[Run] 탭에 가 보면 결과가 잘 출력되는 것을 확인할 수 있음

 

3. DB에도 잘 들어갔는지 확인

localhost:8080/h2-console 에 접속한 후 JDBC URL 새로 입력해주고 [Connect] 버튼 클릭

 

4. DB에 접속하여 ARTICLE 테이블을 실행해보면 잘 저장된 것을 확인할 수 있음

 

티티 리팩터링하기

1. com.example.firstproject > entity > Article 열기

Article() 생성자와 toString() 메서드 삭제

 

2. 삭제할 코드를 대체할 어노테이션 작성

 

Article 클래스 위에 @AllArgsConstructor 어노테이션 붙임

toString() 메서드 대체하는 @ToString 어노테이션 붙임

package com.example.firstproject.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.ToString;

@AllArgsConstructor
@ToString
@Entity
public class Article {
    @Id
    @GeneratedValue
    private Long id;
    @Column
    private String title;
    @Column
    private String content;
}

 

컨트롤러에 로그 남기기

com.example.firstproject > controller > ArticleController 열기

코드 내에서 println() 으로 확인하고 싶은 데이터를 출력하고 있음

실제 서버에서는 println() 문으로 데이터를 검증할 시 기록에 남지 않고 서버의 성능에도 악영향을 끼침

 

로깅 기능을 사용하여 println() 대체 가능

로깅 기능으로 로그를 찍으면 println()문과 달리 나중에라도 그동안 찍힌 로그를 찾아볼 수 있음

 

1. println() 문으로 데이터를 확인하는 부분을 로깅으로 대체

 

ArticleController 클래스 위에 @Slf4j 어노테이션 추가

Slf4j: Simple Logging Facade for Java

 

2. println() 문 대체

  1. System.out.println(form.toString()); 주석 처리
  2. log.info(); 문 작성
    info() 괄호 안에는 출력하기 원하는 form.toString() 넣음
더보기

@Slf4j 어노테이션을 추가하여도 log 부분에 빨간색으로 오류 표시

→ Settings Plugins marketplace에서 lombok을 install 하여 해결함 

3. 2와 같은 방식으로 다른 println()문을 로깅으로 대체

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
    private ArticleRepository articleRepository;

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

    @PostMapping("/articles/create")
    public String createArticle(ArticleForm form){
        log.info(form.toString());
        // System.out.println(form.toString());
        //1. DTO를 엔티티로 변환
        Article article =form.toEntity();
        log.info(article.toString());
        //System.out.println(article.toString());
        //2. 리파지터리로 엔티티를 DB에 저장
        Article saved = articleRepository.save(article);
        log.info(saved.toString());
        //System.out.println(saved.toString());
        return "";
    }
}

 

4. 서버를 재시작한 후 localhost:8080/articles/new에 접속한 후 제목과 내용을 입력하고 [Submit] 버튼 클릭

 

5. [Run] 탭에서 결과 확인

리팩터링 한 후에는 ArticleController가 어떤 데이터가 언제 저장됐는지 시간 정보도 남아있음을 확인할 수 있음