[Spring] @Autowired์ ๋ค์ํ ์ฌ์ฉ ๋ฐฉ๋ฒ - required, Primary, Qualifier
1. ์์กด๊ฐ์ฒด ํ์ ์ ๋น์ด ์๋ ๊ฒฝ์ฐ
๋ค์๊ณผ ๊ฐ์ด BookService ํด๋์ค์ BookRepository ์ธํฐํ์ด์ค๊ฐ ์๋ค.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
BookRepository bookRepository;
@Autowired
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
//
public interface BookRepository {
}
|
cs |
BookService ํด๋์ค์๋ @Service ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ ๋น์ผ๋ก ๋ฑ๋กํด์ฃผ์๊ณ BookRepository๋ ์ ๋ ธํ ์ด์ ์ ๋ถ์ด์ง ์์ ์ผ๋ฐ ์๋ฐ ํด๋์ค์ด๋ค.
BookRepository๋ BookService์ ์์กด๊ฐ์ฒด์ด๋ฉฐ @Autowired๋ฅผ ๋ถ์ฌ BookService์ ์์ฑ์๋ฅผ ํตํด ์ฃผ์ ๋ฐ๋๋ก ํ์๋ค.
์ด๋๋ก ์คํํ๋ฉด ์๋ฌ๊ฐ ๋๋ค.
BookService ๋น์ ์์ฑํ๋ ค๋ฉด BookRepository ๋น์ด ํ์ํ๋ฐ IoC ์ปจํ ์ด๋์์ ํด๋นํ๋ ํ์ ์ ๋น์ ์ฐพ์ ์ ์์ผ๋ BookRepository๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๋ผ๋ ๋ป์ด๋ค.
์ฝ๋๋ฅผ ๋ฐ๊ฟ ์ด๋ฒ์ setter๋ก ์ฃผ์ ๋ฐ๋๋ก ํด๋ณด์.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
BookRepository bookRepository;
@Autowired
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
//
public interface BookRepository {
}
|
cs |
์คํํ๋ฉด ์ญ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์์ฑ์๋ก ์ฃผ์ ๋ฐ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ Setter๋ก ์ฃผ์ ๋ฐ๋๋ก ํ๊ธฐ๋๋ฌธ์ ์๋๋ BookService์ ์ธ์คํด์ค๋ ์์ฑํ ์ ์๋๊ฒ ๋ง์ง๋ง @Autowired ์ ๋ ธํ ์ด์ ์ ์ํด BookRepository๋ฅผ ์ฃผ์ ๋ฐ๋๋ก ์ค์ ํ BookService๋ ์์ฑ๋์ง ์๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ @Autowired ์ ๋ ธํ ์ด์ ์ ์ฒ๋ฆฌํ๋ ์ค ํด๋นํ๋ ๋น์ ํ์ ์ ๋ชป์ฐพ๊ฑฐ๋ ์์กด์ฑ ์ฃผ์ ์ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉฐ ์ดํ๋ฆฌ์ผ์ด์ ๊ตฌ๋์ด ์ ๋๋ก ๋์ง ์๋๋ค.
@Autowired์ required ์์ฑ๊ฐ์ ์ถ๊ฐํด๋ณด์.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
BookRepository bookRepository;
@Autowired(required = false)
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
//
public interface BookRepository {
}
|
cs |
์ด๋ฒ์ ์๋ฌ ์์ด ์ ์์ ์ผ๋ก ์คํ๋๋ค.
@Autowired(required = false)์ ์์กด์ฑ์ 'Optional'๋ก ์ค์ ํ๋ ๊ฒ์ด๋ค.
์ฃผ์ ๋ฐ์ ์์กด๊ฐ์ฒด๊ฐ ํ์์ ์ด์ง ์์ ๊ฒฝ์ฐ @Autowired(required = false)๋ก ์ค์ ํด์ ์์กด๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ง ๋ชปํ๋๋ผ๋ ๋น์ ์์ฑํ๋๋ก ํ ์ ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก BookService๋ BookRepository๋ฅผ ์ฃผ์ ๋ฐ์ง ์์ ์ํ๋ก IoC ์ปจํ ์ด๋์ ๋ฑ๋ก๋๋ค.
required ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ true์ด๊ธฐ ๋๋ฌธ์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ setter๋ก ์ฃผ์ ๋ฐ๊ฒ ํ๋๋ผ๋ ์์กด๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ง ๋ชปํ๋ฉด ํญ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
required = false๋ @Autowired๋ฅผ ํ๋๋ setter์ ๋ถ์์ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์๋ค.
2. ์์กด๊ฐ์ฒด ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired
BookRepository bookRepository;
}
//
public interface BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class MyBookRepository implements BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class AnotherBookRepository implements BookRepository {
}
|
cs |
BookService์์ BookRepository๋ฅผ ํ๋๋ก ์ฃผ์ ๋ฐ๋๋ก ๋ณ๊ฒฝํ๋ค.
MyBookRepository, AnotherBookRepository ํด๋์ค๋ฅผ ์๋ก ๋ง๋ค๊ณ BookRepository๋ฅผ ๊ตฌํํ๋๋ก ํ๋ค.
๋ ๋ค @Repository๋ฅผ ๋ถ์ฌ ๋น์ผ๋ก ๋ฑ๋กํจ์ผ๋ก์จ BookRepository ํ์ ์ ๋น์ด ๋๊ฐ๊ฐ ๋์๋ค.
์ด ๊ฒฝ์ฐ spring์ BookService์ ์ด๋ค BookRepository ๋น์ ์ฃผ์ ํด์ค๊น?
๊ฒฐ๊ณผ๋ ์ฃผ์ ํด ์ค ์ ์๋ค.
๋ BookRepository์ค ์ด๋ค ๋น์ ์ํ๋์ง spring ์ ์ฅ์์ ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
1) @Primary
@Primary ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ํด๋นํ๋ ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ์ฐ์ ์ ์ผ๋ก ์ฃผ์ ํ ๋น์ ์ง์ ํ ์ ์๋ค.
MyBookRepository์ @Primary ์ ๋ ธํ ์ด์ ์ ๋ถ์ด์.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired
BookRepository bookRepository;
}
//
public interface BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository @Primary
public class MyBookRepository implements BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class AnotherBookRepository implements BookRepository {
}
|
cs |
์ด๋ ๊ฒ ํ๋ฉด spring์ BookService์ BookRepository๋ฅผ ์ฃผ์ ํ ๋ ์ฌ๋ฌ๊ฐ์ ๋น์ด ์กด์ฌํ ๊ฒฝ์ฐ @Primary ์ ๋ ธํ ์ด์ ์ด ๋ถ์ด์๋ ๋น์ ์ฃผ์ ํด์ค๋ค.
2) Qualifier
@Qualifier ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ๋น id๋ฅผ ์ง์ ํด์ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ ๋ฐ๋ ๊ณณ์ @Qualifier ์ ๋ ธํ ์ด์ ์ ์ถ๊ฐํ์.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired @Qualifier("myBookRepository")
BookRepository bookRepository;
}
//
public interface BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class MyBookRepository implements BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class AnotherBookRepository implements BookRepository {
}
|
cs |
๊ธฐ๋ณธ์ ์ผ๋ก @Repository ์ ๋ ธํ ์ด์ ์ ์ฐ๋ฉด ๋น id๋ ์๋ฌธ์๋ก ์์ํ๋ ํด๋์ค ์ด๋ฆ๊ณผ ๋์ผํ๋ค.
๋ฐ๋ผ์ MyBookRepository๋ฅผ ์ฃผ์ ๋ฐ๋๋ก ์ค์ ํ๋ ค๋ฉด Qualifier ์ ๋ ธํ ์ด์ ์ myBookRepository๋ผ๊ณ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ @Primary์ @Qualifier ์ ๋ ธํ ์ด์ ์ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ธ ์ ์์ง๋ง @Primary๊ฐ ๋ type safeํ ๋ฐฉ๋ฒ์ด๋ค.
3) ํด๋นํ๋ ํ์ ์ ๋น์ ๋ชจ๋ ์ฃผ์ ๋ฐ๊ธฐ
BookService์์ BookRepository๋ฅผ ์ฃผ์ ๋ฐ๋ ๋ณ์์ ํ์ ์ List๋ก ๋ณ๊ฒฝํ๋ค.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookService {
@Autowired
List<BookRepository> bookRepositories;
}
//
public interface BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class MyBookRepository implements BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class AnotherBookRepository implements BookRepository {
}
|
cs |
์ด๋ ๊ฒ ํ๋ฉด spring์ BookRepository ํ์ ์ ๋น์ ๋ชจ๋ ์ฃผ์ ํด์ค๋ค.
4) ๋น id์ ๋ณ์๋ช ์ ๋์ผํ๊ฒ
๋ณ๋ก spring์์ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ ์๋์ง๋ง @Autowired๋ ํ์ ์ ๋ณด๊ณ ๋์ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ ๋ณ์๋ช ๊ณผ ๋น id๋ ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
์๋ฅผ ๋ค์ด ์ง๊ธ์ฒ๋ผ BookRepository ํ์ ์ ๋น์ด MyBookRepository, AnotherBookRepository๊ฐ ์กด์ฌํ๋ ์ํ์์ MyBookRepository๋ฅผ ์ฃผ์ ๋ฐ๊ณ ์ถ์ผ๋ฉด ์ฃผ์ ๋ฐ์ ๋ณ์๋ช ์ myBookRepository๋ก ํ๋ฉด ๋๋ค.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired
BookRepository myBookRepository;
}
//
public interface BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class MyBookRepository implements BookRepository {
}
//
import org.springframework.stereotype.Repository;
@Repository
public class AnotherBookRepository implements BookRepository {
}
|
cs |
์ฌ๋ฌ ๊ฐ์ ๋น ์ค์์ ๋ณ์๋ช ๊ณผ ๋น id๊ฐ ๋์ผํ ๋น์ด ์ฃผ์ ๋๋ค.
References
์ธํ๋ฐ - ๋ฐฑ๊ธฐ์ ๋์ ์คํ๋ง ํ๋ ์์ํฌ ํต์ฌ ๊ธฐ์
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Component Scan๊ณผ Function์ ์ฌ์ฉํ ๋น ๋ฑ๋ก ๋ฐฉ๋ฒ (1) | 2020.03.02 |
---|---|
[Spring] @Autowired ๋์ ์๋ฆฌ - BeanPostProcessor (0) | 2020.03.01 |
[Spring] ๋น์ ์ค์ ํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ - XML, JAVA, Component Scan (0) | 2020.03.01 |
[Spring] ์ ์๋ฐ ๊ฐ์ฒด๋ฅผ IoC ์ปจํ ์ด๋์ ๋น์ผ๋ก ๋ง๋ค๊น? (0) | 2020.03.01 |
[Spring] ์คํ๋ง PSA (0) | 2020.03.01 |
๋๊ธ