public class HellobootApplication {
public static void main(String[] args) {
//스프링 컨테이너 생성 : ApplicationContext
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.registerBean(HelloController.class); // 어떤 클래스를 이용하여 Bean Object를 만들어 줄 것인가를 지정
applicationContext.refresh(); // Container 초기화 -> Bean Object를 생성
//서블릿 컨테이너 생성
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
WebServer webServer = serverFactory.getWebServer(servletContext -> {
// HelloController helloController = new HelloController();
servletContext.addServlet("frontcontroller", new HttpServlet() { //어댑터 클래스
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //서블릿의 실제 기능 구현
//인증, 보안, 다국어 처리 등 공통 기능
if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())){
String name = req.getParameter("name");
//Binding: 웹 요청을 가지고 처리하는 로직 코드에서 사용할 수 있도록 새로운 타입으로 변환하는 것
HelloController helloController = applicationContext.getBean(HelloController.class);
String ret = helloController.hello(name);
// resp.setStatus(HttpStatus.OK.value()); //status(200)
resp.setContentType(MediaType.TEXT_PLAIN_VALUE); //"Content-Type", "text/plain"
resp.getWriter().println(ret) ;
} else{
resp.setStatus(HttpStatus.NOT_FOUND.value());
}
}
//서블릿 컨테이너에서 어떤 서블릿을 사용해야할 지 정하는 Mapping을 설정해야 함.
}).addMapping("/*"); //모든 요청을 해당 서블릿이 처리
});
webServer.start(); //Tomcat Start
}
}
위와 같이 작성했을 때, Front Container가 직접
new
키워드를 사용하여 Object를 만들어 쓰는것과 차이가 무엇일까? → Spring Container가 고정적으로 할 수 있는 일들을 이후에 적용 가능하도록 기본 구조를 짜놓는다는 것
SimpleHelloService
에 이름을 출력하는 간단한 로직을 가진 메서드 정의HelloController
에서 해당 기능을 사용할 수 있도록 구성public class SimpleHelloService {
String sayHello(String name) {
return "Hello " + name;
}
}
import java.util.Objects;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(String name){
// Object 생성
SimpleHelloService helloService = new SimpleHelloService();
// Null 여부 체크
// null -> exception
return helloService.sayHello(Objects.requireNonNull(name));
}
}