Spring 기본

ㅎㅎ·2023년 8월 25일
0

Spring은 느슨한 결합과 인터페이스를 활용..

필요한 객체를 생성하고, 이 객체가 수정되거나 혹은 다른 형태의 객체로 변경됐을 때, 생성-할당 코드를 모두 수정하는 것이 아니라 Spring이 자동으로 변경된 코드를 주입해서 동작하게 만들어 준다. 이렇게 자동으로 주입하게 만들어 주는 것에 대한 내용은 XML 설정파일을 이용하거나 혹은 Annotaion을 이용한다.


DI

  • 일체형으로 객체 생성

    • class 내부에 필요한 객체들을 생성 및 할당하는 작업이 모두 정의되어 있어, 개발자가 따로 이 작업을 할 필요 없이 해당 class만 생성하면 됨, 즉 클래스내 필요한 필드들이 모두 객체를 만들 때 함께 초기화되어 있음
  • 주입하여 객체 생성

    • class 내부에 필요한 다른 객체들을 개발자가 직접 생성하여 생성자 주입 방식 혹은 setter 주입으로 class를 생성함, 즉 객체를 만들면서 필요한 필드들을 개발자가 직접 커스터마이징 함
  • 일체형 방식은 자율성이 떨어지지만 편리, 주입형은 자율성이 높아 원하는 대로 부품을 주입 가능

  • 스프링은 위 두 개의 장점을 결합한 느낌, 주입하여 객체를 생성하는 방식으로 필요한 필드들을 커스터마이징 하되, 이 작업을 설정을 읽어서 자동으로 해주는 것이 Spring, 이를 Dependency Injection이라 일컬음


IoC 컨테이너

주문서의 내용을 기입해 놓은 곳
주문서의 내용 대로 제품을 만들어 준다.
본래 개발자가 객체를 일체형으로 생성하면
클래스 A를 정의하고, A내부에 필요한 B, C 등의 부품을 생성하는 코드 또한 이 클래스 A에 들어 있어서, A가 만들어지고, B,C가 만들어지는 형태가 된다.
하지만 Spring은 IoC 컨테이너에서 B,C를 만들어서 최종적으로 A가 만들어질 때 여기에 넣어주는, 역순으로 동작한다.
이를 Inversion of Control이라는 말로 표현


XML을 이용한 DI

  • XML 파일
    • setter 주입(클래스 내 setter 메소드 정의 필요)
    • 생성자 주입(클래스 내 형식에 맞는 생성자 정의 필요)
  • bean 태그를 이용해 사용할 객체의 변수명, class를 지정(동일 클래스명 구분 위해 package까지 입력)
  • property 태그를 이용하여 setter 방식 주입, name에는 set 메소드의 클래스 부분 변수명의 두문자를 소문자로 하여 지시, 값타입이면 value에, 참조타입이면 ref에 기입할 bean을 지정(여기서는 위에서 만든 NewLecExam의 id 지정)

ApplicationConext

  • 지시서에 지시한 대로 객체를 주입하는 역할을 하는 클래스
  • XML DI의 경우 xml파일을 인자로 넘겨 생성하면 IoC container 생성되어 꺼내 쓸 수 있는 상태가 됨.

  • 위 xml 지시서대로 console 객체를 주입해줌. 다른 console 객체를 이용하고 싶다면 xml 설정 내에서 bean에 다른 console class를 지정해주면 됨.
  • ExamConsole이라는 Interface는 동일하므로 이 인터페이스를 구현한 어떤 클래스든 인자로 주입 가능

Annotaion을 이용한 DI

  • xml 파일에서 annotation이 있는지 확인하라는 지시를 위해 context tag 추가
  • setter 태그에 해당하는 property를 xml파일에서 지우고, 클래스 내 setter method에 @Autowired 추가
  • xml에서 bean을 생성하면서 해당 클래스에 annotaion이 있는지 확인 후에, 있으면 필요한 부품을 다시 xml에서 클래스명으로 찾아서 주입, 만약 동일한 클래스의 bean이 xml에 여러개 있다면? bean의 id를 주입할 객체의 변수명과 일치시켜야 함
  • bean의 id명을 식별시켜주기 위해 @Qualifier를 이용 가능
  • 지금까지는 property를 주입하는 xml 방식을 annotation으로 바꿈
  • 그럼 bean 자체를 생성하는(클래스를 생성하는) xml상의 코드를 없애고 annotaion으로 바꾸려면? 해당 class에 @Component annotaion을 사용, xml내 코드 삭제, Spring이 해당 클래스를 읽어들이라고 지시하는 <conext:component-scan ...> 코드를 xml 내에 추가, component 스캔만 하면 그 안쪽의 @Autowired 어노테이션도 읽어들이므로 <conext:annotaion ...> 코드도 제거
  • 주입하려는 객체의 기본값을 설정하는 것은 @Value annotaion 이용

  • 이렇게 하면 현재 흔하게 사용하는 Annotaion 방식의 Spring 코드 작성이 가능!, Spring 배우면서 뭔가 혼란이 왔던 것들이 정리가 된다.

@Component와 Controller, Repository, Service

  • MVC 패턴에서 각 기능을 의미론적으로 구분해주기 위해서 Controller, Repository, Service Annotaion을 이용함.

  • 그런데 Spring이 항상 xml 파일의 설정 정보를 이용해서 어노테이션이 달린 클래스들을 스캔하면서 만들어줘야 하나?

  • 또한 Java Library가 제공하는 클래스 등, 우리가 직접 Annotaion을 입력해줄 수 없는 클래스들은 어떻게 주입해줄 수 있나?

  • Java Configuration으로 바꾸고 xml을 없앨 수 있다.


Java Configuration

  • xml에서 어노테이션 방식을 사용하고, bean을 만들라고 지시하던 내용들을 Java Class로 이관하여 관리하는 방식
  • ApplicationConfig 등의 이름으로 class를 생성하고 설정, @Configuration과 @ComponentScan 이용
  • 이렇게 작성하면 뭔가 우리가 다시 직접 객체를 생성하는 느낌 아닌가? 할 수 있지만 exam() 메소드는 함수라기 보다는 IoC container에 부품을 넣어놓으라는 의미의 지시서라고 볼 수 있다. 이렇게 부품을 만들어 놓고 계속 꺼내쓰면 된다. AnnotaionConfig 객체를 생성해서 사용한다.


출처: Youtube, 뉴렉처채널, 스프링 프레임워크 강의

Spring MVC 구성

  • 본격적으로 Spring으로 application을 구축할 때는 데이터베이스 연결 관련 bean, Mybatis mapper와 관련한 bean 등을 자동 주입해주기 위해 Annotaion을 사용한다.
  • root-context.xml과 같이 bean을 관리하는 xml 설정 파일을 만들기도 하고, config 파일을 만들기도 한다.
  • servelt.conext.xml에는 서블릿 컨텍스트와 관련된 설정을 한다. 다음과 같은 것들이 이 파일에서 설정될 수 있다.
  • Controller에 있는 @Requestparam, @GetMapping과 같은 Annotaion은 bean을 주입하기 위한 어노테이션은 아니고, clinet의 요청을 분기시켜주기 위해서 사용하는 지시자 정도로 이해하면 될 거 같다.
profile
Hello World

0개의 댓글