복붙노트

[SPRING] Spring MVC, 컨트롤러 내부에서 다른 컨트롤러 호출하기

SPRING

Spring MVC, 컨트롤러 내부에서 다른 컨트롤러 호출하기

하나의 컨트롤러를 사용하여 두 번째 컨트롤러에서 메서드를 호출하는 기존 코드를 작업하고 있습니다. 지금까지 본 두 가지 구현이 있습니다.

첫 번째 구현

return new Controller().method(request, response);

2 차 구현

@Autowired
private Controller controller.

return this.controller.method(request, response);

어떤 것이 올바른 구현인지, 둘 중 어느 경우에 문제가있는 것인가?

해결법

  1. ==============================

    1.다른 컨트롤러에서 메서드를 호출해야한다는 단순한 사실은 가능한 디자인 결함을 나타냅니다.

    다른 컨트롤러에서 메서드를 호출해야한다는 단순한 사실은 가능한 디자인 결함을 나타냅니다.

    옵션 1을 사용하면 Spring DI 컨테이너가 가져 오는 모든 것을 잃게됩니다. 즉, 다른 컨트롤러는 Spring에 의해 인스턴스화 될 수 있습니다. @Autowired / @Value 종속성이 없기 때문에이 인스턴스에서 작동하더라도 직접 인스턴스화하면 다른 리소스에 대한 종속성을 추가하면 중단됩니다. 게다가, 당신은 이미 당신을 위해 만들어진 컨테이너를 가지고 있는데 왜 다른 사람들을 창조할까요?

  2. ==============================

    2.컨트롤러간에 전화를 걸면 결함이 있거나 리다이렉션을하고 싶습니다. 이것은 완전히 유효합니다. 리디렉션이 해당되는 경우 컨트롤러 메서드에서 다음과 같이 반환하십시오.

    컨트롤러간에 전화를 걸면 결함이 있거나 리다이렉션을하고 싶습니다. 이것은 완전히 유효합니다. 리디렉션이 해당되는 경우 컨트롤러 메서드에서 다음과 같이 반환하십시오.

    return "redirect:/yourDestinationControllerPath";
    
  3. ==============================

    3.코드를 리팩토링해야하는 것 같습니다. 두 컨트롤러 간의 공통점을 별도의 클래스로 추출한 다음 두 컨트롤러에서 호출합니다.

    코드를 리팩토링해야하는 것 같습니다. 두 컨트롤러 간의 공통점을 별도의 클래스로 추출한 다음 두 컨트롤러에서 호출합니다.

  4. ==============================

    4.너는 완전히 잘못하고있다. 무엇이 잘못되었는지에 대한 Costi Ciudatu의 대답을보십시오.

    너는 완전히 잘못하고있다. 무엇이 잘못되었는지에 대한 Costi Ciudatu의 대답을보십시오.

    솔루션 : 컨트롤러와 관련된 서비스 계층 및 DAO 계층 클래스를 갖도록 조언합니다. AccountController가 있다고 가정하면 AccountService 클래스 (interface + implementation) 및 AccountDao (interface + implementation)를 갖게됩니다.

    이제 사용자가 로그인하면 (LoginController) Account가 필요하므로 LoginController에서 AccountService를 자동으로 호출하므로 AccountService 메소드에서 사용자의 계정 세부 정보를 가져옵니다.

  5. ==============================

    5.첫 번째 작업은 더 많은 작업이 필요합니다. 첫째, 항상 매번 Controller 클래스의 새 인스턴스를 만들고 싶습니까?

    첫 번째 작업은 더 많은 작업이 필요합니다. 첫째, 항상 매번 Controller 클래스의 새 인스턴스를 만들고 싶습니까?

    두 번째는 종속성 주입 또는 제어의 반전으로 알려진 패턴을 사용합니다. Spring이 당신을 위해 Bean의 범위를 관리하게한다. 기본적으로 컨트롤러 클래스의 인스턴스를 하나만 생성하지만 어떤 이유로 (어떤 이유로)이 동작이 많은 인스턴스를 생성하는 것을 간단하게하지 않으려면 ...

  6. ==============================

    6.두 번째 것은 올 때마다 인스턴스를 만들지 않기 때문에 정확합니다. @Autowired 주석은 필요할 때 객체에 코드를 삽입합니다.

    두 번째 것은 올 때마다 인스턴스를 만들지 않기 때문에 정확합니다. @Autowired 주석은 필요할 때 객체에 코드를 삽입합니다.

    이것을 확인하십시오. http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html

    그러나 @Controller 어노테이션이 있으며, 컨트롤러에 사용할 것이고 당신은 autowire하고자하는 bean을 위해 @Service를 사용해야한다.

  7. from https://stackoverflow.com/questions/12848386/spring-mvc-calling-another-controller-from-inside-a-controller by cc-by-sa and MIT license