NPE(NullPointerException)
null 값을 참조할 경우 발생시키는 예외이다. 개발자가 두려워 하는 에러 중 하나.
상황은 이러하다.
Service클래스에서 만든 JPA를 활용한 DB접근 메소드를 검증하고자, test클래스를 만들어 실행 시켰다.
자세한 코드는 다음과 같다.
Service
@Service
public class UserService {
@Autowired
UserRepository userRepository;
public Long join(User user){
userRepository.save(user); // JpaRepository 메소드 활용
return user.getId();
}
Test
class UserServiceTest {
@Autowired
UserService userService;
@Test
void join() {
User user = User.builder().id(2L).name("woojin").build();
assertThat(userService.join(user)).isEqualTo(2L);
}
Result
역추적으로 null인 부분을 찾고자 했지만 모든 필드는 초기화가 잘 되있었다....
그렇다. 여기서 눈 여겨 볼점은 user라는 객체안에 있는 필드가 null이여서 발생한 오류가 아닙니다.
user라는 객체 자체가 null이라는 뜻입니다 !
왜 이러한 에러가 발생하였을까...? Builder패턴을 사용하는데 내가 고려하지 못한 부분이 존재한건가?..........
정답은 간단간단 쏘 간단했습니다.
class UserServiceTest {
@Autowired
UserService userService;
@Test
void join() {
User user = User.builder().id(2L).name("woojin").build();
assertThat(userService.join(user)).isEqualTo(2L);
}
위 코드에서 이상한 점은?
@SpringBootTest
class UserServiceTest {
@SpringBootTest 어노테이션을 쓰지 않았다............하.........
인텔리제이 툴을 사용하여 "테스트 생성"을 눌러서 클래스를 생성하다보니 @SpringBootTest가 명시가 안되있을거라고는 상상도 못했다.
얼마전까지만 해도 이클립스를 쓰다가 넘어와서 그런지 정말 황당한 실수를 했다...
@SpringBootTest는
단위 테스트와 같이 기능 검증을 위한 것이 아니라 spring framework에서 전체적으로 플로우가 제대로 동작하는지 검증하기 위해 사용 한다. 그래서 Spring Container가 돌아가지 않아서 @Autowired가 안된것이다. 명시하지 않으면 @Service가 명시된 Bean를 사용하고자 해도 생성이 안되있기에 불가능하다.
즉 User를 생성하는 과정에선 문제가 없었지만 Serivce객체를 사용하는 과정에서 NPE가 발생한거였다 ^^
728x90
'Error' 카테고리의 다른 글
[Java Error] java.lang.IndexOutOfBoundsException 해결법 (0) | 2023.03.20 |
---|---|
MyBatis Error: Invalid bound statement (not found) 불일치 ! (0) | 2023.02.01 |
Spring Boot Thymeleaf 500 에러 (0) | 2023.01.24 |
부적합한 열 유형 : 1111 란? (0) | 2023.01.20 |
ORA-00933: SQL command not properly ended ??…..ㅠㅠㅠ (0) | 2023.01.20 |