애노테이션은 자바에서 한 번 보았습니다. 애노테이션은 2가지의 기능을 갖습니다. 첫 번째는 컴파일러가 코드의 문법 오류를 확인합니다. 두 번째는 프로그램 실행 시 특정 기능을 수행하도록 합니다.
위 예제를 보겠습니다. Cat 클래스는 Animal 클래스를 상속했습니다. 부모에게 물려받은 메서드를 재정의 후 사용하려고 합니다. 재정의하는 것은 선언부는 동일하게 한 후 내용만 바꾸면 됩니다. 그런데, 이런 규칙을 무시하면 재정의가 아니라 새로운 함수를 만든 것이 되겠죠. 그래서 Annotation 을 활용하여 Override 라는 것을 명시하면 컴파일러가 해당 메서드는 재정의함수구나 이해하고 제약사항을 만들어서 우리의 실수를 줄여줍니다.
롬복 애노테이션은 아주 많이 사용합니다. 우리가 자바 개발을 할 때 생성자, Getter, Setter 들을 코드로 작성했었습니다. 그런데 롬복 lombok 애노테이션을 활용하면 우리가 작성하지 않아도 자동으로 생성하는 기능을 제공합니다. Getter Setter 애노테이션을 넣어주면 자동으로 코드를 추후에 생성해주기 때문에 가독성이 엄청나게 상승하는 효과를 가지게 됩니다.
이런 특징 때문에 굉장히 활용도가 높은 것이 lombok Annotation 입니다.
스프링 프로젝트에서는 일반적으로 하나의 메인 클래스를 사용한다. 이런 이유는 기본적으로 프로그램이 느리고 무겁기 때문이다. 그래서 특정 기능이 정상적으로 작동하는지 확인하기 위해서는 테스트 기능을 사용하게 된다. 전체를 동작시키면 너무 오래 걸리니까.
@SpringBootTest 이 애노테이션은 테스트를 위한 임시로 스프링 테스트 환경을 실행하고 @Test 애노테이션은 해당 메소드 단위로 테스트를 설정한다. 예제를 한번 살펴보자.
우선 di 와 lombok 이라는 패키지를 만들었는데, STS 에서는 자바와는 다르게 메인 패키지라는 개념이 있다. 그래서 메인 패키지 하위 패키지에서 작업을 해야 정상적으로 동작하게 됩니다. 따라서 di 패키지를 만들때 com.example.demo.di 로 설정해야 정상적으로 하위 패키지로 생성된다. 또한 위의 Annotation 을 작성할 때 import 문을 작성하는 것이 귀찮다면 Preference 에서 save action 설정을 하면 자동으로 import 문을 작성해줘서 편리합니다.
위에서 작성한 Annotation 을 하나씩 이해해봅시다.
ToString 은 멤버들을 출력하도록 ToString 메서드를 재정의합니다. @NoArgsConstructor 는 default 생성자이고 @AllArgsConstructor 는 모든 멤버를 포함한 생성자이다.
@Data 애노테이션은 사용하지 않았는데, @Data 는 Getter Setter ToString 애노테이션을 한번에 작성하는 애노테이션이다. 근데, Data 애노테이션은 사용하지 않는 것을 권장한다. 왜냐하면 처음 스프링을 접하는 사람들에게 직관적으로 다가가지 않기 때문이다.
아무튼 이렇게 클래스 위에 필요한 lombok Annotation 을 적어준다.
테스트를 해봐야겠죠. '테스트' 뭐가 떠오르시나요? 바로 src/test/java 가 떠올라야 합니다.
테스트
기본적으로 test/java 는 main/java 와 같은 구조로 만듭니다. 그니까 똑같이 만들어줍시다.
lombok Annotation 테스트 해보기
package com.example.demo.lombok;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest // 단위테스트 환경 설정
public class PersonTest {
@Test // 단위 테스트 지정
void test() {
Person person1 = new Person(); // 디폴트 생성자
person1.setName("둘리"); // setter
person1.setAge(12);
System.out.println(person1.getName()); // getter
System.out.println(person1.getAge());
Person person2 = new Person("또치", 15); // 모든 멤버를 입력받는 생성자
System.out.println(person2.toString()); // 재정의된 toString
}
}
lombok Annotation 이 정상적으로 동작하고 있는 것을 확인할 수 있습니다. (자동완성도 정상 동작합니다) 이제 테스트를 해볼 건데, 주의할 점이 있습니다.
Run 버튼을 누르면 main 이 실행되서 테스트가 실행되지 않습니다. 대신 Test( ) 즉 단위 테스트로 지정한 메서드를 우클릭한 이후 Run as - JUnit Test 를 클릭하면 단위 테스트가 실행된다. 이렇게 단위 테스트를 진행하기 위해서는 단위 테스트 환경 설정을 하는 애노테이션 @SpringBootTest 를 클래스에 해주고 @Test 를 단위 테스트 대상 메서드에 해주어야 한다.
main.java 창을 같이 띄워놓고 주석 처리를 해보면 Getter 를 주석처리하면 get 메서드들이 오류가 발생하는 것을 볼 수 있다.
단위 테스트를 진행하면 위와 같은 화면이 출력된다. JUnit 창은 원래 Package Explorer 옆에 같이 보이는데, 보기 힘드니까 Boot Dashboard 옆으로 옮긴다.
한번 실행한 테스트는 JUnit 에 추가되어있는 것을 확인할 수 있는데 여기서 오른쪽 마우스 클릭으로 실행시켜줄 수 있다. 조금 더 편리한 방법이라고 할 수 있다.
연습문제 1. lombok & 단위 테스트 Q. Book 클래스와 단위 테스트를 진행하라.
package com.example.demo.lombok;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Book {
String title;
int price;
String publisher;
int numberOfPage;
}
package com.example.demo.lombok;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class BookTest {
@Test
public void test() {
Book book1 = new Book();
book1.setTitle("어린왕자");
book1.setPrice(10000);
book1.setPublisher("한빛미디어");
book1.setNumberOfPage(100);
System.out.println(book1.toString());
Book book2 = new Book("어린왕자2", 20000, "한빛미디어2", 200);
System.out.println(book2.toString());
}
}
단위 테스트가 잘 진행된 것을 확인할 수 있다.
연습문제 2. 자동차 클래스를 설계하고 단위테스트한다.
package com.example.demo.lombok;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Car {
String modelName;
String company;
String color;
}
package com.example.demo.lombok;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class CarTest {
@Test
public void test() {
Car car1 = new Car();
car1.setModelName("아반떼 cn7 하이브리드");
car1.setCompany("현대");
car1.setColor("grey Silver");
System.out.println(car1.toString());
}
}
lombok Annotation 과 Test java 를 활용하는 법을 연습해보고 있는데, 단위 테스트가 정상적으로 진행되는 것을 확인할 수 있습니다.