Spring

DB 연동 2/4_ JdbcDaoSupport

wintertreey 2024. 7. 14. 17:31

db연동방법4
1. 클래스내에서 직접 sql문 기술
2. 스프링이 지원하는 jdbcdao support 사용
3. mybatis 프레임워크사용
4. jpa 사용

앞에서 살펴본 DataBase 연동방법1은 Spring을 공부하기 전에도 시도했던 방법과 유사했다. 

이번에는 Spring에서 제공하는 클래스를 사용하여 db연동을 해보고자한다. 

 


 jdbcdaosupport란?

JdbcDaoSupport 클래스는 Spring 프레임워크에서 제공하는 추상 클래스.

데이터베이스와 상호 작용하는 DAO를 개발할 때 편리한 기능을 제공해준다.

이 클래스는 JdbcTemplate을 사용하여 데이터베이스 작업을 처리하고, 템플릿 메소드 패턴을 활용하여 일반적인 데이터 액세스 작업을 구현해준다. 

 

JdbcDaoSupport 의 멤버메소드 중 getJdbcTemplate(), setDataSource()가 있다.

getJdbcTemplate(): jdbctemplae 객체반환. db 쿼리를 실행, 결과처리에 사용된다.

setDataSource(): JdbcDaoSupport 클래스에 db연결을 설정하는 데 사용.

상속 방법

JdbcDaoSupport 클래스를 상속하여 DAO 클래스를 개발하는 방법은 다음과 같다.
public class EmployeeDao extends JdbcDaoSupport {
	// DAO 구현 내용
}
  1. DAO 클래스에서 JdbcDaoSupport를 상속합니다.
  2. JdbcDaoSupport를 상속한 DAO 클래스에서 JdbcTemplate을 사용하여 데이터베이스 작업을 처리합니다. JdbcTemplate은 JdbcDaoSupport 클래스에서 제공되는 메소드를 통해 접근할 수 있습니다.

앞으로 마주할 수많은 프레임워크 및 라이브러리들. 

그럴때마다 그게 뭔지 파악하기엔 API를 파악하는게 좋다. 

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html

 

 

 


 

SangpumImpl.java

package pack;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class SangpumImpl extends JdbcDaoSupport implements SangpumInter {
	
	@Override
	public ArrayList<SangpumDto> selectAll() {
		RowMapper rowMapper = new SangpumRowMapper();
		
		return (ArrayList)getJdbcTemplate().query("select * from sangdata", rowMapper);
	}

	// 내부 클래스
	class SangpumRowMapper implements RowMapper {
		@Override
		public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
			//preparedstatement에 의해 select의 실행 결과가 mapRow로 전달됨.rs.next() 불요.
			System.out.println("rowNum: "+ rowNum);
			SangpumDto dto = new SangpumDto();
			dto.setCode(rs.getString("code"));
			dto.setSang(rs.getString("sang"));
			dto.setSu(rs.getString("su"));
			dto.setDan(rs.getString("dan"));
			return dto;
			//rowMapper에 의해 dto가 List컬랙션에 저장.레코드자료가 소진될때까지. 
		}
	}
}

JdbcDaoSupport를 포함시킨다. 

그리고 sql문을 getJdbcTemplate 쿼리문 안에 적어준다. 

내부클래스를 만들어 실행 결과를 출력한다. 

 

init.xml

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 컴포넌트스캔은 여기서 해줘도 되고, 밖에서 어노테이션으로 해도됨. 원래있던건 불요. 모두 지움.  -->
<context:component-scan base-package="pack"/> 
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>org.mariadb.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mariadb://localhost:3306/test</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password">
			<value>123</value>
		</property>
	</bean>

	<bean id="sangpumImpl" class="pack.SangpumImpl">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<bean id="businessImpl" class="pack.BusinessImpl">
		<property name="sangpumInter" ref="sangpumImpl"></property>
	</bean>

</beans>

드라이버 관련 사항이 저장된 파일.

 

출력 결과물


BusinessImpl.java

package pack.model;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class JikwonImpl extends JdbcDaoSupport implements JikwonInter{
	
	@Autowired
	private DataSource dataSource;
	
	@PostConstruct //생성자 다음에 수행되는 메소드. 초기화작업시 여기서 수행.
	public void abcd() {
		setDataSource(dataSource);
	}
	
	@Override
	public List<JikwonDto> selectList(String buserNum) throws DataAccessException {
		RowMapper rowMapper = new JikwonMapper();
		String sql = "select jikwon_no, jikwon_name, buser_name, buser_tel, jikwon_jik "
				+ "from jikwon inner join buser on jikwon.buser_num=buser.buser_no";
		switch (buserNum) {
		case "10":
		case "20":
		case "30":
		case "40":
			sql += " where buser_num="+ buserNum;
			break;
		}
		return getJdbcTemplate().query(sql, rowMapper);
	}
	
	class JikwonMapper implements RowMapper{
		@Override
		public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
			// TODO Auto-generated method stub
			return new JikwonDto() {
				{
					setJikwon_no(rs.getString("jikwon_no"));
					setJikwon_name(rs.getString("jikwon_name"));
					setBuser_name(rs.getNString("buser_name"));
					setBuser_tel(rs.getString("buser_tel"));
					setJikwon_jik(rs.getString("jikwon_jik"));
				}
			};
		}
	}
}

 

@postConstruct
- 객체의 초기화 부분
- 객체가 생성된 후 별도의 초기화 작업을 위해 실행하는 메소드를 선언
@PreDestroy
- 마지막 소멸 단계
- 스프링 컨테이너에서 객체(빈)를 제거하기 전에 해야할 작업이 있다면 메소드위에 사용하는 어노테이션.
 

이번엔 Asepct를 cross-cutting 해본다.

 

LoginAdvice.java

package pack.aspect;

import java.util.Scanner;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LoginAdvice { //관심사항
	@Around("execution(public void jikwonList())") //직원리스트하기전에 꼭 로그인하고싶다
	public Object haha(ProceedingJoinPoint joinPoint) throws Throwable{
	System.out.println("로그인아이디 입력:"); //  이공간에 로그인, 트랜젝션, 시큐리티 등을 거는것.
		Scanner sc = new Scanner(System.in);
		String id = sc.next();
		
		
		if(!id.equalsIgnoreCase("kor")) {
			System.out.println("id불일치. 로그인 실패");
			return null;
		}
		Object object = joinPoint.proceed(); //직원리스트가 수행되는곳
		sc.close();
		
		return object;
		
	}
}

전체 소스코드는 깃허브의 spr14, 15, 16을 참조하자. 

https://github.com/yoonah0327/spring_source.git

 

GitHub - yoonah0327/spring_source

Contribute to yoonah0327/spring_source development by creating an account on GitHub.

github.com

 


https://newcodingman.tistory.com/entry/Spring-JdbcDaoSupport-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%83%81%EC%86%8D

 

Spring JdbcDaoSupport 클래스 상속

Spring 프레임워크에서 JdbcDaoSupport는 데이터베이스와 상호 작용하는 DAO(Data Access Object)를 개발할 때 도움을 주는 유틸리티 클래스입니다. JdbcDaoSupport 클래스의 상속에 대해 자세히 알아보고, 사용

newcodingman.tistory.com

https://goddaehee.tistory.com/46

 

[Spring] @PostConstruct , @PreDestroy

@postConstruct - 객체의 초기화 부분 - 객체가 생성된 후 별도의 초기화 작업을 위해 실행하는 메소드를 선언한다. - @PostConstruct 어노테이션을 설정해놓은 init 메소드는 WAS가 띄워질 때 실행된다. @Pre

goddaehee.tistory.com