์คํ๋ง๋น์ ์ง๋ฌด์ ๊ธฐ๋ฅผ ๋ง์๋ผ, ๊ฐ์ ํ์ ์ ๋น์ด 2๊ฐ์ง ์ด์ ์กด์ฌ
๐ ์คํ๋ง๋น์ ์ง๋ฌด์ ๊ธฐ
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ์ฌ๋ฌ๊ฐ์ง ๊ฒฝ์ฐ์ ์๊ฐ ์์๊ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด DB๋ฅผ ๋๊ฐ ์ด์์ ์ด๋ค๋์ง, ํ ์ธ ์ ์ฑ ์ด ๋๊ฐ์ง(๊ณ ์ ๊ธ์ก ํ ์ธ, ๋น์จ%ํ ์ธ) ๋ผ๋์ง..
์ฆ ๋๊ฐ์ง ์ด์์ ๊ตฌํ์ฒด๊ฐ ์์๋ ๋๊ฐ์ง ๊ตฌํ์ฒด๊ฐ ๋ชจ๋ ์คํ๋ง ๋น์ ๋ฑ๋ก์ด ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น ?
์ปดํฌ๋ํธ ์ค์บ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํํ์๋ ์์ ๊ฐ์ ์ํฉ์ด ์ผ์ด๋๋ค๊ณ ๊ฐ์ ํ๋ฉด.
์คํ๋ง์ ์์ฑ์ ์ฃผ์ ๊ฐ์ ํด๋น ์์ฑ์์ ํ์ ๋ช ์ ๋ณด๊ณ ํ์ ๋ช ๊ณผ ๋งค์นญ์ด ๋๋ ๋น์ ์ฃผ์ ์ ์์ผ์ค๋ค.
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
userRepository์ UserRepository์ ํ์ ์ ๊ฐ์ง๋ ๋น์(์๋ฅผ ๋ค๋ฉด JdbcUserRepository, JPAUserRepository ๋ผ๋๊ฐ) ์ฃผ์ ์ ํด์ค๊ฒ์ด๋ค.
.
"๊ทผ๋ฐ ์ด๋ผ? UserRepository JPAUserRepository, UserRepository JdbcUserRepository ๋๊ฐ๋ ์๋ค?? ๋ ์ผ ์ํด ๋๋ ค์ณ"
์ ์ฒ๋ผ ์คํ๋ง๋น์ด ๋ ธ๋์กฐํฉ์ ๊พธ๋ ค ํ์ ํ๋ ์ฌํ๋ฅผ ๋ง๊ธฐ ์ํ ๋ฐฉ๋ฒ๋ค์ด ์๋ค. ์คํ๋ง๋น์ ํ์ ์ ๋ง๊ธฐ ์ํด ์์๋ณด์.
๊ฐ๋ตํ๊ฒ ์์ฝํ์๋ฉด ๊ตฌํ์ฒด ๋๊ฐ์ ๋ชจ๋ @Component๋ฅผ ๋ถํ์ค์ผ๋ก์จ ๋๊ฐ์ ๊ตฌํ์ฒด๊ฐ ๋ชจ๋ UserRepository ํ์ ์ผ๋ก ์คํ๋ง๋น์ ๋ฑ๋ก์ด ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ๋์ฒํ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ๋ค.
๋ช ์์ ์ผ๋ก ํํํ์
public interface UserRepository {
void save(User user);
}
//--------------------- ์ธํฐํ์ด์ค -----------------------------
@Component
@Primary
public class JdbcUserRepository implements UserRepository {
// JdbcUserRepository์ ๊ตฌํ ๋ด์ฉ
}
@Componet
public class JPAUserRepository implements UserRepository{
// JPAUserRepository์ ๊ตฌํ ๋ด์ฉ
}
//--------------------- ๊ตฌํ์ฒด -----------------------------
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository JdbcUserRepository) {
this.userRepository = JdbcUserRepository;
}
}
@Autowired
public UserService(UserRepository JdbcUserRepository) {
this.userRepository = JdbcUserRepository;
}
๋๊ฐ์ง ์ด์์ ๋น์ด ์์ ์ ๋ช ์๋ฅผ ํด์ ์ ์ด์ฃผ๋ฉด ์คํ๋ง๋น์ด ์ธ์์ ํ๊ณ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ค๋ค.
@Primary
์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ๊ตฌํ์ฒด์ @Primary๋ฅผ ๋ถํ๋ผ.
public interface UserRepository {
void save(User user);
}
//--------------------- ์ธํฐํ์ด์ค -----------------------------
@Component
@Primary
public class JdbcUserRepository implements UserRepository {
// JdbcUserRepository์ ๊ตฌํ ๋ด์ฉ
}
@Componet
public class JPAUserRepository implements UserRepository{
// JPAUserRepository์ ๊ตฌํ ๋ด์ฉ
}
//--------------------- ๊ตฌํ์ฒด -----------------------------
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
์ค๋๋จ๊ณ ์ด์ฌํ ๋ณด๋ฉด JdbcUserRepository ์์ @Primary ๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด์๋๊ฒ์ ํ์ธ ํ ์์๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋์ผํ ํ์ ์ ๋น์ด ๋๊ฐ ์ด์ ๋ฑ๋ก๋๋๋ผ๋ @Primary ๊ฐ ๋ถ์ด์๋ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
@Qualifier
public interface UserRepository {
void save(User user);
}
//--------------------- ์ธํฐํ์ด์ค -----------------------------
@Component
@Qualifier("Main")
public class JdbcUserRepository implements UserRepository {
// JdbcUserRepository์ ๊ตฌํ ๋ด์ฉ
}
@Componet
public class JPAUserRepository implements UserRepository{
// JPAUserRepository์ ๊ตฌํ ๋ด์ฉ
}
//--------------------- ๊ตฌํ์ฒด -----------------------------
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(@Qualifier("Main") UserRepository userRepository) {
this.userRepository = userRepository;
}
}
๋๋ ํฌ๊ฒ ๋จ๊ณ ์ ๋ณด๋ฉด, JdbcUserRepository์ @Qualifier("Main")์ด๋ผ๊ณ ๋ถ์ ๋ถ๋ถ์ด ๋ณด์ผ ๊ฒ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ
์์ฑ์ ๋ถ๋ถ์๋ @Qualifier("Main")์ด๋ผ๊ณ ์ด๋ ธํ ์ด์ ์ด ๋ถ์๋ค.
์ฆ @Qualifier("๋งค์นญ ํ ์ด๋ฆ, ์์ฑ์ ๋ถ๋ถ์ด๋ ๊ตฌํ์ฒด๋ ๊ฐ์์ผํจ")
@Qualifier ์์ ๋งค์นญ ํ ์ด๋ฆ์ด ๋ฌธ์์ด ์ด๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋ฌธ์์ด์ ๊ฒ์ฆ์ ๋ชปํด์ฃผ๋ฏ๋ก ๋ด๊ฐ ์คํ๋ฅผ ๋ด์ด๋ ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ์ฐพ๊ธฐ๊ฐ ์๋นํ ๊น๋ค๋กญ๋ค.
๊ทธ๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด๋ ธํ ์ด์ ์ ๋ง๋ค์ด์ ์ฌ์ฉ ํ ์๊ฐ ์๋ค.
package hello.core.annotation;
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
public @interface Main {
}
// cmd + O ๋๋ฅด๋ฉด ๋ด๊ฐ ์ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋, ์ด๋
ธํ
์ด์
๋ณธ์ง์ผ๋ก ์ฒ๋ค์ด ๊ฐ ์ ์์.
์์ฒ๋ผ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ์์ฒ๋ผ ์ ์ด์ค๋ค. @์ธํฐํ์ด์ค์
public interface UserRepository {
void save(User user);
}
//--------------------- ์ธํฐํ์ด์ค -----------------------------
@Component
@Main
public class JdbcUserRepository implements UserRepository {
// JdbcUserRepository์ ๊ตฌํ ๋ด์ฉ
}
@Componet
public class JPAUserRepository implements UserRepository{
// JPAUserRepository์ ๊ตฌํ ๋ด์ฉ
}
//--------------------- ๊ตฌํ์ฒด -----------------------------
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(@Main UserRepository userRepository) {
this.userRepository = userRepository;
}
}