본문 바로가기

JAVA

(133)
검증과 데이터바인딩 스프링 웹 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 파일에 두 빈이 정의된 순서는 무시된다. 스프링 컨테이너가 이런식으로 작동하기 때문에 어떤 빈..
빈 설정 스프링 프레임워크 기초 정적 팩토리 메서드와 인스턴스 팩토리 메서드로 빈을 생성하는 방법 스프링 컨테이너는 인수가 없는 생성자 지원 여부에 상관없이 클래스의 인스턴스를 만들고 관리할 수 있다. 팩토리 클래스를 사용해 객체 인스턴스를 만드는 기존 자바 애플리케이션 있는경우, 스프링 컨테이너를 사용해 팩토리가 만든 객체를 관리할 수 있다. 정적 팩토리 메서드로 빈 초기화 public class FixedDepositDaoFactory { private FixedDepositDaoFactory() {} public static FixedDepositDao getFixedDepositDao(String daoType) { FixedDepositDao fixedDepositDao = null; if ("jdbc"..
자바 코딩의 기술 - #7 객체 디자인 불 매개변수로 메서드 분할 일반적으로 메서드는 하나의 작업에만 특화되어야 한다. 불 메서드 매개변수는 메서드가 적어도 2가지 작업을 수행함을 뜻한다. class Logbook { private final Path CAPTAIN_LOG = Paths.get("/var/log/captain.log"); private final Path CREW_LOG = Paths.get("/var/log/crew.log"); void log(String message, boolean classified) throws IOException { if (classified) { writeMessage(message, CAPTAIN_LOG); } else { writeMessage(message, CREW_LOG); } } vo..