목표: 롬복을 활용해 기존 코드를 리팩토링 하기 (기존 코드 간소화)
: 코드를 간소화 시켜주는 라이브러리
여러 필수 코드의 반복을 최소화.
: 코드의 구조, 성능을 개선하는 작업
Logging: 프로그램의 수행 과정을 기록으로 남기는 것. (자동차의 블랙박스📹 같은)
먼저 롬복을 설치해야 한다.
build.gradle파일에서 중요한 부분은 dependencies ➡️ 여기에 라이브러리를 추가할 수 있다.
프로그램 생성할 때 추가했던 도구(요리도구)들이 여기 들어가는 것.
Dependencies 안에 아래와 같은 코드를 추가해주고
// 롬복 추가
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
이러한 창이 있는데 코끼리를 눌러 새로고침 및 적용(?) 해주기
아래 사진과 같이 시간이 지나 적용이 되고나면 오른쪽 Gradle 창에서 lombok이 생긴 것을 확인할 수 있다.
인텔리제이 ➡️ help ➡️ find action ➡️ plugins 검색 ➡️ lombok 검색
나는 검색해도 나오지 않아서 installed 보니까 되어있네,,?
그리고 annotation processors 해줘야하는데 원래 밑에 경고창이 뜨면서 할 수 있다. 놓친 사람이 있다면
find action ➡️ Annotation Processors 검색 ➡️ Enable annotation processing 체크 박스 체크해기
롬복을 사용할 준비 완료!
DTO 디렉토리에 ArticleForm 파일을 만들어뒀었다. 여기서 생성자랑 toString()이랑 다 귀찮아. 그러면 이제 과감하게 내용(주석처리 한 내용)을 지우고 다음과 같이 코드(@AllArgs- 와 @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;
// 1. 생성자 삭제 (DTO 리팩토링)
// public ArticleForm(String title, String content) {
// this.title = title;
// this.content = content;
// }
// 2. toString() 메소드도 삭제
// @Override
// public String toString() {
// return "ArticleForm{" +
// "title='" + title + '\'' +
// ", content='" + content + '\'' +
// '}';
// }
public Article toEntity() {
// 새롭게 Article을 생성해 반환해주도록 함
// Article은 Entity클래스이므로
return new Article(null, title, content);
}
}
주석 부분은 다 삭제하도록 하기
이로써 코드의 가독성이 좋아지고 간결해졌다.
이제 서버 재실행 & 데이터 submit & DB를 h2-console로 확인 하면 데이터가 잘 나오는 것을 볼 수 있다. 아, 이때 h2-console url은 또 바뀌었으니 저번 시간처럼 찾아서 바꿔 넣어 connect 해주자.
entity 디렉토리의 Article 파일로 이동
(DTO와 마찬가지로) 아래와 같이 코드 구성(주석 처리된 부분은 완전삭제. 설명을 위해 남김)
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 // 대표값을 지정 (마치 주민등록번호처럼 title과 content가 달라도 구분짓도록)
@GeneratedValue // 1, 2, 3 ... 처럼 알아서 어노테이션
private Long id;
@Column
private String title;
@Column
private String content;
// 1. 생성자 삭제
// public Article(Long id, String title, String content) {
// this.id = id;
// this.title = title;
// this.content = content;
// }
// 2. toString method 삭제
// @Override
// public String toString() {
// return "Article{" +
// "id=" + id +
// ", title='" + title + '\'' +
// ", content='" + content + '\'' +
// '}';
// }
}
controller 디렉토리의 ArticleController 파일로 이동
지금껏 System.out.println으로 데이터를 찍어보고 있었다. 그러나 실제론 이렇게 절대 해서는 안된다.
➡️ 로깅 기능으로 대체
로깅: 블랙박스처럼 서버에서 일어나는 일들을 모두 기록할 수 있도록 하는 것
사용법:
public class Arti- {} 위에 @Slf4j코드를 추가. 이는 로깅을 위한 골뱅이(어노테이션)
이걸 해주었으면 이제 System.out.println을 지우고 log.info(원하는 데이터); 으로 바꾸기
즉,
System.out.println(form.toString()); ➡️ log.info(form.toString());
System.out.println(article.toString()); ➡️ log.info(article.toString());
System.out.println(saved.toString()); ➡️ log.info(saved.toString());
으로 코드 수정
서버가 동시에 두 개의 서버가 실행되지 않도록 조심!
서버는 한 번에 한 개의 서버만 실행되도록!
서버를 재실행 시켜 데이터를 두 개 넣어보았다. 이제 println으로 찍히지 않고 (println보다 다양한 정보를 포함한 채로)로깅으로 찍혀나온다.