[Spring] 스프링 빈 등록 : 컴포넌트 스캔과 자동 의존관계 설정, 자바 코드로 직접 스프링 빈 등록

Miin·2023년 9월 22일
0

Spring

목록 보기
3/17
post-custom-banner

스프링 빈 등록

  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;
  1. setter 주입
	@Autowired // public으로 노출
    public void setMemberService(MemberService memberService) {
    	this.memberService = memberService;
    }
  1. 생성자 주입⭐ <- 권장





Q&A

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

    	답: index
  1. 다음은 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
  2. 다음 빈칸에 들어갈 단어는?
    컨트롤러에서 리턴 값으로 문자를 반환하면 ( )가 화면을 찾아서 처리한다.

    답 : viewResolver 뷰 리졸버
  3. MVC가 가리키는 각 단어는?

    답 : Model, View, Controller
  4. 다음 코드 빈칸에 들어갈 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
  5. 이 애노테이션은 각 테스트 실행 전에 호출되며, 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고 의존관계도 새로 맺어준다. 이 애노테이션의 이름은?

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

    답 : @Autowired
  7. 스프링 빈을 등록하는 2가지 방법은?

    답 : 1. 컴포넌트 스캔과 자동 의존관계 설정  2. 자바 코드로 직접 스프링 빈 등록하기
  8. 이 애노테이션이 있으면 스프링 빈으로 자동 등록된다. 이 애노테이션 이름은?

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

    @Controller
    public class MemberController {
    
        private final MemberService memberService;
    
        (                  
                    
                     
        )
    }
    
    	답 : 
        @Autowired
        public MemberController(MemberService memberService) {
            this.memberService = memberService;
        }
  10. 자바 코드로 직접 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

profile
컴퓨터공학전공 학부생 Back-end Developer
post-custom-banner

0개의 댓글