Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'stodDaoImpl': Requested bean is currently in creation: Is there an unresolvable circular reference?
스프링이 빈을 생성하는 과정에서 순환 참조가 발생했음을 나타내는 에러 문구이다.
- 순환 참조란?
빈 A가 빈 B 의존,
빈 B가 빈 A 의존
=> 빈을 초기화하는 동안 서로가 서로를 기다리게 되어 빈 생성 불가 문제 발생
- 해결 방법
순환 참조를 일으키는 빈들 사이의 의존성 제거 or 변경
에러 메세지
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'stodServiceImpl' defined in file [/Users/soheepark/Desktop/project/soheeProject/jscd/target/jscd-1.0.0-BUILD-SNAPSHOT/WEB-INF/classes/com/jscd/app/order/service/StodServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'stodDaoImpl' defined in file [/Users/soheepark/Desktop/project/soheeProject/jscd/target/jscd-1.0.0-BUILD-SNAPSHOT/WEB-INF/classes/com/jscd/app/order/dao/StodDaoImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'stodDaoImpl': Requested bean is currently in creation: Is there an unresolvable circular reference?
StodServiceImpl과 StodDaoImpl 사이 순환 참조 발생하고 있음
StodServiceImpl은 생성자를 통해 StodDaoImpl을 의존하고 있고,
StodDaoImpl 또한 StodServiceImpl을 의존하고 있음
단, StodServiceImpl가 StodDaoImpl을 의존하는 것은 당연한 것
StodDaoImpl가 StodServiceImpl을 의존하는 부분을 찾아 수정해야함
"DAO 계층이 Service 계층에 의존하는 것은 설계상 바람직하지 않음"
StodServiceImpl.java
package com.jscd.app.order.service;
import com.jscd.app.order.dao.StodDao;
import com.jscd.app.order.dto.StodDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class StodServiceImpl implements StodService {
private final StodDao stodDao;
@Autowired
public StodServiceImpl(StodDao stodDao) {
this.stodDao = stodDao;
}
@Override
public StodDTO getStod(String odNo) {
return stodDao.getStod(odNo);
}
@Override
public void insertStod(StodDTO stodDTO) {
stodDao.insertStod(stodDTO);
}
@Override
public void updateStod(StodDTO stodDTO) {
stodDao.updateStod(stodDTO);
}
@Override
public void updateStodStatus(StodDTO stodDTO) {
stodDao.updateStodStatus(stodDTO);
}
@Override
public void deleteStod(StodDTO stodDTO) {
stodDao.deleteStod(stodDTO);
}
}
StodDaoImpl.java
package com.jscd.app.order.dao;
import com.jscd.app.order.dto.StodDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class StodDaoImpl implements StodDao {
private final StodDao stodDao;
@Autowired
public StodDaoImpl(StodDao stodDao) {
this.stodDao = stodDao;
}
@Override
public StodDTO getStod(String odNo) {
return stodDao.getStod(odNo);
}
@Override
public void insertStod(StodDTO stodDTO) {
stodDao.insertStod(stodDTO);
}
@Override
public void updateStod(StodDTO stodDTO) {
stodDao.updateStod(stodDTO);
}
@Override
public void updateStodStatus(StodDTO stodDTO) {
stodDao.updateStodStatus(stodDTO);
}
@Override
public void deleteStod(StodDTO stodDTO) {
stodDao.deleteStod(stodDTO);
}
}
StodDaoImpl이 자기 자신을 의존하고 있다.
//해당 부분
private final StodDao stodDao;
@Autowired
public StodDaoImpl(StodDao stodDao) {
this.stodDao = stodDao;
}
StodDaoImpl 클래스의 생성자에서 StodDao 타입 객체를 주입받고, 이를 stodDao 필드에 할당하고 있다.
그런데 StodDaoImpl 클래스는 StodDao 인터페이스를 구현하므로,
스프링은 StodDao 타입의 빈을 찾기 위해 StodDaoImpl을 다시 생성하려고 시도하게 된다.
=> 이로 인해 순환 참조 발생
이를 해결하려면, StodDao 인터페이스에 선언된 메서드들의 구현부를 작성해야함.
이게 다 대충 적어놓고 구현부 작성 안해놓고 까먹고 그냥 실행해버린 나의 잘못...
꺼진 불도 다시 보자.
고친 StodDaoImpl.java 파일
package com.jscd.app.order.dao;
import com.jscd.app.order.dto.StodDTO;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class StodDaoImpl implements StodDao {
private final SqlSession sqlSession;
@Autowired
public StodDaoImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public StodDTO getStod(String odNo) {
return sqlSession.selectOne("getStod", odNo);
}
@Override
public void insertStod(StodDTO stodDTO) {
sqlSession.insert("insertStod", stodDTO);
}
@Override
public void updateStod(StodDTO stodDTO) {
sqlSession.update("updateStod", stodDTO);
}
@Override
public void updateStodStatus(StodDTO stodDTO) {
sqlSession.update("updateStodStatus", stodDTO);
}
@Override
public void deleteStod(StodDTO stodDTO) {
sqlSession.delete("deleteStod", stodDTO);
}
}
자알 ~ 돌아간다
헤헤
'[Project] > 사이드 프로젝트' 카테고리의 다른 글
[404 Error] 파일 [/order/paySuccess.jsp]을(를) 찾을 수 없습니다. (0) | 2023.12.11 |
---|---|
[mysql/intellij] SQLException: Access denied for user 'root'@'localhost' (0) | 2023.12.10 |
[TypeError] order.js:113 Uncaught (in promise) TypeError (0) | 2023.12.09 |
[결제완료 카드 번호 데이터 넘기기] NumberFormatException (2) | 2023.12.08 |
[Jscd/주문] 주문 내역 데이터 삽입 시점 (1) | 2023.12.06 |