해결된 질문
작성
·
703
답변 1
1
안녕하세요, 동진님!! 좋은 질문 감사드립니다! ☺️
크게 2가지 방법이 있을 것 같아요!!!
[방법 1. BookRepository
인터페이스 대신 구현체를 2개 주입받는다]
아래 코드와 같은 느낌입니다!!
@RestController
public class BookController {
private final BookMemoryRepository bookMemoryRepository;
private final BookMySqlRepository bookMysqlRepository;
public BookController(
BookMemoryRepository bookMemoryRepository,
BookMySqlRepository bookMysqlRepository
) {
this.bookMemoryRepository = bookMemoryRepository;
this.bookMysqlRepository = bookMysqlRepository;
}
// 사용하고 싶은 곳에 적절한 구현체를 사용한다.
}
이렇게되면 1번에서는 A Repository, 2번에서는 B Repository를 사용하실 수 있게 됩니다!!
또 다른 방법도 있는데요!!
[방법 2. BookRepository
인터페이스를 컬렉션으로 주입 받는다]
강의에서 소개드리지는 않았지만, 스프링 빈을 받을 때 List나 Map을 활용할 수도 있습니다!
예를 들어, List
를 사용한다고 해볼게요!
@RestController
public class BookController {
private final List<BookRepository> bookRepositories;
public BookController(List<BookRepository> bookRepositories) {
this.bookRepositories= bookRepositories;
}
}
이렇게되면 List<BookRepository> bookRepositories
에는 BookMemoryRepository
과 BookMySqlRepository
가 모두 들어있게 됩니다!! 그래서 이런 방식으로 구분할 수도 있습니다!!
@Repository
public class BookMemoryRepository {
@Override
public RepositoryType getType() {
return RepositoryType.MEMORY
}
}
@Repository
public class BookMySqlRepository {
@Override
public RepositoryType getType() {
return RepositoryType.MYSQL
}
}
// enum class 활용
enum RepositoryType {
MEMORY,
MYSQL;
}
@RestController
public class BookController {
private final List<BookRepository> bookRepositories;
public BookController(List<BookRepository> bookRepositories) {
this.bookRepositories= bookRepositories;
}
public void method1() {
// bookRepositories 리스트를 순회하며 getType을 호출하여 MEMORY인 것을 찾는다!
// stream + filter + findFirst를 쓰셔도 좋고, for문을 도셔도 좋습니다!
}
public void method2() {
// bookRepositories 리스트를 순회하며 getType을 호출하여 MYSQL인 것을 찾는다!
}
}
만약 Map을 사용하게 되면 key를 String으로, value를 BookRepository로 받으시면 됩니다!!
@RestController
public class BookController {
private final Map<String, BookRepository> bookRepositories;
public BookController(Map<String, BookRepository> bookRepositories) {
this.bookRepositories= bookRepositories;
}
}
이 경우, 이 Map에는
"bookMemoryRepository" -> BookMemoryRepository 인스턴스
"bookMySqlRepository" -> BookMySqlRepository 인스턴스
가 들어있게 됩니다!!
또 혹시나 궁금한 점 있으시면 편하게 질문 남겨주셔요!!!
감사합니다!! 🙏🙏
친절하고 자세한 답변 감사합니다!! 강의가 귀에쏙쏙들어와서 너무 좋습니다!!