ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot #4 bean과 의존관계
    Study/Spring boot 2021. 7. 9. 02:04

    이제 회원의 정보에 대한 레포지토리랑 서비스는 구현이 끝났으므로 컨트롤러를 구현해보자. 만들어둔 controller/ 패키지내에 MemberController.java 파일을 생성하자. 이제 Controller가 서비스를 이용하기 위해 서비스 객체가 필요할것이다. 그럼 이것을 Controller 클래스내에서 new 연산자로 새로 생성하여 사용하면 어떻게 될까? 그럼 다른 Controller가 이 맴버서비스를 가져다가 쓸때 서로간 맞지않는 문제가 생길것이다.

     

    그래서 이러한 문제를 해결하기 위해 Spring은 container내에 bean을 통해 관리한다. container 내에 bean으로 등록한 클래스들의 객체를 두고 이를 싱글톤 패턴처럼 활용하는것이다. 이 bean으로 등록하는 방법은 2가지 방법이 있는데 먼저 컴포넌트 스캔방법으로 해보자 

     

     

    1. 컴포넌트 스캔

    먼저 레포지토리를 등록해보자. 아래 사진처럼 클래스 위에 @Repository 어노테이션을 등록해주자. 그럼 끝이다!

     

     

    서비스도 마찬가지로 @Service 어노테이션으로 등록해주자. 전 포스팅에서 말했듯이 서비스같은경우 생성자에서 의존성을 주입받는다. 이때 레포지토리 객체를 자동으로 입력받기 위해 @Autowired 어노테이션을 사용해야한다.

    @Autowired 어노테이션이 있으면 스프링이 빈으로 등록한 객체들을 탐색하고 자동으로 주입을 시켜준다.

     

    마찬가지로 컨트롤러도 어노테이션으로 컴포넌트 등록해주자. 이렇게 모두 필요한 컴포넌트들을 빈으로 등록하면 실행시 에러없이 잘 돌아가는것을 확인할 수 있다.

     

     

     

    2. 자바 코드로 직접 빈에 등록

    이번에는 컴포넌트 어노테이션이 아닌 직접 자바 코드를 작성하여 클래스를 빈에 등록해보자.

    컨트롤러를 제외하고 빈에 등록해둔 어노테이션은 모두 지워주자 그리고 메인 클래스 위치에 springConfig.java를 생성하자. 그리고 아래와 같이 코드를 작성하여 등록해주자 직접 @Bean 어노테이션으로 메소드를 등록하고 각 클래스 객체를 리턴하는 것이다.

     
    @Configuration
    public class springConfig {
        
        @Bean
        public MemberService memberService(){
            return new MemberService(memberRepository());
        }
    
        @Bean
        public MemberRepository memberRepository(){
            return new MemoryMemberRepository();
        }
    }

     

     

     

    컴포넌트 스캔으로 빈에 등록하기, 직접 자바 코드로 등록하기, 어느것이 좋다고 할 수는 없다. 주로 정형화 된, 즉 앞으로 코드의 수정이 없다고 판단되면 컴포넌트 스캔을 주로 사용하고 그렇지 않으면 자바 코드로 등록하는 방법을 사용한다고 한다. 왜냐하면 코드가 중간에 수정되면 컴포넌트 스캔방법은 같이 수정해야하는 코드가 많지만, configuration을 이용한 방법은 config 파일만 바꾸면 되기 때문이다.

     
     
     

    댓글

Designed by Tistory.