ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (9주차 60일) STS4 설정, 스프링 DI
    수업 내용 정리 2024. 7. 10. 21:38

    STS 설정

    target 폴더 파일 보기

    :  Window -> Show view -> navigation
    STS4: Window -> Show view -> navigator / project explorer

     

    root-context.xml

    스프링 3.0부터 p: 활용하여 속성을 통해 setter 사용할 있다.

    <bean id="hong" class="com.beyond.di.owner.Owner"
    p:name="홍길동" p:age="36" p:pet-ref="dog"/>

     

    lombok 설정

    1. cmd창에서 lombok 파일 열고 java -jar./lombok.jar 입력
    2. 혹은 맥 -> lombok.jar 열기
    3. STS 설치 경로 지정 후 설치
      터미널 -> cd /Applications/SpringToolSuite4.app/Contents/Eclipse/ -> ls -al 을 통해 폴더에 lombok.jar 확인
    4. MVNrepository에서 롬복 가장 최신 버전 의존성 추가(pom.xml)

    https://mvnrepository.com/artifact/org.projectlombok/lombok

     

     

    DI(Dependency Injection)

    • DI(Dependency Injection)란 하나의 객체가 사용하는(의존하는) 다른 객체를 외부에서 생성하고 주입받아 사용하는 것을 말한다.
    • 객체를 주입받는 방법으로는 메소드를 통한 의존성 주입 방법과 생성자를 통한 의존성 주입 방법이 있다.
    • 스프링에서 관리하는 객체를 빈(Bean)이라고 하고, 해당 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(Bean Factory)라고 한다.

    스프링 DI

    • 스프링에서는 컨테이너가 설정 정보를 읽어와서 자동으로 객체들의 의존 관계를 주입한다.
    • 스프링 컨테이너를 통해 의존성을 주입받게 되면 유지 보수가 편해지고 개발자가 작성해야 할 코드가 단순해지며 객체 간의 종속 관계(결합도)를 해소할 수 있다.

    스프링 DI 설정 방법

    XML 방식

    • 스프링 컨테이너 구동 시 생성해야 하는 객체(Bean)들과 의존 관계를 XML 파일로 작성하는 방식이다.

    Java 방식

    • 스프링 컨테이너 구동 시 생성해야 하는 객체(Bean)들과 의존 관계를 Java 파일로 작성하는 방식이다.
    • 스프링 컨테이너가 자바 파일을 설정 파일로 식별하기 위해서는 @Configuration 어노테이션을 클래스에 작성해야 한다.
    • 자바 파일에서 빈을 선언하기 위해서는 객체를 리턴하는 메소드를 만들고 @Bean 어노테이션을 메소드에 작성해야 한다.
      - 반환되는 객체는 ApplicationContext에서 보관된다.
      (어노테이션 설정을 통해 "hong" id 가지고 Bean으로 등록된다. *default id: 메소드명)

    Java 방식 어노테이션

    • @Configuration: 스프링 컨테이너가 자바 파일을 설정 파일로 식별하기 위해 클래스에 작성한다.
    • @Bean: 자바 파일에서 빈을 선언하기 위해서는 객체를 리턴하는 메소드를 생성하고, 메소드에 작성한다.
      * Setter 메소드를 통해 의존 관계가 있는 빈을 주입할 수 있다.
      * 생성자를 통해 의존 관계가 있는 빈을 주입할 수 있다.
    • @Import: 클래스에 작성하여 다른 Java 설정 파일을 가져올 수 있다.
    • @Autowired: 스프링 컨테이너에서 빈을 찾아 자동으로 의존성 주입을 할 수 있다. 필드, 메소드, 생성자에 적용할 수 있다.
      *예시) 스프링 컨테이너에서 Pet 타입의 
      pet이라는 객체가 빈으로 등록되어 있는지 찾는다. 해당 빈이 존재하면, owner 객체에 자동으로 의존성을 주입한다.
    • @Qualifier: 빈에서 특정 객체만 빈에 주입할  있도록 한다.
    • @Primary: 컨테이너에서 빈을 주입받으려고 여러 개의 빈이 탐색될 경우, 해당 어노테이션이 있는 메소드를 기본값으로 전달한다.
    • @Value: 빈이 아닌 값을 주입할 수 있다.
    • @Component: 클래스를 빈으로 선언할 수 있다. 이 때 ComponentScan이 동작할 수 있도록 설정 파일에 활성화해야 한다.
    • @ComponentScan의 베이스 패키지로 등록된 주소 하위를 스캔하면서 @Component 어노테이션이 존재하는 클래스를 모두 빈으로 선언한다. 주소 설정이 없는 경우, 해당 어노테이션이 존재하는 클래스를 베이스 패키지로 지정한다.
    // JUnit에서 스프링을 사용할 수 있도록 SpringExtension.class를 사용하여 확장한다.
    // @ContextConfiguration을 통해서 설정 파일을 읽고 애플리케이션 컨텍스트를 생성한다.
    @ExtendWith(SpringExtension.class)
    @ContextConfiguration(locations="classpath:spring/root-context.xml")
    @DisplayName("Owner 클래스 테스트")
    class OwnerTest {
    	@Autowired 
    	@Qualifier("hong")
    	//애플리케이션 컨텍스트는 객체를 자동으로 주입시키려고 함.
    	//따라서 해당 타입(Owner)의 bean을 가지고 있는 지 탐색 후 @Qualifier 설정에 따라 "hong"을 가져와 owner에 주입
    	//@Qualifier이 없으면 2개의 빈이 탐색되므로 오류 발생함(hong, lee)
    	private Owner owner;

     

    Bean 주입

    1. 필드에 빈을 주입받는 방법
    2. Setter 메소드로 빈을 주입받는 방법
      • 직접 Setter 메소드를 생성하는 방법
      • (@Setter(onMethod_ = @Autowired)) Lombok 어노테이션 사용하여 주입받는 방법
    3. 생성자로 빈을 주입받는 방법
      • 직접 생성자를 생성
      • (@RequiredArgsConstructor): NotNull, final 객체만 빈으로 자동 주입한다.