SimpleJdbcInsert 빈 등록에 대하여

2021-08-05 20:50:00.874 ERROR 14665 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Configuration cannot be altered once the class has been compiled or used] with root cause

org.springframework.dao.InvalidDataAccessApiUsageException: Configuration cannot be altered once the class has been compiled or used
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkIfConfigurationModificationIsAllowed(AbstractJdbcInsert.java:319) ~[spring-jdbc-5.3.8.jar:5.3.8]
  • Reference
  • 일단 오류와 상관없이.. SimpleJdbcInsert를 빈으로 만드는건 뭔가 이상한듯 저게 저 Repository에서만 쓸텐데.. 저걸 빈으로 만들어서 얻는 이점이 없음
  • JDBC 드라이버에서 제공해주는 DB 메타데이터를 사용해서 insert 쿼리 정보로 사용한다던데 왠지 빈으로 등록 시점에 JDBC 연결이 완료되지 않았을수도 있겠다
  • 여튼, Entity 객체에서 리플렉션으로 '타입'정보를 꺼내쓴다면 애초에 dataSource같은게 필요없겠지 (순수 Java 리플렉션만으로 될테니) 근데 DataSource를 요구한다는건 DB에 뭔가 질의를 날려서 DB 스키마 정보를 꺼내온다는거 같고 그게 빈 생성시점에는 DB접근이 안될수도 있을거 같음
  • DataSource가 커넥션을 관리해주는 놈인데.. 저게, 어플이 막 올라오는 중에는 커넥션이 맺어지지 않은 상태일수도 있음 DataSource 라는 '빈'은 생성되었지만, 아직 커넥션이 초기화 되지 않았다던가..

@PostConstruct

withTableName() 문제

  • @PostConstruct로 생성자 문제는 해결하였으나 여전히 같은 오류가 발생
Configured cannot be altered once the class has been compiled or used
  • withTableName으로 스키마 설정까지 PostConstruct에 들어가야 하는데 메소드에서 계속 재셋업 하려고 하니 오류를 띄우는 것.
  • 아래와 같이 PostConstruct에 설정해주면 됨
private SimpleJdbcInsert jdbcInsert;

@PostConstruct
public void init() {
    jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
    jdbcInsert.withTableName("articles").usingGeneratedKeyColumns("id");
}

관련 소스

Comments