SPRING - 스프링JDBC, @Autowired

이번엔 스프링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 에 있는 템플릿값을 저장해줍니다





위와 같은 방법을 사용 하면 컨트롤러에서 만든

템플릿을 어디서든 다 쓸수 있게 할수 있습니다.



댓글

Designed by JB FACTORY