0729)
금요일에 mybatis 를 기존에 만들어 둔 게시판과 연동했는데 실행 오류가 났다.
오늘 오전 다시 파일들을 찬찬히 살펴보며 코드를 수정했는데 pom.xml 에 세팅 오류가 있었다.'
오류 메세지 )
Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'boardDAOMybatis':
Unsatisfied dependency expressed through field 'mybatis'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.SqlSessionTemplate#0' defined in class path resource [applicationContext.xml]:
Cannot resolve reference to bean 'sqlSession' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSession' defined in class path resource [applicationContext.xml]:
Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeException
수정한 pom.xml 파일
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springbook</groupId>
<artifactId>biz</artifactId>
<name>BoardWeb</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
MyBatis로 기능 처리가 잘 되는 것을 볼 수 있다.
비교를 위해 남겨 놓은 수정 전 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springbook</groupId>
<artifactId>biz</artifactId>
<name>BoardWeb</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.ibatis/ibatis-core -->
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency> -> 강사님 파일에는 없음
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
<scope>runtime</scope>
</dependency> -> 강사님 파일에는 위에 위치되어 있음.
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
ibatis-core는 그리고 어디서 왜 가지고 온 것일까..? 과거의 내가 그랬다니 믿을 수가 없다.
롬북의 버전이 다른 것, ibatis-core 부분은 큰 문제는 아니지만 aspectjweaver 태그가 앞쪽에 들어가야 인식이 되는 건지 강사님이 aspectjweaver 태그를 넣은 부분으로 코드를 옮기자 실행이 됐다. 이클립스의 오류인지 실행 순서의 오류인지 알 수가 없다.
GPT에게 이 문제에 대해 물어봤다.
질문 : 스프링으로 프로젝트를 할때 pom.xml에서 aspectjweaver태그 위치가 실행 오류와 연관이 있어?
답변 :
`pom.xml` 파일에서 `aspectjweaver` 태그의 위치는 **실행 오류와 직접적인 연관이 없습니다**. 하지만, `pom.xml`에서의 태그 위치는 Maven 빌드 순서나 종속성 관리에 영향을 줄 수 있습니다. 실행 오류는 주로 다음과 같은 원인들로 발생할 수 있습니다:
### **1. 종속성 충돌**
- Maven에서는 여러 라이브러리를 가져올 때, 동일한 라이브러리의 다른 버전이 서로 충돌할 수 있습니다. 이런 경우 `aspectjweaver`가 포함된 위치와 상관없이, 해당 라이브러리의 버전 충돌로 인해 실행 오류가 발생할 수 있습니다.
### **2. 종속성 범위(scope)**
- `aspectjweaver` 라이브러리의 `scope`가 잘못 설정된 경우, 예를 들어 `test` 범위로 설정되어 있는데 실제 애플리케이션 런타임에서 필요할 경우, 런타임 오류가 발생할 수 있습니다.
### **3. 종속성 순서**
- Maven의 종속성은 일반적으로 선언된 순서대로 적용됩니다. 이 순서가 의존성 해결에 영향을 미칠 수 있습니다. `aspectjweaver`가 특정 다른 라이브러리에 의존하고 있고, 그 의존성이 올바르게 해결되지 않을 경우 문제를 일으킬 수 있습니다.
### **4. 종속성 버전**
- `aspectjweaver` 라이브러리의 버전이 프로젝트에서 사용 중인 다른 라이브러리와 호환되지 않을 경우, 실행 중 오류가 발생할 수 있습니다.
### **5. Maven 빌드 플러그인**
- `aspectjweaver`를 사용하는 동안, 필요한 Maven 빌드 플러그인(예: AspectJ Maven 플러그인)이 올바르게 설정되지 않은 경우에도 실행 오류가 발생할 수 있습니다.
### **올바른 위치**
일반적으로 `aspectjweaver`는 `dependencies` 섹션 내에 위치하며, 다른 종속성과 함께 나열됩니다. 예를 들어:
```xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version> <!-- 버전은 예시입니다. -->
</dependency>
<!-- 기타 종속성들 -->
</dependencies>
```
### **오류를 방지하는 방법**
1. **정확한 버전 관리**: 모든 종속성의 버전을 일관되게 관리합니다.
2. **종속성 충돌 방지**: `mvn dependency:tree` 명령을 통해 의존성 트리를 확인하고, 충돌이 있는지 검사합니다.
3. **종속성 우선순위 확인**: 특정 종속성이 다른 종속성보다 먼저 로드되도록 해야 한다면, `pom.xml`의 선언 순서를 조정할 수 있습니다.
4. **빌드 플러그인 설정**: 필요한 경우 AspectJ Maven 플러그인이나 다른 관련 플러그인을 설정합니다.
### **마무리**
`aspectjweaver` 태그의 위치가 실행 오류의 직접적인 원인은 아니지만, Maven 종속성 관리에서의 위치, 버전, 범위(scope), 그리고 다른 라이브러리와의 충돌 여부는 오류 발생과 밀접한 관련이 있습니다. 따라서 이러한 요소들을 종합적으로 고려하여 문제를 해결하는 것이 중요합니다.
휴.. 쉽지 않다.
버전을 강사님과 다 맞췄는데 안됐고, 나 뿐만 아니라 다른 동료들도 같은 오류가 난 것으로 보아
강사님도 저 오류가 나 파일을 수정하셨는데 공유가 되지않았고
저 오류의 가장 유력한 후보는 일단 3번인 것 같다.
강사님이 전에 주신 pom.xml 파일과 비교해도 aspectjweaver 태그의 순서 말고는 다른 부분이 없다!
GPT의 답변이 다 믿을만한 것은 아니지만 방대한 통계로 해준 답변일테니
앞으론 저런 오류가 날 수도 있구나 정도로 알고 코드를 잘 봐야겠다!
삽질이라면 삽질이지만 언제 또 이렇게 pom.xml을 자세히 볼까!? 정말 엄청난 깨달음이다.
이참에 정리하는 aspectjweaver 태그란?
Maven 프로젝트에서 AspectJ 라이브러리를 사용하기 위해 선언하는 종속성을 지정하는 역할.
AspectJ는 AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)를 구현하기 위한 도구로,
스프링 프레임워크에서 AOP 기능을 구현할 때 자주 사용
AOP 프로그래밍
AOP (Aspect Oriented Programming)
여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법
UIUX _국비과정 0717 [스프링 3대 요소] | Notion
스프링의 3대 요소
ringed-tartan-f02.notion.site
'( ꙭ ).ᐟ.ᐟ 질문과 해결' 카테고리의 다른 글
이클립스 JSP) 한글깨짐 방지 UTF-8 자동설정 (0) | 2024.07.23 |
---|---|
톰캣 버전 10 라이브러리 인식 문제, 파일이름 인식 문제 (0) | 2024.07.11 |
오라클 에러) 요청한 작업을 수행하는 중 오류 발생: IO 오류: 업체 코드 17002 (0) | 2024.07.10 |
톰켓 에러) 이미 사용 중인 포트 _ Mac , 윈도우 터미널 명령 (0) | 2024.07.10 |
JSP, DB를 공부하며 궁금했던 것들. 질문모음집 (1) | 2024.07.09 |