๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š์ฝ์€ ์ฑ… ์ •๋ฆฌ/์ž๋ฐ” ๊ฐ์ฒด์ง€ํ–ฅ ์›๋ฆฌ์™€ ์ดํ•ด

[์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด] 7์žฅ : ์Šคํ”„๋ง ์‚ผ๊ฐํ˜•๊ณผ ์„ค์ • ์ •๋ณด

์Šคํ”„๋ง์„ ์ดํ•ดํ•˜๋ ค๋ฉด POJO๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํ”„๋ง ์‚ผ๊ฐํ˜•์ด๋ผ๋Š” ์• ์นญ์„ ๊ฐ€์ง„ IoC/DI, AOP, PSA๋ผ๊ณ  ํ•˜๋Š” ์Šคํ”„๋ง์˜ 3๋Œ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์— ๋Œ€ํ•ด ์ดํ•ด๊ฐ€ ํ•„์ˆ˜๋‹ค.

์Šคํ”„๋ง ์‚ผ๊ฐํ˜•๊ณผ ์„ค๊ณ„ ์ •๋ณด

์Šคํ”„๋ง ์‚ผ๊ฐํ˜•์„ ์ดํ•ดํ•˜๋ฉด ๊ทธ ์กฐํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜๋งŽ์€ ๋ณต์žกํ•œ ๋ถ€๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํ”„๋ง ์‚ผ๊ฐํ˜•์— ๋Œ€ํ•ด์„œ ํ•œ๋ฒˆ ์•Œ์•„๋ณด์ž.

 

IoC/DI - ์ œ์–ด์˜ ์—ญ์ „/์˜์กด์„ฑ ์ฃผ์ž…

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์˜์กด์„ฑ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

ex) ์šด์ „์ž๊ฐ€ ์ž๋™์ฐจ๋ฅผ ์ƒ์‚ฐํ•œ๋‹ค. -> ์ž๋™์ฐจ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ํƒ€์ด์–ด๋ฅผ ์ƒ์‚ฐํ•œ๋‹ค. (์šด์ „์ž -> ์ž๋™์ฐจ -> ํƒ€์ด์–ด) ์˜์กด

-> ์ „์ฒด(์˜์กดํ•˜๋Š” ๊ฐ์ฒด)๊ฐ€ ๋ถ€๋ถ„(์˜์กด๋˜๋Š” ๊ฐ์ฒด)์— ์˜์กดํ•œ๋‹ค.

 

์ง‘ํ•ฉ(Aggregation) ๊ด€๊ณ„: ๋ถ€๋ถ„์ด ์ „์ฒด์™€ ๋‹ค๋ฅธ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์„ฑ(Compostion) ๊ด€๊ณ„: ๋ถ€๋ถ„์€ ์ „์ฒด์™€ ๊ฐ™์€ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

 

์›ํ•˜๋Š” ํด๋ž˜์Šค ๋‹ค์ด์–ด ๊ทธ๋žจ

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ: ์˜์กด ๊ด€๊ณ„ ์ง์ ‘ ํ•ด๊ฒฐ

์ž๋ฐ”๋งŒ์œผ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์ง์ ‘ ํ•ด๊ฒฐํ•˜๋Š” ์ฝ”๋“œ

* Car ๊ฐ์ฒด ์ƒ์„ฑ์ž์—์„œ new Car()

interface Tire {
	String getBrand();
}

public class KoreaTire implements Tire {
	public String getBrand() {
		return "์ฝ”๋ฆฌ์•„ ํƒ€์ด์–ด";
	}
}

public class AmericaTire implements Tire {
	public String getBrand() {
		return "๋ฏธ๊ตญ ํƒ€์ด์–ด";
	}
}

Carํด๋ž˜์Šค์—์„œ tire์˜ ์˜์กด์„ฑ์„ ์ง์ ‘ ์ƒ์„ฑ ํ›„ ์—ฐ๊ฒฐ ์‹คํ–‰

public class Car {
	Tire tire;

	public Car() {
		tire = new KoreaTire();
		// tire = new AmericaTire();
	}

	public String getTireBrand() {
		return "์žฅ์ฐฉ๋œ ํƒ€์ด์–ด: " + tire.getBrand();
	}
}

์ž๋™์ฐจ์˜ ์ƒ์„ฑ์ž ์ฝ”๋“œ์—์„œ ์ง์ ‘ ํƒ€์ด์–ด๋ฅผ ์ƒ์„ฑํ•ด ์ฐธ์กฐ๋ณ€์ˆ˜์™€ ์—ฐ๊ฒฐํ•œ๋‹ค.

-> Car ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌ์ฒดํ™”๋œ KoreadTire์—๋„ ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.

 

์Šคํ”„๋ง ์—†์ด ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๊ธฐ 1 - ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์ฃผ์ž…

** ๋ง๋กœ ํ’€์–ด์„œ ํ‘œํ˜„ **

์šด์ „์ž๊ฐ€ ํƒ€์ด์–ด๋ฅผ ์ƒ์‚ฐํ•œ๋‹ค.

์šด์ „์ž๊ฐ€ ์ž๋™์ฐจ๋ฅผ ์ƒ์‚ฐํ•˜๋ฉด์„œ ํƒ€์ด์–ด๋ฅผ ์žฅ์ฐฉ์‹œํ‚จ๋‹ค.

 

** ์ž๋ฐ” ํ‘œํ˜„ **

Tire tire = new KoreaTire();

Car car = new Car(tire); --> ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋˜๋Š” tire ์˜์กด์„ฑ

์ž๋ฐ” ์ฝ”๋“œ

public class Car {
	Tire tire;

	public Car(Tire tire) { // ์ƒ์„ฑ์ž ์ฃผ์ž…
		this.tire = tire;
	}

	public String getTireBrand() {
		return "์žฅ์ฐฉ๋œ ํƒ€์ด์–ด: " + tire.getBrand();
	}
}
public class Driver {
	public static void main(String[] args) {
		Tire tire = new KoreaTire();
		//Tire tire = new AmericaTire();
		Car car = new Car(tire);

		System.out.println(car.getTireBrand());
	}
}

๋ฌด์—‡์ด ๊ฐœ์„ ๋์„๊นŒ?

๊ธฐ์กด์˜ ์ง์ ‘ Car๊ฐ€ tire๋ฅผ ์ƒ์‚ฐํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ tire๊ต์ฒด ์‹œ Car์˜ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋ฏ€๋กœ ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ํ™•์žฅ์„ฑ๋„ ๋–จ์–ด์กŒ๋‹ค.

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

 

๋”ฐ๋ผ์„œ, Car๊ฐ์ฒด๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์ถ”์ƒ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ฉด์„œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  Car๊ฐ์ฒด๋Š” ์ˆ˜์ • ์—†์ด ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

์ƒ์„ฑ์ž ์ฃผ์ž…๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค (๋‹ค๋ฅธ ์ฃผ์ž…๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ) [์ฐธ๊ณ ]

  • ์˜์กด๊ด€๊ณ„ ์„ค์ •์ด ๋˜์ง€ ์•Š์œผ๋ฉด ๊ฐ์ฒด์ƒ์„ฑ ๋ถˆ๊ฐ€ -> ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ธ์ง€ ๊ฐ€๋Šฅ, NPE ๋ฐฉ์ง€
  • ์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ํ•„๋“œ๋ฅผ final ๋กœ ์„ ์–ธ๊ฐ€๋Šฅ -> Immutable
  • (์Šคํ”„๋ง์—์„œ) ์ˆœํ™˜์ฐธ์กฐ ๊ฐ์ง€๊ฐ€๋Šฅ -> ์ˆœํ™˜์ฐธ์กฐ์‹œ ์•ฑ๊ตฌ๋™ ์‹คํŒจ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์šฉ์ด ( DI์˜ ํ•ต์‹ฌ์€ ๊ด€๋ฆฌ๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ DI ์ปจํ…Œ์ด๋„ˆ์— ์˜์กด์„ฑ์ด ์—†์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๋…๋ฆฝ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ POJO(Plain Old Java Ojbect) ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ์„œ๋„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค)

[์ฃผ์ž… ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ์žฅ๋‹จ์  ์ฐธ๊ณ  ๋งํฌ]

 

์Šคํ”„๋ง ์—†์ด ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๊ธฐ 2 - ์†์„ฑ์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

ex) car.setTire(tire);

 

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ•˜๋ฉด ๋” ์ด์ƒ ํƒ€์ด์–ด๋ฅผ ๊ต์ฒดํ•  ์ˆ˜ ์—†๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•  ๋•Œ ํƒ€์ด์–ด๋ฅผ ๊ต์ฒดํ•˜๋ ค๋ฉด ์ƒ์„ฑ์ž ์ฃผ์ž…์ด ์•„๋‹Œ ์†์„ฑ์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์š”ํ•˜๋‹ค. (ํƒ€์ด์–ด ์ƒ์‹œ ๊ต์ฒด๋ฅผ ์œ„ํ•œ ์†์„ฑ ์ฃผ์ž…)

์Šคํ”„๋ง์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… - XML ํŒŒ์ผ ์‚ฌ์šฉ

** ๋ง๋กœ ํ’€์–ด์„œ ํ‘œํ˜„ **

์šด์ „์ž๊ฐ€ ์ข…ํ•ฉ ์‡ผํ•‘๋ชฐ(์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ)์—์„œ ํƒ€์ด์–ด๋ฅผ ๊ตฌ๋งคํ•œ๋‹ค.

์šด์ „์ž๊ฐ€ ์ข…ํ•ฉ ์‡ผํ•‘๋ชฐ์—์„œ ์ž๋™์ฐจ๋ฅผ ๊ตฌ๋งคํ•œ๋‹ค.

์šด์ „์ž๊ฐ€ ์ž๋™์ฐจ์— ํƒ€์ด์–ด๋ฅผ ์žฅ์ฐฉํ•œ๋‹ค.

public class Driver {
	public static void main(String[] args) {
		
		ApplicationContext context = new ClassPathXmlApplicationContext("expert002/expert002.xml");

		// Car car = (Car)context.getBean("car");
		Car car = context.getBean("car", Car.class);

		// Tire tire = (Tire)context.getBean("tire");
		Tire tire = context.getBean("tire", Tire.class);

		car.setTire(tire);

		System.out.println(car.getTireBrand());
	}
}

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์Šคํ”„๋ง ์—†์ด ์˜์กด์„ฑ ์ฃผ์ž…ํ•  ๋•Œ์™€ ๋น„๊ตํ•ด์„œ Driver์ฝ”๋“œ ์™ธ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ์ด ์—†์—ˆ๋‹ค.

Driver ์ฝ”๋“œ์—์„œ๋Š” ์ž์ฒด ์ƒ์‚ฐํ•˜๋˜ Car์™€ Driver๋ฅผ ์ข…ํ•ฉ์‡ผํ•‘๋ชฐ(์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ)์—์„œ ๊ตฌ์ž…ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ข…ํ•ฉ์‡ผํ•‘๋ชฐ(์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ)์— Car์™€ Driver์ •๋ณด๋Š” ์–ด๋””์— ์žˆ์„๊นŒ?

-> XML ํŒŒ์ผ 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="tire" class="expert002.KoreaTire"></bean>

	<bean id="americaTire" class="expert002.AmericaTire"></bean>

	<bean id="car" class="expert002.Car"></bean>

</beans>

Only ์ž๋ฐ”์—์„œ ์Šคํ”„๋ง์„ ๋„์ž…ํ•ด์„œ ์–ป๋Š” ์žฅ์ ์ด ๋ฌด์—‡์ผ๊นŒ?

์ž๋™์ฐจ์˜ ํƒ€์ด์–ด ๋ธŒ๋žœ๋“œ๋ฅผ (ํ•œ๊ตญ -> ๋ฏธ๊ตญ)์œผ๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ทธ ๋ฌด์—‡๋„ ์žฌ์ปดํŒŒ์ผ/์žฌ๋ฐฐํฌํ•˜์ง€ ์•Š์•„๋„ XML ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์Šคํ”„๋ง์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… - ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ(XML)์—์„œ ์†์„ฑ ์ฃผ์ž…

public class Driver {
	public static void main(String[] args) {
		
		ApplicationContext context = new ClassPathXmlApplicationContext("expert003/expert003.xml");

		//Car car = (Car)context.getBean("car");
		Car car = context.getBean("car", Car.class);

		System.out.println(car.getTireBrand());
	}
}

์œ„ ์ฝ”๋“œ๋Š” tire์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ Car์— ์ฃผ์ž…ํ•˜๋Š” ๋ถ€๋ถ„์ด ์‚ฌ๋ผ์กŒ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ tire๋Š” Car์— ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋˜๋Š”๊ฑธ๊นŒ?

XML ํŒŒ์ผ

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="koreaTire" class="expert003.KoreaTire"></bean>

	<bean id="americaTire" class="expert003.AmericaTire"></bean>

	<bean id="car" class="expert003.Car">
		<property name="tire" ref="koreaTire"></property>
		<!--  
		<property name="tire" ref="americaTire"></property>
		-->
	</bean>
	
</beans>

 

์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

XML ํŒŒ์ผ์—์„œ tire์— koreaTire๋ฅผ ๊ฒฐํ•ฉํ•ด์ฃผ๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ” ์ฝ”๋“œ์—์„œ๋Š” ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ดํ•ดํ•˜๊ธด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ 'ํ˜„์‹ค์ ์ด๊ณ ' '์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด' ๋ฐฉ์‹์ด๋‹ค.

 

-> ref์˜ ๊ฐ’์„ americalTire๋กœ ๋ฐ”๊พธ๋ฉด ์žฅ์ฐฉ๋œ ํƒ€์ด์–ด๊ฐ€ ๋ฏธ๊ตญ ํƒ€์ด์–ด๋กœ ๋ฐ”๋€๋‹ค.

 

์Šคํ”„๋ง์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… - @Autowired๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ 3๋Œ€ ์Šคํ‚ฌ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค...

1. Copy & Paste

2. Divide & Conquer

3. Creative & Idleness (์ฐฝ์กฐ์  ๊ฒŒ์œผ๋ฆ„)

 

3๋ฒˆ ์˜ˆ์‹œ) i++, for, for-each๋Š” ์ด๋ฏธ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋”์šฑ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๋งŒ๋“  ๋ฐฉ๋ฒ•๋“ค์ด๋‹ค.

 

์Šคํ”„๋ง์˜ ์ฐฝ์กฐ์  ๊ฒŒ์œผ๋ฆ„์€? -> @Autowired

 

๋ฐ˜๋“œ์‹œ ์„ค์ •์ž ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด tire๊ฐ’์„ ์ฃผ์ž…ํ•ด์•ผํ• ๊นŒ?

 

"@Autowired Tire tire"๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ์„ค์ •์ž ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด ์„ค์ •์ž ๋ฉ”์„œ๋“œ ๋Œ€์‹  ์†์„ฑ์„ ์ฃผ์ž…ํ•ด์ค€๋‹ค.

 

  • ๊ธฐ์กด ์„ค์ • ํŒŒ์ผ
	<bean id="car" class="expert003.Car">
		<property name="tire" ref="koreaTire"></property>
	</bean>
  • @Autowired ํ›„ ์ƒˆ๋กœ์šด ์„ค์ • ํŒŒ์ผ
	<bean id="car" class="expert003.Car"></bean>

property ํƒœ๊ทธ๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค! @Autowired๋ฅผ tire์— ์„ค์ •ํ•ด์คŒ์œผ๋กœ์„œ car์˜ property๋ฅผ ์ž๋™์œผ๋กœ ์—ฎ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

-> XML ํŒŒ์ผ ์„ค์ •์„ @Autowired ์„ค์ •์œผ๋กœ ๋Œ€์ฒดํ•จ

 

@Autowired๋ฅผ ํ†ตํ•œ ์†์„ฑ ๋งค์นญ ๊ทœ์น™

์†์„ฑ ๋งค์นญ ๊ทœ์น™

@Autowired ์„ค์ •๋œ ์†์„ฑ๋“ค์€ ์œ„์˜ ๊ทœ์น™์„ ํ†ตํ•ด์„œ ๋“ฑ๋ก๋œ ๋นˆ์„ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค.

 

์Šคํ”„๋ง์„ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… - @Resource๋ฅผ ํ†ตํ•œ ์†์„ฑ ์ฃผ์ž…

@Resource๋Š” @Autowired์™€ ๊ฐ™์ด ์†์„ฑ์„ ์ž๋™์œผ๋กœ ์—ฎ์–ด์ค€๋‹ค.

 

ํ•˜์ง€๋งŒ @Autowired๋Š” ์Šคํ”„๋ง์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด๊ณ  @Resource๋Š” ์ž๋ฐ” ํ‘œ์ค€ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

๋˜ํ•œ ๋‘˜์€ ๊ฒ€์ƒ‰๋ฐฉ์‹์—์„œ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋‹ค. ๋ฆฌ์†Œ์Šค๋Š” id๋จผ์ € type ํ›„์ˆœ์œ„์ด๊ณ  Autowired๋Š” ๋ฐ˜๋Œ€์ด๋‹ค.

AOP - Aspect? ๊ด€์ ? ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌ? ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ?

AOP-๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

์Šคํ”„๋ง DI๊ฐ€ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์ฃผ์ž…์ด๋ผ๋ฉด ์Šคํ”„๋ง AOP๋Š” ๋กœ์ง(code)์— ๋Œ€ํ•œ ์ฃผ์ž…์ด๋‹ค.

 

์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„

ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ

์ž…๊ธˆ, ์ถœ๊ธˆ, ์ด์ฒด ๋ชจ๋“ˆ ๋ชจ๋‘ <๋กœ๊น…, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜> ๊ธฐ๋Šฅ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ๋‹ค์ˆ˜์˜ ๋ชจ๋“ˆ์— ๊ณตํ†ต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ "ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ"๋ผ๊ณ  ํ•œ๋‹ค.

 

DB ์ปค๋„ฅ์…˜์„ ์ƒ๊ฐํ•ด๋ณด์ž.

์ฟผ๋ฆฌ(ํ•ต์‹ฌ๊ด€์‹ฌ์‚ฌ)๋ฅผ ๋‚ ๋ฆฌ๊ธฐ ์ „ DB ์ปค๋„ฅ์…˜์„ ์—ฐ๊ฒฐ(ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ)ํ•ด์•ผ๋งŒ ํ•œ๋‹ค. (์ฝ”๋“œ = ํ•ต์‹ฌ๊ด€์‹ฌ์‚ฌ + ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ)

 

'ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌ'๋Š” ๋ชจ๋“ˆ๋ณ„๋กœ ๋‹ค๋ฅด์ง€๋งŒ 'ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ'๋Š” ๋ชจ๋“ˆ๋ณ„๋กœ ๋ฐ˜๋ณต๋˜์–ด ์ค‘๋ณตํ•ด์„œ ๋‚˜ํƒ€๋‚œ๋‹ค.

-> "๋ฐ˜๋ณต/์ค‘๋ณต์€ ๋ถ„๋ฆฌํ•ด์„œ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋ผ"

 

AOP๋กœ์ง ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„

๋ฉ”์„œ๋“œ์— ๋กœ์ง์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋“ค

Around, Before, After, AfterReturning, AfterThrowing -> ์ด 5๊ฐœ ์œ„์น˜์— ์ฃผ์ž… ๋กœ์ง(์ฝ”๋“œ) ์ฃผ์ž… ๊ฐ€๋Šฅ

 

** ๊ธฐ์กด์ฝ”๋“œ  **

public class Boy {
	public void runSomething() {
		System.out.println("์—ด์‡ ๋กœ ๋ฌธ์„ ์—ด๊ณ  ์ง‘์— ๋“ค์–ด๊ฐ„๋‹ค.");

		try {
			System.out.println("์ปดํ“จํ„ฐ๋กœ ๊ฒŒ์ž„์„ ํ•œ๋‹ค.");
		} catch (Exception ex) {
			if (ex.getMessage().equals("์ง‘์— ๋ถˆ๋‚จ")) {
				System.out.println("119 ์— ์‹ ๊ณ ํ•œ๋‹ค.");
			}
		} finally {
			System.out.println("์†Œ๋“ฑํ•˜๊ณ  ์ž”๋‹ค.");
		}

		System.out.println("์ž๋ฌผ์‡ ๋ฅผ ์ž ๊ทธ๊ณ  ์ง‘์„ ๋‚˜์„ ๋‹ค.");
	}
}

ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌ์™€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ํ•œ ๋ฉ”์„œ๋“œ์— ๊ฐ™์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

 

** ๊ฐœ์„  ์ฝ”๋“œ **

๋จผ์ € Boy๋ฅผ Person์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์ž

public interface Person {
	void runSomething();
}

public class Boy implements Person {
	public void runSomething() {
		System.out.println("์ปดํ“จํ„ฐ๋กœ ๊ฒŒ์ž„์„ ํ•œ๋‹ค.");
	}
}

 

XMLํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ž

<?xml version="1.0" encoding="UTF-8"?>
<beans 
  ์ƒ๋žต...>

	<aop:aspectj-autoproxy />
	<bean id="myAspect" class="aop002.MyAspect" />
	<bean id="boy" class="aop002.Boy" />
	<bean id="girl" class="aop002.Girl" />
    
</beans>

 

MyAspect์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž.

@Aspect
public class MyAspect {
	@Before("execution(* runSomething())")
	public void before(JoinPoint joinPoint) {
		System.out.println("์–ผ๊ตด ์ธ์‹ ํ™•์ธ: ๋ฌธ์„ ๊ฐœ๋ฐฉํ•˜๋ผ");
		// System.out.println("์—ด์‡ ๋กœ ๋ฌธ์„ ์—ด๊ณ  ์ง‘์— ๋“ค์–ด๊ฐ„๋‹ค.");
	}
}
  • @Aspect๋Š” ์ด ํด๋ž˜์Šค๋ฅผ ์ด์ œ AOP์—์„œ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
  • @Before๋Š” ๋Œ€์ƒ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „์— ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ

๋ฉ”์„œ๋“œ์˜ joinPoint๋Š” Boy.runSomething()์„ ์˜๋ฏธํ•œ๋‹ค. ์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ผ๊ตด ์ธ์‹ํ•˜๊ณ  ๋ฌธ์„ ์—ฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์‹ํ•ด ์ž๋™์œผ๋กœ ๋ฌธ์„ ์—ด์–ด์ค€๋‹ค.

 

์‚ฌ์‹ค Boy์˜ ํ•ต์‹ฌ๊ด€์‹ฌ์‚ฌ๋งŒ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด 4๊ฐœ์˜ ํŒŒ์ผ(์ธํ„ฐํŽ˜์ด์Šค, Boy, XML, AspectํŒŒ์ผ)์˜ ์ˆ˜์ •์ด ํ•„์š”ํ–ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ์ด๋กœ ์ธํ•ด Boy๋Š” ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌ๋งŒ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๊ณ  ์ถ”๊ฐ€ ๊ฐœ๋ฐœ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ•ด์กŒ๋‹ค.

๋˜ํ•œ, AOP๋ฅผ Boy.java์— ์ ์šฉํ•จ์œผ๋กœ์จ ๋‹จ์ผ์ฑ…์ž„์›์น™๋„ ์ž์—ฐ์Šค๋ ˆ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

AOP๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์— ์ฃผ์ž…

  • Boy๊ฐ€ Person์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 
    • ์Šคํ”„๋ง AOP๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • MyAspect๊ฐ€ ์ถ”๊ฐ€๋œ ์ด์œ 
    • ๊ณตํ†ต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ˆ„๊ตฐ๊ฐ€๋Š” ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ (MyAspect๊ฐ€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ฒ˜๋ฆฌํ•จ)
    • XML์—์„œ ๋นˆ์„ ์„ค์ •ํ•ด ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ก์‹œ ํŒจํ„ด์„ ์ด์šฉํ•ด ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌ์— ์ฃผ์ž…ํ•˜๊ธฐ

ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•œ ๋ฉ”์„œ๋“œ ๊ฐ„์ ‘ํ˜ธ์ถœ

ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ

๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด "ํ”„๋ก์‹œ"๊ฐ€  ๊ทธ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ง„์งœ ๊ฐ์ฒด์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

์ด๋•Œ "ํ”„๋ก์‹œ"๋Š” ๊ทธ๋ƒฅ ์ „๋‹ฌ๋งŒ ํ•˜์ง€ ์•Š๊ณ  ์ฃผ๊ณ  ๋ฐ›๋Š” ๋‚ด์šฉ์„ ๊ฐ์‚ฌํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฉ”์„œ๋“œ Caller์™€ Callee๋Š” ํ”„๋ก์‹œ์— ์กด์žฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ์˜ค์ง ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋งŒ์ด ํ”„๋ก์‹œ์˜ ์กด์žฌ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ Caller, Callee ํ”„๋ก์‹œ๊ฐ€ ๋ฌด์Šจ ์ผ์„ ํ•˜๋“  ์ „ํ˜€ ์ƒ๊ด€์—†์ด ์ž์‹ ์˜ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ๋Š” XMLํŒŒ์ผ์˜ <aop:aspectj-autoproxy />์ง€์‹œ์ž๋กœ ํ”„๋ก์‹œ์˜ ์กด์žฌ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์Šคํ”„๋ง AOP์˜ ํ•ต์‹ฌ

  • ์Šคํ”„๋ง AOP๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜
  • ์Šคํ”„๋ง AOP๋Š” ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜
  • ์Šคํ”„๋ง AOP๋Š” ๋Ÿฐํƒ€์ž„ ๊ธฐ๋ฐ˜

PSA - ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ถ”์ƒํ™”

์„œ๋น„์Šค ์ถ”์ƒํ™”์˜ ์˜ˆ๋กœ JDBC๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค. JDBC๋ผ๊ณ  ํ•˜๋Š” ํ‘œ์ค€ ์ŠคํŽ™์ด ์žˆ๊ธฐ์— ์˜ค๋ผํด์„ ์‚ฌ์šฉํ•˜๋“  MySQL์„ ์‚ฌ์šฉํ•˜๋“  MS-SQL์„ ์‚ฌ์šฉํ•˜๋“  Connection, Statement, ResultSet์„ ์ด์šฉํ•ด ๊ณตํ†ต๋œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…๋ฅ˜์™€ ๊ด€๊ณ„์—†์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ๋””์ž์ธ ํŒจํ„ด์—์„œ ์„ค๋ช…ํ–ˆ๋˜ ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ํ™œ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋‹ค์ˆ˜์˜ ๊ธฐ์ˆ ์„ ๊ณตํ†ต์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๊ฒƒ -> ์„œ๋น„์Šค ์ถ”์ƒํ™”

 

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์„œ๋น„์Šค ์ถ”์ƒํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ œ๊ณต!!!!

 

์˜ˆ๋ฅผ ๋“ค๋ฉด OXM(Object XML Mapping)๊ธฐ์ˆ ์—๋Š” Castor, XMLBeans ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์ด ์žˆ๋Š”๋ฐ ์ด ๊ธฐ์ˆ ๋“ค์˜ API๋Š” ๋ชจ๋‘ ์ œ๊ฐ๊ฐ์ด๋‹ค.

์ด๋•Œ ์ œ๊ฐ๊ฐ์ธ API๋ฅผ ์œ„ํ•œ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์–ด๋–ค ๊ธฐ์ˆ ์„ ์“ฐ๋˜ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๋‹ค๋ฅธ ๊ธฐ์ˆ ๋กœ์˜ ๊ต์ฒด ๋˜ํ•œ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

PSA ์˜ˆ) ORM, ์บ์‹œ, ํŠธ๋žœ์žญ์…˜, OXM ๋“ฑ

 

"์ด์ฒ˜๋Ÿผ ์„œ๋น„์Šค ์ถ”์ƒํ™”๋ฅผ ํ•ด์ฃผ๋ฉด์„œ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— PSA(์ผ๊ด€์„ฑ ์žˆ๋Š” ์ถ”์ƒํ™”)๋ผ๊ณ  ํ•œ๋‹ค."

 

'๐Ÿ“š์ฝ์€ ์ฑ… ์ •๋ฆฌ > ์ž๋ฐ” ๊ฐ์ฒด์ง€ํ–ฅ ์›๋ฆฌ์™€ ์ดํ•ด' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด] 6์žฅ : ์Šคํ”„๋ง์ด ์‚ฌ๋ž‘ํ•œ ๋””์ž์ธ ํŒจํ„ด  (0) 2021.05.13
[์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด] 5์žฅ : ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ 5์›์น™  (0) 2021.04.30
[์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด] 4์žฅ : ์ž๋ฐ”๊ฐ€ ํ™•์žฅํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ  (0) 2021.04.27
[์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด] 3์žฅ : ์ž๋ฐ”์™€ ๊ฐ์ฒด ์ง€ํ–ฅ  (0) 2021.04.22
[์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด] 2์žฅ : ์ž๋ฐ”์™€ ์ ˆ์ฐจ์ /๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ  (0) 2021.04.21