기록4

LD·2024년 1월 5일
0

[ ApplicationContext ]
ApplicationContext는 Bean의 생명주기와 설정정보 등을 관리하며 IoC의 핵심이다.
ApplicationContext는 getResources 메소드로 Bean 리소스를 불러올 수 있는데, ApplicationContext가 ResourceLoader 인터페이스를 구현하고 있기 때문이다. 그래서 모든 ApplicationContext는 Resource 인스턴스를 얻기 위해 getResources()와 같은 ResourceLoader의 메소드를 사용할 수 있다.

이 때 Resource 인스턴스 타입에 따라 불러오는 여러 방식이 있는데, 기본적으로 getResource() 호출시 ApplicationContext 타입에 맞는 Resource 인스턴스가 반환된다.

	@Autowired
	private ApplicationContext context;
    
    ...
    
    context.getResources("classpath:/mappers/**/*Mapper.xml")

ex)

  • ClassPathXmlApplicationContext.getResource(location) : ClassPathResource 인스턴스 반환
  • FileSystemXmlApplicationContext.getResource(location) : FileSystemResource 인스턴스 반환
  • WebApplicationContext.getResource(location) : ServletContextResource 인스턴스 반환
  • location에 'file:', 'classpath:' 등의 접두어 사용 시 타입에 맞는 인스턴스가 반환된다.

[ MyBatis Data Access Layer ]

이미지출처 / 참고

  • SqlSession은 작성된 SQL 문을 호출하고 결과를 반환한다. SqlSessionFactory로 생성되고 관리된다. 더 이상 필요하지 않은 상태가 되면 세션을 닫는다. 스레드 안전 등을 위해 SqlSessionTemplate가 Session을 구현하여 대체한다.
    @Bean
    public SqlSessionTemplate sqlSession() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory());
    }
  • SqlSessionFactory는 DB 커넥션을 설정하고 연결 정보를 제공하며 SqlSession을 생성한다. 애플리케이션에 하나만 존재한다. SqlSessionFactoryBean 결과로 생성할 수 있다.
  • SqlSessionFactoryBean은 Spring에서 제공하는 FactoryBean 인터페이스를 구현한 클래스이다. Spring IoC 컨테이너에서 빈을 생성하고 관리할 때 사용된다. MyBatis 설정정보 - dataSource, MapperLocation, MyBatisConfiguration 등을 설정하고, 그 결과로 SqlSessionFactory를 생성하여 반환한다.
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource());
		factoryBean.setMapperLocations(context.getResources("classpath:/mappers/**/*Mapper.xml"));
		factoryBean.setConfiguration(MybatisConfig());
        return factoryBean.getObject();
    }
    
    /** xml 형식
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource" />
    	<property name="mapperLocations" value="classpath*:mappers/../.Mapper.xml" />
    	<property name="configuration">
    		<bean class="org.apache.ibatis.session.Configuration">
      			<property name="mapUnderscoreToCamelCase" value="true"/>
    		</bean>
  		</property>
    </bean>
     **/
  • FactoryBean은 Spring의 Bean 인터페이스를 구현한 클래스로, 특정 타입의 빈을 생성하고 초기화하는 역할을 담당한다. 보통 스프링 빈으로 관리할 수 없는 객체(프록시 객체 등)를 대신 생성하고 관리하는 기능을 제공한다. 주로 Spring 컨테이너에 등록된 빈을 통해 다른 빈을 생성하고, 빈의 라이프사이클을 관리하기 위해 사용되고, 일반적인 Factory 패턴과는 다르게, Spring의 IoC 컨테이너에서 빈을 생성하고 구성하는 데 사용된다.

[ 프록시 패턴 ]
원본 객체 수정없이 접근제어, 부가기능을 추가할 수 있는 패턴. Reflection API 기술을 사용한다. 하지만 중복 코드 발생, 여러 프록시 클래스를 생성해야 한다는 단점이 있는데, 이를 해결하기 위해 동적 프록시 기술을 사용한다.
동적 프록시는 기존에 프록시 구현체를 여러 개 생성하던 것을 InvocationHandler 인터페이스 구현체로 대체할 수 있다.
참고

[ Reflection API]
구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메소드, 타입, 변수, ...)에 접근하는 기법이다.
애플리케이션 실행 중에 클래스를 불러오는 호출 로직을 통해 클래스 정보를 얻어와 핸들링 할 때 java.lang.Class 패키지의 Class 클래스를 사용한다.
런타임에서 Class 클래스 객체를 얻는 방법은 object.getClass(), .class, .forName 이 있다.
참고

[ 팩토리 패턴 ]
Factory 객체를 만드는 패턴이다. Factory 패턴은 객체의 생성을 캡슐화하고, 생성된 객체를 클라이언트에게 직접 노출하지 않고 생성하는 패턴이다. 주로 인터페이스나 추상 클래스를 통해 객체를 생성하는 메서드를 제공하고, 구체적인 객체 생성은 서브클래스에서 이뤄집니다. 즉, 단일 클래스를 통해 객체 생성을 캡슐화하는 디자인 패턴이다.
참고

[ 팩토리 메서드 패턴 ]
Factory Method 패턴은 객체 생성을 서브클래스에 위임하여 처리한다. 상위 수준의 클래스에서는 인터페이스를 정의하고, 실제 객체 생성은 하위 클래스에서 구현한다. 이는 인스턴스를 생성하는 코드를 추상화하여 상위 수준의 클래스에서는 클래스의 구체적인 정보가 없이도 인스턴스를 생성할 수 있게 한다. 상속을 기반으로 하는 디자인 패턴이며, 서브클래스에서 구체적인 객체 생성을 책임진다. 즉, Factory Method 패턴은 상속을 통해 객체 생성을 위임하는 방식이다.

이미지 참고

0개의 댓글

관련 채용 정보