본문 바로가기
Programming/>> Spring

[Spring] Spring + Hibernate4 + MySQL 설정

by 니키ᕕ( ᐛ )ᕗ 2015. 11. 22.


Hibernate.zip



Spring 프로젝트를 하나 해보는데 mybatis는 설정이 비교적 간단한 편이기도 하고 포스팅을 하진 않았지만 설정해본적도 있어서

국내에서는 잘 쓰이지 않는 hibernate(하이버네이트)를 한 번 이용해보았다. 생각보다 자료가 없고 삽질을 많이해서 오래 걸렸다.


1. maven에 관련 dependency를 추가한다.

<!-- Database Connection -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-orm</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

<dependency>
	<groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
</dependency>


<!-- Hibernate -->
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-core</artifactId>
	<version>${org.hibernate-version}</version>
</dependency>

<!-- Database JDBC -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.37</version>
</dependency>

Hibernate는 버전이 5.x까지 나왔는데 Jboss tool이 왠지 5를 지원하지는 않는 것 같아서 4.x 버전을 사용했다.



2. JBoss 설치


DB에 연결하여 hbm.xml과 Domain Vo를 만들어주는 역할을 한다. 이번엔 이용해서 만들었지만 다음번에는 @Entity 를 이용하여 직접 작성해보려고 한다.




이클립스 마켓에서 Jboss 선택 후 설치한다.





나는 아무생각없이 다 설치했지만 Hibernate tool만 설치해도 무방하다. 아니 오히려 그것만 설치하는게 좋다.



3. DB 테이블 생성

CREATE TABLE `TB_USER` (
  `USERID` varchar(30) NOT NULL,
  `PASSWORD` varchar(50) NOT NULL,
  `NAME` varchar(25) NOT NULL,
  `EMAIL` varchar(200),
  `POINT` smallint(6) DEFAULT '0',
  `RANK` tinyint(10) DEFAULT '0',
  `REGDATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `LASTDATE` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `GENDER` enum('M','F') ,
  `INTEREST` varchar(30),
  PRIMARY KEY (`USERID`),
  UNIQUE KEY `userid_UNIQUE` (`USERID`)
); 



4. Hibernate Configuration



설치가 끝나면 Open Perspective - Hibernate를 선택한 후, Hibernate configuration 창에서 Add Configuration을 선택한다.





이런 창이 하나 뜨는데 Hibernate 버전을 선택해주고, 현재 Hibernate를 적용할 프로젝트를 선택한다.

그리고 Database connection에서 New를 선택하여 DB연결을 진행한다.







MySQL을 선택하여 진행하는데, Connector문제가 발생할 수도 있다. 

MySQL 홈페이지에서 커넥터를 다운받은 후 Add나 Remove를 하지 않고 Edit로 새로 받은 커넥터의 jar를 선택한다.





DB의 URL, NAME, PASSWORD 입력 후 접속을 확인한다.





Database connection이 끝나면 이제 Configuration file을 생성 or 선택한다.





Setup을 누르면 어떤 작업을 할 것인지 물어본다.



1. 이미 cfg.xml 파일이 있다면 선택하면 되고 




2. 없으면 원하는 위치에 생성한다.





여기까지 하면 기본 설정이 끝났다.





5. Run Configuration




방금 생성한 Hibernate configuration을 확장하여 연결이 제대로 되었는지 확인한다.

DB연결이 제대로 안되면 DB부분은 확장이 되지 않고 에러가 난다.





이제 Run configuration으로 들어간다.





Output directory를 선택하는데 편한곳으로 선택한다. 구글링 했을 때는 target 폴더로 하는 곳이 몇몇 있었다.





Domain code, Hibernate XML Mappings를 선택 후 Run을 한다.




지정한 target 아래에 hbm.xml과 .java가 생성된 것을 볼 수 있다.



여기서 유의해야되는 것은 hbm.xml과 java파일을 생성할 때, 한 폴더에 몰아서 생성했기 때문에 이후 java파일의 위치가 이동하면 hbm.xml 파일에서 class의 이름에 패키지명을 반드시 붙여줘야한다. 






6. xml 설정 


root-context.xml 

<bean id="dataSourceMySQL" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://192.168.25.7:3306/DB"/> <property name="username" value="ID"/> <property name="password" value="PW"/> </bean> <bean id="sessionFactoryMySQL" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSourceMySQL" /> <property name="configLocation"> <value>/WEB-INF/spring/hibernate.cfg.xml</value> </property> </bean> <bean id="transactionManagerMySQL" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactoryMySQL"/> </bean>


hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <mapping resource="TbUser.hbm.xml"/> </session-factory> </hibernate-configuration>



7. Controller, Dao, Service


controller
@Controller
public class MainController {
	
	@Autowired
	MainService service;
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Model model) {
		
		List<TbUser> list = service.selectAll();
		for(TbUser user : list){
			System.out.println(user.getName());
		}
		
		TbUser user = service.select("admin");
		System.out.println(user.toString());
		
		return "index";
	}
}


Service

public interface MainService { public List selectAll(); public TbUser select(String userid); } @Service public class MainServiceImpl implements MainService { @Autowired MainDao dao; @Override public List selectAll() { return dao.selectAll(); } @Override public TbUser select(String userid) { return dao.select(userid); } }



Dao

@Repository
public class MainDaoImpl implements MainDao {
	
	@Autowired
	SessionFactory sessionFactory;
	
	@Override
	public List selectAll(){
		Session session = sessionFactory.openSession();
		List result = (List) session.createQuery("from TbUser").list();
		session.close();
		return result;
	}

	@Override
	public TbUser select(String userid) {
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from TbUser where userid = :userid");
		query.setString("userid", userid);
		TbUser user = (TbUser) query.uniqueResult();
		session.close();
		return user;
	}
}

createQuery에 들어가는 SQL문은 일반적인 SQL이 아니라 Hibernate에서만 사용하는 HQL라는 것이다. 

실제 DB의 테이블 이름은 TB_USER이지만 HQL에서는 hbm.xml에서 참조하고 있는 자바 클래스의 이름을 사용하는 것 같다. 

이것에 대해서는 아직 잘 몰라서 공부가 더 필요한 상황이다....



댓글