APPLICATION FAILED TO START

알파로그·2023년 3월 18일
0

Error

목록 보기
23/37
***************************
APPLICATION FAILED TO START
***************************  // 극혐..
  1. 첫번째 상황
    • 실수로 자기 자신을 DI 한경우
  2. 두번째 상황
    • 두 Service 계층이 서로 DI 한경우

✏️ 첫번째 상황 : 발단

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 계층
@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 계층
@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);
        }
    }

✏️ 문제 원인

  • 지난번에도 이런 문제가 있었는데 실수로 자기 자신을 DI 해서 발생되었던 문제였다.
    • 두 객체의 DI 를 살펴봤는데 아무런 이상도 없었다.
    • 콘솔메시지를 보니 CategoryService 계층에도 문제가 있다고 해서 확인해봤는데 마찬가지로 DI 에 문제는 없었다.
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class CategoryService {

    private final CategoryRepository categoryRepository;
    private final BoardService boardService;

📍 두개의 객체가 서로를 DI 할경우

  • 서버 실행 자체가 안되기때문에 의심가는 부분을 하나씩 주석처리해가며 문제를 파악했다.
  • 원인은 Category Service 와 Board Service 가 서로를 DI 해서 발생한 문제인것 같다.
    • 주석처리를 하면서 원인을 파악했다.
    • 원인을 알고 콘솔메시지를 보니 이것이 원인이 확실한 것 같다.

✏️ 문제 해결

  • BoardController 계층에 business logic 이 나오는게 싫어서 Service 쪽으로 넘겨줬는데 이 방법으로는 순환참조 문제때문에 해결이 어려울것같아서 다시 Controller 계층으로 이동시켰다.
//-- 게시판 전체 목록 --//
@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";
}
profile
잘못된 내용 PR 환영

0개의 댓글