Burninghering's Blog
Published 2023. 3. 29. 00:54
스프링으로 DB 다루기 패캠 챌린지

스프링으로 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
profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.