본문 바로가기

SPRING/Configuration

스프링 DB 연동 - JDBC / C3P0

0. 테이블, 시퀀스, 샘플 데이터 넣기

데이터 넣을 때는 꼭 commit; 작업 실행하기

 

 

1. pom.xml에 DB 연동 라이브러리 추가

 

       	<!-- DB 연동 라이브러리들 추가 -->
        
        <!-- jdbc 추가 -->
        <dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-jdbc</artifactId>
        	<version>4.1.0.RELEASE</version>
        </dependency>
        
        <!-- 커넥션풀 추가 -->
        <dependency>
        	<groupId>com.mchange</groupId>
        	<artifactId>c3p0</artifactId>
        	<version>0.9.2.1</version>
        </dependency>
        <dependency>
        	<groupId>commons-dbcp</groupId>
        	<artifactId>commons-dbcp</artifactId>
        	<version>1.4</version>
        </dependency>
        
        <!-- 오라클은 스프링에서 드라이버 제공을 안해주기 때문에 따로 지정 -->
        <dependency>
        	<groupId>oracle</groupId>
        	<artifactId>ojdbc6</artifactId>
        	<version>11.2.0.3</version>
        </dependency>

 

+ ojdbc6.jar 파일 .m2 경로에 넣기

왜? 스프링에서 오라클 드라이버는 제공해주지 않기 때문에 따로 폴더에 넣어줘야함

아니면, OJDBC 사설 저장소 추가하는 방법도 있음 -> 하지만, 사설 저장소이기 때문에 오류가 발생하면 저장소 주소를 변경해줘야함

그래서, 편하게 직접 .jar 파일 넣어주기

 

 

2. appctx.xml

DB 접속 정보를 객체에 저장하고, 그 객체를 DAO에 전달

커넥션 풀 설정

-> 이미 디비 접속이 되어있는 애들을 모아놓음. 다썼다 close하면 끊어버리는게 아니라 풀장에 돌려주는 것.

-> 다양한 옵션을 적용할 수 있음

 

 

3. MemberDAO 클래스

 

public class MemberDAO {
	
	private JdbcTemplate jdbcTemplate;
	
	public MemberDAO(DataSource dataSource) { // xml에서 의존 주입해주기
		System.out.println("MemberDAO 객체 생성");
		jdbcTemplate = new JdbcTemplate(dataSource); // jdbcTemplate도 만들어야됨!!
	}

	public Member selectByEmail(String email) {
		List<Member> result = jdbcTemplate.query(
				"select * from member where email=?", new MemberRowMapper(), email);
		return result.isEmpty() ? null : result.get(0);
	}	
	
	public List<Member> selectAll() {
		List<Member> result = jdbcTemplate.query(
				"select * from member", new MemberRowMapper());
		return result;
	}
	
	public int count() {
		Integer cnt = jdbcTemplate.queryForObject(
				"select count(*) from member", Integer.class);
		return cnt;
	}
	
	public void update(Member member) {
		jdbcTemplate.update(
				"update member set name = ?, password = ? where email = ?",
				member.getName(), member.getPassword(), member.getEmail());
	}
	
	// KeyHolder
	public void insert(Member member) { // 사용자한테 ID 값은 전달받지 않음. 즉 id=null인 상태
		KeyHolder keyHolder = new GeneratedKeyHolder(); 
		jdbcTemplate.update(
				new PreparedStatementCreator() { // 익명클래스 생성
					@Override
					public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
						PreparedStatement pstmt = con.prepareStatement(
							"insert into member (id, email, password, name, regdate)" + 
							"values (MEMBER_SEQ.nextval, ?, ?, ?, ?)",
							new String[] {"ID"}); // 배열을 String으로 전달. 지금은 ID만 전달. 홀딩시킬 값을 저장
							pstmt.setString(1, member.getEmail());
							pstmt.setString(2, member.getPassword());
							pstmt.setString(3, member.getName());
							pstmt.setTimestamp(4, new Timestamp(member.getRegisterDate().getTime()));

							return pstmt;
							
					}
				}, keyHolder); // 최종 ID 값을 keyHolder에 저장
			Number keyValue = keyHolder.getKey();
			member.setId(keyValue.longValue());
	}
	
	public void delete(String email, String password) {
		
		jdbcTemplate.update("delete member where email = ? and password = ?", 
							email, password);
		
	}
	
	public void memberDelete(Member member) {
		
		Member pmember = selectByEmail(member.getEmail());
		if(pmember == null) {
			System.out.println("회원 정보가 없습니다.");
		} else if(pmember.getPassword().equals(member.getPassword())) {
			jdbcTemplate.update("delete member where id = ?", pmember.getId());
		} else {
			System.out.println("비밀번호가 일치하지 않습니다.");
		}
		
	}
	
}

 

 

 

 

4. MemberRowMapper 클래스

- select() 메서드에서 사용

 

 

5. Main 메서드

 

public class MainForMemberDao {
	
	private static MemberDAO memberDao;
	
	public static void main(String[] args) {
		GenericXmlApplicationContext ctx =
				new GenericXmlApplicationContext("classpath:appctx.xml");
		
		memberDao = ctx.getBean("memberDao", MemberDAO.class);
		
		selectByEmail("test@naver.com");
		selectAll();
		count();
		update();
		insert();
		delete(); // 내꺼
		memberDelete(); // 강사님꺼
	}

    private static void memberDelete() {
    	System.out.println("-----delete Test");
    	Member member = new Member(
	    			"test2@naver.com",
					"2222",
					"test2",
    				new Date());
    	memberDao.memberDelete(member);
	}

	private static void delete() {
		System.out.println("-----delete Test");
		memberDao.delete("0928172624@test.com", "0928172624");
		
	}

	private static void insert() {
		System.out.println("-----insert Test");
		//SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmmss");
		//String prefix = dateFormat.format(new Date());
		Member member = 
				new Member(
						"test5@naver.com",
						"5555",
						"test5",
						new Date());
		memberDao.insert(member);
		System.out.println(member.getId() + "번 데이터 추가"); // ID값을 알 수 있게 됨
	}

	private static void update() {
		System.out.println("-----update Test");
		Member member = memberDao.selectByEmail("test@naver.com");
		String oldPwd = member.getPassword();
		String newPwd = Double.toHexString(Math.random());
		member.changePassword(oldPwd, newPwd);
		
		memberDao.update(member);
		System.out.println("암호 변경: " + oldPwd + "->" + newPwd);
	}

	private static void count() {
		System.out.println("-----count Test");
		int cnt = memberDao.count();
		System.out.println("멤버 수: " + cnt);
		
	}

	private static void selectAll() {
		System.out.println("-----selectAll Test");
		List<Member> ls = memberDao.selectAll();
		for(Member tmp:ls) {
			System.out.println(tmp);	
		}
	}

	private static void selectByEmail(String email) {
		System.out.println("-----selectByEmail Test");
		Member member = memberDao.selectByEmail(email);
		System.out.println(member);	
	}
}