롬복과 리팩터링

OneTwoThree·2022년 10월 14일
0

유튜브

  • Lombok을 이용해서 코드를 리팩터링 할 수 있다.
  • 개발하다 보면 생성자, toString 등 코드 양이 많은데 Lombok을 이용해 이걸 간단하게 한다.
  • 리팩터링은 코드의 구조, 성능을 개선하는 작업이다.
  • 로깅은 프로젝트의 수행 과정을 기록으로 남기는 것이다.

lombok 라이브러리 추가

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

이렇게 추가해준다.
추가하고 우상단에 보면 코끼리 새로고침 아이콘이 뜨는데 그걸 해줘야함

추가한 내용을 새로고침 해서 인터넷에서 추가한 내용을 다운해줌

좀 기다리면 이렇게 lombok이 설치된 것을 확인할 수 있다.

lombok 플러그인 설치

상단 메뉴바 help > find action > plugins 검색
marketplace 가서 lombok 검색 해서 플러그인 설치하면 된다
그런데 2020.03 이후 버전은 lombok이 자체 설치되어 있음 그래서 나는 플러그인 설치는 따로 안했다.

file > settings > Build, Execution, Deployment > Compiler > Annotation Processors 로 이동

저거 체크하기
이렇게 하면 롬복을 사용할 준비 끝


lombok으로 코드 간소화

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 toEntitiy() {
        return new Article(null,title,content);
    }
}

전에 만든 dto의 ArticleForm 클래스다.
생성자랑 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 toEntitiy() {
        return new Article(null,title,content);
    }
}

이렇게바꿔준다
생성자를 @AllArgsConstructor가 toString을 @ToString이 대체해준다.

이렇게 바꾸고 서버 돌려서 실행해보면 잘 된다.

package com.example.firstproject.entity;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity  // 이 어노테이션을 붙여야 DB가 이 객체를 인식한다
public class Article {

    @Id // 각 객체를 식별하기 위한 Id임 (주민번호 같은거)
    @GeneratedValue // id를 1, 2, 3 ,.. 자동생성하기 위함
    private Long id;

    @Column //DB가 필드를 인식할 수 있게 해줌
    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 + '\'' +
                '}';
    }
}

엔티티 클래스인 Article 클래스

package com.example.firstproject.entity;


import lombok.AllArgsConstructor;
import lombok.ToString;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity  // 이 어노테이션을 붙여야 DB가 이 객체를 인식한다
@AllArgsConstructor
@ToString
public class Article {

    @Id // 각 객체를 식별하기 위한 Id임 (주민번호 같은거)
    @GeneratedValue // id를 1, 2, 3 ,.. 자동생성하기 위함
    private Long id;

    @Column //DB가 필드를 인식할 수 있게 해줌
    private String title;
    @Column
    private String content;

}

이렇게 바꿔준다.

로깅

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 // 스프링부트가 미리 생성한 객체를 가져다가 연결
    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());

        // 1. DTO를 Entitiy로 변환해야한다
        Article article = form.toEntitiy();
        System.out.println(article.toString());


        // 2. Repository에게 Entitiy를 DB안에 저장하게 한다
        Article saved = articleRepository.save(article);
        System.out.println(saved.toString());

        return "";
    }

}

ArticleController인데 지금까지 확인을 위해 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;

@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){
//        System.out.println(form.toString());
        // 로깅 기능으로 println 대체하자
        log.info(form.toString());



        // 1. DTO를 Entitiy로 변환해야한다
        Article article = form.toEntitiy();
        //System.out.println(article.toString());
        log.info(article.toString());

        // 2. Repository에게 Entitiy를 DB안에 저장하게 한다
        Article saved = articleRepository.save(article);
        //System.out.println(saved.toString());
        log.info(saved.toString());

        return "";
    }

}

클래스 위에 @Slf4j 추가
이걸 추가하면 로깅을 사용할 수 있다.
그리고 클래스 내에서 println을 log.info로 대체했다.

서버를 재실행하고 확인해보자.

이렇게 찍어준다
println으로 찍을 때보다 더 자세함

0개의 댓글