@SuperBuilder

Kyle_Kim·2023년 6월 10일
0

Article객체에서 공통적인 필드를 제거하기 위해서 super클래스인 BoseBoard를 상속받고 있다.

@Data
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
public abstract class BaseBoard implements Serializable {

    @Column(name="title", nullable = false)
    private String title;

   ....
   ....
}
@Entity
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Table(name="tb_article")
@DynamicUpdate
@DynamicInsert
public class ArticleVo extends BaseBoard implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name= "article_id")
    private Integer id;

   ....
   ....
}

하지만 CRUD테스트에서 Builder로 부모객체를 상속받으려 하자 빌더에 부모클래스의 변수가 찍히지 않았다...

@SuperBuilder 사용시 주의할점

- Article객체에서 원래 사용하였던 @Builder를 제거하고 @SuperBuilder로 교체하였다.

- 만약 Article객체에서 @NoArgsConstructor @AllArgsConstructor를 사용한다면 부모 클래스인 BaseBoard에도 같은 Annotation을 달아줘야 정삭 작동한다.

@DataJpaTest()
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class ArticleTest {
    @PersistenceContext
    private EntityManager em;

    @Autowired
    private ArticleRepository articleRepository;

    public static ArticleVo make(){
        return ArticleVo.builder()
                .writer("John Doe")
                .title("Test title")
                .contents("Test Contents")
                .build();
    }

}

주의사항을 충족한 뒤에 Builder패턴이 정상 작동한다.

profile
Make Things Right

0개의 댓글