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

스프링으로 DB를 다루기위해,

TDD코드에

테이블에 회원 정보를 추가하는 메소드를 만들고

매개변수로 User를 주었기 때문에

User클래스를 만들어준다(테이블의 컬럼과 똑같이 만들어준다)

 

그리고나서 insertUser메소드를 만들어준 뒤

 

Test코드로 insertUserTest()코드를 만들어준다.

 

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 메서드를 만들어주었다

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 코드 다시 실행

@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 메소드를 만들어보았다

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 코드도 만들어준다

    @Test
    public void SelectUserTest() throws Exception{
       User user = selectUser("hering");
       assertTrue(user.getId().equals("hering")); //가져온 id가 괄호와 같다면
    }

 

하지만 매번 id가 있을 거란 보장이 없기 때문에

@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를 공유할까?

public class DBConnectionTest2Test {
   @Autowired //테스트 케이스들은 별도의 객체에서 실행시키기 때문에 ds를 공유하지 않음
    DataSource ds;

공유하지 않는다고 한다


삭제하는 코드

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
    
}

 

테스트 코드

@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

@개발자 김혜린

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