๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ•Š๏ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค

SpringBoot Part1-2

by hyeon-z 2023. 6. 21.

 

1. Inversion of Control(์ œ์–ด์˜ ์—ญ์ „)

 

IoC๋ž€ ์ œ์–ด์˜ ํ๋ฆ„์ด ์—ญ์ „๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

ํ•ด๋‹น ์ƒํ™ฉ์—์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์ด ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ์„ ํƒ, ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

๐Ÿ’ก ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ œ์–ด์˜ ๊ถŒํ•œ์ด ๊ฐ์ฒด ์ž์‹ ์—๊ฒŒ ์—†๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ๋‹ค.

=> ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ „์ฒด ํ๋ฆ„์˜ ์ œ์–ด ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
=> ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ๋ฆ„์„ ์ฃผ๋„ํ•˜๋ฉด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

SpringBoot Part1-1์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

public class Main {
    public static void main(String[] args) {
        FixedAmountVoucher fixedAmountVoucher = new FixedAmountVoucher(10L);
        Order order = new Order(fixedAmountVoucher);
    }
}

Order ์—”ํ„ฐํ‹ฐ๊ฐ€ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

=> ๋ชจ๋“  ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ(Order)์—์„œ ์ œ์–ดํ•œ๋‹ค.

 

๊ธฐ์กด ๊ตฌ์กฐ ๋ณ€๊ฒฝ

OrderContext: ์ฃผ์š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„ ์„ค์ • ๋‹ด๋‹น

OrderService: Order์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹ด๋‹น(OrderRepository, VoucherService๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.)

 

๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์ œ์–ด๊ถŒ์„ OrderContext์— ๋„˜๊ฒผ๋‹ค!! => IoC

* OrderContext๋Š” ์ผ์ข…์˜ IoC ์ปจํ…Œ์ด๋„ˆ

IoC์ปจํ…Œ์ด๋„ˆ: IoC๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ณต๊ฐ„, ๊ฐœ๋ณ„ ๊ฐ์ฒด๋“ค์˜ ์˜์กด ๊ด€๊ณ„ ์„ค์ •์ด ์ด๋ค„์ง€๊ณ  ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด๋ฅผ ๊ด€์žฅํ•œ๋‹ค.

 

๐Ÿค”Repository๊ฐ€ interface๋กœ ๊ตฌํ˜„๋œ ์ด์œ 

Repository๋Š” jdbc๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜๋„ ์žˆ๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—(ex. PostgreSQL, mongoDB) ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ ์„ ๊ณ ๋ คํ•ด ๋Œ€๋ถ€๋ถ„ interface๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

2. DDD

 

https://learn.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design

 

Aggregate

 

- Entity๋“ค์˜ ์ง‘ํ•ฉ, ์—ฐ๊ด€๋œ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ

- ํ•˜๋‚˜์˜ Root Entity๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด Root Entity๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ Entity๋“ค์— ์ ‘๊ทผํ•œ๋‹ค.

- ์ผ๊ด€์„ฑ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํŠธ๋žœ์žญ์…˜์˜ ๋‹จ์œ„๋กœ ๋‹ค๋ฃจ์–ด์ง„๋‹ค.

 

 

Repository

 

- ๋„๋ฉ”์ธ ๊ฐ์ฒด๋“ค์„ ์˜์†ํ™”ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ ์ €์žฅ์†Œ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ถ”์ƒํ™”ํ•œ๋‹ค.
- ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ €์žฅ, ๊ฒ€์ƒ‰, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

- Aggreagate๋‹จ์œ„๋กœ ๋™์ž‘ํ•œ๋‹ค.

- ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฃผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ตฌํ˜„์— ๋Œ€ํ•œ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ˆจ๊ธฐ๊ณ  ๋„๋ฉ”์ธ์˜ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์œ ์—ฐ์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์ธ๋‹ค.

 

Service

 

- Domain Model Layer์— ์กด์žฌ

- Repository๋ฅผ ์ด์šฉํ•ด์„œ ์‹ค์ œ Entity์— ๋Œ€ํ•œ ํŠธ๋žœ์ ์…˜์„ ์ผ์œผํ‚จ๋‹ค.

- ํŠน์ •ํ•œ ๋„๋ฉ”์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์—ฌ๋Ÿฌ ๊ฐ์ฒด ๊ฐ„์˜ ํ˜‘๋ ฅ์„ ์กฐ์ •ํ•˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์„ ๋‹ด๋‹นํ•œ๋‹ค.

- ๋„๋ฉ”์ธ ๊ฐ์ฒด์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ ๊ฐ์ฒด ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.

- ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋„๋ฉ”์ธ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค.


3. ApplicationContext

 

https://applepick.tistory.com/128

 

ApplicationContext, BeanFactory

 

ApplicationContext๋Š” BeanFactory๋ฅผ ์ƒ์†ํ•˜๊ณ  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ์„ฑ, ์กฐํ•ฉ, ์˜์กด๊ด€๊ณ„ ์„ค์ • ๋“ฑ์„ ์ œ์–ดํ•˜๋Š” IoC ๊ธฐ๋ณธ๊ธฐ๋Šฅ์€ BeanFactory๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.

 

https://docs.spring.io/spring-framework/reference/core/beans/beanfactory.html

ApplicationContext๊ฐ€ BeanFactory๋ฅผ ์ƒ์†ํ•˜๊ณ  ๊ทธ ์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„ ์ƒ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— BeanFactory์˜ ๊ธฐ๋Šฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

IoC Container

 

- ๊ฐœ๋ณ„ ๊ฐ์ฒด๋“ค์˜ ์˜์กด๊ด€๊ณ„ ์„ค์ •์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ณ  ๊ฐ์ฒด๋“ค์˜ ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด, ์กฐํ•ฉ๋“ฑ์„ ๊ด€์žฅํ•œ๋‹ค.

- ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

 

IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์Šคํ”„๋ง์—์„œ๋Š” ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณตํ•œ๋‹ค!

 

Bean

 

- IoC Container๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด

- @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•˜์—ฌ IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ƒ์„ฑ, ๊ด€๋ฆฌ๋œ๋‹ค.

 

Configuration Metadata (์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)

 

Spring Framework์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ์„ ์ •์˜ํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด

=> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ์ฒด๋“ค์„ ๋„์‹ํ™”ํ•œ ๊ฒƒ

 

- Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ์ฒด ์ƒ์„ฑ, ์˜์กด์„ฑ ์ฃผ์ž…, ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

- ApplicationContext๋Š” ์‹ค์ œ ๋งŒ๋“ค์–ด์•ผํ•  ์ •๋ณด๋ฅผ Configuration Metadata๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ๋‹ค.

- ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•œ๋‹ค.

 

๐Ÿ“ข ์„ค์ • ๋ฐฉ์‹

 

๐Ÿ‘† ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜

@Component(+@Service, @Respository, @Controller)์„ ํ†ตํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜๊ณ  @Autowired๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

 

๐Ÿ‘† ์ž๋ฐ” ๊ธฐ๋ฐ˜

 Java ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹

 

ํŠน์ง•

- @Configuration์„ ์‚ฌ์šฉํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ , @Bean์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ตฌ์„ฑ์„ ์ •์˜ํ•œ๋‹ค. 

- AnnotationConfigApplicationContext ํด๋ž˜์Šค๋Š” Java ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์—ฌ Spring ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
- AnnotationConfigApplicationContext๋Š” @Configuration ์–ด๋…ธํ…Œ์ด์…˜์ด ์ง€์ •๋œ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„ ๊ตฌ์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.


ex) AppConfig๋Š” @Configuration ์–ด๋…ธํ…Œ์ด์…˜์ด ์ง€์ •๋œ Java ์„ค์ • ํด๋ž˜์Šค

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
OrderService orderService = context.getBean(OrderService.class);

 

๐Ÿ‘† XML ๊ธฐ๋ฐ˜

applicationContext.xml๊ณผ ๊ฐ™์€ XML ํŒŒ์ผ์— ๊ฐ์ฒด์˜ ์ •์˜์™€ ๊ตฌ์„ฑ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹

 

ํŠน์ง•

- XML ํŒŒ์ผ์€ applicationContext.xml์œผ๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, <bean> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์˜์กด์„ฑ ์ฃผ์ž…, ์†์„ฑ ์„ค์ • ๋“ฑ์„ ์ •์˜ํ•œ๋‹ค.

- GenericXmlApplicationContext ํด๋ž˜์Šค๋Š” XML ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์—ฌ Spring ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
- GenericXmlApplicationContext๋Š” Spring ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ XML ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

 

ex)

GenericXmlApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");

4. Dependency Injection

 

- IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•˜๋‚˜์˜ ํŒจํ„ด

- ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์„ค์ •ํ•ด์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด

 

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด๋Š” ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•œ๋‹ค.

ํ•˜์ง€๋งŒ DI ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ์™ธ๋ถ€์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

DI ์ข…๋ฅ˜

 

๐Ÿ‘† ์ƒ์„ฑ์ž ์ฃผ์ž… (Constructor Injection)

๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹

๊ฐ์ฒด์˜ ์ƒ์„ฑ ์‹œ์ ์— ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ‘† setter ์ฃผ์ž…(Setter Injection)

๊ฐ์ฒด์˜ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹

์˜์กด์„ฑ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด setter ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

๐Ÿ‘† ํ•„๋“œ ์ฃผ์ž…(Field Injection)

์˜์กด์„ฑ์„ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•„๋“œ๋กœ ์ง์ ‘ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹

์ฃผ๋กœ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ์— ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

 

@Bean
public VoucherService voucherService(VoucherRepository voucherRepository) {
    return new VoucherService(voucherRepository);
}

@Bean
public OrderService orderService(VoucherService voucherService, OrderRepository orderRepository) {
    return new OrderService(voucherService, orderRepository);
}

'๐Ÿ•Š๏ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

SpringBoot Part1-5  (0) 2023.06.26
SpringBoot Part1-4  (0) 2023.06.23
SpringBoot Part1-3  (0) 2023.06.22
SpringBoot Part 1-1  (0) 2023.06.21
ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ JAVA - OOP  (0) 2023.06.11

๋Œ“๊ธ€