재미있게 코딩합시다

3. 스프링(Spring) - 데이터베이스와의 연동 본문

IT /Spring(스프링)

3. 스프링(Spring) - 데이터베이스와의 연동

감민셔 2019. 1. 4. 16:48

일반적인 웹 어플리케이션의 구조.



DB와 연동하기 

코딩하는것에 앞서서

프로젝트에 메이븐과 Spring-core,spring-context, spring-jdbc, spring-mysql 

을 셋팅을 햇음을 알려드립니다.


java에서 기본 JDBC를 사용하면서 불편했던점..


- PreparedStatement 구문이 편하지만

바인딩 에 대해서 타입, 위치를 개발자가 직접 다 지정해줘야한다.

-ResultSet에서 값을 줏어올때도 타입과 위치를 개발자가 직접세팅을해줘야햇다

-PreparedStatment구문 객체랑 ResultSet객체 사용후 close도 해줘야합니다.


하지만 스프링에서는


Dao가 Connection을 직접 제어하지 않고 Connection을 관리해주는 한단계 높은

응용계층의 객체를 사용합니다.  =>> session 입니다.



Spring-JDBC에서는 제공하는

Connection을 관리하는 작업을 대신 해주는 

Session 역할을 해주는 객체 : 

이름 : jdbTemplate 


저역활을 하는 친구들이 Connetction을 어떻게 연결할지에 대한 정보들을

Java.sql.DataSource 인터페이스를 구현하는 객체가 도와줍니다.


DataSource구현체 : DB에 연결하기 위한 정보들의 집합.


스프링컨테이너에 DataSource 구현체를 Bean으로 등록

(DB 접속정보를 넣는다)(url,username,password)


JdbcTemplate을 빈으로 등록.

(DataSource를 넣어서 )

JdbcTemplate을 사용하는 Dao 작성.

작성한 Dao를 컨테이너에 빈으로 등록(JdbcTemplate넣어서)


<!-- DataSource구현체 빈으로 등록 -->

<!-- 어떻게 디비에 접속할건지에 대한 정보 + 커넥션을 어떻게 관리할건지 -->

-<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property value="com.mysql.jdbc.Driver" name="driverClassName"/>

<property value="jdbc:mysql://localhost:3306/bitcamp" name="url"/>

<property value="root" name="username"/>

<property value="mysql" name="password"/>

</bean>


<!-- JdbcTemplate은 Connection에 sql을 먹이고, 결과받아오는 역할 -->

<!-- 우리가 만드는 Dao는 JdbcTemplate이 sql을 날리기 위해 필요한 정보 전달 & 결과값받기 -->

-<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"/>

</bean>

-<bean id="memberDao" class="MemberDao">

<property name="jdbcTemplate" ref="jdbcTemplate"/>

</bean>

</beans>

DriverManagerDateSource  ==>스프링에서 제공하는 연습용의 아주 단순한 DataSource 구현제


여기까지 ApplicationContext.xml 설정 끝


먼저 database에 사용될 model 들을 설정해줘야하므로

toString, getter, setter 들을 설정해준다.

package a;

import java.util.Date;


public class Member {

private String id;

private String pw;

private String name;

private String email;

private String regDate;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPw() {

return pw;

}

public void setPw(String pw) {

this.pw = pw;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getRegDate() {

return regDate;

}

public void setRegDate(String regDate) {

this.regDate = regDate;

}

@Override

public String toString() {

return "Member [id=" + id + ", pw=" + pw + ", name=" + name + ", email=" + email + ", regDate=" + regDate

+ "]";

}

}

inset와 delete update selectone selectAll 들이 들어잇는

Dao도 정의 해주기

package a;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;


import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.RowMapper;

//dao가 구현하고 싶은 기능은

//하나의 member객체에 대한 테이블에 insert,update

//특정 id에 대해 delete하는거

//특정 id에 대해 하나의 레코드를 select하는거

//모든 레코드 select하는거

public class MemberDao {

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

public void insertMember(Member member) {

String sql = "insert into member values(?,?,?,?,?)";

jdbcTemplate.update(sql,member.getId(),

member.getPw(),member.getName(),

member.getEmail(),member.getRegDate());

}

public void updateMember(Member member) {

String sql = "update member set m_pw = ?,"

+"m_name = ?" + "m_email" + "m_reg_date"

+ "where m_id = ?";

jdbcTemplate.update(sql,

member.getPw(),member.getName(),

member.getEmail(),member.getRegDate(),

member.getId());

}

public void deleteMember(String id) {

String sql = "delete from member where m_id = ?";

jdbcTemplate.update(sql,id);

}

//결과값 받아오기

RowMapper<Member> rowMapper = new RowMapper<Member>() {

@Override

public Member mapRow(ResultSet rs, int index) throws SQLException {

Member member = new Member();

member.setId(rs.getString("m_id"));

member.setPw(rs.getString("m_pw"));

member.setName(rs.getString("m_name"));

member.setEmail(rs.getString("m_email"));

member.setRegDate(rs.getString("m_reg_date"));


return member;

}

};

//위의 결과값 받아오는것을 바탕으로 selectone selectAll 만든다.

public Member selectOne(String id) {

String sql = "select * from member where m_id = ?";

return jdbcTemplate.queryForObject(sql, rowMapper, id);

}

public List<Member> selectAll(){

String sql = "select * from member";

return jdbcTemplate.query(sql, rowMapper);

}

}

JAVA에서와 Spring에서 DAO가 다른점

1.데이터타입신경X,

2.직접구문객체 얻어쓴다

3.쓰고닫고 하지않아도 상관없다

4.예외처리 안해도된다.


그리고 

//결과값 받아오기밑의 코드들은

resultSet이 결과 테이블을 탑색할 때 

하나의 레코드를 하나의 모델객체로 어떻게 변환할지를

ProwMapper 인터페이스가 정의하는 메소드에 구현하면 된다.mapRow();

그럼 나중에 select 할때 마다 이 객체를 활용해서 결과값을 매핑해준다.


Test 클래스를 만들어서 실행해보기

package a;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;


public class Test {

public static void main(String [] args) {


ApplicationContext context= new FileSystemXmlApplicationContext("src/a/applicationContext.xml");

MemberDao dao = context.getBean("memberDao",MemberDao.class);

Member member = new Member();

member.setId("kim");

member.setPw("123");

member.setName("kimminseo");

member.setEmail("1");

member.setRegDate("2019-01-04");

dao.insertMember(member);

// dao.deleteMember("kim");

System.out.println(dao.selectOne("kim"));

for(Member m : dao.selectAll())

System.out.println(m);

}

}


Comments