Ch01. Spring

SeoYaeJunยท2025๋…„ 9์›” 8์ผ

2ํ•™๊ธฐ SW ๊ต์œก

๋ชฉ๋ก ๋ณด๊ธฐ
7/8

/*Spring ๊ธฐ๋ณธ ์˜์กด๋ฌธ๋ฒ•*/

package pack;
class Baduk{
	AI ag;
	Baduk(AI ag){  //์ƒ์„ฑ์ž - ์˜์กด๊ฐ์ฒด์—์„œ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์Œ. 
		this.ag = ag;
		System.out.println("๋Œ€๊ตญ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.");
	}
	void play() {ag.play();}   // ์ฃผ์ž…๋ฐ›์€ ai์—์„œ์˜ play ์‹คํ–‰
	void stop() {ag.stop();}
}  
//์˜์กด์„ฑ ์ฃผ์ž…(DI): Baduk์ด ์ง์ ‘ AlphaGo๋‚˜ BetaGo๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ์™ธ๋ถ€(main)์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฌ์šฉ.
interface AI{
	abstract void play();
	abstract void stop();
}
class AlphaGo implements AI{
	public void play() {System.out.println("์ธ๊ณต์ง€๋Šฅ์€ ์•ŒํŒŒ๊ณ ์ž…๋‹ˆ๋‹ค.");}
	public void stop() {System.out.println("์•ŒํŒŒ๊ณ ๊ฐ€ ๊ฒŒ์ž„์„ ์ค‘๋‹จ.");}
}
class BetaGo implements AI{
	public void play() {System.out.println("์ธ๊ณต์ง€๋Šฅ์€ ๋ฒ ํƒ€๊ณ ์ž…๋‹ˆ๋‹ค.");}
	public void stop() {System.out.println("๋ฒ ํƒ€๊ณ  ๊ฒŒ์ž„์„ ์ค‘๋‹จ.");}
} // ๊ฐ™์€ Interface์ง€๋งŒ ํ–‰๋™์€ ๋‹ค๋ฅธ "๋‹คํ˜•์„ฑ ์‹คํ˜„"
public class Sample {
	public static void main(String[] args) {
		Baduk b1 = new Baduk(new AlphaGo()); // ์˜์กด์„ฑ Alphago ์ฃผ์ž…
		Baduk b2 = new Baduk(new BetaGo());	// ์˜์กด์„ฑ Betago ์ฃผ์ž…
		b1.play(); b1.stop(); // ์‹คํ–‰์ฝ”๋“œ
		b2.play(); b2.stop();
	}
}
/*
class A{}
interface IA{}
interface IB{}
interface IC{}
class B extends A implements IA, IB, IC{}
 */

๐Ÿ“Œ ์‹คํ–‰ ํ๋ฆ„ & ๊ฒฐ๊ณผ
Baduk b1 = new Baduk(new AlphaGo());
Baduk ์ƒ์„ฑ์ž ์‹คํ–‰ โ†’ "๋Œ€๊ตญ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค." ์ถœ๋ ฅ.
๋‚ด๋ถ€์ ์œผ๋กœ ag = new AlphaGo() ์ €์žฅ.
b1.play();
AlphaGo.play() ์‹คํ–‰ โ†’ "์ธ๊ณต์ง€๋Šฅ์€ ์•ŒํŒŒ๊ณ ์ž…๋‹ˆ๋‹ค." ์ถœ๋ ฅ.
b1.stop();
AlphaGo.stop() ์‹คํ–‰ โ†’ "์•ŒํŒŒ๊ณ ๊ฐ€ ๊ฒŒ์ž„์„ ์ค‘๋‹จ." ์ถœ๋ ฅ.
Baduk b2 = new Baduk(new BetaGo());
"๋Œ€๊ตญ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค." ์ถœ๋ ฅ.
๋‚ด๋ถ€์ ์œผ๋กœ ag = new BetaGo() ์ €์žฅ.
b2.play();
"์ธ๊ณต์ง€๋Šฅ์€ ๋ฒ ํƒ€๊ณ ์ž…๋‹ˆ๋‹ค." ์ถœ๋ ฅ.
b2.stop();
"๋ฒ ํƒ€๊ณ  ๊ฒŒ์ž„์„ ์ค‘๋‹จ." ์ถœ๋ ฅ.

Springboot3์˜ ๊ตฌ์กฐ

์Šคํ”„๋ง๋ถ€ํŠธ - ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋” ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ด์šฉํ•  ์ˆ˜์žˆ๋„๋ก ๋งŒ๋“  ๋„๊ตฌ. ๋น ๋ฅด๊ฒŒ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •. ์˜์กด์„ฑ ์„ธํŠธ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์Šคํƒ€ํ„ฐ๋ฅผ ์ด์šฉํ•ด ์˜์กด์„ฑ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๋ฆฌ๊ฐ€๋Šฅ.
1. ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” ์Šคํ”„๋ง์ฝ”์–ด์™€ ์Šคํ”„๋ง MVC์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•˜๋ฏ€๋กœ ์ˆ˜๋™์œผ๋กœ ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑํ•  ํ•„์š” X
2. ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ†ฐ์บฃ๊ณผ ๊ฐ™์€ WAS์—์„œ ๋ฐฐํฌ
3. ์ž๋ฐ”์ฝ”๋“œ๋Š” ํด๋ž˜์Šค A์—์„œ B ๊ฐ์ฒด๋ฅผ ์“ฐ๊ณ ์‹ถ์€ ๊ฒฝ์šฐ ์ง์ ‘ ์ƒ์„ฑ. ์Šคํ”„๋ง์˜ ๊ฒฝ์šฐ ์ง์ ‘์ƒ์„ฑ์ด ์•„๋‹Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉ. -> Ioc/DI ๊ฐœ๋… (์ค‘์š”ํ•จ!!)

์ง์ ‘ ์ƒ์„ฑ (new) vs. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋งก๊ฒจ์„œ ์ฃผ์ž…๋ฐ›๊ธฐ (DI)

// B๋ผ๋Š” ํด๋ž˜์Šค
class B {
    public void doSomething() {
        System.out.println("B๊ฐ€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค!");
    }
}

// A๋ผ๋Š” ํด๋ž˜์Šค
class A {
    private B b;

    public A() {
        // A ์•ˆ์—์„œ B๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•จ
        this.b = new B();
    }

    public void action() {
        b.doSomething();
    }
}

// ์‹คํ–‰
public class Main {
    public static void main(String[] args) {
        A a = new A(); // A๋ฅผ ๋งŒ๋“ค๋ฉด A ๋‚ด๋ถ€์—์„œ B๋„ ์ƒ์„ฑ๋จ
        a.action();
    }
}

A๊ฐ€ B๋ฅผ ์ง์ ‘ newํ•ด์„œ ์ƒ์„ฑ. A๋Š” ํ•ญ์ƒ B๋งŒ ์จ์•ผํ•จ

Spring์—์„œ IoC/DI ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component // ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” Bean
class B {
    public void doSomething() {
        System.out.println("B๊ฐ€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค!");
    }
}

@Component // ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” Bean
class A {
    private final B b;

    // ์ƒ์„ฑ์ž ์ฃผ์ž… (๊ถŒ์žฅ ๋ฐฉ์‹)
    @Autowired
    public A(B b) {
        this.b = b; // ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ B ๊ฐ์ฒด๋ฅผ ๋Œ€์‹  ๋„ฃ์–ด์คŒ
    }

    public void action() {
        b.doSomething();
    }
}
-----------------------
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public CommandLineRunner run(A a) { // ์Šคํ”„๋ง์ด A๋ฅผ ์ฃผ์ž…
        return args -> {
            a.action(); // "B๊ฐ€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค!"
        };
    }
}

new๋ฅผ ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ  @Component๋กœ ๋“ฑ๋กํ•ด๋‘๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌ
A๋Š” B๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์ง€์•Š๊ณ  ์™ธ๋ถ€์—์„œ ๋ฐ›์•„์„œ DI ์‚ฌ์šฉ.
B๋Œ€์‹  C๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์“ฐ๊ณ ์‹ถ์œผ๋ฉด ์Šคํ”„๋ง ์„ค์ •๋งŒ ๋ฐ”๊พธ๊ณ  A์˜ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
IoC - Inversion of Control ์ œ์–ด์˜ ์—ญ์ „.
DI - Dependency Injection ์˜์กด์„ฑ ์ฃผ์ž…

@Component // ํด๋ž˜์Šค MyBean ๋นˆ์œผ๋กœ ๋“ฑ๋ก
// ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด ํด๋ž˜์Šค๋ฅผ ๊ด€๋ฆฌ
public class MyBean {
}

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

AOP - Aspect Oriented Programming
๊ด€์ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์„ ํ•ต์‹ฌ๊ด€์ , ๋ถ€๊ฐ€๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ด€์‹ฌ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์†”์งํžˆ ๋ญ”๋ง์ธ์ง€ ์•ˆ์™€๋‹ฟ์Œ...
์‰ฌ์šด ์˜ˆ๋กœ ๊ณ„์ขŒ์ด์ฒด, ๊ณ ๊ฐ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ์„ ๋•Œ ๊ฐ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ๋กœ๊น… ์กฐ์ง, ์ง€๊ธˆ๊นŒ์ง€ ๋ฒŒ์–ด์ง„์ผ์„ ๊ด€๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๋กœ์ง ํฌํ•จ. ์ด๋•Œ ํ•ต์‹ฌ๊ด€์ ์€ ๊ณ„์ขŒ์ด์ฒด, ๊ณ ๊ฐ ๊ด€๋ฆฌ ๋กœ์ง์ด๊ณ  ๋ถ€๊ฐ€ ๊ด€์ ์€ ๋กœ๊น…, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๋กœ์ง์ด๋‹ค.
๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ•ต์‹ฌ ๊ด€์  ์ฝ”๋“œ์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณ€๊ฒฝ๊ณผ ํ™•์žฅ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘์ด ๊ฐ€๋Šฅ.

์ด์‹ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค ์ถ”์ƒํ™” PSA

Portable Service Attraction - ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ๋“ค์„ ์ถ”์ƒํ™” ํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

ํ•œ์ค„์ •๋ฆฌ
IoC - ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋Œ€์‹ ํ•˜๋Š”๊ฒƒ
DI - ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ
AOP - ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ๋•Œ ํ•ต์‹ฌ ๊ด€์ ๊ณผ ๋ถ€๊ฐ€ ๊ด€์ ์„ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœํ•˜๋Š”๊ฒƒ
PSA - ์–ด๋А ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋˜ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š”๊ฒƒ

profile
์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€