• getBean의 NoSuchBeanDefinitionException 회피하기

    Spring context에서 Bean을 가져오기 위해 getBean 메소드를 주로 사용한다. getBean 메소드는 Bean 이름이나 Type 등을 받아서 해당하는 Bean이 있으면 인스턴스를 반환하고 없으면 NoSuchBeanDefinitionException 예외를 발생시킨다. 만약에 A라는 Bean이 있으면 이걸 사용하고, 없으면 B라는 Bean을 사용해야 할 때 어떻게 구현을 해야 할까? 라는 고민에서 이 포스트를 작성하게 되었다. 예외는 진짜 예외일...


  • JPA 와 mybatis 를 같은 Transaction 에서 사용하기

    이 포스트는 같은 트랜잭션 내에 JPA와 MyBatis를 사용하는 방법을 Spring Transaction 을 이용한 예제를 보여준다. JpaTransactionManager Spring 은 PlatformTransactionManager 인터페이스로 트랜잭션을 처리한다. 이 인터페이스의 구현체 중에 하나인 JpaTransactionManager 는 단일 JPA EntityManagerFactory 를 유지하면서 스레드별로 EntityManager를 제공한다. JpaTransactionManager 는 JPA 를 위해 주로 사용하지만 트랜젝션이 사용하고 있는 DataSource에 직접 접근이...


  • enum으로 JPA 상속관계 구분 컬럼 지정

    클래스의 상속관계를 JPA로 표현하기위해서 @DiscriminatorColumn 애노테이션으로 부모 클래스의 구분 컬럼을 지정하고 @DiscriminatorValue 애노테이션으로 자식 클래스가 사용할 구분자 값을 지정한다. @DiscriminatorValue는 String 타입을 Value 로 지정하게 되어있다. 일반적으로 구분자 또는 타입 같은 값은, 값 리스트들을 체계적으로 관리하기위해 enum 으로 선언해 사용하고는 하는데 이것을 JPA에 바로 적용할 수가 없다. 이 포스트에서는 enum을...


  • The server time zone value 'KST' is unrecognized 예외 발생시

    IntelliJ에서 로컬에서 동작하고 있는 mysql 에 직접 접속하려고 하다보니 The server time zone value 'KST' is unrecognized or represents more than one time zone. 오류가 발생하였다. 개발할 때에는 Datasource의 url에 ?serverTimeZone=Asia/Seoul 를 추가하면 대부분 해결이 된다. IntelliJ에서는 DB 접속정보를 넣는 화면의 URL에 직접 넣으면 해결되지 않는다. Advanced 탭에 들어가서 serverTimezone에...


  • LocalContainerEntityManagerFactoryBean 에 null 를 리턴할 때

    LocalContainerEntityManagerFactoryBean 을 이용해서 직접 Bean 을 등록할 때 LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); return emf.getObject(); 를 하면 null 이 리턴된다. 이유는 LocalContainerEntityManagerFactoryBean 는 AbstractEntityManagerFactoryBean 을 상속하여 구현하는데 이 클래스의 메소드 afterPropertiesSet() 가 모든 속성값이 세팅이 다 됐음을 알리는 역할을 한다. XML 로 Bean 설정을 하면 BeanFactory 가 이 메소드를 호출하지만...