ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 스프링 개념 잡기
    WEB/Spring 2020. 9. 13. 23:02

    1. 스프링은 프레임워크이다.

    프레임워크란 틀 안에서 동작하는 것을 의미

    "신입 개발자들아 요 틀 안에서만 작업하면 나처럼 고수가 될 수 있어!"

     

    2. 스프링은 오픈소스다.

    오픈소스란 소스코드가 공개 되어있다는 것을 의미 => 내부를 뜯어 고칠 수 있음!

     

    3. 스프링은 IoC 컨테이너를 가진다.

    IoC(Inversion of Controller), '제어의 역전'이란 주도권이 스프링에 있음을 의미

     

     

    위와 같이 make() 메소드와 use() 메소드의 의자는 다른 메모리 공간에서 실체화 된다.

    의자를 공유하고 싶으면 make() 메소드에서 실체화 된 의자를 use() 메소드로 어떠한 로직을 통해 넘겨줘야한다.

    그러나 이러한 로직을 짜기 굉장히 힘듬 그래서 스프링이 IoC를 통해 이러한 작업을 도와줌

     

    스프링이 우리가 가지고 있는 의자, 붕어빵, 사자, 기린과 같은 오브젝트들을 스프링이 스캔한다.

    스캔을 통해 읽은 오브젝트들을 전부 heap 메모리 영역에 할당한다. (사용자가 아닌 스프링이 오브젝트를 생성한다.)

    오브젝트의 관리가 사용자가 아닌 스프링에게 넘어감 (제어권이 넘어감)

    스프링이 할당한 메모리 주소를 우리가 어떻게 알 수 있을까? => 나중에 알아보자

     

    4. 스프링은 DI를 지원한다.

    DI(Dependency Injection)란 스프링와 관리하는 오브젝트를 내가 원하는 모든 클래스의 메소드에서 가져와 사용할 수 있

     

    각각의 의자는 공유된 의자임 (싱글톤으로 관리됨)

    의자를 스캔하면 딱 한 번만 의자가 힙 메모리에 할당되고 한번 할당된 의자를 공유해서 사용할 수 있음

     

    스프링은 IoC와 DI를 잘해야한다!

     

    5. 스프링은 엄청나게 많은 필터를 가지고 있다.

    필터는 문지기의 역할을 한다. 

    스프링 자체에서 제공하는 필터 그대로 사용할 수 있고, 사용하지 않는 필터도 사용하는 걸로 변경할 수 있다.

    그리고 직접 필터를 생성하여 사용할 수도 있다.

    톰캣의 필터는 똑같이 필터라고 불리고 web.xml이 이러한 기능을 한다.

    스프링 컨테이너의 필터는 인터셉터라고 불리고 AOP라는 개념을 알아야한다. => 나중에 알아보자

     

    6. 스프링은 엄청나게 많은 어노테이션을 가지고 있다. (리플렉션, 컴파일 체킹)

    주석은 컴파일러가 무시한다. 

    그러나 어노테이션은 컴파일러가 뭔가를 체킹할 수 있게 힌트를 준다. => 무시하지 않는다!

    Dog 클래스 Animal 클래스를 상속받고 두 클래스에 전부 run() 이라는 메소드가 있다고 가정해보자

    Dog 클래스에서 run()을 재정의 할 수 있는데, 이때 위에 @Override라는 어노테이션을 명시해주면, 자바가 실행되어 컴파일할 때 어노테이션을 보고 부모 클래스인 Animal 클래스에 run() 메소드를 가지고 있겠다고 예상하고 확인을 하러 간다. 그래서 부모 클래스에 run() 메소드가 있으면 정상적으로 컴파일 된다.

    그러나 Dog 클래스가 fly()라는 메소드를 가지고 있는데 위에 @Override 어노테이션을 명시해주면, 부모 클래스를 찾아가 fly() 메소드가 있는지 확인하고, 존재하지 않기 때문에 컴파일 에러가 발생한다.

     

    스프링에서는 어노테이션을 통해 주로 객체를 생성한다.

    어노테이션을 미리 만들어놓고 어노테이션이 어떤 역할을 하는지 미리 약속을 한다.

    @Component : 해당 어노테이션이 붙어 있는 클래스를 메모리에 로딩해!

    @Autowired : 해당 어노테이션이 붙어 있으면 메모리에 로딩된 객체를 해당 변수에 집어 넣어!

    라고 가정하면 다음 로직이 가능하다.

     

    A라는 클래스 위에 @Component 어노테이션을 명시하면 스프링에서 해당 클래스를 스캔해서 A라는 클래스를 힙 메모리에 로딩 (스프링이 객체를 생성 : IoC)

    A 오브젝트를 클래스 B에서 사용하고 싶다면 new를 통해 직접 사용자가 생성하는 것이 아니라(공유가 아닌 새로운 메모리 영역에 할당되기 때문에) A a; 이렇게 선언만 해놓고 @Autowired 어노테이션을 명시한다.

    스프링이 B 클래스를 스캔할 때, B 클래스 내부에 어떤 것이 있나 분석한다. (리플렉션)

    리플렉션을 통해 어떤 특정 클래스 내부에 있는 메소드, 필드, 어노테이션 등을 체킹 (런타임시 발생)

    또한 체킹으로 끝나지 않고 존재한다면, 무엇인가를 하라고 설정할 수 있음!

    리플렉션을 통해서 B클래스에 @Autowired가 있는것을 확인하면, 스프링에서 IoC를 통해 로딩한 수많은 오브젝트들 중에서 A와 동일한 타입의 오브젝트가 로딩되어있는지 확인하고, A가 만약 없다면 NULL값이 들어가고, A가 존재한다면 A가 들어간다. (스프링에서 관리하는 오브젝트를 필요에 따라 가져옴 : DI)

     

    즉, 스프링이 로딩한 오브젝트를 (Ioc)

    동일한 타입이 있나 확인하고 (리플렉션)

    동일한 타입이 존재한다면 이를 해당 변수에 주입한다. (DI)   

     

    7. 스프링은 MessageConverter를 가지고 있다. (기본 값은 현재 JSON 이다.)

     

     

    8. 스프링은 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.

    바이트 스트림으로 전송을 하면 자바에서 이 데이터를 InputStream으로 읽는다.

    바이트 단위로 전송을 하고 있으므로 자바가 읽는 데이터 단위가 바이트가 된다.

    바이트를 처리하려면 까다로움, 바이트는 문자가 아니므로 이를 char 형태로 변환해야함

    그래서 InputStreamReader 클래스를 이용하면 바이트를 문자로 바꿔준다. 

    이는 배열로 여러개의 문자를 받을 수 있는데 그러나 배열의 크기가 고정이라는 특징 때문에 단점이 많다.

     

    BufferedReader 클래스를 사용하면 위의 문제점을 해결할 수 있음

    BufferedWriter는 JSP에서 쓰이고 자바에서는 PrintWriter를 자주 사용함

    즉 BufferedReader와 BufferedWriter는 바이트 스트림을 통해 데이터를 전송할 때 전송 단위가 가변 길이의 문자열로 쓰게 해주는 클래스

     

    이를 직접 구현할 필요 없이 어노테이션을 명시하면 제공한다.

    @ResponseBody 어노테이션을 명시하면 BufferedWriter 작동

    @RequestBody 어노테이션을 명시하면 BufferedReader 작동

     

    9. 스프링은 계속 발전중이다.

     

     

    www.youtube.com/channel/UCVrhnbfe78ODeQglXtT1Elw
     

    데어 프로그래밍

    getinthere@naver.com

    www.youtube.com

     

    댓글

Designed by Tistory.