본문 바로가기
웹개발/Springboot

IoC 컨테이너

by HoPpangg 2021. 6. 24.
SMALL

스프링프레임 워크는 정해직 규칙을 배우는 것 입니다.

그 중 하나인 IoC 컨테이너에 대해 알아보겠습니다.

IoC 컨테이너느 객체들을 관리하는 것입니다.

예를 들어 STS툴에 A, B, C 이름의 클래스가 3개 있을 때 spring에서 실행시키면 클래스 3개를 컨퍼런트 스캔을 하게 됩니다. 

스캔을 하면서 클래스 위에 붙은 annotation이 IoC컨트롤러의 기준에 부합하는 annotation이라면 해당 클래스를 객체화(new)하여 IoC컨트롤러에 넣습니다.

IoC 컨트롤러에 넣음으로써 singleton이 가능해지고 제어를 쉽게 할 수 있습니다.

예를 들어 프로젝트가 커져 객체를 생성했는지 안했는지 모를 때 같은 객체를 또 생성하는 실수를 할 수 있는데, IoC 컨트롤러는 그런 실수를 방지할 수 있게 해줍니다.

필요할 때 IoC컨트롤러에 접근하여 꺼내쓰기(DI : Dependency Injection)만 하면 됩니다.

IoC 컨트롤러에 들어있는 컨트롤러는 new객체 선언을 하면서 쓰지 않아도 됩니다.

서버에서 요청이 들어오면 servletdispatcher가 /(슬래쉬)이후의 주소를 낚아채(필터) IoC 컨테이너 속에서 낚아챈 주소에 해당하는 것을 꺼내어 동작합니다.

jsp에서는 factory 패턴(위 행위)을 직접 구현해야 합니다.

 

정리를 하자면,

서버 실행 -> 컨퍼런스 스캔 -> IoC 컨테이너에 등록(@RestController, @Controller....) -> 대기 -> request 요청 -> front에서 dispatcher가 주소를 낚아챔 -> 낚아챈 주소를 파싱해서 IoC 컨트롤러에서 찾아냄 -> 함수 실행 직전 JSON으로 들어온 데이터를 java object로 바꿔줌 -> 함수 실행 -> 함수 실행 직후 java object를 JSON으로 바꿔줌 (응답은 무조건 JSON or String)

 

직접 예시>

서버가 실행되면 컴포넌트 스캔이 발생합니다.

컴포넌트 스캔을 하는 이유는 IoC 컨테이너에 객체를 등록하기 위해서 합니다.

컴포넌트 스캔을 하는 기준은 src/main/java 속에 있는 자바 파일이 들어있는 패키지의 내부만 스캔합니다.

예시를 보면 ExampleApplication.java / TestController.java / User.java를 컴포넌트 스캔을 하게 됩니다.

annotation이 붙어있긴 하지만 Controller에 해당하는 annotation이 아니기때문에 IoC 컨테이너에 들어가지 않습니다.

annotationdl @RestController 입니다. IoC 컨테이너에 들어갑니다.

annotation이 붙어있지 않습니다. IoC 컨테이너에 들어가지 않습니다.

 

그럼 현재 IoC 컨테이너에는 TestController 클래스만 들어있게 됩니다.

 

post방식으로 http://localhost:8080/ 으로 요청을 한다면

request header : x-www-for-urlencoded

body : username=hong&password=1234

이러한 데이터가 오는데 이때 주소를 dispatcher가 가로채 IoC를 스캔합니다 (@PostMapping 주소가 "/" 인것을 찾음)

-> @PostMapping("/")을 호출하면서 매개변수(User data)에 파싱된 데이터를 넣어줌(함수가 실행되면서 매개변수에 request 받은 값들을 넣어줌 (post(new User(hong, 1234)) 형태로 넣어줌)

*GET방식의 요청일 때 데이터를 보내면 오류남(GET방식에는 body 데이터가 없기 때문)

728x90
LIST

'웹개발 > Springboot' 카테고리의 다른 글

객체지향 모델링에서 접근제어자 private을 쓰는 이유  (0) 2021.06.24
HTTP 메서드 - PUT  (0) 2021.06.24
HTTP 메서드 - POST  (0) 2021.06.24

댓글