[SpringBoot] Service에서 Repository injection

Brian·2021년 7월 11일
0

SpringBoot

목록 보기
1/1
post-thumbnail

!!! 공부 목적으로 작성하는 블로그입니다. 부족한 부분에 대해 조언을 해주시면 감사하겠습니다.

Service Class에서 Respository Class를 주입해주는 방법에 대해서 알아보기 위해 공부 목적으로 작성합니다.

@Service
@Transactional(readOnly = true): 
public class MemberService {

    // field injection
    @Autowired
    private MemberRepository memberRepository;
 }

위 코드는 보통적으로 많이 사용하는 코드 형식이다. 그러나 단점이 있습니다. 기본적으로 변경이 불가하기 때문이다. 테스트를 할 경우에 repository를 변경을 해야 할 경우들이 있는데 현재 코드로는 불가능하다.

그래서 이것을 해결하기 위해 setter injection을 사용하기도 한다.

🧐setter injection

@Service
@Transactional(readOnly = true)
public class MemberService {

   // field injection
   private MemberRepository memberRepository;
	
  @Autowired
  public void setMemberRepository(MemberRepository memberRepository) {
      this.memberRepository = memberRepository;
  }
  
}

스프링이 바로 바로 주입하는게 아니라 setter을 통해서 주입을 해주는 형식이다. 장점이라면 테스트 코드를 작성할때 값을 주입 해줄수 있다는 것이다. 단점이라면 어플리케이션이 실행하는 시점에 누군가가 setMemberRepository를 바꿀수도 있다. 설마 누가.. 그럴까... 혹시 모를 상황을 대비해서 사용 안하는게 더 안정적일거 같다. 이미 어플리케이션 실행이 잘되고 있는 시점에 바꾼다는 것은 말이 안된다.

😎constuctor injection

@Service
@Transactional(readOnly = true)
public class MemberService {

    // field injection
    private MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

}

생성자 주입을 사용할 경우에는 생성자에서 주입을 해주기 때문에 한번 생성하면 완성된 상태 이기 때문에 중간에 set으로 memberRepository 변경이 불가해진다.

또 생성자 주입을 사용 할 경우 좋은 점은 예를 들어 테스트 코드를 작성할 때도 아래 이미지 와 같이 빨간줄을 확인 할 수 있다. 빨간줄 부분에 주입을 해줘야 한다는 것을 알 수 있다. 새성 시점에 memberSerivce는 repository가 필요하다는 것을 명확하게 알 수 있다.

글로 작성하려니 설명이 많이 부족한거 같다. 코드를 한번 직접 작성해보는게 더 도움이 될거 같다.

최신 스프링에서는 필드가 하나 있을 경에는 @Autowired를 생략 할 수 있따. 위 이미지 보다 조금 더 간략하게 작성하는 방법도 있다. 아래 코들로 확인해보자.

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

    // field injection
    private final MemberRepository memberRepository;
}

@AllArgsConstructor 어노테이션도 사용이 가능하지만 final을 붙인 필드에는 @RequiredArgsConstructor를 쓰는것이 좋은거 같다. Required는 final이 작성된 것만 construtor을 생성해준다고 생각하면 된다.

🙄final을 사용해야 하는 이유

memberRepository를 변경 할 일이 없기 때문에 final을 붙여준다. 생성자를 생성했지만 값을 지정해주지 않으면 생성자에 빨간줄이 생긴다. 오류 발생을 확인 할 수 있기 때문에도 이유라고 볼 수 있다.

profile
Jiujitsu_coder

0개의 댓글