티스토리 뷰

728x90
👉🏻  Spring에서는 DI기능을 제공합니다. 이는 Applicaiton 시작 시 IOC에 Bean으로 설정된 Object를 관리하고, Singleton 형태로 '@Autowired' 되어있는 객체에 주입이 됩니다. 주입 방식에는 기본적으로 필드주입, Setter주입, 생성자 주입이 있으며 현재까지는 생성자 주입이 가장 안정적인 방법으로 알려져 있습니다.

그 이유를 살펴보겠습니다. [일반 메서드 주입도 있으나 잘 사용하지 않거나 Setter와 비슷하여 제외]

Setter 주입

  • DI를 Setter 함수에서 실행하는 방법
  • 선택, 변경 가능성이 있는 의존관계에서 사용
@Slf4j
@Service
public class MemberService{

private MemberMapper MemberMapper;

    @Autowired
    public void setMemberMapper(MemberMapper memberMapper) {
			this.MemberMapper = memberMapper;
		}
...

 

Field 주입 

  • DI를 field에 직접 주입 하는 방법
  • 코드의 간결함이 장점
  • 외부 변경이 불가능하기 때문에 Test code 작성 시 실행이 힘듬 
  • DI Framwork가 없으면 아무것도 할 수 없음 
@Slf4j
@Service
public class EmailService{

	@Autowired
    private SmsMapper smsMapper;
..

생성자 주입

  • DI를 생성자에서 실행하는 방법
  • 생성자 호출 시점에 딱 1번 호출 되는 것이 보장 
    • 1번 호출 보장은 데이터 보존에 유리함 -> 외부 접근 할 수 있는 곳이 한 곳이니까
  • 불편, 필수 의존 관계에 사용 
  • Spring 프레임 워크가 밀고 있음
  • 생성자가 1개인 경우 @Autowired를 생략해도 주입이 가능
  •  
@Service 
public class UserServiceImpl implements UserService {
	private UserRepository userRepository; 
	private MemberService memberService;
    
    public UserServiceImpl(UserRepository userRepository, MemberService memberService) { 
    this.userRepository = userRepository;
    this.memberService = memberService;
    } 
   }

생성자 주입을 사용해야하는 이유 

불변

  • 대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 
    오히려 대부분의 의존관계는 애플리케이션 종료전까지 변하면 안된다. 불변의 법칙
  • 수정자 주입을 사용하면, setXxx메서드를 public으로 열어두어야 한다.
  • 누군가 실수로 변경할 수도 있고, 변경하면 안되는 메서드를 이용해서 에러가 날 수 있다.
  • 생성자 주입은 객체를 딱 1번만 호출하므로 이후에 호출 되는 일이 없다. 따라서 불변하게 설계할 수 있다

final키워드

생성자 주입을 사용할 때 final 키워드를 사용할 수 있다. 

final을 사용하면 생성자에서 혹시라도 값이 설정하지 않을 경우 오류 메시지를 뱉는다. 

 

728x90
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday