1. Stack
1.1 지난 시간 코드
Stack01.java
•
push(), pop(), getArr() 구현
Stack01Test.java
•
stack01의 각 메소드가 잘 작동하는지 테스트한다.
1.2 @BeforeEach
Stack02Test.java
•
테스트 클래스에 @BeforeEach를 추가한다.
@BeforeEach
- 각 @Test 어노테이션이 붙어있는 메소드를 실행하기 전에 실행되는 동작을 설정 할 수 있다.
- 각 테스트는 독립적으로 실행되어야 하므로 예를 들어 db에서 데이터 지우는 코드, db에 데이터를 넣는 코드 등을 넣는다.
1.3 isEmpty() 구현
Stack02.java
•
마지막에 isEmpty() 메소드를 추가한다.
•
isEmpty() : 스택이 비어있으면 true, 비어있지 않으면 false를 리턴 한다.
1.4 pop() 예외처리
•
앞선 코드들에서 테스트할 때 스택이 비어있을 때 pop()을 하는 경우는 배제했었다.
•
하지만 실제 스택에서 스택이 비어있을 때 pop()을 하는 경우 EmptyStackException오류가 발생한다.
•
따라서 비어있는 스택에 pop()을 하는 경우 예외를 처리해야 한다.
Stack02.java
•
pop() 메소드에서 isEmpty() 메소드를 활용해 스택이 비어있으면 실제 스택처럼 EmptyStackException를 발생 시킨다.
Stack02Test.java
•
테스트 클래스에서 예외 처리를 검증 해야 할 때 assertThrows를 이용하면 에러 나지 않고 실행할 수 있다.
테스트 만들 때 원칙
1. negative Test부터 - 안될것 같은 것부터 테스트를 만든다.
2. 언제 실행해도 동일한 결과가 나오게끔 테스트를 구성 해야 한다.
1.5 peek() 구현
•
peek(): pop()과 비슷하지만 값을 확인만 하고 빼지는 않는 기능이다.
•
stack의 맨 위에 있는 값을 이용해 특정 조건 처리를 하고 싶을 때 필요하다.
Stack02.java
•
peek() 메소드: 앞에서는 –top를 썼지만 이 방법은 top의 cnt가 내려가기 때문에 top - 1을 한다.
•
비었을때는 test code에서 설계한 것과 같이 Exception을 throw한다.
Stack02Test.java
2. 토비의 스프링
2.1 지난 시간 코드
ConnectionMaker.java
AWSConnectionMaker.java
LocalConnectionMaker.java
UserDao.java
UserDaoFactory.java
User.java
UserDaoTest.java
2.2 deleteAll(), getCount() 구현
•
deleteAll(): DB에 저장되어 있는 유저들을 모두 삭제하는 메소드를 구현한다.
•
getCount(): DB에 저장되어 있는 모든 유저들의 수를 구하는 메소드를 구현한다.
UserDao.java
•
deleteAll() 메소드: delete from users 를 실행한다.
◦
executeUpdate()를 사용한다. return값: int
•
getCount() 메소드: select count(*) from users 를 실행한다.
◦
executeQuery()를 사용한다. return값: ResultSet
◦
결과값을 받아오고 싶을 때 executeQuery()를 사용한다. ex) get()
UserDaoTest.java
•
deleteAll()과 getCouont()의 테스트코드를 추가한다.
2.3 test코드 count생성
UserDaoTest.java
•
맨처음 deleteAll()을 하고 add()와 getCount()를 테스트하는 count()메소드를 추가한다.
2.4 test코드 addAndSelect()리팩토링
UserDaoTest.java
2.5 get() 예외처리하기
•
get() 메소드에서 결과값이 없으면 rs.next()했을 때 ResultSet에 null값이 들어간다.
•
따라서 null이 아닐때(값이 있을 때)에만 User 오브젝트를 생성하도록 수정한다. 그리고 User오브젝트가 null인채로 끝나면 에러를 던져준다.
UserDao.java
•
get() 메소드에서 user == null일때 EmptyResultDataAccessException예외를 던진다.
2.6 test코드 @beforeeach적용하기
•
앞서 스택에서 사용했던 것처럼 @BeforeEach는 각 @Test 메소드가 실행 될때마다 실행되는 코드이다. Junit에서 공통화 시킬 수 있게 제공한다.
UserDaoTest.java
•
@beforeeach를 추가하고 get()메소드의 예외처리를 테스트하는 메소드를 추가한다.
JUnit의 작동 방식(@Before -> @BeforeEach (Junit5))
JUnit의 테스트 메소드 실행 방법
Junit5에서 테스트 실행할 때 마다 오브젝트 생성하는 이유
2.7 deleteAll(), getCount() 예외 처리
public void deleteAll() throws SQLException, ClassNotFoundException {
Connection c = connectionMaker.getConnection();
PreparedStatement ps = c.prepareStatement("delete from users");
ps.executeUpdate();
ps.close();
c.close();
}
Java
복사
•
위 코드는 앞서 작성했던 deleteAll()이다. 여기엔 큰 문제가 있는데 만약 실행 중간에 에러가 나면 ps.close() c.close()가 실행되지 않는 치명적인 문제가 있다.
•
connection이 닫히지 않으면 서버가 다운된다.
•
따라서 Connection, PreparedStatement할 때 에러가 나도 ps.close(), c.close()를 하기 위한 예외 처리를 해야 한다.
리소스 반환과 close()
UserDao.java
•
finally구문을 사용해 에러가 발생해도 무조건 실행될수 있도록 처리한다.