ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring - 데이터베이스 연결 시 Config파일 파헤치기
    Spring/전자정부프레임워크 2024. 12. 23. 15:17
    반응형

    1. 데이터베이스 등록 및 연동의 흐름

    Spring에서는 다음의 흐름을 통해 데이터베이스와 연결하고 이를 통해 SQL을 실행합니다:

    1. 데이터 소스(DataSource) 설정: 데이터베이스 연결 정보(Driver, URL, 사용자명, 비밀번호 등)를 설정.
    2. SqlSessionFactory 생성: MyBatis에서 사용할 SQL 세션을 생성. 데이터 소스를 기반으로 동작.
    3. 트랜잭션 매니저(Transaction Manager) 등록: 데이터베이스 트랜잭션을 관리.
    4. 매퍼 스캔 및 매퍼 연결: MyBatis 매퍼 인터페이스와 XML 매퍼 파일을 등록하고 연결.

    2. 상세 흐름과 어노테이션 설명

    2.1 데이터 소스 설정

    데이터 소스는 데이터베이스 연결을 위한 설정입니다. 일반적으로 XML 파일(context-datasource.xml)에 등록하고 Java Config에서 이를 참조합니다.

    XML 파일 예시

    <bean id="mariaDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.mariadb.jdbc.Driver" />
        <property name="url" value="jdbc:mariadb://localhost:3307/{userdatabase}" />
        <property name="username" value="{username}" />
        <property name="password" value="{userpassword" />
    </bean>

     

    • id: mariaDataSource는 데이터 소스를 식별하는 고유 이름입니다.
    • driverClassName: 데이터베이스의 JDBC 드라이버 클래스 이름입니다.
    • url: 데이터베이스의 URL 경로입니다.
    • username / password: 데이터베이스 접속 정보입니다.
    • destroy-method: 빈이 소멸될 때 연결을 종료하는 메서드입니다(close).

    2.2 Config 파일: 데이터 소스 참조

    Java Config에서 위 XML 파일의 데이터를 로드하고 DataSource를 사용하여 SqlSessionFactory와 트랜잭션 매니저를 등록합니다. 여기서 sqlSessionFactoryRef 의 경우에는 basPackages 즉 매퍼 패키지에 등록된 파일을 기존에 datasource를 xml파일에 등록한 내용과 연결시켜주는 중간 역할을 한다. 그렇기 때문에 @Qualifier에 datasource에서 등록하였던 bean id와 동일하게 해줘야한다.

    MariaConfig 파일

    @Configuration
    @ImportResource("classpath:/{path}/context-datasource.xml") // XML 파일 로드
    @MapperScan(
        basePackages = "{path}",  // 매퍼 패키지 스캔
        sqlSessionFactoryRef = "mariaSessionFactory"    // SqlSessionFactory 연결
    )
    public class MariaConfig extends WebConfig {
    
        @Bean(name = "mariaSessionFactory")
        public SqlSessionFactory mariaSessionFactory(@Qualifier("mariaDataSource") DataSource mariaDataSource) throws Exception {
            System.out.println("MariaConfig 설정");
            return createSqlSessionFactory(mariaDataSource, "classpath:/{path}/*.xml");
        }
    
        @Bean(name = "mariaTransactionManager")
        public PlatformTransactionManager mariaTransactionManager(@Qualifier("mariaDataSource") DataSource mariaDataSource) {
            return createTransactionManager(mariaDataSource);
        }
    }

     

    어노테이션 설명

    1. @Configuration:
      • Spring에서 이 클래스를 설정 클래스(Bean Definition Source)로 인식합니다.
      • Spring Container가 이 클래스를 로드하여 빈을 생성합니다.
    2. @ImportResource:
      • XML 파일(context-datasource.xml)을 로드합니다.
      • XML에서 정의한 DataSource 빈을 Spring Context에 등록합니다.
    3. @MapperScan:
      • 특정 패키지에 있는 MyBatis 매퍼 인터페이스를 자동으로 스캔합니다.
      • sqlSessionFactoryRef를 통해 스캔된 매퍼가 사용할 SqlSessionFactory를 지정합니다.
    4. @Bean:
      • Spring Context에 직접 빈을 등록합니다.
      • 등록된 빈은 다른 컴포넌트에서 의존성 주입(Dependency Injection)으로 사용됩니다.
    5. @Qualifier:
      • 동일한 타입의 빈이 여러 개 있을 때, 특정 빈(mariaDataSource)을 명시적으로 선택합니다.

    2.3 공통 설정: WebConfig

    코드

    @Configuration
    public class WebConfig {
    
        public SqlSessionFactory createSqlSessionFactory(DataSource dataSource, String mapperLocation) throws Exception {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource); // 데이터 소스 연결
            sqlSessionFactoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(mapperLocation) // 매퍼 XML 파일 위치
            );
            return sqlSessionFactoryBean.getObject();
        }
    
        public PlatformTransactionManager createTransactionManager(DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    }

    설명

    1. SqlSessionFactory 생성
      • MyBatis에서 SQL 실행을 관리하는 주요 객체입니다.
      • 데이터 소스와 매퍼 XML 파일을 연결하여 MyBatis 매퍼가 사용할 수 있도록 설정합니다.
    2. PlatformTransactionManager 생성
      • Spring에서 트랜잭션을 관리하는 객체입니다.
      • @Transactional 어노테이션을 통해 트랜잭션 관리가 가능합니다.

    2.4 매퍼 스캔과 MyBatis 매퍼

    MyBatis 매퍼 인터페이스

    @Mapper
    public interface MariaMapper {
        List<String> getAllUsers(); // 추상 메서드
    }
    • @Mapper:
      • MyBatis 매퍼 인터페이스로 등록합니다.
      • @MapperScan에 의해 자동으로 스캔됩니다.

    매퍼 XML

    <mapper namespace="{mapperpath}">
        <select id="getAllUsers" resultType="string">
            SELECT name FROM users;
        </select>
    </mapper>

     

    • namespace: 매퍼 인터페이스와 매퍼 XML 파일을 연결하는 고유 이름. 인터페이스의 FQCN(패키지명 포함된 클래스 이름)과 일치해야 합니다.
    • id: 매퍼 인터페이스의 메서드 이름과 일치해야 합니다.

    3. 전체 동작 과정

    1. XML 파일 로드
      • Spring은 @ImportResource를 통해 context-datasource.xml에서 데이터 소스를 로드합니다.
      • 데이터 소스는 mariaDataSource와 같은 고유 ID로 등록됩니다.
    2. Config 클래스 처리
      • Spring은 @Configuration 클래스를 스캔하여 필요한 SqlSessionFactory와 트랜잭션 매니저를 생성합니다.
      • @Qualifier를 통해 XML 파일에서 등록한 특정 데이터 소스를 주입받습니다.
    3. 매퍼 스캔
      • @MapperScan이 지정된 패키지에서 MyBatis 매퍼 인터페이스를 스캔합니다.
      • 매퍼 인터페이스는 SqlSessionFactory를 사용하여 데이터베이스와 통신합니다.
    4. MyBatis 매퍼 실행
      • 매퍼 인터페이스에서 정의한 메서드가 호출되면 매퍼 XML에 정의된 SQL이 실행됩니다.

    4. 요약

    • context-datasource.xml: 데이터 소스를 정의하고 Java Config에서 참조합니다.
    • Config 파일:
      • SqlSessionFactory와 트랜잭션 매니저를 생성하여 Spring Context에 빈으로 등록합니다.
    • @MapperScan:
      • 매퍼 인터페이스를 스캔하여 SqlSessionFactory에 등록합니다.
    • 매퍼 인터페이스와 XML:
      • 매퍼 인터페이스의 메서드는 매퍼 XML의 SQL 쿼리와 연결됩니다.

     

    반응형

    댓글

Designed by Tistory.