///////
Search

stack, 토비의 스프링_이연재

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구문을 사용해 에러가 발생해도 무조건 실행될수 있도록 처리한다.