본문 바로가기

JAVA/Spring

(28)
FactoryBean 사용 FactoryBean 사용 new 연산자로 생성할 수 없는 의존성을 어떻게 생성해 주입할때, 어댑터인 FactoryBean 인터페이스를 제공하여 사용한다. 정적 팩터리 클래스로 접근해야 하는 객체처럼 new 연산자로 생성할수 없는 객체를 생성할때는 일반적으로 FactoryBean을 사용한다. FactoryBean은 다른 빈을 생성하는 팩터리 역할을 담당 FactoryBean은 일반적인 빈과 마찬가지로 ApplicationContext에서 구성되지만 스프링이 FactoryBean 인터페이스를 사용해 의존성 요청이나 검색 요청에 응답할때는 일반적인 빈과 달리 FactoryBean 인스턴스를 반환하지 않는다. 대신 스프링이 FactoryBean.getObject() 메서드를 호출해 반환받는 결과를 반환한다. ..
빈 라이프 사이클 관리 빈 라이플 사이클 관리 스프링을 포함한 IoC 컨테이너가 제공하는 주요 기능 중 하나는 생성이나 소멸 같은 빈 라이프사이클의 특정 시점에 통지를 받을 수 있게 빈을 생성하는 것이다. 빈이 라이프 사이클 이벤트 통지를 받을 수 있게 설정하면 빈은 이벤트 발생 시점에 관련 처리를 할수 있다. 초기화 이후(post-initialization)와 소멸이전(pre-destruction) 이벤트 3가지 방법으로 인터페이스기반, 메서드 기반, 애너테이션 기반 인터페이스 기반은 콜백을 사용해 해당빈을 통지 메서드 기반은 빈이 초기화될때, 소멸될때 호출할 메서드 이름을 ApplicationContext 구성에 지정 애너테이션 기반은 빈을 초기화한 후나 소멸 전에 호출해야 할 메서드를 JSR-250에 정의된 애너테이션으로..
검증과 데이터바인딩 스프링 웹 MVC를 활용한 검증과 데이터바인딩 @ModelAttribute 애너테이션 스프링의 Model 객체에 속성을 저장하고 싶을 때는 메서드에 @ModelAttribute를 설정 Model 객체에서 속성을 읽고 싶을 때는 메서드 인수에 @ModelAttribute 설정 모델 속성의 스코프가 request 스코프로, 요청 처리가 끝나거나 요청을 리다이렉션 하면 모델 속성이 사라진다. @SessionAttribute @RequestMapping 을 설정한 메서드를 호출하기전에 컨트롤러의 @ModelAttribute를 설정한 모든 메서드가 호출된다. 이런 동작 방식은 @ModelAttribute 메서드들이 데이터를 데이터베이스나 외부 웹 서비스에서 얻어 모델 속성을 채워 넣는 경우 적당하지 않다. 데이터..
AOP AOP AOP (Aspect Oriented Programing) 관점지향 프로그래밍은 여러 클래스에 나뉜 책임을 애스팩트(관점)라고 부르는 별도의 클래스에 캡슐화하는 접근방식을 말한다. 여러 클래스에 걸쳐있는 책임은 횡단 관심사(cross-cutting concern)라고 부른다. 횡단 관심사의 예로 로킹, 트랜잭션 처리, 캐싱, 보안 등을 들을 수 있다. 스프링은 내부에서 트랜잭션, 캐싱, 보안 등의 선언적인 서비스를 구현하기 위해 AOP 프레임워크를 제공한다. 스프링 AOP 프레임워크 대신 AspectJ를 애플리케이션에서 AOP 프레임워크로 사용할 수도 있다. 간단한 AOP 서비스 레이어에 정의된 클래스의 메서드에 전달되는 인수를 모두 획득하고 싶을 경우, 메서드 인수를 로그에 남기는 간단한 접근 ..
캐싱 캐싱 java.util.concurrent.ConcurrentMap, Ehcache, Guava, GemFire나 JSR 107(자바 임시 캐싱 API, JCACHE )을 구현한 캐시 솔루션에 대한 캐시 추상화를 즉시지원한다. 사용하는 캐시 솔루션이 스프링 캐시 추상화를 지원하지 않는다면, 직접 캐시 솔루션이 제공하는 API를 사용하거나, 스프링이 제공하는 캐시 추상화를 캐시 솔루션에 맞추는 어댑터를 만들어야 한다. CacheManager와 Cache 인터페이스는 스프링 캐시 추상화에서 중심적인 역할을 한다. CacheManager 인스턴스는 하부 캐시 솔루션이 제공하는 캐시 매니저를 감싸는 래퍼 역할을 하며, Cache 인스턴스의 컬렉션을 관리한다. EhCacheManager는 이캐시Ehcache의 n..
데이터베이스 연결 스프링을 이용해 데이터베이스와 상호 작용 스프링은 JDBC 위에 추상 계층을 추가해 데이터베이스와 상호작용을 편리하게 만든다. 스프링은 하이버네이트와 마이바티스 등 ORM 프레임워크로 데이터베이스 상호 작용도 단순화 시킨다. MyBank 고객이 자신의 잔액 세부 정보를 살펴보고 금융거래 명세서(bankstatement)를 생성하며, 정기예금을 개설하고 체크북을 요청할 수 있게 해주는 인터넷 뱅킹 애플리케이션이다. BANK_ACCOUNT_DETAILS와 FIXED_DEPOSIT_DETAILS 테이블 BANK_ACCOUNT_DETAILS 1
빈과 빈 정의 커스텀 빈과 빈 정의 커스텀 하기 빈에 커스텀 초기화와 정리 로직을 넣는 방법 스프링 BeanPostProcessor 인터페이스를 구현해 새로 생성된 빈 인스턴스와 상호작용하는 방법 스프링 BeanFactoryPostProcessor 인터페이스를 구현해 빈 정의를 변경하는 방법 1-1. 빈에 커스텀 초기화와 정리 로직 커스텀 하기 bean 엘리먼트에 init-method 속성값을 지정, destory-method 속성값을 지정 public class FixedDespositDaoImpl implements FixedDespositDao { private static Logger logger = LogManager.getLogger(FixedDespositDaoImpl.class); private Database..
의존관계주입 의존 관계 주입 내부 빈 빈 의존관계를 여러 빈이 공유하지 않는다면 의존관계를 내부 빈으로 만든것을 고려할 수 있다. 내부 빈은 해당 내부 빈 정의를 둘러싸고 있는 빈 정의 안에서만 접근할 수 있다. 스프링 컨테이너에 등록된 다른 빈들은 내부 빈을 사용할 수 없다. 내부 빈 정의에 해당하는 엘리먼트는 id 속성을 지정하지 않는다. 내부 빈은 항상 프로토타입 스코프 빈이기 때문에 내부 빈에 해당하는 엘리멘트에 scope 속성이 들어있어도 이를 무시한다. depends-on 속성을 통해 빈 초기화 순서 제어하기 A빈이 B빈을 생성자 인수로 받는다면, 스프링 컨테이너는 A를 생성하기 전에 B를 생성한다. 이때 XML 파일에 두 빈이 정의된 순서는 무시된다. 스프링 컨테이너가 이런식으로 작동하기 때문에 어떤 빈..