Develop

[Error] class/typealias not found : Alias 못찾는 오류 본문

웹 개발/Error

[Error] class/typealias not found : Alias 못찾는 오류

개발 기록 2024. 3. 8. 10:29

 

VO에 분명히 Alias를 지정해줬는데 못찾는 오류 발생

방법 2개임

 

spring boot 프로젝트 구조 (필요한 부분만 펼쳐둠)

 


1번째 방법

VO

package com.example.demo.domain;


import javax.validation.constraints.Pattern;

import org.apache.ibatis.type.Alias;

import lombok.Data;

@Data
@Alias("noticeVO")
public class NoticeVO {
	
	private int noNum; // 게시글 번호(AI) no_num
	
	//@NotBlank(message="제목을 입력해주세요.")
	@Pattern(regexp = "[a-zA-Z0-9ㄱ-힣]{1,30}", message = "최소 1자, 최대 30자까지 입력 가능하며 영문, 숫자, 한글만 입력 가능합니다.")
	//@Size(min = 1, message = "제목은 1글자 이상이어야 합니다.")
	private String noTitle; // 제목
	
	//@NotBlank(message="내용을 입력해주세요.")
	@Pattern(regexp = "[a-zA-Z0-9ㄱ-힣]{1,300}", message = "최소 1자, 최대 300자까지 입력 가능하며 영문, 숫자, 한글만 입력 가능합니다.")
	//@Size(min = 1, message = "내용은 1글자 이상이어야 합니다.")
	private String noContent; // 내용
	
	private String noFile; // 파일 경로
	private String noState; // 글 상태
	
	
}

 

noticeVO라는 Alias를 지정해주었음을 확인함

 


 

application.properties

#MyBatis
#VO
mybatis.type-aliases-package=com.example.demo.domain 
#mapper
mybatis.mapper-locations=classpath:mappers/*.xml
#mybatis config 
mybatis.config-location=classpath:mybatis-config.xml

 

mybatis-config.xml 파일 루트 알려주기 (맨밑줄)

 

classpath: 작성시 src/main/java 패키지가 아닌 src/main/resource 패키지로 가는듯


 

mybatis-config.xml 

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<settings>
		<!-- mapUnderscoreToCamelCase : Mybatis의 DTO(VO) 리턴 값을 Camel Case로 변환시킨다 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
		<!-- callSettersOnNulls : ResultType 이 HashMap 일 때 값이 null 인 것이 누락되어 나오는데, null을 포함시켜 return 하게 한다 -->
		<setting name="callSettersOnNulls" value="true"/>
	</settings>
<!--
	<mappers> 
		<mapper resource="mappers/ notiveMapper.xml"/>
	</mappers>
-->

	<typeAliases>
		<typeAlias type="com.example.demo.domain.NoticeVO" alias="noticeVO" />
	</typeAliases>

</configuration>

 

<typeAliases> 태그를 사용하여 alias 지정하면

 

mapper에서 오류가 사라진다

근데 매번 지정해주는 것도 일인데..이유를 모르겠음 

다음엔 mapper와 mybatis-config.xml이 같은 상위폴더 안에 있도록 해봐야겠다

 

 

이 구성처럼!

 

그리고 참고한 글에 따르면

application.properties 또는 application.yml 파일에서 설정해주는

 

#mapper
mybatis.mapper-locations=classpath:mappers/*.xml

mapper-locations은 일정한 규칙대로 일괄적용 하는 방식이고

 

 

config-location은 

#mybatis config 
mybatis.config-location=classpath:mybatis-config.xml

 

위와같은 형식으로 지정시 mybatis-config.xml에서 선택적으로 mapper 및 alias name을 적용할 수 있다고 한다. 

 


 

2번째 방법

1. MyBatisConfig 수정 (주로 MyBatisConfig로 쓰지만 내 파일의 이름은 MySQLConfig)

 

 

원래의 config 파일

// SqlSessionFactory
//  SqlSessionFactory는 마이바티스에서 핵심 역할을 하는 객체로
//  데이터베이스 연결 및 SQL 실행을 관리한다.
//  스프링부트와 마이바티스를 연동할 때 SqlSessionFactory를 빈으로 등록해야한다.
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource,) throws Exception {

    // SqlSessionFactory : Mysql과 Mybatis를 연결해주는 객체
    // SqlSessionFactoryBean : SqlSessionFactory 를 생성해주는 클래스
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    // setDataSource : 앞에서 정의한 datasource를 참조하게 한다.
    sessionFactory.setDataSource(dataSource);

    // PathMatchingResourcePatternResolver : 위치 검색을 돕는 Spring calss
    // getResources()로 경로 검색을 해서 SqlSessionFactory 에 mapper 와 mybatis-config를 set해준다
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"));

    // classpath : resource 폴더를 나타냄
    // 여기서 언급되는 myBatisConfig는 말 그대로 Mybatis 설정 파일으로 필수는 아니지만 Mybatis 설정을 위해 생성해주는 편이 좋다.
    // resource폴더 아래에 mybatis-config.xml 을 생성해줬다.
    Resource myBatisConfig = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml");
    sessionFactory.setConfigLocation(myBatisConfig);


    return sessionFactory.getObject();
}

 

 

수정된 config 파일

(같은 이름이 있어서 헷갈리지말라고 import도 첨부함)

package com.example.demo.config;

import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;


// SqlSessionFactory
	//  SqlSessionFactory는 마이바티스에서 핵심 역할을 하는 객체로
	//  데이터베이스 연결 및 SQL 실행을 관리한다.
	//  스프링부트와 마이바티스를 연동할 때 SqlSessionFactory를 빈으로 등록해야한다.
@Bean(name ="sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource")DataSource dataSource,
                                            ApplicationContext applicationContext,
                                            @Value("${mybatis.type-aliases-package}") String typeAliasesPackage,
                                            @Value("${mybatis.mapper-locations}") String mapperLocations,
                                            @Value("${mybatis.config-location}") String configLocation
                                          ) throws Exception {
        
    // SqlSessionFactory : Mysql과 Mybatis를 연결해주는 객체
    // SqlSessionFactoryBean : SqlSessionFactory 를 생성해주는 클래스
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    // setDataSource : 앞에서 정의한 datasource를 참조하게 한다.
    sessionFactory.setDataSource(dataSource);

    sessionFactory.setMapperLocations(applicationContext.getResources(mapperLocations));
    sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
    sessionFactory.setConfigLocation(applicationContext.getResource(configLocation));

    return sessionFactory.getObject();
}

 

 

이렇게 수정하면 매번 mybatis-config 파일에 alias를 등록하지 않아도 된다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<settings>
		<!-- mapUnderscoreToCamelCase : Mybatis의 DTO(VO) 리턴 값을 Camel Case로 변환시킨다 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
		<!-- callSettersOnNulls : ResultType 이 HashMap 일 때 값이 null 인 것이 누락되어 나오는데, null을 포함시켜 return 하게 한다 -->
		<setting name="callSettersOnNulls" value="true"/>
	</settings>
<!--
	<mappers> 
		<mapper resource="mappers/ notiveMapper.xml"/>
	</mappers>
-->

	<typeAliases>
		<typeAlias type="com.example.demo.domain.NoticeVO" alias="noticeVO" />
		<typeAlias type="com.example.demo.domain.Criteria" alias="CriVO" />
	</typeAliases>

</configuration>

 

이 파일의 <typeAliases> 내용을 안써도 된다는 뜻

= 즉 VO가 추가되어도 안적어줘도 되기 때문에 편함!

 

두번째 방법의 출처는 사수님ㅎㅎ


 

참고한 글

 

머찐아빠 :: Springboot + gradle + Mybatis typeAlias Eclipse 인식오류 (tistory.com)

 

Springboot + gradle + Mybatis typeAlias Eclipse 인식오류

어느순간 SpringFramework을 사용하는 프로젝트는 springboot가 대세가 되버렸고, 이제는 점점 springboot + maven + mybatis 에서 maven자리를 gradle이 대체하는 추세인듯하다. (개인적인 느낌) 여전히 Maven이 친

gubok.tistory.com