Servlet/JSP로 사용자 관리 시스템 구현하기 과정 - TDD
JSP/Servlet과JSP로 사용자 관리 시스템 구현

Servlet/JSP로 사용자 관리 시스템 구현하기 과정 - TDD

반응형

Servlet/JSP로 사용자 관리 시스템 구현하기 과정 - TDD


강의 링크 : https://www.slipp.net/wiki/pages/viewpage.action?pageId=25526852



강의를 이어서 진행하기에 앞서, 단위 테스트 과정에 대해 포스팅하고자 합니다.




우리는 프로젝트를 만들면서, 중간중간에 제대로 구현이 되고 있는지 한번씩 실행해보며 확인합니다. 하지만 처음부터 깔끔하고 완벽한 코드를 만드는 것은 매우 힘든 일입니다. 따라서 프로젝트의 실제 파일을 작성하기에 앞서, 테스트 파일을 통해 제대로 구현하는 지 실험해보는 과정을 거치게 됩니다.


이러한 테스트 과정을 흔히 TDD(Test Driven Development)라고 말합니다.



즉, 코드를 작성할 때부터 설계하라는 뜻입니다. 무작정 코드를 작성해서 구현한 다음에 리팩토링을 할 바에는, 처음부터 구현에 신경을 쓰면서 유지보수를 줄이고 깔끔하게 만들기 위해 행하는 과정입니다. 실력있고 인정받는 개발자가 되기 위해서는 반드시 필요한 부분입니다.


현재까지 진행된 강의진행에서 User와 Database에 대한 테스트 파일은 아래와 같습니다. 유닛 테스트 파일을 만들어 src 폴더에 test 패키지로 따로 관리하여 실제로 홈페이지에 적용하기에 앞서 오류가 없는지 테스트하는 역할을 합니다.


UserTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package net.slipp.user;
 
import static org.junit.Assert.*;
 
import org.junit.Test;
 
import net.slipp.db.Database;
 
public class UserTest {
 
    public static User TEST_USER = new User("userId""password""name""abc@naver.com");
    
    @Test
    public void matchPassword() {
        assertTrue(TEST_USER.matchPassword("password"));
    }
    
    @Test
    public void notmatchPassword() {
        assertFalse(TEST_USER.matchPassword("password2"));
    }
    
    @Test
    public void login() throws Exception {
        User user = UserTest.TEST_USER;
        Database.addUser(user);
        
        assertTrue(User.login(TEST_USER.getUserId(), TEST_USER.getPassword()));
    }
    
    @Test(expected=UserNotFoundException.class)
    public void loginWhenNotExistedUser() throws Exception {
        User.login("userId2", TEST_USER.getPassword());
    }
    
    @Test(expected=PasswordMismatchException.class)
    public void loginWhenPasswordMismatch() throws Exception {
        User user = UserTest.TEST_USER;
        Database.addUser(user);
        User.login(TEST_USER.getUserId(), "password2");
    }
 
 
}
 
cs


TEST_USER로 User 클래스를 생성하면서, static으로 4가지 변수에 대한 값을 임의로 지정해줍니다. 

이후에 여러 @Test를 통해 오류 유무를 검사합니다. notmatchPassword 메소드를 보면 일부러 값이 틀린 password2를 넣으면서 유닛 테스트에 assert 기능으로 false가 제대로 나오는지 확인하는 것을 볼 수 있습니다.


DatabaseTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package net.slipp.db;
 
import static org.junit.Assert.*;
 
import static org.junit.Assert.*;
 
import org.junit.Test;
 
import net.slipp.user.User;
import net.slipp.user.UserTest;
 
public class DatabaseTest {
 
    @Test
    public void addAndFindWhenExisted() {
        User user = UserTest.TEST_USER;
        Database.addUser(user);
        
        User dbUser = Database.findByUserId(user.getUserId());
        assertEquals(user, dbUser);
    }
    
    public void addAndFindWhenNotExisted() {
        User dbUser = Database.findByUserId("userId2");
        assertNull(dbUser);
    }
 
 
}
 
cs

database 클래스 또한, user테스트에서 생성한 TEST_USER를 가지고 데이터베이스에 저장한 아이디와 user에서 들어온 아이디 비교가 잘 이루어지고 있는지 테스트하는 과정을 나타내고 있습니다.



이를 통해 우리가 실제로 구현하면서 진행하기에 앞서 오류가 없이 잘 진행될지 확인하고, 오류가 발생할 값을 넣어보고 실제로 오류가 제대로 나오는지 또한 단위 테스트를 통해 알아보는 과정입니다.



개발자 입장에서는, 추가적인 코드 생성을 필요로 하는 일이기 때문에 여간 귀찮은 일이 아닙니다. 굳이 이렇게까지 해야돼?라고 생각하는 사람들도 상당히 많을 것입니다. 지금까지 진행된 강의내용에서는 아직 양이 많지 않기 때문에 괜찮지만 실제로 프로젝트 크기가 거대해지고, 유지보수를 많이 필요로 할 때는 이와 같은 TDD를 통한 테스트가 제대로 이루어져야 좋은 프로그램을 만들어낼 수 있습니다.


지금부터라도 유닛 테스트를 통해 조금 더 생산성있는 코드를 만들기 위해 노력하는 습관을 길러놓으면 좋을 것 같다는 생각이 들었습니다.



반응형