4-4. MVC 시대 (실습 6, 7)

박은서's avatar
Jan 29, 2026
4-4. MVC 시대 (실습 6, 7)

실습 6. DispatcherServlet

우리가 만들 일 없음! Spring에서 하는 순간 자동으로 동작함

1) DispatcherServlet

package ex04; import ex04.anno.RequestMapping; import ex04.anno.RestController; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.List; public class DispatcherServlet { // IoC컨테이너 = 제어의 역전 public List<Object> iocContainer = new ArrayList<>(); // 1. 컴퍼넌트 스캔해서 ioc 컨테이너에 객체 추가 // -> 컴퍼넌트 스캔 : 패키지 스캔해서 클래스 찾아서 동적으로 new하는 것 public void componentScan(String folder) throws Exception { // 2. 패키지스캔 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); URL packageUrl = classLoader.getResource(folder); File ex04Folder = new File(packageUrl.toURI()); File[] files = ex04Folder.listFiles(); // anno, App, BoardController, UserController // 3. 찾은 것들을 new해서 컬렉션에 담아두기 for (File f : files){ //System.out.println(f.getName()); if(f.getName().endsWith(".class")){ String className = folder+"."+f.getName().replace(".class", ""); // ex04.BoardController, ex04.UserController // ex04.BoardController, ex04.UserController, ex04.App Class cls = Class.forName(className); // JVM 문자열로 클래스 로딩 //System.out.println(cls); if(cls.isAnnotationPresent(RestController.class)){ System.out.println(cls); Object instance = cls.newInstance(); iocContainer.add(instance); } } } } // 2. 컴퍼넌트 스캔 대상에서 메서드 찾기 // -> 주소를 다 뒤져서 해당하는 메서드 찾기 public void findUri(String value){ for(Object instance : iocContainer){ Method[] methods = instance.getClass().getDeclaredMethods(); for (Method method : methods) { RequestMapping rm = method.getDeclaredAnnotation(RequestMapping.class); if(rm.value().equals(value)){ try { method.invoke(instance); break; } catch (Exception e) { e.printStackTrace(); } } } } } }

2) UserController

package ex04; import ex04.anno.RequestMapping; import ex04.anno.RestController; @RestController public class UserController { @RequestMapping("/login") public void login(){ System.out.println("login 호출됨"); } }

3) BoardController

package ex04; import ex04.anno.RequestMapping; import ex04.anno.RestController; @RestController public class BoardController { @RequestMapping("/insert") public void insert(){ System.out.println("insert 호출됨"); } @RequestMapping("/delete") public void delete(){ System.out.println("delete 호출됨"); } @RequestMapping("/update") public void update(){ System.out.println("update 호출됨"); } @RequestMapping("/select") public String select1(){ System.out.println("select 호출됨"); return "apple"; } }

4) App (main)

package ex04; public class App { public static void main(String[] args) throws Exception { // 1. 키보드 입력 자리 String uri = "/login"; // 2. 컴퍼넌트 스캔 DispatcherServlet ds = new DispatcherServlet(); ds.componentScan("ex04"); // 3. 메서드 호출 ds.findUri(uri); } }

4-1) 결과

notion image

5) ReplyController 클래스, write 메서드 추가

package ex04; import ex04.anno.RequestMapping; import ex04.anno.RestController; @RestController public class ReplyController { @RequestMapping("/reply/write") public void write() { System.out.println("댓글 쓰기 완료"); } }

6) App (main)에서 write 호출

package ex04; public class App { public static void main(String[] args) throws Exception { // 1. 키보드 입력 자리 String uri = "/reply/write"; // 2. 컴퍼넌트 스캔 DispatcherServlet ds = new DispatcherServlet(); ds.componentScan("ex04"); // 3. 메서드 호출 ds.findUri(uri); } }

6-1) 결과

notion image
➡️ 이 코드는 지정한 폴더에서만 클래스를 찾지만, spring은 지정 폴더 이하에 있는 모든 폴더의 클래스를 찾을 수 있음

실습 7. Spring

1) UserController

package com.example.v4; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @GetMapping("/join") public String join() { return "join 완료"; } }

2) V4Application (main)

package com.example.v4; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class V4Application { public static void main(String[] args) { SpringApplication.run(V4Application.class, args); } }

2-1) 결과

notion image
Share article