spring(41)
-
영속성 관리(1)
1. 엔티티 매니저 팩토리와 엔티티 매니저 데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다(비용이 비쌈) EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); Persistence.createEntityManagerFactory("hello")를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성한다. 엔티티 매니저 팩토리가 생성된 후 필요할 때마다 엔티티 매니저를 생성하면 된다.(비용이 거의 안 든다) EntityManager entityManager = emf.createEntityMana..
2023.12.28 -
스프링 레시피 CH2.19 AOP를 이용해 POJO에 상태 추가하기
과제 기존 객체에 새로운 상태를 추가해서 호출 횟수, 최종 수정 일자 등 사용 내역을 파악하고 싶은 경우가 있다. 모든 객체가 동일한 베이스 클래스를 상속하는 건 말이 안된다. 레이어 구조가 다른 여러 클래스에 상태를 추가하기란 더욱 어렵다. 해결책 상태 필드가 위치한 구현 클래스의 인터페이스를 기존 객체에 들여온 다음, 특정 조건에 따라 상태값을 바꾸는 어드바이스를 작성한다. 풀이 각 Calculator 객체의 호출 횟수를 기록하려고 한다. 원본 클래스에는 호출 횟수를 담을 카운터 필드가 없기 때문에 AOP 인트로덕션을 적용한다. 먼저 Counter 인터페이스를 작성한다. public interface Counter { void increase(); int getCount(); } 그리고 간단한 구현 ..
2023.12.19 -
스프링 레시피 CH2.16 애스펙트 포인트컷 재사용하기
과제 포인트컷 표현식을 여러 번 되풀이해서 쓸 겨웅엔 어드바이스 애너테이션에 직접 써넣는 것보다 재사용할 방법이 필요하다. 해결책 @Pointcut을 이용하면 포인트컷만 따로 정의해 여러 어드바이스에서 재사용할 수 있다. 풀이 애스펙트에서 포인트컷은 @Pointcut을 붙인 단순 메서드로 선언할 수 있다. 포인트컷과 애플리케이션 로직이 뒤섞이는 건 바람직하지 않으니 메서드 바디는 보통 비워두고 포인트컷의 가시성은(public, protected, private) 메서드의 수정자로 조정한다. 이렇게 선언된 포인트컷은 다른 어드바이스가 메서드명으로 참조한다. package com.spring.study.chapter02.aop.calculation._aspect.log; import org.apache.co..
2023.12.18 -
스프링 레시피 CH2.9 후처리기를 만들어 POJO 검증/수정하기
과제 모든 빈 인스턴스, 또는 특정 타입의 인스턴스를 생성할 때 해당 빈 프로퍼티를 어떤 기준에 따라 검증/수정하라 해결책 빈 후처리기를 이용하면 초기화 *콜백 메서드 전후에 원하는 로직을 빈에 적용할 수 있다. (*@Bean의 initMethod 속성 or @PostConstruct를 붙인 메서드) 빈 후처리기의 가장 중요한 특징은 IoC 컨테이너 내부의 모든 빈 인스턴스를 대상으로 한다. 보통 빈 후처리기는 빈 프로퍼티가 올바른지 체크하거나 어떤 기준에 따라 빈 프로퍼티를 변경 또는 전체 빈 인스턴스를 상대로 어떤 작업을 수행하는 용도로 쓰인다. @Required는 스프링에 내장된 후처리기RequiredAnnotationBeanPostProcessor가 지원하는 애너테이션이다. RequiredAnno..
2023.12.16 -
스프링 레시피 CH2.8 애너테이션을 이용해 POJO 초기화/폐기 커스터마이징하기
과제 어떤 POJO는 사용하기 전에 특정한 초기화 작업을 거쳐야 한다. 예를 들면 파일을 열거나, 네트워크/DB에 접속하거나, 메모리를 할당하는 등 선행 작업이 필요한 경우이다. 대개 이런 POJO는 그 생명을 다하는 순간에도 폐기 작업을 해줘야 한다. IoC 컨테이너에서 빈을 초기화 및 폐기하는 로직을 커스터마이징 하라 해결책 자바 구성 클래스의 @Bean 정의부에서 initMethod, destroyMethod 속성을 설정하면 스프링은 이들을 각각 초기화, 폐기 콜백 메서드로 인지한다. POJO 메서드에 각각 @PostConstruct 및 @PreDestroy를 붙여도 마찬가지다. 또 스프링에서 @Lazy를 붙여 느긋한 초기화 (주어진 시점까지 빈 생성을 미루는 기법)를 할 수 있고 @DependsO..
2023.12.14 -
스프링 레시피 CH2.7 프로퍼티 파일에서 로케일마다 다른 다국어 메시지를 해석하기
과제 애너테이션을 이용해 다국어를 지원하는 애플리케이션을 작성하세요. 해결책 MessageSource 인터페이스에는 리소스 번들 메시지를 처리하는 메서드가 몇 가지 정의되어 있다. ResourceBundleMessageSource는 가장 많이 쓰이는 MessageSource 구현체로, 로케일별로 분리된 리소스 번들 메시지를 해석한다.ResourceBundleMessageSource POJO를 구현하고 자바 구성 파일에서 @Bean을 붙여 선언하면 애플리케이션에서 필요한 i18n 데이터를 가져다 쓸 수 있다. 풀이 미국(로케일)의 영어(언어)에 해당하는 message_en_US.properties 리소스 번들을 예로 들겠다. 리소스 번들은 클래스패스 루트에서 읽으므로 이 경로에 파일이 있는지 확인하고 다음..
2023.12.14 -
스프링 레시피 CH2.6 외부 리소스(텍스트, XML, 프로퍼티, 이미지 파일)의 데이터 사용하기
과제 여러 곳(예 : 파일시스템, 클래스패스, URL)에 있는 외부 리소스(예 : 텍스트, XML, 프로퍼티, 이미지 파일)를 각자 알맞은 API로 읽어들여야 할 때가 있습니다. 해결책 스프링이 제공하는 @PropertySource를 이용하면 빈 프로퍼티 구성용 .properties 파일(키-값)을 읽어들일 수 있다. 또 Resource라는 단일 인터페이스를 사용해 어떤 유형의 외부 리소스라도 경로만 지정하면 가져올 수 있는 리소스 로드 메커니즘이 마련되어 있다. @Value로 접두어를 달리 하여 상이한 위치에 존재하는 리소스를 불러올 수도 있다. 이를테면 파일시스템 리소스는 file, 클래스패스에 있는 리소스는 classpath 접두어로 붙이는 식이다. 리소스 경로는 URL로도 지정할 수 있다. 풀이 ..
2023.12.12 -
스프링 레시피 CH2.4 @Resource와 @Inject를 붙여 POJO 자동 연결 하기
과제 스프링 전용 @Aurowired 대신, 자바 표준 애너테이션 @Resource, @Inject로 POJO를 자동 연결하여 참조하세요 해결책 @Resource는 이름으로 POJO 레퍼런스를 찾아 연결합니다. @Inject는 타입으로 POJO 레퍼런스를 찾아 연결합니다. 풀이 @Autowired는 org.springframework.beans.factory.annotation 패키지에 속해있어서 스프링에서만 쓸 수 있다. 자바 진영에서는 동일한 기능의 표준화된 애너테이션이 있다. @Resource, @Inject가 그렇다. 2.4.1 @Resource로 POJO 자동 연결하기 타입으로 POJO를 찾아 자동 연결하는 기능은 @Resource나 @Autowired나 마찬가지다 public class Seq..
2023.12.11 -
스프링 레시피 CH2.3 POJO 레퍼런스와 자동 연결을 이용해 다른 POJO와 상호 작용하기
과제 애플리케이션을 구성하는 POJO/빈 인스턴스들은 서로 함께 움직여 임무를 완수합니다. 애너테이션을 붙여 POJO 레퍼런스와 자동 연결하세요 해결책 자바 구성 클래스에 정의된 POJO/빈 인스턴스들 사이의 참조 관계는 표준 자바 코드로도 맨어줄 수 있다. 필드, 세터 메서드, 생성자, 또는 아무 다른 메서드에 @Autowired를 붙이면 POJO레퍼런스를 자동 연결해 쓸 수 있다. 풀이 생성자, 필드, 프로퍼티로 자동 연결하는 방법을 차례로 소개하고 마지막에 자동 연결 관련 이슈의 해결 방법을 제시합니다. 자바 구성 클래스에서 POJO 참조하기 자바 구성 클래스에 POJO 인스턴스를 정의하면, 모든 게 자바 코드로 있으니 얼마든지 POJO를 참조할 수 있다. @Configuration public c..
2023.12.10