Skip to content

[Week5] 나호준 - 컨트롤러 확장#118

Open
Rojojun wants to merge 4 commits into
Loopers-play-dev-lab:rojojunfrom
Rojojun:rojojun/week5
Open

[Week5] 나호준 - 컨트롤러 확장#118
Rojojun wants to merge 4 commits into
Loopers-play-dev-lab:rojojunfrom
Rojojun:rojojun/week5

Conversation

@Rojojun

@Rojojun Rojojun commented May 20, 2026

Copy link
Copy Markdown
Collaborator

고민사항

아래와 같이 흐름을 정의하고 진행을 했는데, 아래의 방식의 흐름이 맞는지 정확하게 잘 모르겠습니다.

부트스트랩 단계

  flowchart TB
      subgraph App["App (com.diy.app)"]
          LC["LectureController<br/>@Controller"]
          LR["LectureRepository<br/>@Repository"]
          RM["메서드<br/>@RequestMapping"]
      end

      subgraph Framework["Framework (com.diy.framework)"]
          BS["BeanScanner<br/>(Reflections)"]
          AC["ApplicationContext<br/>beans: List&lt;Object&gt;"]
          RHI["RequestHandlerImpl<br/>handlers: Map&lt;RequestKey, HandleMethod&gt;"]
      end

      Main(["Main.main()"])

      Main -->|"1. initialize()"| AC
      AC -->|"2. scan"| BS
      BS -->|"@Controller, @Component,<br/>@Repository 클래스 수집"| AC
      LC -.->|어노테이션 감지| BS
      LR -.->|어노테이션 감지| BS

      Main -->|"3. registerRequestMapping()"| RHI
      RHI -->|"4. @RequestMapping 메서드 스캔"| BS
      RM -.->|어노테이션 감지| BS
      RHI -->|"5. 메서드의 declaringClass가<br/>Controller인지 검증"| AC
      RHI -->|"6. RequestKey → HandleMethod<br/>맵에 등록"| RHI

      classDef app fill:#e3f2fd,stroke:#1976d2
      classDef fw fill:#fff3e0,stroke:#f57c00
      class LC,LR,RM app
      class BS,AC,RHI fw
Loading

유저 요청 단계

  sequenceDiagram
      actor User as 유저 (브라우저)
      participant Tomcat as TomcatWebServer
      participant Dispatcher as DispatcherServlet<br/>(프레임워크)
      participant Handlers as handlers Map<br/>(RequestKey→Handler)
      participant Controller as LectureController<br/>(App)
      participant Resolver as ViewResolver
      participant View as View<br/>(JSP/Redirect)

      User->>Tomcat: GET /lectures
      Tomcat->>Dispatcher: service(req, resp)

      Note over Dispatcher: App이 전체 처리를<br/>프레임워크에 위임

      Dispatcher->>Dispatcher: new RequestKey(URI, Method)
      Dispatcher->>Handlers: get(requestKey)
      Handlers-->>Dispatcher: RequestHandler

      Dispatcher->>Controller: handler.handleRequest(req, resp)<br/>= method.invoke(bean, ...)
      Controller-->>Dispatcher: ModelAndView

      Dispatcher->>Resolver: resolveViewName(viewName)
      Resolver-->>Dispatcher: View

      Dispatcher->>View: render(model, req, resp)
      View->>Tomcat: HTML 응답 작성
      Tomcat-->>User: HTML 페이지 표시
Loading

이런 흐름이 맞다면, 컨트롤러는 결국 항상 ModelAndView를 반환하는게 옳은가 하는 고민도 생깁니다.

블로커

  1. 나만의 프레임워크라는 본질에 집중하기 위해서, 스프링의 동작방식보다는 나만의 동작방식을 정의하고 진행을 했습니다. 저번주차에 말씀해주신 사항들을 듣고 진행을 했는데, 결국 Main 에서 조립을 하려고 하다보니 프로덕트가 프레임워크를 알아야하는 문제가 생겨서 이 부분에 대한 해결책을 고민하고 있었습니다.
  2. 개인적인 궁금함인데요... @RequestMapping 에서 왜 RequestMethod는 어레이로 받나요?! 실제 스프링도 그렇던데, 명확한 이유를 문서로서 찾지 못해서 궁금합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant