✅ 테스트용 컨텍스트 분리TestApplicationContext를 실제 서비스할 DI 설정 정보라 생각하고 AppContext로 이름을 변경합니다. 그리고 Test용으로 DI 설정을 새롭게 구성하기 위해 TestAppContext 클래스를 생성합니다. TestAppContextpackage vol1.jhcode.ch7; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mail.MailSender; import vol1.jhcode.ch7.user.service.DummyMailSender; import ..
✅ XML 설정에서 Java-based-Configuration 설정으로지금까지 XML 설정이 아닌 Java-based-Configuration 설정을 사용해 왔습니다. 그래서 크게 바꿀 것이 없고, 다만 복습한다는 생각으로 다시 한 번 코드를 구성해보겠습니다. pom.xml 4.0.0 toby toby 0.0.1-SNAPSHOT org.mariadb.jdbc mariadb-java-client 3.1.4 mysql mysql-connector-java 8.0.26 org.springframework spring-core 5.3.20 org.springframework spring-context 5.3.20 org.springframework spring-test 5.3.20 org.aspectj asp..
✅ DI와 기능의 확장애플리케이션을 새로 시작하지 않고 특정 SQL의 내용만을 변경하고 싶다면 어떻게 해야 할까요? 그에 앞서서 먼저 DI와 인터페이스의 상속에 대해서 알아보겠습니다. DI를 적용할때 가능한한 인터페이스를 사용해야 한다.인터페이스의 사용으로 다형성을 얻기 위함이다.인터페이스 분리 원칙을 통해 클라이언트와 의존 오브젝트 사이의 관계를 명확하게 해줄 수 있다.각기 다른 관심과 목적에 따라 명확하게 구분이 가능하며, 하나의 오브젝트가 여러 개의 인터페이스를 구현할 수 있으므로, 하나의 오브젝트를 바라보는 창이 여러 가지일 수 있게 된다. 인터페이스 분리 원칙이 주는 장점은 모든 클라이언트가 자신의 관심에 따른 접근 방식을 불필요한 간섭 없이 유지할 수 있다는 점기존 클라이언트에 영향을 주지 않..
✅ OXM(Object-XML Mapping)JAXB가 JavaSE와 JavaEE 표준에 포함되어 있지만 JAXB 외에도 아래와 같은 XML과 오브젝트 매핑 기술이 있습니다.Castor XML : 설정파일이 필요 없는 인트로스펙션 모드를 지원하기도 하는 매우 간결하고 가벼운 바인딩 프레임워크JiBX : 뛰어난 퍼포먼스를 자랑하는 XML 바인딩 기술XmlBeans : 아파치 XML 프로젝트의 하나, XML의 정보셋을 효과적으로 제공Xstream : 관례를 이용해서 설정이 없는 바인딩을 지원하는 XML 바인딩 기술의 하나 이렇게 XML과 자바 오브젝트를 매핑해서 상호 변화해주는 기술을 OXM이라고 합니다. 기능이 같은 여러 가지 기술이 존재한다면 추상화를 적용할 수 있습니다. 스프링이 제공하는 OXM 추상 ..
✅ XML 파일을 이용하는 SQL 서비스UserDaoJdbc에서 사용했던 SQL문을 이전에 학습했던 JAXB를 통하여 매핑하여 사용할 수 있도록 해보겠습니다. SQL문을 UserDao와 동일한 패키지에서 xml 파일로 작성합니다. sqlmap.xml insert into users(id, name, password, email, level, login, recommend) values(?,?,?,?,?,?,?) select * from users where id = ? select * from users order by id delete from users select count(*) from users update users set name = ?, password = ?, email = ?, leve..
✅ Java-Configuration 설정을 이용한 분리책에서는 xml 방식을 통해 DAO 객체와 SQL을 분리하고 있지만, 현재는 잘 쓰이지 않는 방식이기 때문에 Java-Configuration 방식을 사용해서 분리하도록 변경하였습니다. TestDaoFactory@Bean public UserDaoJdbc userDao() { UserDaoJdbc userDaoJdbc = new UserDaoJdbc(); userDaoJdbc.setDataSource(dataSource()); userDaoJdbc.setSqlMap(sqlMap()); //sqlMap Bean 객체 주입 return userDaoJdbc; } //== xml 방식이 아닌 java-configuration 방식을 사용 ==// @Bea..
✅ 자동 프록시 생성부가 기능이 타겟 오브젝트마다 새로 생성되는, 즉 InvocationHandler를 구현한 구체 클래스가 타겟 오브젝트에 종속되어 매번 새롭게 생성되는 것은 Advice를 통해서 해결했습니다. 이제 남은 것은 타겟 오브젝트를 변경할 때마다 거의 비슷한 내용의 ProxyFactoryBean의 빈 설정 정보를 매번 복사해서 등록해야 하는 문제입니다. target을 제외하면 Advisor 정보가 동일하기 때문에 중복을 제거할 수 있을 것입니다. 🔹빈 후처리기 -DefaultAdvisorAutoProxyCreatorBeanPostProcessor을 구현해서 만드는 빈 후처리기는 스프링 빈 오브젝트로 만들어지고 난 후에, 빈 오브젝트를 다시 가공할 수 있게 해줍니다. 여기서는 DefaultAd..
✅ ProxyFactoryBean스프링에서 프록시 오브젝트를 생성해주는 기술을 추상화한 팩토리 빈을 제공하고 있습니다. 스프링의 ProxyFactoryBean은 스프링 프레임워크에서 제공하는 기능 중 하나로, 동적 프록시를 생성하고 Bean으로 등록하여 관리하는 팩토리 빈(FactoryBean)입니다. ProxyFactoryBean을 사용하면 AOP(Aspect-Oriented Programming)를 구현하여 메소드 호출을 가로채고 부가적인 기능을 추가할 수 있습니다. 스프링에서 제공하는 팩토리 빈을 통해서, 기존에 작성했던 팩토리 빈의 한계를 극복할 수 있습니다. Advice: 타겟이 필요 없는 순수한 부가 기능Advice는 AOP에서 타겟 오브젝트에 적용하는 부가적인 기능을 담은 객체를 총칭합니다...
✅ 팩토리 빈(FactoryBean)스프링은 내부적으로 리플렉션 API를 이용해서 빈 정의에 나오는 클래스 이름을 가지고 Bean을 생성합니다. 문제는 다이나믹 프록시 오브젝트가 동적으로 클래스가 생성되기 때문에 어떤 클래스인지 조차 알 수 없어서 Bean에 등록할 수 없습니다. 다이내믹 프록시는 Proxy 클래스의 newProxyInstance() 라는 스태틱 팩토리 메소드를 통해서만 만들 수 있습니다. 이를 만들기 위해 스프링에서 제공하는 팩토리 빈 인터페이스를 구현하여서 빈 객체를 생성하는 방법을 알아보겠습니다. 🔹팩토리 빈 학습 테스트팩토리 빈팩토리 빈이란 스프링을 대신해서 오브젝트의 생성로직을 담당하도록 만들어진 특별한 빈을 말합니다. 가장 간단한 방법은 스프링의 FactoryBean이라는 인터..
✅ 프록시단순히 확장성을 고려해서 한 가지 기능을 분리한다면 아래와 같이 전략 패턴을 사용해도 됩니다. 트랜잭션 기능은 추상화 작업을 통해 전략 패턴을 적용하였지만 여전히 트랜잭션을 적용한다는 코드가 남아있었습니다. 트랜잭션이라는 기능은 사용자 관리 비즈니스 로직과는 성격이 다르기 때문에 아예 그 적용 사실 자체를 밖으로 분리할 수 있습니다. 이 방법을 이용해 UserServiceTx를 만들었고, UserServiceImpl에는 트랜잭션 코드가 하나도 남아있지 않게 되었습니다. 하지만 이렇게 구성했더라고 클라이언트가 핵심기능을 가진 클래스를 직접 사용해버리면 부가 기능을 가진 클래스를 따로 빼두었기 때문에 부가 기능이 적용되지 않습니다. 그래서 부가 기능이 마치 자신이 핵심 기능을 가진 클래스처럼 꾸미기..