스프링 컨테이너 한 클래스 내에서 두개의 @Repository 사용하기
BookController 내에서 서로 다른 Repository를 사용하려고 한다면 어떻게 사용해야 하나요?

1번인 saveBook에서는 BookMemoryRepository의 saveBook()을 사용하고
2번인 saveBook1 에서는 BookMySqlRepository의 saveBook()을 사용하고 싶다고 하면 사용할 수 있는지? 사용할 수 있다면 어떻게 사용해야 하나요??


답변 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 인스턴스가 들어있게 됩니다!!
또 혹시나 궁금한 점 있으시면 편하게 질문 남겨주셔요!!!
감사합니다!! 🙏🙏
패키지 구분에 대해 궁금한게 있습니다
0
27
2
리액트 관련 질문이 있습니다.
0
65
2
스프링부트 버전
0
78
2
7강 강의를 들으려고 했는데 오류가 나서 서버가 안 켜지는거 같아요.
0
60
2
33강. UserLoanHistory의 관계성에 대한 질문
1
57
2
Java JDK 버전 문의의 건
0
136
2
ec2 에서 Linux버전이 달라져서 설치가 안되는것 같은데 자료 최신화좀 해주세요.
0
90
3
h2 console 접속했을 테이블 질문
1
67
1
ec2 서버에서 스프링 실행도 되고 인바운드 설정까지 했는데 index.html 안됨
0
82
2
15강. updateUser() 질문
0
57
2
깃허브 질
0
88
2
여기까지 다 끝냈다고 하셨는데
0
81
2
왜안될까요
0
72
2
MySQL 창이안ㄴ뜹니다
0
59
2
포스트맨
0
53
1
spring 개념적인 질문
0
72
2
인텔리제이 샘플코드 실행 안됨 오류
0
144
2
aws 배포할때 .env 파일에 저장한 환경변수에 관하여 여쭤볼게 있습니다
0
88
1
마이그레이션 오류입니다.
0
176
3
Whitelabel Error Page 오류가 났습니다.
0
172
2
안녕하십니까! 오류가 났습니다.. 도와주세요 ㅜㅜ
1
95
3
궁금한게 있습니다.
0
61
2
DTO 관련
0
71
2
궁금한게 있습니다!
0
70
2





