이 자바 스프링 넘이란 놈을 하면서.....진짜....설정때문에 어마어마한 시간을 보내고 있다~
내가 자바를 싫어했던 이유가 새록새록 생각났다~
먼저 pom.xml 파일에서
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <!-- print query log --> <dependency> <groupId>org.lazyluke</groupId> <artifactId>log4jdbc-remix</artifactId> <version>0.2.7</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.31</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> | cs |
위에 것들을 추가해준다.
mysql, mybatis 그리고 쿼리 띄어주는것까지 추가해주고,
/src/main/webapp/WEB-INF/spring/ 폴더의
root-context.xml 파일을 열고, 아래를 추가해준다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/testtable" /> <property name="username" value="root" /> <property name="password" value="password" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:/mapper/**/*.xml" /> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSession" /> </bean> <!-- query log --> <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource"> <constructor-arg ref="dataSourceSpied" /> <property name="logFormatter"> <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter"> <property name="loggingType" value="MULTI_LINE" /> <property name="sqlPrefix" value="SQL : " /> </bean> </property> </bean> | cs |
mysql 정보는
<property name="url" value="jdbc:mysql://localhost:3306/testtable" /> 에
localhost:포트/스키마이름
해주고,
밑에 아이디랑 비번 넣어준다.
그 밑에 sqlSession은 마이바티스를 불러와서 쿼리를 넣어준다는 말인데,
쿼리문장을 넣는 곳에 경로를 넣어준다.
<property name="mapperLocations" value="classpath:/mapper/**/*.xml" />
위 경로는
/src/main/resources/mapper/전체폴더/전체.xml파일
이란 뜻이다.
나 같은경우는 게시판을 만들꺼니까.
/src/main/resources/mapper/board/board_sql.xml 이란 파일을 만들었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="user"> <select id="selectCount" resultType="Integer"> <![CDATA[ SELECT count(*) FROM board ]]> </select> <!-- <select id="selectUserId" parameterType="hashmap" resultType="Integer"> <![CDATA[ SELECT count(user_id) checkResult FROM user WHERE user_id = #{user_id} ]]> </select> --> </mapper> | cs |
보드 테이블 갯수조회 쿼리만 넣었다.
값이 안들어가도 그냥 조회만되게..
/src/main/java 밑에 패키지를 만들어 주고,
나는 패키지 com.myboardtest.dao 만들었다.
콘트롤러랑 다른 패키지를 만들었다.
그리고, 거기에
/src/main/java/com.myboardtest.dao/AbstractDAO.java 를 만들어 주고,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package com.myboardtest.dao; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; public abstract class AbstractDAO { protected Log log = LogFactory.getLog(AbstractDAO.class); @Autowired private SqlSessionTemplate sqlSession; protected void printQueryId(String queryId) { if (log.isDebugEnabled()) { log.debug("\t QueryId : " + queryId); } } public Object insert(String queryId, Object params) { printQueryId(queryId); return sqlSession.insert(queryId, params); } public Object update(String queryId, Object params) { printQueryId(queryId); return sqlSession.update(queryId, params); } public Object delete(String queryId, Object params) { printQueryId(queryId); return sqlSession.delete(queryId, params); } public Object selectOne(String queryId) { printQueryId(queryId); return sqlSession.selectOne(queryId); } public Object selectOne(String queryId, Object params) { printQueryId(queryId); return sqlSession.selectOne(queryId, params); } @SuppressWarnings("rawtypes") public List selectList(String queryId) { printQueryId(queryId); return sqlSession.selectList(queryId); } @SuppressWarnings("rawtypes") public List selectList(String queryId, Object params) { printQueryId(queryId); return sqlSession.selectList(queryId, params); } } | cs |
이렇게 만들고,
얘는 abstract class라 또
src/main/java/com.myboardtest.dao/boardDAO.java 를 만들어서 AbstractDAO.java를 불러왔다.
1 2 3 4 5 6 7 8 9 10 11 | package com.myboardtest.dao; import org.springframework.stereotype.Repository; @Repository("dao") public class boardDAO extends AbstractDAO { public Integer selectCount() { return (Integer) selectOne("user.selectCount"); } } | cs |
참고로 여기에는 서비스파일을 만드는 대신에,
어노테이션으로 @Repository("dao") 라고 만들어줬다.
아직 어노테이션은 잘 모르지만, @Repository 라는게, dao라는 이름으로 저장소같은거를 만들어줬다라고 이해했다.
그리고, Integer로 받을꺼기 때문에 인티저 클래스 만들어 주고,
*int 는 null 값을 못받고, Integer는 널 값을 받을수있기때문에 Integer로 했다.
그리고, selectOne("user.selectCount"); 은, AbstractDAO에서 selectOne이라는 클래스에
board_sql.xml에 있는 namespace = user에서 id = selectCount 에 있는 쿼리문을 가져와서 넣는다는 거다.
그리고 홈컨트롤러
/src/main/java/com.myboardtest.myboard/HomeController.java 에서 애네를 불러와야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | package com.myboardtest.myboard; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.myboardtest.dao.boardDAO; /** * Handles requests for the application home page. */ @Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); // @Autowired // private SqlSessionTemplate sqlSession; /** * Simply selects the home view to render by returning its name. */ @Autowired private boardDAO dao; @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute("serverTime", formattedDate); // System.out.println(sqlSession.selectOne("SELECT * FROM BOARD")); /* * boardDAO dao = new boardDAO(); */ System.out.println(dao.selectCount()); return "home"; } } | cs |
@Autowired
private boardDAO dao;
라는 거가 아까 boardDAO.java에서 저장소에 넣은 dao를 불러온다.
System.out.println(dao.selectCount());
그리고 그냥 콘솔에서 찍어만 보았다.
결과값이 뜨더군.
-------------------------------------------------------------------------------------------------------------------------------
이 넘의 스프링 시작하는데, 너무 클래스들이 얼히고 설켜 있어서, 처음에 구조 파악하는데 오래걸렸다.
지금은 그냥 저장소에서 불러왔는데,
서비스 패키지를 만들어 주고, 서비스들을 그곳에 모아두면 나중에 이용할때 더 편하긴 하다.
그거는 다음 포스트에 올리는걸로
'컴퓨터 > Java Spring Framework' 카테고리의 다른 글
JPA CascadeType 종류 (0) | 2018.05.10 |
---|---|
Spring Security logout Handler custom (0) | 2018.05.08 |
mod_jk연동 도메인 여러개 (0) | 2018.03.09 |
톰캣 설치 (0) | 2018.03.09 |
아파치 컴파일 설치 (0) | 2018.03.09 |