Jam's story

[Spring] ํŠธ๋žœ์žญ์…˜ ๋ณธ๋ฌธ

Spring

[Spring] ํŠธ๋žœ์žญ์…˜

์• ํ”Œ์ฉ€ 2022. 7. 18. 16:25

๐Ÿ“Œ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ? 

dispatcher-servlet.xml ์„ค์ •ํŒŒ์ผ์„ ๋ณด๊ณ  ์Šคํ”„๋ง ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ + ์กฐ๋ฆฝํ•˜๋Š” ๊ณต์žฅ 

 

๐Ÿ“Œ web.xml์— ๋ณด๋ฉด  ํ”„๋ก ํŠธ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ๋‹ค. (๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›๋Š” ์ปจํŠธ๋กค๋Ÿฌ ) 

<!--   ์Šคํ”„๋ง front-controller๋“ฑ๋ก -->
  <servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup> <!-- ํ†ฐ์บฃ์ด ์‹œ์ž‘๋ ๋•Œ ์„œ๋ธ”๋ฆฟ๊ฐ์ฒด ์‹คํ–‰  -->
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. (๊ด€๋ฆฌ๋ฅผ ๋ชฉ์  ) 

 

์˜ˆ)

๊ด€๋ฆฌ์ž์š”์ฒญ ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ , 

ajax ์š”์ฒญ ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ ๋“ฑ๋“ฑ... 

 

 

๐Ÿ“Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๊ณ„์ธต๊ตฌ์กฐ (๋ถ€๋ชจ-์ž์‹ ๊ณ„์ธต )

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๊ณ„์ธต๊ตฌ์กฐ(๋ถ€๋ชจ- ์ž์‹ ๊ณ„์ธต )

 

๐Ÿ“Œ ์ง€๊ธˆ์€ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•˜๋‚˜์ด๋‹ค (์ž์‹ ๊ณต์žฅ์ด ํ•˜๋‚˜ ) 

ํ•˜์ง€๋งŒ ,์ง€๊ธˆ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—  ์ž์‹๊ณต์žฅ์„ ๋” ์ถ”๊ฐ€ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ!

dispatcher-servlet.xml => ์„ ์–ธ๋œ ๋นˆ ๊ฐ์ฒด๋“ค ์ค‘์— DB ์—ฐ๋™ํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์€ ๋ถ€๋ชจ๊ณต์žฅ(Application Context)  ๊ทธ ์•ˆ์—์„œ ์ƒ์„ฑํ•˜๋„๋ก ์ฝ”๋”ฉ 


1๏ธโƒฃdispatcher-service.xml ํŒŒ์ผ ์ƒ์„ฑ  -์Šคํ”„๋ง ๋นˆ์„ ๊ด€๋ฆฌ๋ฅผ ๋ชฉ์ ์œผ๋กœ ์„ค์ •ํŒŒ์ผ ๋ถ„๋ฆฌ

 

dispatcher-servlet.xml ( ์ด ์ž์ฒด๊ฐ€ ์„œ๋ธ”๋ฆฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๊ฐœ ์ด์ƒ์˜ dispatcher-servlet์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.  )

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="newlecture.dao, controllers"></context:component-scan>

<!-- ํŒŒ์ผ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ  -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="-1"></property>
</bean>

</beans>

dispatcher-service.xml (๋‚˜๋ˆ„์–ด์ฃผ์—ˆ๋‹ค. ) 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
           
           
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
    <property name="username" value="scott"></property>
    <property name="password" value="tiger"></property>
</bean>

<!-- NamedParameterJddbcTemplate ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ์‚ฌ์šฉ -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>
</beans>

 

๐Ÿ“Œ์ด๋ ‡๊ฒŒํ•˜๋ฉด dispatcher-servlet.xml(์ˆ˜์ •๋œ) ๋งŒ ์‹คํ–‰์ด ๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๊ด€๋ จ ๋นˆ ๊ฐ์ฒด๋“ค์€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. 

์„œ๋น„์Šค์— ์„ค์ •๋œ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก web.xml์„ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. 

 

p373- ContextLoaderListener๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋  ๋นˆ์„ ์„ค์ •ํ•ด์ค€๋‹ค. 

 

web.xml - ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์„ ์—ฌ๋Ÿฌ๊ฐœ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ,( ๋ถ€๋ชจ๊ณต์žฅ๊ณผ ์ž์‹๊ณต์žฅ๋“ค์„ ๋งŒ๋“œ๋Š”๋ฐ,) ๋ถ€๋ชจ๊ณต์žฅ์„ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ์†Œ๋ฆฌ 

   <!-- p.371 WebApplicationContext ๊ณ„์ธต -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dispatcher-service.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

 


springJDBC02 ๋ณต์‚ฌํ•ด์„œ -> springTransaction ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ 

์ปจํ…์ŠคํŠธ root ๋ฐ”๊พธ๊ณ  , add and remove์—์„œ springTransaction ์ด๊ฒƒ๋งŒ ์˜ฌ๋ฆฌ๊ณ , ์„œ๋ฒ„ ์Šคํƒ‘, ํ›„ ํด๋ฆฐ ํ›„ ์žฌ์‹œ์ž‘ 

 

์ ์‹ฌ์‹œ๊ฐ„๋™์•ˆ p505~536 ์ฝ์–ด๋ณด๊ธฐ


1๏ธโƒฃHomeController ์ƒ์„ฑ 

@Controller 
@RequestMapping("/")
public class HomeController {
	
	public HomeController() {
		super();
		// TODO Auto-generated constructor stub
	}
}

 

index.htm ์ƒ์„ฑ 

index.htm ์š”์ฒญ์ด์™”์„๋•Œ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ๋Œ๋ ค์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์ž 

 

HomeController.java



@Controller 
@RequestMapping("/")
public class HomeController {
	
	public HomeController() {
		super();
		// TODO Auto-generated constructor stub
	}
	@RequestMapping("index.htm")
	public String home() throws Exception{
		return "index.jsp";
	}
	
}

 

 

JoinController.java 



@Controller 
@RequestMapping("/joinus/*")
public class JoinController {
	
	public JoinController() {
		super();
		// TODO Auto-generated constructor stub
	}
	private MemberDao memberDao=null;
	
	@RequestMapping(value= {"join.htm"}, method=RequestMethod.GET)
	public String join() throws Exception{
		return "redirect:../index.htm";
		//joinus๊ฐ€ ๋ถ™์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ../ ์ถ”๊ฐ€ 
	}
	@RequestMapping(value= {"login.htm"}, method=RequestMethod.POST)
	public String login(Member member) throws Exception{
		this.memberDao.insert(member); //ํšŒ์› insert
		return "login.jsp";
	}
}

 

 

notice.jsp  -htm ์œผ๋กœ ์ˆ˜์ • 

	<ul id="loginmenu" class="block_hlist">
					<li>
						<a href="../index.htm">HOME</a>
					</li>
					<li>
						<a href="../joinus/login..htm">๋กœ๊ทธ์ธ</a>
					</li>
					<li>
						<a href="../joinus/join.htm">ํšŒ์›๊ฐ€์ž…</a>
					</li>
				</ul>

-507p 

dispatcher-servlet.xml

 

    <!-- ์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•  ํŠธ๋žœ์žญ์…˜ ๋ฉ”๋‹ˆ์ ธ ๋“ฑ๋ก -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

 

6. ์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• 

1)์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ: ๊ฐœ๋ฐœ์ž ์ง์ ‘ ์ฝ”๋”ฉ . ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ ธ, ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ์ด์šฉ

2)์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• xml์„ค์ •

3)์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ @์–ด๋…ธํ…Œ์ด์…˜ 

 

 


ํŠธ๋žœ์žญ์…˜ ์‹ค์Šต 

ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์‹ค์Šต 

1)๊ณต์ง€์‚ฌํ•ญ ์ƒˆ๊ธ€์ž‘์„ฑ   + 

noticeํ…Œ์ด๋ธ” insert 

 

2)point์นผ๋Ÿผ๊ฐ’์€ <3 ์ฒดํฌ์ œ์•ฝ์กฐ๊ฑด ์„ค์ • 

 

3)noticeํ…Œ์ด๋ธ” pk ์ œ์•ฝ์กฐ๊ฑด ์„ค์ •

 

4)notice ํ…Œ์ด๋ธ”์˜ title ์นผ๋Ÿผ๊ฐ’์€ unique ์ œ์•ฝ์กฐ๊ฑด ์„ค์ • 

 

1๏ธโƒฃSQL 

ALTER TABLE member
ADD ( point number(10) default(0) );

ALTER TABLE member
ADD CONSTRAINT ck_member_point CHECK( point < 3 );


ALTER TABLE notices
ADD CONSTRAINT pk_notice_seq   PRIMARY KEY( seq );


 ALTER TABLE notices
  ADD CONSTRAINT uk_notice_title unique( title);

 

 

2๏ธโƒฃMember.java

	//ํŠธ๋ž™์žญ์…˜ ์ฒ˜๋ฆฌ ์ฒดํฌ์œ„ํ•ด์„œ point ์นผ๋Ÿผ ์ถ”๊ฐ€ 
	private int point;
	
	public int getPoint() {
		return point;
	}
	public void setPoint(int point) {
		this.point = point;
	}

 

3๏ธโƒฃjoin.jsp

// action="join.htm"
<div class="top-wrapper clear">
<div id="content">
<form action="join.htm" method="post">
<h2>ํšŒ์›๊ฐ€์ž…</h2>


//form ํƒœ๊ทธ ์•ˆ์— ๊ฐ€์ž…๋ฒ„ํŠผ ๋„ฃ๊ธฐ 
<div id="buttonLine">
<input class="btn-okay button" type="submit" value="๊ฐ€์ž…" />
</div>
</form>

 

4๏ธโƒฃ

์šฐ์„  ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด ์ƒˆ๊ธ€(insert)+ ์ž‘์„ฑ์ž์˜ point ์นผ๋Ÿผ1์ฆ๊ฐ€(update) ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์•ˆ๋œ ์ƒํƒœ 

interface NoticeDao์— ์ถ”๊ฐ€ 

	//ํŠธ๋žœ์žญ์…˜ ํ…Œ์ŠคํŠธ ์šฉ๋„์˜ ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€ 
	public void insertAndPointUpOfMember(Notice notice, String id) throws ClassNotFoundException, SQLException;

 

 

5๏ธโƒฃNLNoticeDao

@Override
public void insertAndPointUpOfMember(Notice notice, String id) throws ClassNotFoundException, SQLException {
	//์ƒˆ ๊ณต์ง€์‚ฌํ•ญ ์“ฐ๊ธฐ    
	String sql = "INSERT INTO NOTICES"
		    	+ "(SEQ, TITLE, CONTENT, WRITER, REGDATE, HIT, FILESRC) "
	            + "VALUES"
	            + "( (SELECT MAX(TO_NUMBER(SEQ))+1 FROM NOTICES), :title, :content, :writer, SYSDATE, 0, :filesrc)";
	      
	      SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(notice);
	      
	       this.jdbcTemplate.update(sql, parameterSource);
	    
	      
	      //ํฌ์ธํŠธ 1์ฆ๊ฐ€
	     sql="UPDATE member"
	     		+ "SET point =point+1"
	     		+ "WHERE id=:id";
	    		 
	    MapSqlParameterSource paramSource2 = new MapSqlParameterSource();
	      paramSource2.addValue("id",id);
	      
	     this.jdbcTemplate.update(sql, paramSource2);
}

 

์ปจํŠธ๋กค๋Ÿฌ์— noticeReg ๋ฉ”์†Œ๋“œ 

	๋งˆ์ง€๋ง‰์— ์ด๋ถ€๋ถ„ ์ถ”๊ฐ€ 
    	this.noticeDao.insertAndPointUpOfMember(notice, "kenik");
		return "redirect:notice.htm";
    
    
    
    //๊ธ€์“ฐ๊ธฐ+์ฒจ๋ถ€๋œ ํŒŒ์ผ 
	@RequestMapping( value = {"noticeReg.htm"}, method = RequestMethod.POST )
    public String noticeReg(Notice notice ,HttpServletRequest request ) throws Exception {
        //1 ์ฒจ๋ถ€๋œ ํŒŒ์ผ์˜ ์œ ๋ฌด ํ™•์ธ ํ›„์— ํŒŒ์ผ์ €์žฅ 
		CommonsMultipartFile multipartFile= notice.getFile();
		
		String uploadRealPath=null;
		
		if(!multipartFile.isEmpty()) { //์ฒจ๋ถ€๋œ ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด 
			uploadRealPath =request.getServletContext().getRealPath("/customer/upload");
			System.out.println("uplaodRealPath:"+uploadRealPath);
			
			String originalFilename=multipartFile.getOriginalFilename(); //์˜ค์ฒœ "a.txt" ->"a_1.txt"
			//์ด๋ ‡๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ๋ถ™์ด๋Š” ํ•จ์ˆ˜ (์ด๋ฏธ ์กด์žฌํ•  ์ˆ˜ ๋„ ์žˆ์œผ๋‹ˆ๊นŒ)
		    String filesystemName = getFileNameCheck(uploadRealPath, originalFilename);
			File dest=new File(uploadRealPath,filesystemName);
			multipartFile.transferTo(dest); //์‹ค์งˆ์ ์œผ๋กœ ํŒŒ์ผ์„ ์ €์žฅ 
			
			//originalFilename ,  filesystemName Notices ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ์ด 2๊ฐœ ์กด์žฌ 
			String filesrc=filesystemName; //์ €์žฅํ•˜๊ณ ์žํ•˜๋Š” ํŒŒ์ผ 
			notice.setFilesrc(filesrc);
		}
		//2.Notices ํ…Œ์ด๋ธ”์— ๊ณต์ง€์‚ฌํ•ญ INSERT
		notice.setWriter("kenik");
/*         int rowCount = this.noticeDao.insert(notice);
         if (rowCount==1) { 
            return "redirect:notice.htm";         
         }else { 
            return "redirect:noticeReg.jsp?error"; 
         }*/
		
		this.noticeDao.insertAndPointUpOfMember(notice, "kenik");
		return "redirect:notice.htm";
   } // noticeReg

 

 


์ด์ œ๋ถ€ํ„ฐ ์Šคํ”„๋ง์œผ๋กœ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ -2)์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• xml์„ค์ •

1๏ธโƒฃweb.xml์— ์ถ”๊ฐ€ 

    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"/>
</bean>

์ „์ฒด์ฝ”๋“œ 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
           
           
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
    <property name="username" value="scott"></property>
    <property name="password" value="tiger"></property>
</bean>

<!-- NamedParameterJddbcTemplate ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ์‚ฌ์šฉ -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>
    <!-- p507 ์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•  ํŠธ๋žœ์žญ์…˜ ๋ฉ”๋‹ˆ์ ธ ๋“ฑ๋ก -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"/>
</bean>
</beans>

 

2๏ธโƒฃNLNoticeDao.java์— ์ถ”๊ฐ€

   
   @Autowired
   private TransactionTemplate transactionTemplate;

 

3๏ธโƒฃp516 

ํŠธ๋žœ์žญ์…˜์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์žฅ์†Œ(๋ฉ”์†Œ๋“œ) 

NLNoticeDao.java    -  insertAndPointUpOfMember()

//ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠธ๋žœ์žญ์…˜์ฒ˜๋ฆฌ 
@Override
public void insertAndPointUpOfMember(Notice notice, String id) throws ClassNotFoundException, SQLException {
	//์ƒˆ ๊ณต์ง€์‚ฌํ•ญ ์“ฐ๊ธฐ    
	String sql = " INSERT INTO NOTICES"
		    	+ " (SEQ, TITLE, CONTENT, WRITER, REGDATE, HIT, FILESRC) "
	            + " VALUES"
	            + " ( (SELECT MAX(TO_NUMBER(SEQ))+1 FROM NOTICES), :title, :content, :writer, SYSDATE, 0, :filesrc)";
   
    //ํฌ์ธํŠธ 1์ฆ๊ฐ€
  String sql2=" UPDATE member"
	     		+ " SET point =point+1"
	     		+ " WHERE id=:id";
	    
	    /// TransactionCallback+ WithoutResult 
	    //์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚œ๋‹ด์— ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ๊ฐ’์ด ์—†์„๊ฒฝ์šฐ 
	    this.transactionTemplate.execute(new TransactionCallbackWithoutResult() {

			@Override
			protected void doInTransactionWithoutResult(TransactionStatus ts) {
				  SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(notice);
			      //์ด ์•ˆ์—์„œ this๋ผ๊ณ  ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค. TransactionCallbackWithoutResult() ์˜ this ๋ผ๋Š” ๋œป์ด์–ด์„œ 
				  // this.jdbcTemplate.update(sql, parameterSource);
				  jdbcTemplate.update(sql, parameterSource);
			       MapSqlParameterSource paramSource2 = new MapSqlParameterSource();
				      paramSource2.addValue("id",id);
				    jdbcTemplate.update(sql2, paramSource2);
			}
	    	
	    });
	 
}

 

๊ธ€์„์“ฐ๋‹ˆ 

2๋กœ ๋ณ€๊ฒฝ!

ํ•˜์ง€๋งŒ ๋˜ ํ•œ๋ฒˆ ๊ธ€์„ ์“ฐ๋ ค๊ณ  ํ•˜๋‹ˆ  ์—๋Ÿฌ๋ฐœ์ƒ  - > ๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ ์ƒˆ๋กœ ์ƒ์„ฑ ํ•ด์„œ ์„ ์–ธ์ ๋ฐฉ๋ฒ• ์‹œ๋„ 

 


springTransaction03

์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ 
  • ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ? ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € ๊ฐ์ฒด
  • ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ springTransaction X
  • ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ 
    1. xml ์„ค์ •ํŒŒ์ผ - springTransaction02
      • <tx:advice> ํƒœ๊ทธ์ด์šฉ - ํŠธ๋žœ์žญ์…˜ ์†์„ฑ ์ •์˜ํ•˜๋Š” ํƒœ๊ทธ
      • <aop:config> ํƒœ๊ทธ - ํŠธ๋žœ์žญ์…˜๋„ ๋‚ด๋ถ€์ ์œผ๋กœ AOP ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    2. @Transaction ์–ด๋…ธํ…Œ์ด์…˜ - springTransaction03
    3. ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋ฒ”์œ„, ๋กค๋ฐฑ ๊ทœ์น™ ๋“ฑ๋“ฑ ์ •์˜ํ•ด์„œ ์ฒ˜๋ฆฌ

 

1๏ธโƒฃweb.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" 
               xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/tx
               http://www.springframework.org/schema/tx/spring-tx.xsd">

2๏ธโƒฃNLNoticeDao.java

 

// [3]
   // [tx:advice + aop:config] ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ. 
   @Override
   public void insertAndPointUpOfMember(Notice notice, String id) throws ClassNotFoundException, SQLException {
      // 1. ์ƒˆ ๊ณต์ง€์‚ฌํ•ญ ์“ฐ๊ธฐ
      String sql = "INSERT INTO NOTICES"
            + " ( SEQ, TITLE, CONTENT, WRITER, REGDATE, HIT, FILESRC) "
            + " VALUES"            
            + " ( (SELECT MAX(TO_NUMBER(SEQ))+1 FROM NOTICES), :title, :content, :writer, SYSDATE, 0, :filesrc  )";

      // 2. ํฌ์ธํŠธ 1์ฆ๊ฐ€
      String  sql2 = "UPDATE member "
            + " SET point = point + 1 "
            + " WHERE id = :id ";      


      // 1.
      SqlParameterSource paramSource = new BeanPropertySqlParameterSource(notice);  
      jdbcTemplate.update(sql                             ,      paramSource  );      

      // 2
      MapSqlParameterSource paramSource2 = new MapSqlParameterSource();
      paramSource2.addValue("id", id);      
      jdbcTemplate.update(sql2, paramSource2);


   } //  insertAndPointUpOfMember

 

์—๋Ÿฌ๋ฉ”์„ธ์ง€ 
javax.servlet.ServletException: ์„œ๋ธ”๋ฆฟ [dispatcher]์„(๋ฅผ) ์œ„ํ•œ Servlet.init() ํ˜ธ์ถœ์ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

 

 


springTransaction04

์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜

@transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด ์ž๋™์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค. 

 

dispatcher-servlet.xml  ์—์„œ <tx:annotation> ์ถ”๊ฐ€ 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
">

    <context:component-scan base-package="newlecture.dao, controllers" />

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="-1"></property>
    </bean>

    <!-- ์ถ”๊ฐ€ -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insertAndPointUpOfMember" 
                isolation="DEFAULT" 
                propagation="REQUIRED"
                read-only="false"
                timeout="-1"
            />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut expression="execution(public void insertAndPointUpOfMember(*, *))" id="insertOrM"/>
        <aop:pointcut expression="within(newlecture.dao.*)" id="insertPackage"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="insertOrM"/>
    </aop:config>
</beans>

 

NLNoticeDAO.java

 

  @Override
   @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, timeout = -1)
   public void insertAndPointUpOfMember(Notice notice, String id) throws ClassNotFoundException, SQLException {
      // 1. ์ƒˆ ๊ณต์ง€์‚ฌํ•ญ ์“ฐ๊ธฐ
      String sql = "INSERT INTO NOTICES"
            + " ( SEQ, TITLE, CONTENT, WRITER, REGDATE, HIT, FILESRC) "
            + " VALUES"            
            + " ( (SELECT MAX(TO_NUMBER(SEQ))+1 FROM NOTICES), :title, :content, :writer, SYSDATE, 0, :filesrc  )";

      // 2. ํฌ์ธํŠธ 1์ฆ๊ฐ€
      String  sql2 = "UPDATE member "
            + " SET point = point + 1 "
            + " WHERE id = :id ";      


      // 1.
      SqlParameterSource paramSource = new BeanPropertySqlParameterSource(notice);  
      jdbcTemplate.update(sql                             ,      paramSource  );      

      // 2
      MapSqlParameterSource paramSource2 = new MapSqlParameterSource();
      paramSource2.addValue("id", id);      
      jdbcTemplate.update(sql2, paramSource2);


   } //  insertAndPointUpOfMember
Comments