토비의 스터디(17)
-
전략 패턴이란?
1. 전략 패턴이란 2. 전략 패턴을 사용하는 이유 3. 전략 패턴 예제 4. 적용 사례(Comparator) 순서로 전략패턴을 빠르게 알아보자! 1. 전략 패턴이란 실행 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴 특정 컨텍스트에서 알고리즘을 별도로 분리하는 설계 방법 종합하면, 특정한 기능을 수행할 때 다양한 알고리즘이 적용될 수 있는 경우알고리즘들을 별도로 분리하는 설계 방법이다. 이렇게만 읽으면 감이 하나도 안잡힌다. 간단한 예시를 통해 알아보자. 예시상황 한 과일 매장은 상황에 따라 다른 가격 할인 정책을 적용하고 있습니다. 제일 먼저 온 손님에게 10%를 할인해주고 마지막 손님은 20%, 그리고 신선도가 떨어진 과일에 대해서는 20% 할인을 해주고 있습니다. 이 상황에서 쉽게 생각할 수 ..
2022.10.29 -
[토비의 스프링 3.1] 3.3 JDBC 전략 패턴의 최적화
이전 장(3.2)에서는 전략 패턴을 사용해서 변하는 부분과 그렇지 않은 부분을 깔끔하게 분리했다. public void deleteAll() throws SQLException { StatementStrategy strategy = new DeleteAllStatement(); // 선정한 전략 클래스의 오브젝트 생성 jdbcContextWithStatementStrategy(strategy); // 컨텍스트 호출, 전략 오브젝트 전달 } 클라이언트 코드에서 구체적인 전략을 정하고, 컨텍스트에 그 전략을 파라미터로 전달해주었다. 컨텍스트도 jdbcContextWithStatementStrategy라는 메소드로 분리하였더니 다른 DAO에서도 PreparedStatement를 실행하는 JDBC의 공통 작업 ..
2022.07.07 -
[토비의 스프링 3.1] 3.2 변하는 것과 변하지 않는 것
3.2.1 JDBC try/catch/finally 코드의 문제점 바로 이전 장에서는 try/catch/finally 블록을 적용해서 완성도 높은 UserDao를 작성했지만, 여전히 복잡한 것은 사실이다. try/catch/finally 블록이 2중으로 중첩되어 나오며(finally 블록에서 리소스 반환할 때에도 try/catch/finally가 한번 더 사용된다), 모든 메소드에서 try/catch/finally 블록이 반복된다. 만약 finally 블록에서 커넥션을 닫아주는 메소드를 생략한 경우에는, 테스트에 별 문제 없어보여도 애플리케이션을 운영하던 중에 서버에서 리소스가 꽉 찼다는 에러가 발생하며 서비스가 중단될 것이다. 이런 DAO는 폭탄이 될 가능성을 지니고 있다. 이 경우에는 변하지 않는, ..
2022.07.06 -
[토비의 스프링 3.1] 3.1 다시 보는 초난감 DAO
1장에서 초난감 DAO 코드에 DI를 적용하면서 관심사가 다른 코드를 분리하였으며, 변경과 확장에 유연한 구조로 변경하였다. 이는 개방 폐쇄 원칙(OCP)을 잘 준수했다고 볼 수 있다. 3장에서는 템플릿에 대해 학습한다. 템플릿이란 변경이 거의 일어나지 않는 부분을 자유롭게 변경되는 부분과 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다. 3장에서 스프링에 적용된 템플릿 기법을 살펴보자. 3.1 다시 보는 초난감 DAO 아직 UserDao의 코드에는 문제점이 남아 있다. 예외 상황에 대한 처리가 부족하다. 한번 살펴보자. 3.1.1 예외처리 기능을 갖춘 DAO JDBC 코드에는 예외 처리를 반드시 해주어야 한다. 정상적인 JDBC 코드의 흐름을 따르지 않고 중간에 예외가 발생한 경우 사용한 리소스를..
2022.07.05 -
[토비의 스프링 3.1] 2.5 학습 테스트로 배우는 스프링
개발자는 자신이 개발하지 않은 프레임워크나 라이브러리를 사용하기 전에 테스트를 작성해보아야 한다. 이런 테스트를 학습 테스트라고 한다. 목적은 사용할 API나 프레임워크의 기능을 테스트를 통해 익히는 것이다. 이미 다른 사람들이 잘 만들어두었으므로 테스트의 주 목적은 검증과 거리가 멀다. 2.5.1 학습 테스트의 장점 다양한 조건에 따른 기능을 손쉽게 확인할 수 있다. 예제를 만들면서 학습할 수 있으며, 자동화된 테스트 코드를 통해 다양한 조건에 따라 기능이 어떻게 동작하는지 빠르게 확인할 수 있다. 학습 테스트 코드를 개발 중에 참고할 수 있다. 학습 테스트는 다양한 기능과 조건에 대한 테스트 코드를 개별적으로 만들고, 따로 남겨놓을 수 있다. 이렇게 저장한 코드는 실제 개발에서 샘플 코드로 참고하면 ..
2022.07.04 -
[토비의 스프링 3.1] 2.4 스프링 테스트 적용
기존의 테스트코드에서 @Before 메소드가 테스트 메소드 개수만큼 반복된다. @Before public void setUp(){ Application Context ac = new GenericXmlApplicationContext("applicationContext.xml"); this.dao = ac.getBean("userDao", UserDao.class); } 현재 @Before 메소드는 애플리케이션 컨텍스트를 생성하는 코드를 수행하는데, 애플리케이션 컨텍스트는 생성될 때 모든 싱글톤 빈 오브젝트를 초기화한다. 어떤 빈은 오브젝트가 생성될 때 자체적인 초기화 작업을 진행하는 경우도 있다. 이 경우 빈 오브젝트 초기화에 많은 시간이 할애된다. 또, 애플리케이션 컨텍스트가 초기화될 때 어떤 빈은 ..
2022.06.30