프로젝트를 만들면서 NullPointerException
에러가 나왔다.
코드는 아래와 같다.
Controller
package com.sh.movie.web;
import com.sh.movie.service.board.BoardService;
import com.sh.movie.web.dto.BoardDto;
import com.sh.movie.web.dto.BoardResponseDto;
import com.sh.movie.web.dto.BoardUpdateRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor
@RestController
public class BoardController {
private BoardService boardService;
@PostMapping("/boards")
public Long save(@RequestBody BoardDto boardDto){
return boardService.save(boardDto);
}
}
Service
package com.sh.movie.service.board;
import com.sh.movie.domain.board.Board;
import com.sh.movie.domain.board.BoardRepository;
import com.sh.movie.web.dto.BoardDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@RequiredArgsConstructor
@Service
public class BoardService {
private BoardRepository boardRepository;
@Transactional
public Long save(BoardDto boardDto){
return boardRepository.save(boardDto.toEntity()).getId();
}
}
NullPointerException
에러가 난 이유는@RequiredArgsConstructor
사용시 final
을 사용해야 했기 때문이다.
Spring MVC프로젝트를 진행 시 Controller와 Service에서 @Autowired를 사용했는데 Spring Boot 프로젝트 진행 시 @Autowired가 없어 어색했다.
Bean을 주입하는 방식은 다음과 같다.
@Autowired, setter, 생성자
이 중 가장 권장하는 방식은 생성자로 주입받는 방식
이다. 생성자로 Bean 객체
를 받도록 하면 @Autowired와 동일한 효과를 볼 수 있다.
즉, @RequiredArgsConstructor
가 생성자를 대신 생성해준다.
@RequiredArgsConstructor : final이 선언된 모든 필드를 인자값으로 하는 생성자를 lombok의 어노테이션
생성자를 직접 안쓰고 lombok 어노테이션을 쓰는 이유는 해당 클래스의 의존성 관계가 변경될 때마다 생성자 코드를 계속해서 수정하는 번거로움을 해결하기 위함이다.
위에 코드를 다음과 같이 수정해야한다.
Controller
@RequiredArgsConstructor
@RestController
public class BoardController {
private final BoardService boardService;
@PostMapping("/boards")
public Long save(@RequestBody BoardDto boardDto){
return boardService.save(boardDto);
}
}
Service
@RequiredArgsConstructor
@Service
public class BoardService {
private final BoardRepository boardRepository;
@Transactional
public Long save(BoardDto boardDto){
return boardRepository.save(boardDto.toEntity()).getId();
}
}