2017년 11월 29일 수요일

토비의 스프링 공부/정리 [3]

회사에서 토비의 스프링 스터디를 시작하였다.
새로운 기분으로 정독하고 있으며, 정리한 내용을 학습목적으로 git에 올리고 있다.
이해가 가지 않는 내용도 있지만, 일단 1회독을 마치는 것을 목표로 진행하자!









//////////////////////////////////////////////////////////////////////////////////////////////


3. 템플릿


템플릿이란 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로 독립시켜서 효과적으로 활용할 수 있도록하는 방법. (??)
3장에선 스프링에 적용된 템플릿 기법을 살펴보고, 이를 적용해 완성된 DAO코드를 만드는 방법을 소개한다.


3.1 다시 보는 초난감 DAO

책에서 소개한 UserDao 코드에는 예외상황에 대한 처리 부분에 문제점이 있다고 한다.
preparedstatement를 처리하는 중 예외가 발생하면 close를 실행못하고 마치게된다. 이것이 계속쌓이면 리소스가 부족하다는 오류가 발생할 수 있다. 그래서 try/catch 구문으로 예외처리를 하도록 권장한다.
글 조회부분 또한 ResultSet도 반환해야하는 리소스이기 때문에 예외상황에서도 ResultSet의 close()메소드가 반드시 호출되도록 만들어줘야 한다.

리소스 반환과 close()

Connection이나 PreStatement에는 close()메소드가 있다. 종료라고 볼 수도 있지만 보통 리소스를 반환한다는 의미로 이해하는 것이 좋다. Connection과 PreparedStatement는 보통 풀(pool) 방식으로 운영된다. 미리 정해진 풀 안에 제한된 수의 리소스(Connection, Statement)를 만들어 두고 필요할 때 이를 할당하고, 반환하면 다시 풀에 넣는 방식으로 운영된다. 요청이 매우 많은 서버 환경에서는 매번 새로운 리소스를 생성하는 대신 풀에 미리 만들어둔 리소스를 돌려가며 사용하는 편이 훨씬 유리하다. 대신. 사용한 리소스는 빠르게반환해야 한다. 그렇지 안흥면 풀에 있는 리소스가 고갈되고 결국 문제가 발생한다. close()메소드는 사용한 리소스를 풀로 다시 돌려주는 역할을 한다.

3.2 변하는 것과 변하지 않는 것

finally 블록의 c.close() 라인 하나 빼먹은 것과 같은 실수를 했어도 테스트를 돌려보면 별 문제가 없어 보인다. 하지만 해당 메소드가 호출되고 나면 커넥션이 하나씩 반환되지 않고 쌓여가게 된다. 이를 그대로 사용하면 최대 DB커넥션 개수를 넘어설 것이고, 서버에서 리소스가 꽉 찼다는 에러가 나면서 서비스가 중단되는 상황이 발생한다.
>>이런 예외상황을 처리하는 코드는 테스트하기 매우 어렵고 번거롭다.
>> 효과적으로 다루기위해선..??

분리와 재사용을 위한 디자인 패턴 적용

책에서는 UserDao의 메소드를 개선하고 있다.
*****어려움 ㅠㅠ

3.3 JDBC 전략 패턴의 최적화


3.4 컨텍스트와 DI


3.5 템플릿과 콜백


3.6 스프링의 JdbcTemplate

댓글 없음:

댓글 쓰기