***************************
APPLICATION FAILED TO START
*************************** // 극혐..
MVC 패턴을 사용해 Controller 에서 작업을 하던 중,
다른 Entity 에 관련된 Controller 작업을 하려고
새로운 Controller 를 만들었더니 서버가 실행이 되지 않고 아래와 같은 메시지가 출력되었다.
@Controller
@RequestMapping("/notice")
@RequiredArgsConstructor
public class CategoryController {
private final ProfileService profileService;
private final CategoryController categoryController;
@GetMapping("notFound/{name}")
public String failLogin(@PathVariable String name, Model model) {
model.addAttribute("name", name);
return "notice/notFound";
}
}
Description:
The dependencies of some of the beans in the application context form a cycle:
┌──->──┐
| categoryController defined in file [/Users/.../CategoryController.class]
└──<-──┘
Action:
Relying upon circular references is discouraged and they are prohibited by default.
Update your application to remove the dependency cycle between beans. As a last resort,
it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
Process finished with exit code 1
메시지를 보면 내가 순환 참조를 했다고 하지말라고 하는데 딱히 그런적이 없어서 어느 부분을 고처주어야 될지 모르겠다.
콘솔 메시지에서는 최후의 방법으로 application.yml 에서 환경설정으로 순환참조를 막으라고 하는데,
원인이 무엇인지도 파악하지 못한상태에서 이렇게 처리하는 건 너무 찜찜해 어떤 녀석이 범인인지 색출해 내기로 마음먹었다.
콘솔에서 CategoryController 에서 발생했다고 나와서 컴포넌트가 되지 않게 Controller 어노테이션을 주석처리하니 서버가 정상적으로 작동 되었다.
이미 알고있긴 했지만 확실히 범인은 이 안에 있다는 뜻이다..
혹시 매서드가 문제인가 싶어 메서드를 주석처리 해보고, Controller 를 제외한 다른 어노테이션도 모두 주석을 해봐도 문제가 발생했다.
그렇게 이것 저것 주석처리 해보다 DI 에서 문제가 있다는 사실을 알게 되었다.
잘 보니 Controller 클레스에서 DI 를 같은 Controller 로 설정했다는 사실을 발견했다..
인텔리제이 자동완성기능에 의존해 무지성 엔터를 친 결과이다..
Service 를 의존하도록 코드를 변경시켜주니 정상적으로 잘 작동된다.
@Controller
@RequestMapping("/notice")
@RequiredArgsConstructor
public class CategoryController {
private final ProfileService profileService;
private final CategoryService service;
@GetMapping("notFound/{name}")
public String failLogin(@PathVariable String name, Model model) {
model.addAttribute("name", name);
return "notice/notFound";
}
}
항상 느끼는 거지만 대부분의 예외발생이 이런 부주의 때문에 발생하는 것 같다..
원인을 찾으면 아.. 소리가 절로나온다..
Description:
The dependencies of some of the beans in the application context form a cycle:
boardController defined in file [/Users/.../BoardController.class]
┌─────┐
| boardService defined in file [/Users/.../BoardService.class]
↑ ↓
| categoryService defined in file [/Users/.../CategoryService.class]
└─────┘
Action:
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
@Controller
@RequestMapping("/board")
@RequiredArgsConstructor
@Slf4j
public class BoardController {
private final BoardService boardService;
private final MemberService memberService;
//-- 게시판 전체 목록 --//
@GetMapping("/list")
public String showList(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "-1") Long id,
Principal principal,
Model model
) {
Page<Board> paging = boardService.getBoard(page, id);
model.addAttribute("paging", paging);
return "/board/boardList";
}
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class BoardService {
private final BoardRepository boardRepository;
private final MemberService memberService;
private final CategoryService categoryService;
//-- find all + paging + category dividing --//
public Page<Board> getBoard(int page, Long id) {
if (id == -1) {
return this.getBoardAll(page);
} else {
Category category = categoryService.getCategory(id);
return this.getBoard(page, category);
}
}
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class CategoryService {
private final CategoryRepository categoryRepository;
private final BoardService boardService;
//-- 게시판 전체 목록 --//
@GetMapping("/list")
public String showList(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "-1") Long id,
Principal principal,
Model model
) {
Page<Board> paging;
if (id == -1) {
paging = boardService.getBoardAll(page);
} else {
Category category = categoryService.getCategory(id);
paging = boardService.getBoard(page, category);
model.addAttribute("category", category);
}
model.addAttribute("paging", paging);
return "/board/boardList";
}