SPRING - 스프링JDBC, @Autowired
- SPRING
- 2018. 2. 8. 16:10
이번엔 스프링JDBC에대해 알아보겠습니다
먼저 JDBC를 사용하면 DAO에서
매번 반복하던 코드를 줄일수 있습니다
(드라이버 로드, 커넥션 생성 및 DB연결, SQL실행, 자원해제)
이런 반복적인 작업을 스프링에서는 간단하게 처리 할 수 있습니다
스프링에서 제공하는 JDBC템플릿을 사용하면 간단합니다
먼저 JDBC 템플릿을 사용하려면
pom.xml에서 <dependency>를 추가해 줘야합니다
위 이미지처럼 pom.xml 에서 의존 추가합니다
다음 servlet-context.xml에서
DB연결을 위한 준비를 합니다
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 | <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> <!-- Enables the Spring MVC @Controller programming model --> <annotation-driven /> <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> <context:component-scan base-package="com.spring.ex" /> <beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <beans:property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" /> <beans:property name="username" value="scott" /> <beans:property name="password" value="tiger" /> </beans:bean> <beans:bean name="template" class="org.springframework.jdbc.core.JdbcTemplate"> <beans:property name="dataSource" ref="dataSource" /> </beans:bean> <beans:bean name="dao" class="com.spring.ex.dao.TicketDao" > <beans:property name="template" ref="template" /> </beans:bean> </beans:beans> | cs |
24line 부터 추가해주어야 합니다
먼저 32line 에서 만든 template 은
25line 에서 만든 dataSource 를 참조 하고 있기
때문에 template 이 dataSource를 가지고 있는겁니다
36line도 같습니다. 36line은 다음 포스팅을 위해
미리 만들어 뒀습니다
다음 DAO 보겠습니다
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 59 60 61 62 | package com.spring.ex.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import com.spring.ex.dto.TicketDto; public class TicketDao { JdbcTemplate template; @Autowired public void setTemplate(JdbcTemplate template) { this.template = template; } public TicketDao() { System.out.println(template); } public void buyTicket(final TicketDto dto) { System.out.println("buyTicket()"); System.out.println("dto.getConsumerId() : " + dto.getConsumerId()); System.out.println("dto.getAmount() : " + dto.getAmount()); template.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection con) throws SQLException { String query = "insert into card (consumerId, amount) values (?, ?)"; PreparedStatement pstmt = con.prepareStatement(query); pstmt.setString(1, dto.getConsumerId()); pstmt.setString(2, dto.getAmount()); return pstmt; } }); template.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection con) throws SQLException { String query = "insert into ticket (consumerId, countnum) values (?, ?)"; PreparedStatement pstmt = con.prepareStatement(query); pstmt.setString(1, dto.getConsumerId()); pstmt.setString(2, dto.getAmount()); return pstmt; } }); } } | cs |
15line 에서 JDBC템플릿 객체 생성합니다
15line 에서만든 template 에 위에서 만든
bean이 담겨야합니다
그래서 18line에서 setter까지 만들어 줬습니다
다음 이 setter를 자동으로 호출을해서
19line의 템플릿에 담겨야합니다
이때 사용되는게 17line의
@Autowired 어노테이션입니다
이 어노테이션은 자동으로 알아서
빈이 생성된 후 해당 부분으로 할당됩니다.
다음 컨트롤러 보겠습니다
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 59 60 61 62 63 64 65 66 67 68 69 70 | package com.spring.ex; 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.spring.ex.dao.TicketDao; import com.spring.ex.dto.TicketDto; /** * Handles requests for the application home page. */ @Controller public class HomeController { private TicketDao dao; @Autowired public void setDao(TicketDao dao) { this.dao = dao; } private static final Logger logger = LoggerFactory.getLogger(HomeController.class); /** * Simply selects the home view to render by returning its name. */ @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 ); return "home"; } @RequestMapping("/buy_ticket") public String buy_ticket() { return "buy_ticket"; } @RequestMapping("/buy_ticket_card") public String buy_ticket_card(TicketDto ticketDto, Model model) { System.out.println( "buy_ticket_card" ); System.out.println( "ticketDto : " + ticketDto.getConsumerId() ); System.out.println( "ticketDto : " + ticketDto.getAmount() ); dao.buyTicket(ticketDto); model.addAttribute("ticketInfo", ticketDto); return "buy_ticket_end"; } } | cs |
컨트롤러에서도 템플릿을 사용합니다
servlet-context.xml 의 36line에서만든
빈을 사용하고 있습니다.
다음 템플릿을 어디서든지 사용할수
있도록 하는방법은 먼저 util패키지를 하나 만들어줍니다
다음 위처럼 static변수를 사용해 템플릿을 만든후
예를 들어 컨트롤러에서 템플릿 객체를
생성했다면 아래와같이 Constant 에 있는 템플릿에
컨트롤러에서 만든 템플릿 객체를 넣어줍니다.
(위에서는 DAO에서 템플릿 객체를 생성해서 사용했습니다)
다음 DAO 에서 템플릿에 null값을 준후
template 에 Constant 에 있는 템플릿값을 저장해줍니다
위와 같은 방법을 사용 하면 컨트롤러에서 만든
템플릿을 어디서든 다 쓸수 있게 할수 있습니다.
'SPRING' 카테고리의 다른 글
SPRING - 스프링 트랜잭션(2) (0) | 2018.02.08 |
---|---|
SPRING - 스프링 트랜잭션(1) (0) | 2018.02.08 |
SPRING - @Valid 와 @InitBinder (0) | 2018.02.07 |
SPRING - ValidationUtils 클래스 (0) | 2018.02.07 |
SPRING - Validator 를 이용한 form 데이터 값 검증 (0) | 2018.02.07 |