클래스 내에서 객체 생성
- Car 객체가 생성될 때 Engine 객체도 함께 만들어짐.
- 즉, Engine 객체가 Car 클래스 내부에서 생성됨(new)
- 클래스 간 결합도가 높고, 코드 유지보수가 어려움
public class Car{ private Engine engine; public Car(){ engine = new Engine(); } }
객체를 외부에서 생성하여 클래스에 주입
- Engine 객체가 외부에서 생성되고(new) Car 클래스에 주입함
- 클래스 간 결합도가 낮고, 코드의 유연성을 확보함
public class Car{ private Engine engine; public Car(Engine engine){ this.engine = engine; } }
클래스 간 의존성, 결합성을 낮춤
코드의 유연성을 확보하여 유지보수가 용이함
가장 권장되는 방식
장점으로는 final 선언이 가능하여 불변성 보장, 테스트 코드 작성 용이, 순환참조 방지 등이 있음
public class MemberController { private final MemberService memberService; public MemberController(MemberService memberService){ this.memberService = memberService; } }
@RequiredArgsConstructor public class MemberController{ private final MemberService memberService; }
@Autowired를 이용하는 방식
단점으로는 프레임워크 의존성이 큼, 단일 테스트가 어려움 등이 있음
테스트 코드의 중요성이 높아지자 점차 사용하지 않게 됨
@Autowired //4.3부터 단일 생성자인 경우 생략해도 됨 public class MemberController { private MemberService memberService; }
setter을 이용하는 방식
setter을 통해 필요한 값이 할당되기 전까지 객체를 사용할 수 없음
안정성이 낮으므로 거의 사용되지 않음
public class MemberController { private MemberService memberService; public void setMemberService( MemberService memberService){ this.memberService = memberService; } }