상세 컨텐츠

본문 제목

[스프링3] 섹션 4. 스프링 빈과 의존관계

23-24/Spring 3

by recoday 2023. 9. 29. 10:00

본문

728x90

스프링 빈 등록

  1. 컴포넌트 스캔과 자동 의존관계 설정
  2. 자바 코드로 직접 스프링 빈 등록


컴포넌트 스캔과 자동 의존관계 설정

MemberController가 MemberService를 통해서 회원가입, 데이터 조회

-> 서로 의존 관계가 있다

 

@Controller
public class MemberController {
}
  • `@Controller` 애노테이션이 있으면 MemberController 객체를 생성해서 Spring에 넣어두고 Spring이 관리 -> 스프링 컨테이너에서 스프링 빈이 관리된다
  • `@Controller` 애노테이션이 있으면 스프링 빈으로 자동 등록

 

컴포넌트 스캔 원리

  • `@Component` 애노테이션이 있으면 스프링 빈으로 자동 등록된다
  • `@Controller` 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문
  • `@Controller`, `@Service`, `@Repository`도 `@Component`를 포함하고 있어 스프링 빈으로 자동 등록된다

 

@Controller
public class MemberController {
    private final MemberService memberService;
    // 새로운 인스턴스 생성할 필요 X
    
    @Autowired // 생성자가 1개만 있으면 생략 가능
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}



Dependency Injection(DI) 의존성 주입

@Autowired

  • 생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.
  • 스프링 컨테이너가 뜰 때 MemberController 생성하면서 이 생성자 호출, 스프링이 memberService를 스프링 컨테이너에 있는 memberService를 가져다가 연결을 시켜줌 (memberService에는 @Service 애노테이션, MemoryMemberRepository에는 @Repository 애노테이션이 있어야 함
    -> 정형화된 패턴)
    => Dependency Injection(DI) 의존성 주입 : 객체 의존관계를 외부에서 넣어주는 것

 

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired // 생성자 주입
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    
    ...
}
@Repository
public class MemoryMemberRepository implements MemberRepository {}

이 MemberService를 스프링이 생성할 때 스프링 컨테이너에 등록을 하면서 이 생성자를 호출 -> 또 @Autowired가 있으면 MemberRepository가 필요함을 알고 스프링 컨테이너에 MemoryMemberRepository를 넣어줌

그럼 그림과 같이 연결됨

스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록(유일하게 하나만 등록해서 공유) -> 같은 스프링 빈이면 모두 같은 인스턴스

 

자바 코드로 직접 스프링 빈 등록

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

 


참고

 

Dependency Injection

 

1. 필드 주입

@Autowired private MemberService memberService;

 

2. setter 주입

@Autowired // public으로 노출
public void setMemberService(MemberService memberService) {
     this.memberService = memberService;
}

 

3. 생성자 주입⭐ <- 권장

 

더보기

Q&A


1. 다음 빈칸에 들어갈 단어는?
- `static/_____.html`을 올려두면 `http://localhost:8080` 실행 시 Welcome page 기능을 제공한다.

답: index

 


2. 다음은 Controller 코드이다. `http://localhost:8080/hi` 실행 시 `resources/templates/hello.html`을 보여주기 위해 빈칸에 들어갈 단어는 무엇인가?

@Controller
public class HelloController {

    @GetMapping("hi")
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "_____";
    }
}


답: hello

 

 

3. 다음 빈칸에 들어갈 단어는?
컨트롤러에서 리턴 값으로 문자를 반환하면 (                )가 화면을 찾아서 처리한다.

답 : viewResolver 뷰 리졸버

 


4. MVC가 가리키는 각 단어는?

답 : Model, View, Controller

 


5. 다음 코드 빈칸에 들어갈 json 형식의 객체를 반환하는 애노테이션 이름은?

  @Controller
  public class HelloController {

     @GetMapping("hello-api")
     @___________
     public Hello helloApi(@RequestParam("name") String name) {
       Hello hello = new Hello();
       hello.setName(name);
       return hello;
     }
     static class Hello {
         private String name;

         public String getName() {
            return name;
         }
         public void setName(String name) {
            this.name = name;
         }
     }
  }


답 : @ResponseBody



6. 이 애노테이션은 각 테스트 실행 전에 호출되며, 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고 의존관계도 새로 맺어준다. 이 애노테이션의 이름은?

답 : @BeforeEach

 


7. 생성자에 (           ) 애노테이션이 있으면 스프링이 연관된 객체를 스프링 컨테이너에 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 Dependency Injection, 의존성 주입이라 한다. 빈칸에 들어갈 단어는?

답 : @Autowired



8. 스프링 빈을 등록하는 2가지 방법은?

답 : 1. 컴포넌트 스캔과 자동 의존관계 설정  2. 자바 코드로 직접 스프링 빈 등록하기

 


9. 이 애노테이션이 있으면 스프링 빈으로 자동 등록된다. 이 애노테이션 이름은?

답 : @Component


        
10. 다음 괄호 안에 들어갈, 회원 컨트롤러에 생성자 주입을 통해 의존관계를 추가하는 코드를 작성해주세요.

  @Controller
  public class MemberController {

      private final MemberService memberService;

      (                  
                  
                   
      )
  }


답 : 

      @Autowired
      public MemberController(MemberService memberService) {
          this.memberService = memberService;
      }



11. 자바 코드로 직접 MemberService와 MemberRepository 스프링 빈을 등록하는 SpringConfig 클래스 코드를 작성해보세요.

  @Configuration
  public class SpringConfig {

     @Bean
     public MemberService memberService() {
        return new MemberService(memberRepository());
     }

     @Bean
     public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
     }
  }

 

 

[출처] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 (기술 섹션 0. 강의소개 ~ 섹션 4. 스프링 빈과 의존관계), 김영한 https://inf.run/WzVy

 

 

 

ⓒ 머핀

728x90

관련글 더보기