실습 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) 결과

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) 결과

➡️ 이 코드는 지정한 폴더에서만 클래스를 찾지만, 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) 결과

Share article