본문 바로가기
Programming/>> Spring

[Spring] Spring기반 웹 사이트 템플릿 만들기 - 2. HSQLDB + Hibernate 5.x

by 니키ᕕ( ᐛ )ᕗ 2017. 7. 16.

+ 일단 이번 포스팅에서 Hibernate Xml 설정에 대한 것은 하지 않을 예정이다. Xml설정이 필요한 경우에는 이전에 내가 쓴 포스팅을 참조하는게 좋을 것 같다...

 

매번 외부에서 노트북 or 개인 PC에서 왔다갔다 하며 개발을 하다보니까 DB연결하는게 참 번거로웠다. 그래서 Tomcat 실행시 같이 메모리에 올라가는 HSQLDB를 사용하기로 했다. EmbeddedDatabaseBuilder를 이용하여 HSQLDB를 실행할 수 있도록 하고, 실행시 필요한 Table이나 데이터를 자동으로 생성하기 위해 sql파일 경로도 지정한다. HSQLDB말고 H2나 Derby도 가능하다.

@Configuration
public class DataSourceConfig {
	@Bean
	public DataSource dataSource() {
		EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
		return builder.setType(EmbeddedDatabaseType.HSQL)
				.addScripts(new String[] { "classpath:db/create.sql", "classpath:db/insert.sql" }).build();
	}
}

 

그렇지만 나중에는 인메모리형식이 아닌 RDBMS를 사용할 것이기 때문에... 일반적인 DataSource 설정도 추가한다. DataSource에 들어가는 파라미터는 properties 파일을 참조한다.

@Configuration
@PropertySource("classpath:properties/database.properties")
public class DataSourceConfig {

	@Autowired
	private Environment env;

	/* Database Source */
	@Bean
	public BasicDataSource dataSource() {
		BasicDataSource source = new BasicDataSource();
		source.setDriverClassName(env.getProperty("database.driverClassName"));
		source.setUrl(env.getProperty("database.url"));
		source.setUsername(env.getProperty("database.username"));
		source.setPassword(env.getProperty("database.password"));
		return source;
	}
}
#HSQL
database.driverClassName=org.hsqldb.jdbcDriver
database.url=jdbc:hsqldb:mem:test
database.username=sa
database.password=

 

 

다음은 Hibernate 설정이다.

/* Hibernate */
@Bean
public LocalSessionFactoryBean getSessionFactory() {
	LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
	sessionFactory.setDataSource(dataSource());
	sessionFactory.setPackagesToScan(new String[] { "spring.web.app.common.model" });
	sessionFactory.setHibernateProperties(getHibernateProperties());
	return sessionFactory;
}
@Bean
public Properties getHibernateProperties() {
	Properties properties = new Properties();
	properties.put(AvailableSettings.DIALECT, env.getRequiredProperty("hibernate.dialect"));
	properties.put(AvailableSettings.SHOW_SQL, env.getRequiredProperty("hibernate.show_sql"));
	properties.put(AvailableSettings.STATEMENT_BATCH_SIZE, env.getRequiredProperty("hibernate.batch.size"));
	properties.put(AvailableSettings.HBM2DDL_AUTO, env.getRequiredProperty("hibernate.hbm2ddl.auto"));
	properties.put(AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS, env.getRequiredProperty("hibernate.current.session.context.class"));
	return properties;
}
/* Transaction */
@Bean
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
	HibernateTransactionManager txManager = new HibernateTransactionManager();
	txManager.setSessionFactory(sessionFactory);
	return txManager;
}
#Hibernate
## SQL 최적화를 위한 Dialect 클래스명
hibernate.dialect=org.hibernate.dialect.HSQLDialect
## 스키마 자동생성 옵션(validate/update/create/create-drop)
hibernate.hbm2ddl.auto=update
## SQL문을 콘솔에 표시 여부(true/false)
hibernate.show_sql=true
## SQL문 일괄 실행시 지정할 배치 크기
hibernate.batch.size=20
hibernate.current.session.context.class=org.springframework.orm.hibernate5.SpringSessionContext

그냥 나도 같아 붙여넣은 거라서 별다른 설명할 것은 없다. 

 

xml로 설정할때는 복잡하게 config파일에 Model도 지정해줘야했고 xml파일마다 ValueObject 클래스와 Hibernate Model을 Mapping하는 별도의 xml파일을 만들어야 했는데 이제는 ValueObject 클래스에 어노테이션만 추가해주면 된다.

@Entity
@Table(name="TB_USER")
public class User {
	@Id
	private String userid;
	private String password;
	private String name;
	private String email;
	private int point;
	private short rank;
	private Date regdate;
	private Date lastdate;
	private String gender;
	private String interest;
	private String[] interests;
}

 

CREATE TABLE IF NOT EXISTS TB_USER (
	USERNO INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL, 
	USERID varchar(30) NOT NULL,
	PASSWORD varchar(50) NOT NULL,
	NAME varchar(25) NOT NULL,
	EMAIL varchar(200),
	POINT INTEGER DEFAULT 0,
	RANK INTEGER DEFAULT 0,
	REGDATE timestamp DEFAULT CURRENT_TIMESTAMP,
	LASTDATE timestamp DEFAULT CURRENT_TIMESTAMP,
	GENDER char(1),
	INTEREST varchar(30),
	PRIMARY KEY (USERID)
);

 

@Repository
public class MemberDao {
    @Autowired
    SessionFactory session;
    
    protected Session getSession() {
		return this.session.getCurrentSession();
	}
	public UserInfo getUser(String userid) {
		return getSession().get(User.class, "admin");
	}
}

 

댓글