기록방
4장 : 롬복과 리팩터링 본문
길벗 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 리팩터링하기
- ArticleForm의 생성자를 지우고, 클래스 선언 위에 @AllArgsConstructor 애노테이션 추가
- 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 : 어떤 파라미터도 가지지 않는 기본 생성자
- 롬복이 코드를 만드는 순서
- java 컴파일러가 소스파일을 파싱해 AST 트리를 만들기
- Lombok은 AnnotaionProcessor에 따라 AST트리를 동적으로 수정하고 새 노드를 추가하고 마지막으로 바이트 코드를 분석 및 생성
- 최종적으로 자바 컴파일러는 Lombok Annotation Processor에 의해 수정된 AST를기반으로 Byte Code를 생성
🥕 참고
728x90
'FrameWork > Spring' 카테고리의 다른 글
6장 : 게시판 내 페이지 이동하기 (0) | 2024.03.29 |
---|---|
5장 : 게시글 읽기: Read (0) | 2024.03.29 |
3장 : 게시판 만들고 새 글 작성하기: Create (2) | 2024.03.17 |
2장 : MVC 패턴 이해와 실습 (0) | 2024.03.10 |
1장 : 스프링 부트 시작하기 (0) | 2024.03.06 |