안녕하세요, 오늘은 스프링 부트 프로젝트 내에서 Entity 클래스를 생성하고 테스트하는 방법에 대해서 공부한 내용을 정리해보려고 합니다. 우선 저는 실습 프로젝트에서 JPA와 Lombok를 사용하였습니다. 먼저 JPA와 Lombok 이란 무엇인지 간단하게 알아보고 스프링 부트 프로젝트 내에 세팅 방법에 대해서 정리해보도록 하겠습니다.
JPA(Java Persistence API)
JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와 상호작용하기 위한 표준 API입니다. SQL 쿼리를 직접 작성하지 않고도 자바 객체와 데이터베이스 테이블 간의 매핑을 관리할 수 있습니다. 또 데이터베이스와의 상호작용을 객체 지향적으로 처리할 수 있게 도와줍니다.
JPA 주요 개념
엔티티(Entity)
데이터베이스 테이블에 매핑되는 자바 클래스입니다. 각 엔티티 인스턴스는 데이터베이스의 한 행(row)에 해당합니다.
필드(Field)와 열(Column)
엔티티 클래스의 각 필드는 데이터베이스 테이블의 열(column)에 매핑됩니다. 필드에 @Column 애노테이션을 사용하여 매핑 정보를 지정할 수 있습니다.
기본 키(Primary Key)
엔티티 인스턴스의 고유 식별자입니다. @Id 애노테이션을 사용하여 기본 키를 지정합니다.
엔티티 매니저(Entity Manager)
엔티티 인스턴스를 생성, 삭제, 검색 및 관리하는 인터페이스입니다.
영속성 컨텍스트(Persistence Context)
엔티티 인스턴스가 관리되는 환경입니다. 엔티티 매니저가 엔티티 인스턴스를 영속성 컨텍스트에 저장하고 관리합니다.
JPA 주요 애노테이션
@Entity: 클래스를 엔티티로 지정
@Table: 엔티티와 매핑될 테이블 정보를 지정
@Id: 기본 키 지정
@GeneratedValue: 기본 키의 생성 전략 지정
@Column: 필드를 열과 매핑하고, 열의 속성을 지정
@OneToOne, @OneToMany, @ManyToOne, @ManyToMany: 엔티티 간의 관계 지정
JPA 세팅하기
우선 프로젝트 내의 build.gradle (또는 pom.xml) 에 의존성을 추가해야 합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
Lombok
롬복(Lombok)은 자바 애플리케이션에서 반복적인 코드를 줄여주기 위해 사용되는 라이브러리입니다. 롬복을 사용하면 getter, setter, toString, equals, hashCode 등의 메서드를 자동으로 생성할 수 있으며, 빌더 패턴, 로그 생성 등 다양한 기능을 제공하여 코드의 가독성과 유지보수성을 높여줍니다. 이제 롬복에 대해 자세히 설명하겠습니다.
롬복의 주요 기능과 애노테이션
Getter와 Setter 자동 생성
@Getter: 클래스나 필드에 붙여서 getter 메서드를 자동으로 생성
@Setter: 클래스나 필드에 붙여서 setter 메서드를 자동으로 생성
생성자 자동 생성
@NoArgsConstructor: 파라미터가 없는 기본 생성자를 생성
@AllArgsConstructor: 모든 필드를 파라미터로 받는 생성자 생성
@RequiredArgsConstructor: final 필드나 @NonNull 애노테이션이 붙은 필드를 파라미터로 받는 생성자 생성
toString, equals, hashCode 자동 생성
@ToString: toString 메서드 자동으로 생성
@EqualsAndHashCode: equals와 hashCode 메서드 자동으로 생성
빌더 패턴 생성
@Builder: 빌더 패턴을 적용하여 객체를 생성
Lombok 세팅하기
저는 Gradle을 사용하고 있기 때문에 build.gradle
파일에 다음과 같이 의존성을 추가하였습니다.
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
}
추가로 테스트 환경을 위해 다음과 같은 의존성도 추가하였습니다. 이렇게 하면 테스트 코드를 작성할 때 롬복의 기능을 사용할 수 있습니다.
Entity 생성하기
저의 실습코드와 함께 엔티티 생성과정에 대해서 정리하도록 하겠습니다.
우선, @Entity 애노테이션을 사용하여 이 클래스가 JPA 엔티티임을 나타냅니다. 그 다음 @Table(name = “tbl_todo”) 애노테이션을 통해 이 엔티티가 데이터베이스의 tbl_todo
테이블과 매핑됨을 나타냈습니다.
@ToString
, @Getter
, @Builder
, @AllArgsConstructor
, @NoArgsConstructor
을 사용하여 자동으로 toString(), getter, 빌더 패턴, 모든 필드를 사용하는 생성자, 기본 생성자를 생성하도록 하였습니다.
만약 테이블이 없는 상태로 프로젝트 실행 시 아래와 같이 create table 쿼리가 실행되며,
실제로 데이터베이스에 정의한 테이블 구조대로 테이블이 생성되는 것을 확인하실 수 있습니다.
테스트 코드 작성하기
이제 테이블을 생성했으니 테스트 코드를 작성하여 기본적인 테스트를 진행해보도록 하겠습니다.
해당 프로젝트에서 저는 SpringBootTest 와 Log4j2 라이브러리를 사용하였습니다.
@SpringBootTest
@Log4j2
그 다음 @Autowired 애노테이션을 사용하여 제가 테스트하기 원하는 TodoRepository
타입의 bean 을 자동으로 주입하였습니다.
@Autowired
는 스프링에서 제공하는 애노테이션입니다. 스프링 컨테이너가 자동으로 적절한 빈(객체)을 찾아서 주입해주는 역할을 합니다. 필드, 생성자, 메서드에 붙일 수 있고 주로 필드 주입, 생성자 주입, 세터 주입에 사용됩니다.
우선 Repository 객체가 잘 주입되었는지 테스트 해보았습니다.
그럼 아래와 같은 로그가 찍히는 것을 확인할 수 있습니다.
로그에 찍힌 jdk.proxy2.$Proxy119
는 스프링 프레임워크가 런타임에 생성한 프록시 객체를 나타냅니다.
다음으로 INSERT 에 대한 테스트 코드를 작성해보았습니다.
위와 같이 Todo
객체를 빌더 패턴을 사용하여 생성한 후 각 필드에 값을 지정했습니다.
그 다음 todoRepository.save(todo)
를 호출하여 Todo
객체를 데이터베이스에 저장시키고 해당 result 에 대해서 출력하는 테스트 코드를 작성했습니다. 테스트 코드 실행 시 다음과 같은 결과를 확인할 수 있었습니다.
실행된 SQL 쿼리와 객체 정보 로그를 확인해보면 insert 쿼리가 실행되고 지정한 객체로 insert 된 것을 확인할 수 있습니다.