Spring / ์ง๊ธ๊น์ง ์ฌ์ฉํ ์ด๋ ธํ ์ด์ ์ ๋ฆฌ @
by rlaehddnd0422์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ์ด์
์ฌ์ ์ ์๋ฏธ๋ก ์ฃผ์์ ๋ปํ๋ ์ด๋ ธํ ์ด์ ์ ์ฃผ์๊ณผ๋ ์ญํ ์ด ๋ค๋ฅด์ง๋ง, ์ฃผ์์ฒ๋ผ ๋ฌ์ ํน์ํ ์๋ฏธ๋ถ์ฌ๊ฐ ๊ฐ๋ฅํ๊ณ , ๊ธฐ๋ฅ ์ฃผ์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ํ๋ก๊ทธ๋จ์๊ฒ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ํด์ ์ฌ์ฉํฉ๋๋ค.
@Controller
์ปจํธ๋กค๋ฌ ๋ก์ง์์ ์๋ ค์ฃผ๋ ์ด๋ ธํ ์ด์
@Service
์๋น์ค ๋ก์ง์์ ์๋ ค์ฃผ๋ ์ด๋ ธํ ์ด์
@Repository
๋ฆฌํฌ์งํ ๋ฆฌ ๋ก์ง์์ ์๋ ค์ฃผ๋ ์ด๋ ธํ ์ด์
@Test
JUnit์์ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ .
ํ ์คํธ ์ฝ๋์์ ์๋ ค์ฃผ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ด ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ์ฝ๋๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํํ ์ ์์ต๋๋ค.
@Responsebody
๊ฐ์ฒด๋ฅผ HTTP์์ฒญ์ body๋ด์ฉ์ผ๋ก mappingํ์ฌ ํด๋ผ์ด์ธํธ๋ก ์ ์ก
@Responsebody๊ฐ ๋ถ์ ํ๋ผ๋ฏธํฐ๊ฐ ์์ผ๋ฉด HTTP ์์ฒญ์ ๋ฏธ๋์ด ํ์ ๊ณผ ํ๋ผ๋ฏธํฐ์ ํ์ ์ ๋จผ์ ํ์ธํ๋ค.
์ฆ, @Responsebody ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด http ์์ฒญ body๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ string์ผ๋ก ์ ๋ฌ ๋ฐ์ ์ ์๋ค.
@GetMapping
์ฃผ์ด์ง URI ํํ์๊ณผ ์ผ์นํ๋ HTTP GET ์์ฒญ์ฒ๋ฆฌ ํด์ฃผ๋ ์ด๋ ธํ ์ด์
ex) localhost:8080/hello ์์ฒญ์ด ๋ค์ด์ค๋ฉด @GetMapping("hello")์ด ๋ถ์ ํจ์๋ฅผ ์คํํฉ๋๋ค.
ex) @GetMapping("/")์ธ ๊ฒฝ์ฐ ํ ํ๋ฉด์ ๋งคํ๋จ.
@PostMapping
: ์ฃผ์ด์ง URI ํํ์๊ณผ ์ผ์นํ๋ HTTP POST ์์ฒญ์ฒ๋ฆฌ ํด์ฃผ๋ ์ด๋ ธํ ์ด์
@RequestMapping
์ฃผ์ด์ง URIํํ์๊ณผ ์ผ์นํ๋ HTTP Request ๋ฅผ ์์ฒญ์ฒ๋ฆฌ ํด์ฃผ๋ ์ด๋ ธํ ์ด์
@Override
๋ถ๋ชจ๋ ์ธํฐํ์ด์ค ๊ตฌํ ํด๋์ค์์ ๋ฉ์๋ ๊ตฌํํ ๋ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์
@BeforeEach
๊ฐ ํ ์คํธ ์คํ ์ ์ ํธ์ถ๋๋๋ก ํด์ฃผ๋ ์ด๋ ธํ ์ด์ .
ํ ์คํธ๊ฐ ์๋ก ์ํฅ์ด ์๋๋ก ํ๊ธฐ ์ํดใ ํญ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋ ์์กด๊ด๊ณ๋ฅผ ์๋ก ๋งบ์ด์ฃผ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
@AfterEach
ํ ์คํธ ์ฝ๋์์ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ .
ํ ๋ฒ์ ์ฌ๋ฌ ๋ฉ์๋์ ํ ์คํธ๋ฅผ ์คํํ๋ฉด ๋ฉ๋ชจ๋ฆฌ DB์ ์ง์ ํ ์คํธ์ ๊ฒฐ๊ณผ๊ฐ ๋จ์ ์ด์ ํ ์คํธ๊ฐ ๋ค์ ํ ์คํธ์ ์ํฅ์ ๋ผ์ณ ํ ์คํธ ์ฝ๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
@AfterEach๋ฅผ ์ฌ์ฉํด์ ๊ฐ ํ ์คํธ๊ฐ ๋๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น์ฐ๋ ์์ ์ ๊ตฌํํ๋ฉด ์ด์ ํ ์คํธ๊ฐ ๋ค์ ํ ์คํธ์ ์ํฅ์ ์ฃผ์ง ์๊ฒ ํ ์ ์์ต๋๋ค.
@Autowired
์๋ ์์กด๊ด๊ณ ์ฃผ์ (DI) ์ด๋ ธํ ์ด์ .
์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋น์ ์ฐพ์์ ์์กด๊ด๊ณ ์ฃผ์ (Dependency Injection, DI) ํด์ค๋๋ค.
์์ฑ์๊ฐ ํ๋์ผ ๊ฒฝ์ฐ ์๋ตํด๋ ๋ฉ๋๋ค.
@Configuration
์๋ ๋น ๊ด๋ฆฌ ํด๋์ค์์ ์๋ ค์ฃผ๋ ์ด๋ ธํ ์ด์ .
CGLIB ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ์ดํธ์ฝ๋ ์กฐ์์ ํตํด ๋น๋ค์ ์ฑ๊ธํค์ ๋ณด์ฅํด์ค๋๋ค.
@Bean
์๋ ๋น ๊ด๋ฆฌ ํด๋์ค์์ ์๋์ผ๋ก ๋น์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ .
@ComponentScan
@Component ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์ค์บํด์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
ํ๋ผ๋ฏธํฐ exlucdeFilters, includeFilters, basePackages ๋ก ์ ์ธ, ํฌํจ, ์์์์น ์ง์ ๊ฐ๋ฅ
๊ธฐ๋ณธ ์ ์ฉ ๋์ : @Controller, @Service, @Repository, @Configuration
@Component
์๋ ์คํ๋ง ๋น ๋ฑ๋ก ์ด๋ ธํ ์ด์ .
ํด๋น ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ ์๋์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋ฉ๋๋ค.
@Transaction
ํ ์คํธ ์งํ ์ ์ DB์ ๋ํ ํธ๋์ญ์ ์ ์์ํ๊ณ , ํ ์คํธ ์๋ฃ ํ์๋ ํญ์ ๋กค๋ฐฑ์ ์งํํ์ฌ DB์ ๋ฐ์ดํฐ๊ฐ ๋จ์ง ์๋๋ก ํด์ ๋ค์ ํ ์คํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํฉ๋๋ค.
@SpringBootTest
ํตํฉ ํ ์คํธ๋ฅผ ์ํ ํ๊ฒฝ์ ์ค๋นํด์ค๋๋ค. ๋ชจ๋ ๋น๋ค์ ์ค์บํ๊ณ ์คํ๋ง ์ปจํ ์ด๋์ ํ ์คํธ๋ฅผ ํจ๊ป ์คํํ๋๋ก ํด์ค๋๋ค.
@Displayname
JUnit์์ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก @Test์ ํจ์๋ช ์ ๋ณ๊ฒฝํด์ ๋ณผ ์ ์์ต๋๋ค.
@Test
@DisplayName("๊ตฌ์ฒด ํ์
์ผ๋ก ์กฐํ")
void findBeanByName2()
{
MemberService memberService = ac.getBean("memberService", MemberServiceImp.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImp.class);
}
@RequiredArgsConstructor
final์ด ๋ถ์ ํ๋๋ฅผ ๋ชจ์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด ์ค๋ค. ( ์ฝ๋์๋ ๋ณด์ด์ง ์์ )
@Component
@RequiredArgsConstructor
public class OrderServiceImp implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Qualifier
๊ฐ์ ํ์ ์ผ๋ก ๋ฑ๋ก๋ ๋น์ด ๋ ๊ฐ ์ด์์ผ ๋, ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํด์ฃผ๋ ์ด๋ ธํ ์ด์ .
@Component
@Qualifier("mainDp")
public class FixDiscountPolicy implements DiscountPolicy{
@Component
@Qualifier("secondDp")
public class RateDiscountPolicy implements DiscountPolicy{
@Component
public class OrderServiceImp implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImp(MemberRepository memberRepository, @Qualifier("mainDp") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Qualifier ๋ผ๋ฆฌ ๋งค์นญ -> ๋ง์ฝ ์๋ค ? -> ๋น์ด๋ฆ ๋งค์นญ -> ๋ฑ๋ก๋ ๋น์๋ ์๋ค? -> NoSuchBeanDefinitionException ์์ธ ๋ฐ์
@Primary
์ฐ์ ์์๋ฅผ ์ง์ ํด์ฃผ๋ ์ง์ ์๋ก ์ฐ์ ์์กด๊ถ์ ๊ฐ๋ ๋น์๊ฒ @Primary๋ฅผ ๋ถํ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
@Component
@Primary
@Qualifier("mainDp")
public class FixDiscountPolicy implements DiscountPolicy{
@Primary์ @Qualifier์ค์์๋ @Qualifier๊ฐ ์ฐ์ ๊ถ์ด ๋์ต๋๋ค.
@PostConstructor
์์ฑ์๊ฐ ์คํ๋ ์ดํ์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ ์์ ์ ํ ๋ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ .
@PreDestroy
์๋ฉธ์๊ฐ ์คํ๋๊ธฐ ์ด์ ์ ์คํํ๋ ๋ฉ์๋์์ ์๋ ค์ฃผ๋ ์ด๋ ธํ ์ด์ .
@Scope
๋น ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ค์ ํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ๋น ์ค์ฝํ๋ก๋ singleton๊ณผ prototype์ด ์๋ค.
singleton์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ์ง์ ๊น์ง ์ ์ง๋์ง๋ง,
prototype์ ๊ฒฝ์ฐ ๋น์ ์์ฑ-> ์์กด๊ด๊ณ ์ฃผ์ ๊น์ง๋ง ์ ์ง๋๋ค. (ํด๋ผ์ด์ธํธ์ ๋ฆฌํด๋๊ณ ์๋ฉธ๋จ)
์น ์ค์ฝํ๋ก๋ request, session ๋ฑ์ด ์์.
'๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Boot CRUD API ๊ตฌํ (1) - ์๊ตฌ์ฌํญ ๋ถ์, ๋ฐ์ด๋ฒํ ์ด์ค ์ค๊ณ, ๋๋ฉ์ธ ์ค๊ณ (0) | 2023.05.26 |
---|---|
Spring Boot CRUD API ๊ตฌํ (1) | 2023.05.24 |
Spring / Web ์ค์ฝํ (0) | 2023.02.13 |
Spring / Bean Scope (0) | 2023.02.11 |
Spring / ์คํ๋ง ๋น Life-cycle callback (0) | 2023.02.10 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422