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

Spring

Spring์˜ ์˜์กด์„ฑ ์ฃผ์ž…

์˜์กด์„ฑ ์ฃผ์ž…

์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์˜ ์˜๋ฏธ๋ฅผ ์•Œ์•„๋ณด๊ณ  ์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•ด๋ณด์ž.

์˜ˆ์ œ

์˜์กด์„ฑ์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ผ๊นŒ?

๊ฐ„๋‹จํ•œ Test ์šฉ Repository์™€ Controller๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

package com.vividswan.spring.web.domain.test;

import org.springframework.stereotype.Component;

public class TestRepository {
    public String findStrig(){
        return "This Is Test!!";
    };
}
package com.vividswan.spring.web;

import com.vividswan.spring.web.domain.test.TestRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    TestRepository testRepository = new TestRepository();
    //์ƒ์„ฑ์ž ์‚ฌ์šฉ

    @GetMapping("/test")
    public String test(){
        return testRepository.findStrig();
    }

}

/test ๊ฒฝ๋กœ๋กœ ๋งคํ•‘์„ ํ•˜๋ฉด "This Is Test!!"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋‹ค.

์ด๋•Œ, ์ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ TestRepository๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

์˜์กด์ด๋ž€?

์œ„์˜ ์ƒํ™ฉ์ด TestController ๊ฐ์ฒด๊ฐ€ TestRepository์— ์˜์กดํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค.

A๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ B์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์€, A๊ฐ€ B๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , ๊ทธ ๋ง์€ B๊ฐ€ ๋ฐ”๋€Œ๋ฉด A์—๊ฒŒ๋„ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋Š” ๊ฐ„๋‹จํ•œ ์†Œ์Šค์˜€์ง€๋งŒ, Repository๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜€๊ณ , ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ Repository๊ฐ€ ๊ตฌํ˜„๋œ๋‹ค๋ฉด, TestController์˜ ๋‚ด์šฉ๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

์ž‘์€ ๊ทœ๋ชจ๊ฐ€ ์•„๋‹Œ ํฐ ํ”„๋กœ์ ํŠธ์—์„  ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด๋“ค๋ผ๋ฆฌ์˜ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ด๊ฒƒ์„ ์Šคํ”„๋ง์ด ์ง์ ‘ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

Spring IoC

์Šคํ”„๋ง์—์„ , Spring IoC ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ์ฒด๋“ค์„ ๋“ฑ๋กํ•ด ์ฃผ๋ฉด, ์Šคํ”„๋ง์ด ๊ทธ ์•ˆ์—์„œ ๊ฐ์ฒด๋“ค์˜ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ด€๋ฆฌํ•ด ์ค€๋‹ค.

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, ์Šคํ”„๋ง์ด ๊ฐ์ฒด๋ฅผ ์ธ์‹ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ฒŒ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด์„œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ์ž.

์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

package com.vividswan.spring.web.domain.test;

import org.springframework.stereotype.Component;

@Component
public class TestRepository {
    public String findStrig(){
        return "This Is Test!!";
    };
}
package com.vividswan.spring.web;

import com.vividswan.spring.web.domain.test.TestRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Autowired
    TestRepository testRepository;

    @GetMapping("/test")
    public String test(){
        return testRepository.findStrig();
    }

}

Repository์—๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ @Component๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

Controller์—์„  ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ–ˆ๋˜ ๋ฐฉ์‹์„ ์—†์• ๊ณ , @Autowired๋ฅผ ํ†ตํ•ด Repository๋ฅผ ์ž๋™์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๊ฒŒ ํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐํ•˜๋ฉด Repository์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ณ€ํ•œ๋‹ค๊ณ  ํ•ด๋„, TestController์˜ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, TestRepository๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ”๊พธ๊ณ , ๊ทธ์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ Repository๊ฐ€ ๋ณ€ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•˜์ž.

package com.vividswan.spring.web.domain.test;

public interface TestRepository {
    public String findStrig();
}
package com.vividswan.spring.web.domain.test;

import org.springframework.stereotype.Component;

@Component
public class TestRepositoryImp implements TestRepository {
    public String findStrig(){
        return "This Is Test!!";
    };
}

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ธฐ์กด์˜ TestRepository๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” TestRepositoryImp๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

๋˜ ๊ธฐ์กด์˜ TestRepository์˜ ์ด๋ฆ„์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

ํŽธ์˜์„ฑ

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ผ๋„ TestController๋Š” ๋”ฐ๋กœ ์œ ์ง€ ๋ณด์ˆ˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

    @Autowired
    TestRepository testRepository;

์ด ์†Œ์Šค๋งŒ์œผ๋กœ @Component ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” TestRepositoryImp ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…ํ•ด ์ค€๋‹ค.

์ด๋ ‡๊ฒŒ Repository์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์Šคํ”„๋ง IoC๋Š” ๊ทธ์— ๋งž๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…ํ•ด ์ฃผ๋Š” ํŽธ์˜์„ฑ์ด ์žˆ๋‹ค.