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패턴이 정상 작동한다.