이전 글 : [토비의 스프링] 6. AOP (1) 지금까지 해왔던 작업은 비즈니스 로직에 반복적으로 등장하는 트랜잭션 코드를 투명하게 분리해내는 것이었다. 투명하다는 것은 투명한 유리를 사이에 둔 것처럼, 부가기능을 적용한 후에도 기존 설계와 코드에는 영향을 주지 않고 메소드가 호출되는 과정에 다이내믹하게 참여해서 부가적인 기능을 제공해주도록 만들었다는 것이다. 자동 프록시 생성 자동 프록시 생성 빈 후처리기 투명한 부가기능을 적용하는 과정에서 발견됐던 거의 대부분의 문제는 제거했다. 타깃 코드는 깔끔하고, 부가기능은 한 번만 만들어 모든 타깃과 메소드에 재사용이 가능하고, 타깃의 적용 메소드를 선정하는 방식도 독립적으로 작성할 수 있도록 분리되어 있다. 하지만 아직 한 가지 해결할 과제가 남아 있다. ..
AOP AOP는 IoC/DI, 서비스 추상화와 더불어 스프링의 3대 기반기술의 하나다. AOP를 바르게 이용하려면 OOP를 대체하려고 하는 것처럼 보이는 AOP라는 이름 뒤에 감춰진, 그 필연적인 등장배경과 스프링이 그것을 도입한 이유, 그 적용을 통해 얻을 수 있는 장점이 무엇인지에 대한 충분한 이해가 필요하다. 스프링에 적용된 가장 인기 있는 AOP의 적용 대상은 바로 선언적 트랜잭션 기능이다. 트랜잭션 코드를 메소드로 분리 5장의 서비스 추상화 기법을 적용해 스프링이 제공하는 깔끔한 트랜잭션 인터페이스를 썼음에도, 비즈니스 로직이 주인이어야 할 메소드 안에 이름도 길고 무시무시하게 생긴 트랜잭션 코드가 더 많은 자리를 차지하고 있다. public void upgradeLevels() throws E..
트랜잭션 적용으로 알아보는 서비스 추상화 5장에서는 트랜잭션을 적용해보면서 스프링이 어떻게 성격이 비슷한 여러 종류의 기술을 추상화하고 이를 일관된 방법으로 사용할 수 있도록 지원하는지를 살펴볼 것이다. 모 아니면 도 서비스에서 필요한 사용자의 레벨 관리 기능에 대한 요구사항을 추가로 구현하고, 테스트도 잘 만들어서 검증도 마쳤다. 이 때 다음과 같은 질문이 나왔다. 정기 사용자 레벨 관리 작업을 수행하는 도중에 네트워크가 끊기거나 서버에 장애가 생겨서 작업을 완료할 수 없다면, 그때까지 변경된 사용자의 레벨은 그대로 둘까요? 아니면 모두 초기 상태로 되돌려 놓아야 할까요? 열띤 토론 끝에 사용자 레벨 조정 작업은 중간에 문제가 발생해서 작업이 중단된다면 그때까지 진행된 변경 작업도 모두 취소시키도록 결..
예외 처리 자바 개발자가 가장 신경 쓰기 귀찮아하는 것 중의 하나가 바로 예외처리다. 정상적인 결과와 흐름을 보여주는 코드를 만들기도 버거운데 예외상황까지 처리해야 한다는 사실이 부담스러울 수도 있다. 이 장에서는 예외를 처리하는 Best Practice를 살펴본다. 초난감 예외처리 먼저 개발자들의 코드에서 종종 발견되는 초난감 예외처리의 경우들을 살펴보자. 예외 블랙홀 try { // Do something } catch (SQLException e) { } 예외를 잡고는 아무것도 하지 않는 경우다. 예외 발생을 무시해버리고 정상적인 상황인 것처럼 다음 라인으로 넘어가겠다는 분명한 의도가 있는 게 아니라면 연습 중에도 절대 만들어서는 안 되는 코드다. 왜냐하면 프로그램 실행 중에 어디선가 오류가 있어서..
템플릿 객체지향 설계의 핵심 원칙인 개방 폐쇄 원칙(OCP)를 생각해보자. 이 원칙은 코드에서 어떤 부분은 변경을 통해 그 기능이 다양해지고 확장하려는 성질이 있고, 어떤 부분은 고정되어 있고 변하지 않으려는 성질이 있음을 말해준다. 템플릿이란 이렇게 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다. 예외처리 기능을 갖춘 DAO DB Connection이라는 제한적인 리소스를 공유해 사용하는 서버에서 동작하는 JDBC 코드에는 반드시 지켜야 할 원칙이 있다. 바로 예외 처리다. 정상적인 JDBC 코드의 흐름을 따르지 않고 중간에 어떤 이유로든 예외가 발..
테스트 스프링이 개발자에게 제공하는 가장 중요한 가치는 객체지향과 테스트이다. 애플리케이션의 복잡성을 대응하는 첫 번째 전략은 확장과 변화를 고려한 객체지향적 설계와 그것을 효과적으로 담아낼 수 있는 IoC/DI 같은 기술이고, 두 번째 전략은 만들어진 코드를 확신할 수 있게 해주고, 변화에 유연하게 대처할 수 있는 자신감을 주는 테스트 기술이다. 또한 테스트는 스프링을 학습하는 데 있어 가장 효과적인 방법 중 하나다. 테스트의 작성은 스프링의 다양한 기술을 활용하는 방법을 이해하고 검증하고, 실전에 적용하는 방법을 익히는 데 효과적으로 사용될 수 있다. 테스트의 유용성 테스트는 내가 예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인해서, 만든 코드를 확신할 수 있게 해주는 작업이다. 기존에 수행하..
오브젝트 스프링의 핵심 철학은 다음과 같다. J2EE 시절의 혼란 속에서 잃어버린 객체지향 기술의 진정한 가치를 회복시키고, 그로부터 OOP가 제공하는 폭넓은 혜택을 누릴 수 있도록 기본으로 돌아가자는 것이다. 따라서 스프링이 가장 관심을 많이 두는 대상은 오브젝트이다. 오브젝트에 대한 관심은 오브젝트의 기술적인 특징과 사용 방법을 넘어서 오브젝트의 설계로 발전하게 된다. 관심사의 분리 자바빈(JavaBean) 자바빈은 다음 두 가지 관례를 따라 만들어진 오브젝트를 가리킨다. 디폴트 생성자 자바빈은 파라미터가 없는 기본 생성자를 갖고 있어야 한다. 프레임워크 등에서 Reflection을 이용해 오브젝트를 생성하기 때문에 필요하다. 프로퍼티 자바빈이 노출하는 이름을 가진 속성을 프로퍼티라고 한다. 프로퍼티..