기록방

4장 : 롬복과 리팩터링 본문

FrameWork/Spring

4장 : 롬복과 리팩터링

Soom_1n 2024. 3. 22. 22:14

길벗 IT도서에서 주관하는 코딩 자율학습단 8기 : Spring Boot 파트에 참여한 기록입니다 [ 목록 ]

4.1 롬복이란

  • **롬복(lombok)**이란 코드를 간소해주는 라이브러리
    • 개발하다 보면 getter(), setter(), constructor(), toString() 과 같은 필수 메서드를 사용
    • 매번 작성할 필요 없도록 나온 도구가 롬복
    • Slf4j를 이용한 로깅 가능
  • **로깅(logging)**이란 프로그램의 수행 과정을 기록으로 남기는 것
    • println() 문을 개선

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

4.2.1 롬복 설치하기

  • build.gradle에 롬복 의존성 추가
    • compileOnly 'org.projectlombok:lombok'
    • annotationProcessor 'org.projectlombok:lombok'
  • 오류발생
    • 롬복과 JDK 버전이 안맞는듯
    • 뒤에 1.18.30으로 버전 명시해 주면 해결
    compileOnly 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'
    
  • Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'

4.2.2 DTO 리팩터링하기

  1. ArticleForm의 생성자를 지우고, 클래스 선언 위에 @AllArgsConstructor 애노테이션 추가
  2. toString() 메서드도 지우고, @ToString 애노테이션 추가

4.2.3 엔티티 리팩터링하기

  • DTO와 마찬가지로 @AllArgsConstructor 와 @ToString 애노테이션 추가

4.2.4 컨트롤러에 로그 남기기

  • 컨트롤러에 println()을 사용했는데, 실제 서버에서 사용하면 안됨
  • 데이터 검증 기록이 남지 않을 뿐더러 서버 성능에도 악영향
  • 컨트롤러 코드 수정
    • @Controller 위에 @Slf4j 애노테이션 추가
    • Slf4j는 Simple Logging Facade for Java의 약자
    • println()문도 log.info()로 대체
    @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());
    //        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 "";
        }
    }
    
    
  • 로그 찍힌 모습
    • 시간 정보도 남는다.

🚀 1분 퀴즈

다음 빈칸에 들어갈 용어를 찾아 쓰세요

  • ( build.gradle ) : 롬복을 설치하기 위해 값 변경이 필요한 파일
  • ( @AllArgsConstructor ) : 모든 필드를 매개변수로 하는 생성자를 만드는 롬복 애노테이션
  • ( @ToString ) : toString() 메서드를 대체하는 롬복 애노테이션
  • ( @Slf4j ) : 로깅 기능을 사용하기 위해 필요한 롬복 애노테이션
  • ( log.info() ) : 출력되기 원하는 데이터를 로그로 찍기 위해 사용하는 구문

✅ 셀프 체크

  • Member 컨트롤러와 DTO도 리팩터링하기
package com.example.firstproject.controller;

import com.example.firstproject.dto.MemberForm;
import com.example.firstproject.entity.Article;
import com.example.firstproject.entity.Member;
import com.example.firstproject.repository.MemberRepository;
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 MemberController {
    @Autowired
    private MemberRepository memberRepository;

    @GetMapping("/member/new")
    public String newMemberForm() {
        return "members/new";
    }
    @PostMapping("/member/join")
    public String regist(MemberForm form) {
        log.info(form.toString());
//        System.out.println(form.toString());

        // 1. DTO를 엔티티로 변환
        Member member = form.toEntity();
        log.info(member.toString());
//        System.out.println(member.toString());

        // 2. 레포지토리로 엔티티를 DB에 저장
        Member saved = memberRepository.save(member);
        log.info(saved.toString());
//        System.out.println(saved.toString());
        return "";
    }
}

package com.example.firstproject.dto;

import com.example.firstproject.entity.Member;
import lombok.AllArgsConstructor;
import lombok.ToString;

@AllArgsConstructor
@ToString
public class MemberForm {
    private String email; 
    private String password; 

    public Member toEntity() {
        return new Member(null, email, password);
    }
}

🏓 더 알아 볼 내용

1. 리팩터링

  • 리팩터링 : 결과의 변경 없이 코드의 구조를 재조정함
    • 코드의 가독성을 높이고 유지 보수를 편하게 하기 위해 시행
  • 리팩터링의 바이블이라 불리는 마틴 파울러의 <Refactoring>이라는 책을 보면 다양한 패턴이 정리되어 있는데, 여기서 살펴볼 것은 ‘메서드 추출’
    • 메서드 추출 패턴 : 같은 기능을 하는 로직을 하나의 메서드로 만들어 사용

2. @AllArgsConstructor, @NoArgsConstructor

  • @AllArgsConstructor : 모든 필드를 파라미터로 가지는 생성자
  • @NoArgsConstructor : 어떤 파라미터도 가지지 않는 기본 생성자
  • 롬복이 코드를 만드는 순서
    1. java 컴파일러가 소스파일을 파싱해 AST 트리를 만들기
    2. Lombok은 AnnotaionProcessor에 따라 AST트리를 동적으로 수정하고 새 노드를 추가하고 마지막으로 바이트 코드를 분석 및 생성
    3. 최종적으로 자바 컴파일러는 Lombok Annotation Processor에 의해 수정된 AST를기반으로 Byte Code를 생성

🥕 참고

롬복: https://projectlombok.org/features/constructor

728x90