Spring Bean 개념과 의존성 주입 - Spring Service 계층, Spring Bean, 의존성 주입
728x90

안녕하세요!

항상 나아가는 개발자 pink_salt 입니다!

코드프레소 Java 웹 개발 체험단 활동을 하고 있습니다.

Spring Boot 컨트롤러와 REST API에 대해 공부해보았는데요!

이제는 Spring Bean의 개념과 의존성 주입에 대해서 공부해보려고 합니다.

'Spring Boot 웹 개발 입문'강의를 듣고 공부한 내용을 정리하여 포스팅을 진행하였습니다.


계층형 아키텍처 패턴을 다시 보면은

이렇습니다. 저번에는 Presentation Layer를 봤었는데요.

이번엔 Application Layer의 @Service를 공부해보겠습니다.

Spring Service

  • 시스템의 핵심 비즈니스 로직을 구현하는 계층입니다.
  • SNS 시스템의 경우
    • 이미지, 글 등의 콘텐츠 정보를 저장합니다.
    • 사용자가 선호할만한 콘텐츠를 추천합니다.
    • 회원가입, 로그인, 회원 탈퇴 등의 회원 관련 처리를 합니다.
  • view의 종류와 database 종류에 영향을 받지 않는 독립적인 계층입니다.
    • 영향을 받지 않도록 설계해야 합니다.

Service의 구현

  • 클래스에 @Service Annotation을 사용합니다.
  • 파라미터로 전달된 데이터들의 검증 작업을 수행합니다.
  • Repository 계층을 활용하여 database에 접근합니다.
    • Service 계층의 단일 메서드가 transaction의 단위가 됩니다.
  • 애플리케이션의 세부 영역(User, Post,...) 별로 클래스를 생성하여 구현합니다.
  • 인터페이스의 사용이 권장되나, 다형성을 활용한 기능 확장의 요구사항이 없는 경우 사용하지 않기도 합니다.

Spring Bean과 의존성 주입

 

객체의 활용과 의존성

- 의존성(Dependency)

하나의 모듈(클래스, 패키지 등)이 다른 모듈을 사용하는 것 -> 의존성이 있다라고 합니다.

  • 일반적으로 다른 객체의 기능을 사용하기 위해서는 멤버 변수에 new로 객체를 생성하여 참조합니다.
  • 생성한 객체의 메소드를 호출합니다.
  • 어떤 객체를 생성하여 사용할 것인지 코드 상에 명시합니다. (complile-time 의존성이 생성됨)

 

 

의존성 주입(DI, Dependency Injection)

객체 생성을 외부에서 대신 수행합니다.

활용할 객체에 대한 의존성(참조)설정을 외부에서 대신 해줍니다.

활용할 클래스(인터페이스)타입의 멤버 변수만 선언한 후 생성자를 구현합니다.

-> new 키워드로 객체 생성을 직접하지 않습니다.

특정 클래스가 사용하는 다른 객체 즉 멤버 변수가 참조해야하는 구체적인 객체를 해당 클래스에서 코드상으로 명시하는 것이 아닌 run-time에서 외부에서 생성해서 생성자로 넣어주는 것입니다.

어떤 객체를 참조할 것인지 외부에서 생성하는 것을 말합니다.

외부에서 객체는 누가 생성할까?

  • Spring Framework가 객체의 생성과 관리 역할을 수행합니다.
  • Spring Framework가 소스코드를 스캔하여
    • @RestController가 있다면 객체를 생성하도록 시도하고
    • 생성자를 보고 Service 클래스가 필요한 것을 파악한 후 Service 클래스를 찾습니다.
    • Service 클래스에 가니까 @Service Annotation을 발견하게 되고 이 것도 객체를 생성해서 관리하고자 합니다

Spring Framework가 객체의 생성과 관리 역할을 수행하는데 

  • Spring Framework가 특정 조건을 만나면 객체를 생성합니다.
    • 클래스 상단의 Annotation(@Controller, @RestController, @Service 등)
    • @Configuration 클래스의 @Bean Annotation
    • XML 설정
  • 객체로 생성할 대상을 검색하는 과정 -> Component Scan이라고 합니다.
  • 조건에 따라 객체들의 의존성을 관리합니다.

 

Spring IoC 컨테이너와 Spring Bean

Spring IoC 컨테이너

  • Spring Framework에서 객체의 생성과 관리의 역할을 하는 컴포넌트

Spring Bean

  • Spring IoC 컨테이너에 의해서 생성되어 관리되는 Java 객체

 

의존성 주입을 위한 단계

1. Spring에 의해 객체가 생성 되게끔 Annotation을 설정합니다.

2. 사용할 객체를 멤버 변수와 생성자에 추가합니다.

3. 객체를 사용한다.

new를 사용하지 않고 객체를 사용할 수 있다는 것을 기억해주세요!

 


객체를 생성하는 또 다른 방법

@Configuration과 @Bean Annotation

  • Spring Framework에서는 Java 클래스에 @Configuration Annotation을 사용 가능합니다.
    • 이 Annotation이 붙은 해당 클래스는 Spring Framework에 의해 설정 정보를 위한 클래스로 활용됩니다.
    • @Configuration 클래스 내에 @Bean을 사용한 메소드로 Bean을 생성할 수 있습니다.
      • Bean으로 등록할 객체를 생성 후 Return합니다.

 

의존성 주입

POINT!

의존성은 하나의 모듈(클래스, 패키지 등)이 다른 모듈을 사용할 때 만들어지며, new 키워드로 객체를 직접 생성합니다.
Spring Framework는 객체를 생성하고 객체 간의 의존성을 연결하는 역할을 대신 수행해 줍니다. 이것을 의존성 주입이라고 합니다.
Spring IoC 컨테이너는 객체를 생성, 관리하는 역할을 하는 컴포넌트 입니다.
Spring Bean은 Spring에 의해서 생송되고 관리되는 객체입니다.

이 코드를 application properties에 작성하면 log를 확인할 수 있습니다.(실습 때 참고)

 

다음 게시물에서는 Spring Boot와 MyBatis 연동에 대해서 배워보겠습니다.

728x90
반응형