스프링으로 DB를 다루기위해,
TDD코드에
테이블에 회원 정보를 추가하는 메소드를 만들고
매개변수로 User를 주었기 때문에
User클래스를 만들어준다(테이블의 컬럼과 똑같이 만들어준다)
그리고나서 insertUser메소드를 만들어준 뒤
Test코드로 insertUserTest()코드를 만들어준다.
<code />
public class DBConnectionTest2Test {
@Autowired
DataSource ds;
@Test
public void insertUserTest() throws Exception{
User user = new User("kim","1234","abc","aaa@aaa.com",new Date(),"fb",new Date());
int rowCnt=insertUser(user);
assertTrue(rowCnt==1);
}
//사용자 정보를 user_info테이블에 저장하는 메서드
public int insertUser(User user) throws Exception{
Connection conn = ds.getConnection(); //데이터소스로부터 데이터베이스 연결을 가져온 뒤
// insert into user_info (id, pwd, name, email, birth, sns, reg_date)
// values ('hyerin','1234','hyerin','khr5830@naver.com','1997-06-23','instagram',now());
String sql="insert into user_info values (?,?,?,?,?,?,now()) "; //sql문 작성
PreparedStatement pstmt = conn.prepareStatement(sql); //?에 해당하는 것들을 넣기
pstmt.setString(1, user.getId()); //sql injection 공격, 성능 향상
pstmt.setString(2, user.getPwd());
pstmt.setString(3, user.getName());
pstmt.setString(4, user.getEmail());
pstmt.setDate(5, new java.sql.Date(user.getBirth().getTime()));
pstmt.setString(6, user.getSns());
int rowCnt = pstmt.executeUpdate(); //sql문 실행 - insert,delete,update
return rowCnt;
}
Test Code를 두 번 클릭하면
id가 겹치므로 에러가 난다
그래서 deleteAll 메서드를 만들어주었다
<code />
private void deleteAll() throws Exception{
Connection conn = ds.getConnection(); //데이터소스로부터 데이터베이스 연결을 가져온 뒤
String sql="delete from user_info "; //sql문 작성
PreparedStatement pstmt = conn.prepareStatement(sql); //?에 해당하는 것들을 넣기
pstmt.executeUpdate(); //sql문 실행 - insert,delete,update
}
Test 코드 다시 실행
<java />
@Test
public void insertUserTest() throws Exception{
User user = new User("hering","1234","abc","aaa@aaa.com",new Date(),"fb",new Date());
deleteAll();
int rowCnt=insertUser(user);
assertTrue(rowCnt==1);
}
성공!
그 다음으로는 user_info에서 정보를 가져오는 selet 메소드를 만들어보았다
<code />
public User selectUser(String id) throws Exception{
Connection conn = ds.getConnection(); //데이터소스로부터 데이터베이스 연결을 가져온 뒤
String sql="select * from user_info where id=?"; //sql문 작성
PreparedStatement pstmt = conn.prepareStatement(sql); //?에 해당하는 것들을 넣기
pstmt.setString(1,id);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){ //rs에 값이 있으면
User user = new User(); //rs로부터 값을 받아다 User 객체를 채운 뒤 반환하면 된다
user.setId(rs.getString(1)); //첫 번째 컬럼 값 가져와서 저장
user.setPwd(rs.getString(2));
user.setName(rs.getString(3));
user.setEmail(rs.getString(4));
user.setBirth(new Date(rs.getDate(5).getTime()));
user.setSns((rs.getString(6)));
user.setRed_date(new Date(rs.getTimestamp(7).getTime()));
return user;
}
return null;
}
Test 코드도 만들어준다
<java />
@Test
public void SelectUserTest() throws Exception{
User user = selectUser("hering");
assertTrue(user.getId().equals("hering")); //가져온 id가 괄호와 같다면
}
하지만 매번 id가 있을 거란 보장이 없기 때문에
<code />
@Test
public void SelectUserTest() throws Exception{
deleteAll(); //먼저 모든 데이터를 삭제한 뒤
User user = new User("hering","1234","abc","aaa@aaa.com",new Date(),"fb",new Date());
int rowCnt=insertUser(user); //insert를 한다
User user2 = selectUser("hering");
assertTrue(user.getId().equals("hering")); //가져온 id가 괄호와 같다면
}
Test Case들은
인스턴스 변수인 ds를 공유할까?
<code />
public class DBConnectionTest2Test {
@Autowired //테스트 케이스들은 별도의 객체에서 실행시키기 때문에 ds를 공유하지 않음
DataSource ds;
공유하지 않는다고 한다
삭제하는 코드
<code />
public int deleteUser(String id) throws Exception{
Connection conn = ds.getConnection(); //데이터소스로부터 데이터베이스 연결을 가져온 뒤
String sql="delete from user_info where id=?"; //sql문 작성
PreparedStatement pstmt = conn.prepareStatement(sql); //?에 해당하는 것들을 넣기
pstmt.setString(1,id);
return pstmt.executeUpdate(); //sql문 실행 - insert,delete,update
}
테스트 코드
<code />
@Test
public void deletUserTest() throws Exception{
deleteAll();
int rowCnt=deleteUser("hering");
assertTrue(rowCnt==0);
User user = new User("hering","1234","abc","aaa@aaa.com",new Date(),"fb",new Date());
rowCnt=insertUser(user);
assertTrue(rowCnt==1);
rowCnt=deleteUser(user.getId());
assertTrue(rowCnt==1);
assertTrue(selectUser(user.getId())==null);
}
업데이트 코드
는 과제!
'패캠 챌린지' 카테고리의 다른 글
Transaction, Commit, Rollback (0) | 2023.04.03 |
---|---|
DAO의 작성과 적용 (0) | 2023.03.30 |
Spring으로 DB 연결하기 (0) | 2023.03.28 |
스프링 IOC와 DI (0) | 2023.03.24 |
스프링 DI 활용하기 - 이론 (0) | 2023.03.23 |