에러는 기본적으로 첫번째 줄을 봅니다. 에러종류와 그와 관련된 자세한 사항이 적혀져있습니다.
에러를 잘 읽어보고 기억하도록합시다. 시도때도없이 에러가 찾아오지만, 생각보다 원인과 해결방법이 많지는 않습니다.
NullPointerException처럼 자세한 내용이 나오지않는 에러의 경우 대부분 에러위치를 알려줍니다.
에러를 보고 내가 작성한 파일을 찾습니다.
초록색으로 밑줄친 부분에서 발생한 에러기 때문에 가서 해결해줍시다.
(NullPointerExcpetion을 해결하지 못한다면 당장 에러를 해결하는데에만 급급해하지말고 NullPointerExcpetion이 뭔지
왜 발생하는지, 어떻게 해결하는지에 대한 공부를 하셔야합니다. 다른 에러들도 마찬가지입니다. )
서버 켜질 때
web.xml에 보면 ContextLoaderListener, DispatcherServlet에 대한 내용이 있다.
서버가 켜질 때 Spring은 ApplicationContext , WebApplicaionContext의 빈들을 생성한다.
이 때 빈 정의가 잘못 되어있다면 ErrorCreating Bean with name "빈이름" 에러가 발생한다.
이렇게 서버 켜질 때 에러가 발생하면 Controller,Service 등의 JAVA 코드가 완벽해도
브라우저가 요청하면 무조건 404에러가 발생한다.
ErrorCreating Bean with name "sqlSessionFactory"
1.처음에 DB 설정 ( 처음에 context-datasource 에 잘못적었거나,appconifg.properties의 값이 잘못된 경우)
==> 한번 DB에 연결되서 화면 잘 나오는 경우는 더 이상 신경쓰지않아도 됨
2. 잘 설정했는데도 왠지 에러남
==> 가끔 변경사항이 잘 저장되지 않았을 때 가끔 이럼. project clean합시다.
ErrorCreating Bean with name "ServiceImpl,Controller "
필드에 @Inject를 썻으면 spring은 관련 객체를 주입해야한다.
그런데 관련객체가 빈으로 없으면 주입을 못합니다.
@Controller
public class FreeBoardController{
@Inject
IFreeBoardService freeBoardService;
}
// @Service가 없다..
public class FreeBoardServiceImpl implements IFreeBoardService{
}
위와 같은 상황에서 Spring은 "freeBoardController" 빈을 만들려고 한다. 이 빈을 만들려면
IFreeBoardService타입의 빈을 주입해야 한다.
근데 FreeBoradServiceImpl에 @Service를 안 붙이면
Spring은 IFreeBoardService 타입의 빈이 없다.
주입할 IFreeBoardService타입 빈이 없어서 freeBoardController를 못 만드니
ErrorCreating Bean with name "freeBoardController" 에러가 발생한다.
==> 빈으로 등록해야 할 곳에 @Controller, @Service, @Mapper 잘 붙였는지 확인하자.
ErrorCreatingBean With Name "무슨ServcieImpl" (찾기 어려워요)
mapper파일 작성 중에 <select , insert> 태그에 resultType이나 parameterType에 잘못 쓴 경우
=> org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.study.code.vo.CodeVOa'
CodeVOa는 없다. 이러면 에러납니다.
ErrorCreatingBean with name "어쩌구저쩌구" 첫번째 에러줄을 끝까지 잘 읽어봐야합니다.
그 외 기타 에러가 있겠지만 그때 그때 해결할 힘을 기릅시다.
서버는 잘 켜졌다. 실행도중
NullPointerException (빈관련 문제인 경우)
Spring으로 Controller처음 만났을 때 NullPointerException을 만날 수 있는데
Spring에서는 Controller,Service, Dao를 다 의존주입을 통해
Controller에서 Service의 메소드, Service에서 Dao의 메소드를 호출하도록 했다.
그리고 그 메소드를 호출하기위한 객체또한 Spring을 통해 빈으로 주입받았다.
Controller에서 Service호출해서 사용하는 기존의 코드는
IFreeBoardService freeBoardService=new FreeBoardServiceImpl();
freeBoardService.getBoardList()
이다.
이 때 기존의 new FreeBoardServiceImpl()코드를 그대로 사용할 경우 FreeBoardService의 코드를 보자.
@Service
public class FreeBoardServiceImpl implements IFreeBoardService {
@Inject
IFreeBoardDao freeBoardDao;
@Override
public FreeBoardVO getBoard(int boNo) throws BizNotFoundException {
FreeBoardVO freeBoard = freeBoardDao.getBoard(boNo);
}
}
비록 @Service, @Inject가 되어있지만 new FreeBoardServiceImpl()로
만든 경우 Spring이랑 아무 관련이없다.
Spring이 생성한게 아니라 사용자가 직접 new 키워드로 생성했기 때문이다. 객체는 생성이 된다.
하지만 기본적으로 new 로 생성한 객체는 필드가 null이다.
즉, new FreeBoardServiceImpl()로 만든 객체에서 freeBoardDao는 null이다.
그래서 NullPointerException이 발생한다.
==> Service나 Dao의 객체를 직접 생성하는 코드가 있나 살펴보자.
404에러 (서버가 제대로 켜진 후)
1. 가장 기본적인 경로문제. contextPath가 잘못되어있어서 404뜨는 경우도 가끔있습니다.
잘 설정했나 확인하기.
2. 내가 요청한 url과 @RequestMapping("")의 값이 다른 경우
콘솔에서는 WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/study4/free/freeListasddd.wow] in DispatcherServlet with name 'appServlet' 이라는 에러가 나온다.
3. return하는 View이름 값이 다른 경우
jsp를 찾을 수 없다고 나온다.
4. 1~3번 전부 확인했는데 문제가 없는걸요?
Controller를 만들어놓고 @Controller를 안 붙인 경우도 있습니다.