public class Controller1 {
private final Service1 service1;
public Controller1() {
this.service1 = new Service1();
}
}
public class Service1 {
private final Repository1 repository1;
public Service1() {
this.repository1 = new Repository1();
}
}
public class Repository1 { ... }
public class Repository1 {
public Repository1(String id, String pw) {
// DB 연결
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/memo", id, pw);
}
}
Controller 5 개가 각각 Service1 을 생성하여 사용하게 되는 것이고, Repository1 생성자 변경에 의해 모든 Contoller 와 모든 Service 의 코드 변경이 필요하게 되는 문제점이 발생한다.
문제점을 해결하기위해서는 아래의 조건이 필요하다.
- 각 객체에 대한 객체 생성은 딱 1번만!
- 생성된 객체를 모든 곳에서 재사용!
- 생성자 주입을 사용하여 필요로하는 객체에 해당 객체 주입!
조건에 맞게 코드를 수정하면 아래의 코드와 같다.
public class Repository1 { ... }
// 객체 생성
// Repository1 클래스 선언 및 객체 생성 → repository1
Repository1 repository1 = new Repository1();
//Service1 클래스 선언 및 객체 생성 (repostiroy1 사용) → service1
Class Service1 {
private final Repository1 repitory1;
// repository1 객체 사용
public Service1(Repository1 repository1) {
this.repository1 = repository1;
}
}
// 객체 생성
Service1 service1 = new Service1(repository1);
// Contoller1 선언 ( service1 사용)
Class Controller1 {
private final Service1 service1;
// service1 객체 사용
public Controller1(Service1 service1) {
this.service1 = service1;
}
}
public class Repository1 {
public Repository1(String id, String pw) {
// DB 연결
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/memo", id, pw);
}
}
// 객체 생성
String id = "root";
String pw = "1234";
Repository1 repository1 = new Repository1(id, pw);
@Component
public class MemoService { ... }
// 필드 위에 DI
@Component
public class MemoService {
@Autowired
private MemoRepository memoRepository;
// ...
}
@Component
public class MemoService {
private final MemoRepository memoRepository;
// 메서드 위에 DI
@Autowired
public MemoService(MemoRepository memoRepository) {
this.memoRepository = memoRepository;
}
// ...
}
//Lombok을 이용한 생성자에 DI 주입
@Component
@RequiredArgsConstructor // final로 선언된 멤버 변수를 파라미터로 사용하여 생성자를 자동으로 생성합니다.
public class MemoService {
private final MemoRepository memoRepository;
// public MemoService(MemoRepository memoRepository) {
// this.memoRepository = memoRepository;
// }
...
}
@Controller는 어디서 사용될까?
내부에서 사용 Handlet Mapping으로 찾은 Controller를 소환 할때 사용된다.