Develop
[Error] class/typealias not found : Alias 못찾는 오류 본문
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
'웹 개발 > Error' 카테고리의 다른 글
오류 났을 때 스택트레이스 읽기 방법과 중요성 (0) | 2025.01.06 |
---|---|
스프링부트 새프로젝트 생성시 나는 오류 (0) | 2024.12.31 |
[Error] mapper에서 getter, setter 메서드 호출 오류 (0) | 2024.03.09 |
[Error] Uncaught TypeError: back is not a function at HTMLInputElement.onclick (0) | 2024.02.15 |