[백엔드 첫 걸음] Lombok, Response (스프링)

khyojun·2022년 8월 8일
1
post-thumbnail

이번에는 Lombok이라는 라이브러리를 활용하여 코드들을 리팩토링하여보고 Response관련 코드를 알아보자.


1. Lombok

Lombok(롬복)은 Java 라이브러리로 반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리입니다.

예시코드를 한 번 보자.

public class HelloResponseDto {
    private final String name;
    private final Optional<Integer> amount;
    
    
    public String getName(){
    	this.name=name;
    }
    
    public Optional<Integer> getAmount(){
    	this.amount=amount;
    }
    
}

이런식의 코드가 기본적인 getter코드라고 할 수 있다. 그치만 Lombok의 어노테이션들을 활용을 하게 되면?

📂java/web/dto/HelloResponseDto.java

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
    private final String name;
    private final Optional<Integer> amount;
}

...?! 이게 지금 뭘까? 혁신인가? 너무 짧아졌는데? 이것이 지금 필드에 변수가 2개뿐이여서 그렇지 커다란 프로젝트나 대규모로 들어가게되면 진짜로 많이 짧아지겠다는 생각이 가장 많이 들게 되었다.

  • @getter : 선언된 모든 필드의 get메소드를 생성해 준다.
  • @RequiredArgsConstructor
    • 선언된 모든 final 필드가 포함된 생성자를 생성해 준다.
    • final이 없는 필드는 생성자에 포함되지 않는다.

맘대로 이렇게 리팩토링해도 될까?

그치만.... 이렇게 함부러 큰 프로젝트들에서 Lombok을 남발을 해버려도 될까?라는 생각이 드는데 찾아보니 사람들마다 다르긴한데 많은 사람들이 참여한 프로젝트에서 보게 되면은 직관적으로 코드를 보시기 위해서 일부러 사용하지 않고 남기시는 분들도 생각보다 있다고 하신다. 그래서 상황을 봐가면서 사용을 해야겠다는 생각이 많이 들었다.

그래도 사용하는 법을 알아선 나쁠건 없으니 일단은 알아두자.
그리고 혹시나 이렇게 지금의 코드들에선 규모가 작으니 막 바꿀 순 있겠지만 나중에 코드의 규모가 커지게 된다면? 물론 그럴때도 있지만 우리에겐 테스트 코드라는 것이 있다! Lombok으로 변경하고 문제가 생기는지에 대해서만 테스트 코드를 통해 확인해주면 되기 때문에 겁 먹지말고 변경을 하면 된다.

테스트코드로...

📂test/java/web/dto/HelloResponseDto.java

package com.khyojun.admin.springboot.dto;

import com.khyojun.admin.springboot.web.dto.HelloResponseDto;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import java.util.Optional;
public class HelloResponseDtoTest {

    @Test
    public void 롬복_기능_테스트(){
        //given
        String name = "test";
        Optional<Integer> amount=Optional.of(1000);

        //when
        HelloResponseDto dto = new HelloResponseDto(name, amount);

        //then

        Assertions.assertThat(dto.getName()).isEqualTo(name);
        Assertions.assertThat(dto.getAmount()).isEqualTo(amount);
    }
}

여기 보이는 것처럼 HelloResponseDto에 생성자로 자동적으로 생성이 되어서 파라미터로 넣어준 것을 알 수 있다.
그리고 assertThat을 통하여 비교를 해준다. 테스트코드를 돌려봤을때 이상이 없었다. 그러면 이제 Controller로 들어가서 고쳐보자.

📂java/web/HelloController.java

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }

    @GetMapping("/hello/dto")
    public HelloResponseDto helloResponseDto(@RequestParam(value = "name", required = false) String name, @RequestParam(value = "amount", required = false) Optional<Integer> amount){
        return new HelloResponseDto(name, amount);
    }
}

이전 테스트코드에서도 HelloResponseDto라는 것도 테스트가 완료가 되었으므로 바로 name과 amount를 json으로 반환시켜주는 ResponseDto를 만들어봤다.

@RequestParam

  • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션.
  • 여기서는 외부에서 name(@RequestParam("name"))이란 이름으로 넘긴 파라미터를 메소드 파라미터 name(String name)에 저장하게 된다.
    ex)localhost:8080/hello/dto?name="spring"&amount=1000일 경우 name에는 spring이 amount에는 1000이라는 값이 들어간다.

✨ required?

여기서 추가적으로 required에는 false라는 값을 넣게 되었는데 이유는 null값이 들어가게 되면은 기본적으로는 화면에서 오류가 발생하게 된다. 왜냐? required=true가 디폴트이기때문에 반드시 외부에서 값을 받아와야하기 때문이다.

✨ Optional?

여기서 Optional을 사용하지 않게 된다면 int값이 들어가지 않게될 경우 Null값을 원래는 반환을 해야하지만 기본적인 자료형인 int에서는 null을 반환을 하지 못한다. 그러므로 Wrapper인 Optional Integer를 사용하여 Null값을 반환할 수 있도록 감싸주는(그래서 Wrapper 클래스라고 하나보다.) 작업을 하였다.

결론:

1. Lombok은 좋지만 상황을 봐가면서 사용하도록...

2. 테스트 코드를 잘 작성하여 코드를 잘 검증할 수 있도록 하자.

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글