스프링부트

4장 롬복과 리팩터링

hpehpeyy 2025. 1. 15. 22:01

4.1 롬복이란

 

롬복(lombok)이란 코드를 간소화해 주는 라이브러리입니다. 개발하다 보면 getter(), setter(),constructor(), toString()과 같은 필수 메서드를 사용하기 마련인데요. 이를 매번 작성하는 것은 생각보다 번거롭습니다. 스마트하지만 게으른 개발자들은 이런 반복을 없애려 했고, 그래서 나온 도구가 바로 롬복입니다.

 

롬복을 사용하면 필수 코드를 간편하게 작성할 수 있습니다. 또 로깅 기능을 통해 println() 문을 개선할 수 있습니다. 로깅(logging)이란 프로그램의 수행 과정을 기록으로 남기는 것을 말하는데, 일종의 자동차 블랙박스와 같습니다.

롬복의 기능

 

이 장에서는 롬복으로 코드를 리팩터링해 보겠습니다. 리팩터링(refactoring)이란 코드의 기능에는 변함이 없이 코드의 구조 또는 성능을 개선하는 작업을 말합니다.


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

지금까지 폼 데이터를 저장하기 위해 여러 코드를 작성했습니다. controller를 만들고 dto, entity, repository 등도 작성했습니다. 이번 실습에서는 롬복을 활용해 늘어진 코드를 간소화하고 println() 문을 로깅으로 변환해 보겠습니다.

 

4.2.1 롬복 설치하기

1. 프로젝트 탐색기에서 firstproject > src 아래를 보면 build.gradle 파일이 있습니다. 파일명 앞에 코끼리 아이콘이 있는데요, 롬복은 여기에 추가합니다. 더블클릭해서 코드를 엽니다.

 

2. 코드 중간에 dependencies {} 블록이 보입니다. 여기에는 프로젝트를 생성할 때 추가한 도구들이 적혀 있습니다. 웹 서비스를 만들기 위해 추가한 web 도구와 mustache, jpa, h2database를 확인할 수 있는데, 롬복도 여기에 추가합니다. 다음과 같이 compileOnly...,annotationProcessor...로 시작하는 코드를 작성합니다.

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'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

 

3. 편집기에 나타난 코끼리 모양의 새로 고침 아이콘을 클릭합니다. 추가한 코드를 감지해 롬복 관련 라이브러리를 인터넷에서 자동으로 다운로드합니다.

 

4. 상태 표시줄에 다운로드 현황이 표시됩니다. 다운로드가 끝난 후 오른쪽에 [Gradle] 탭을 클릭하면 롬복이 포함된 것을 확인할 수 있습니다.

 

이제 롬복을 사용할 준비가 끝났으니 코드를 리팩터링해 보겠습니다.

 

4.2.2 DTO 리팩터링하기

먼저 리팩터링할 대상은 DTO입니다.

 

1. 프로젝트 탐색기에서 com.example.firstproject > dtt > ArticleForm을 엽니다. 코드를 보면 ArticleForm() 생성자와 toString() 메서드가 있습니다. 먼저 ArticleForm() 생성자를 간소화해 보겠습니다.\

 

 (1) ArticleForm() 생성자 코드 전체를 지웁니다.

 

 (2) ArticleForm 클래스 위에 @AllArgsConstructor 어노테이션을 추가합니다. 이렇게 하면 클래스 안쪽의 모든 필드, 즉 title과 content를 매개변수로 하는 생성자가 자동으로 만들어집니다. 이전의 생성자 코드 4줄이 1줄로 대체되는 것이죠.

@AllArgsConstructor
public class ArticleForm {
    private String title; //제목을 받을 필드
    private  String content; //내용을 받을 필드

 

2. toString() 메서드를 간소화해 보겠습니다.

 

 (1) toString() 메서드 코드 전체를 지웁니다.

 

 (2) @ToString 어노테이션을 추가합니다. 이렇게 하면 toString() 메서드를 사용하는 것과 같은 효과가 납니다.

@AllArgsConstructor
@ToString
public class ArticleForm {
    private String title; //제목을 받을 필드
    private  String content; //내용을 받을 필드

 

3. 제대로 동작하는지 확인해 보겠습니다. 서버를 실행합니다. localhost:8080/articles/new에 접속한 후 제목은 qqqqq, 내용은 11111을 입력하고 [Submit] 버튼을 클릭합니다. 인텔리제이 실행창의 [Run] 탭에 가 보면 결과가 잘 출력되는 것을 확인할 수 있습니다.

 

4. 폼 데이터로 전송한 내용이 DB에도 잘 들어갔는지 확인해 보겠습니다. 웹 브라우저에서 새 탭을 열고 localhost:8080/h2-console에 접속합니다. JDBC URL은 서버를 켤 때마다 바뀌니 새로 입력해 줘야 합니다. [Run] 탭으로 돌아와 Ctrl+F를 눌러 jdbc를 검색합니다.

검색 결과를 복사한 후 웹 브라우저의 JDBC URL에 붙여 넣고 [Connect] 버튼을 클릭합니다.

 

5. DB에 접속해 ARTCLE 테이블을 실행해 보면 데이터가 잘 저장된 것을 확인할 수 있습니다.

 

4.2.3 엔티티 리팩터링하기

두 번째로 리팩터링할 대상은 엔티티입니다.

 

1. 프로젝트 탐색기에서 com.example.firstproject > entity > Article을 엽니다. 엔티티도 코드를 보면 Article() 생성자와 toString() 메서드가 있습니다. 두 코드를 지웁니다.

 

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

 (1) Article 클래스 위에 @AllArgsConstructor 어노테이션을 붙입니다. 이렇게 하면 클래스 안쪽의 모든 필드, 즉 id, title, content를 매개변수로 하는 생성자가 자동으로 만들어집니다.

 

 (2) toString() 메서드를 대체하는 @ToString 어노테이션을 붙입니다.

@AllArgsConstructor
@ToString
@Entity //1.엔티티 선언
public class Article {
    @Id //3.엔티티의 대푯값 지정
    @GeneratedValue //3.자동 생성 기능 추가(숫자가 자동으로 매겨짐)
    private Long id;

    @Column //2.title 필드 선언, DB 테이블의 title 열과 연결됨
    private String title;

    @Column //2.content 필드 선언, DB 테이블의 content 열과 연결됨
    private String content;
}

 

이렇게 해서 Article 엔티티 코드를 개선해 봤습니다.

 

4.2.4 컨트롤러에 로그 남기기

세 번째로 리팩터링할 대상은 컨트롤러입니다. 프로젝트 탐색기에서 com.example.firstproject > controller > ArticleController를 엽니다. 코드를 보면 println() 문으로 확인하고 싶은 데이터를 출력하고 있는데요. 실제 서버에서는 절대 이렇게 하면 안 됩니다. println() 문으로 데이터를 검증하면 기록에 남지 않을뿐더러 서버의 성능에도 악영향을 끼칩니다.

 

println() 문을 사용하지 않으려면 어떻게 해야 할까요? 바로 로깅 기능을 사용하면 됩니다. 로깅은 자동차의 블랙박스와 같다고 했습니다. 자동차에서 일어나는 모든 순간을 블랙박스가 다 기록하듯이 로깅 기능을 이용하면 서버에서 일어나는 일을 모두 기록할 수 있습니다. 다시 말해 println() 문을 사용하면 데이터를 바로 출력해 볼 수 있지만, 나중에 따로 찾아볼 수는 없습니다. 하지만 로깅 기능으로 로그를 찍으면 나중에라도 그동안 찍힌 로그를 찾아볼 수 있습니다.

 

1. println() 문으로 데이터를 확인하는 부분을 로깅으로 대체해 보겠습니다. ArticleController 클래스 위에 @Slf4j 어노테이션을 추가합니다. Slf4j는 Simple Logging Facade for Java의 약자로, 이 어노테이션을 쓰면 로깅 기능을 사용할 수 있습니다.

@Slf4j //로깅 기능을 위한 어노테이션 추가
@Controller
public class ArticleController {
	(중략)
}

 

2. 로깅 어노테이션을 추가했으니 println() 문을 대체해 보겠습니다.

 (1) System.out.println(form.toString()); 문을 주석 처리합니다.

 

 (2) log.info(); 문을 작성합니다. info() 괄호 안에는 출력하기 원하는 form.toString()을 넣습니다.

@PostMapping("/articles/create")
    public String createArticle(ArticleForm form){
        log.info(form.toString()); //2.로깅 코드 추가
        //System.out.println(article.toString()); //1.기존 println() 문 주석처리

 

3. 같은 방식으로 나머지 println() 문을 로깅으로 대체합니다.

 (1) System.out.println(article.toString()); 문을 주석 처리하고 로깅 코드로 대체합니다.

 

 (2) System.out.println(saved.toString()); 문을 주석 처리하고 로깅 코드로 대체합니다.

//1.DTO를 엔티티로 변환
Article article = form.toEntity();
log.info(article.toString());//1.로깅 코드 추가
//System.out.println(article.toString()); //1.기존 println() 문 주석 처리
//2. 리파지터리로 엔티티를 DB에 저장
Article saved = articleRepository.save(article);
log.info(saved.toString());//2.로깅 코드 추가
//System.out.println(saved.toString());//2.기존 println() 문 주석 처리

 

4. 서버를 재시작해 잘 동작하는지 확인합니다. localhost:8080/articles/new에 접속한 후 제목은 aaaaa, 내용은 1111을 입력하고 [Submit]을 클릭합니다.

 

이와 같이 롬복을 사용하면 단순한 출력 기능 로그 시스템으로 바꿀 수 있습니다.