spring으로 DB다루기 -TDD

 

//사용자 정보를 user_info 테이블에 저장하는 메서드

public int insertUser(User user) throws Exception {
        Connection conn = ds.getConnection(); // 데이터 소스로부터 데이터베이스를 가져옴

// sql에 작성해놓은 인포와 값. 순서가 일치해야 한다.
//        insert into user_info (id, pwd, name, email, birth, sns, reg_date)
//        values ('asdf22','1234','윤세라','aaa@aaa.com','2022-02-02','instagram',now());

        String sql="insert into user_info values (?,?,?,?,?,?,now()) "; //sql문 작성

        PreparedStatement pstat = conn.prepareStatement(sql); // 각 ? 부분에 해당하는 값 채우기
        pstat.setString(1, user.getId());
        pstat.setString(2, user.getPwd());
        pstat.setString(3, user.getName());
        pstat.setString(4, user.getEmail());
        pstat.setDate(5, new java.sql.Date(user.getBirth().getTime()));
        pstat.setString(6, user.getSns());

        int rowCnt = pstat.executeUpdate(); // sQl문 실행 insert, delete, update에 executeUpdate사용.
        return rowCnt; // 결과를 rowcount로 받음.

    }

👇위에 대한 테스트 코드 실행

@Test
public void insertUserTest() throws Exception{
    User user = new User("asdd","1234","졸려요","aaa@aaaa.com", new Date(), "insta", new Date());
    int rowCnt = insertUser(user);

    assertTrue(rowCnt==1); // 결과값이 1이 나오면 true가 되어 통과
}

* 돌렸더니 에러문장이 Duplicate entry 'asdf' 로 나와서 'asdd'로 값을 변경해서 돌리고 해결! 이미 입력되어있는 값이라 중복값에러가 뜬거였음.

 

👉 테스트 할 때마다 키값이 중복되지 않도록 설정할 수 없으므로 delete메서드를 추가해서 자료가 삭제된 후 테스트 할 수 있도록 한다.

deleteAll(); // user_Info 테이블에 있는 모든 데이터를 지우는 메서드

private void deleteAll() throws Exception {
        Connection conn = ds.getConnection(); // 데이터 소스로부터 데이터베이스를 가져옴
        String sql="delete from user_info"; //자료 삭제

        PreparedStatement pstat = conn.prepareStatement(sql); // 각 부분에 해당하는 값 채우기
        pstat.executeUpdate(); // sQl문 실행 insert, delete, update에 executeUpdate사용.
    }

모두 지워지고 하나만 나온다

 

테이블에서 값을 가져와 조회하는 메서드

@Test
public void selectUserTest() throws Exception{
 // 아이디가 있을지 없을지 모르므로 delete 후 insert를 해서 테스트를 해야 하므로 메서드 추가.
        deleteAll();

        // insert
        User user = new User("asdd","1234","졸려요","aaa@aaaa.com", new Date(), "insta", new Date());
        int rowCnt = insertUser(user);
        User user2= selectUser("asdd");

    assertTrue(user.getId().equals("asdd")); //위에서 조회한 아이디가 결과값이랑 같아야 true 반환
}

public User selectUser(String id) throws Exception { // 매개변수를 id로 하여 사용자 정보를 가져오는 메서드
    Connection conn = ds.getConnection(); // 데이터 소스로부터 데이터베이스를 가져옴

    String sql="select * from user_info where id=?"; //자료 삭제

    PreparedStatement pstmt = conn.prepareStatement(sql); // 각 부분에 해당하는 값 채우기
    pstmt.setString(1,id);
    ResultSet rs= pstmt.executeQuery(); // sQl문 실행 insert, delete, update에 executeUpdate사용.

    if(rs.next()){ //rs다음에 값이 있을때 아래내용 실행
        User user = new 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.setReg_date(new Date(rs.getTimestamp(7).getTime()));

        return user; // 결과가있으면 값을 채워서 반환
    }

    return null; // 결과가 없으면 널값 반환
}

👉 여러번 테스트를 해도 성공하도록 테스트코드를 작성해야 한다.

👉 DataSource에 있는 인스턴스변수 ds는 메서드들과 공유될 것 같지만, 테스트 코드의 경우 별도의 객체로 실행되도록 되어있기 때문에 ds를 공유하지 않는다.

 

 

+ Recent posts