5 ๋ถ„ ์†Œ์š”

๐Ÿ“š SPRING


๐Ÿ“š IoC & Container

IoC ( Inversion of Control ) ๋ž€

IoC ( Inversion of Control ) ๊ฐœ๋…

  • ๊ฐ์ฒด ์ œ์–ด ๋ฐฉ์‹
    • ๊ธฐ์กด : ํ•„์š”ํ•œ ์œ„์น˜์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง ๊ตฌํ˜„
    • IoC : ๊ฐ์ฒด ์ƒ์„ฑ์„ Container์—๊ฒŒ ์œ„์ž„ํ•˜์—ฌ ์ฒ˜๋ฆฌ
  • IoC ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ์žฅ์ 
  • ๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์œผ๋ฉด
    • ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ ๋  ๋•Œ ๊ทธ ํด๋ž˜์Šค์™€ ๊ฒฐํ•ฉ๋œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋„ ๊ฐ™์ด ์œ ์ง€๋ณด์ˆ˜ ๋˜์–ด์•ผํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ ( ์˜ํ–ฅ์„ ๋งŽ์ด ์ค€๋‹ค. )

๊ฐ์ฒด๊ฐ„ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ

  • ํด๋ž˜์Šค ํ˜ธ์ถœ ๋ฐฉ์‹
  • ํด๋ž˜์Šค๋‚ด์— ์„ ์–ธ๊ณผ ๊ตฌํ˜„์ด ๋ชจ๋‘ ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.


  • MemberService ๊ตฌํ˜„์ฒด์™€ AdminService ๊ตฌํ˜„์ฒด๋ฅผ HomeController์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
  • MemberService ๋˜๋Š” AdminService๊ฐ€ ๊ต์ฒด๋˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด HomeController๊นŒ์ง€ ์ˆ˜์ •ํ•ด์•ผํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  • ๊ฐ•ํ•œ ๊ฒฐํ•ฉ
public class HomeController{
    ---
    private MemberServiceImpl memberService = new MemberServiceImpl();
    private AdminServiceImpl adminservice = new AdminServiceImpl();
    ---
    -> ๊ตฌํ˜„์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑ


    public void addUser(MemberDto memberDto){
        memberService.joinMember(memberDto);
        adminService.registerMember(memberDto);
    }
}

๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค

์ธํ„ฐํŽ˜์ด์Šค ํ˜ธ์ถœ ๋ฐฉ์‹

  • ๊ตฌํ˜„ ํด๋ž˜์Šค ๊ต์ฒด๊ฐ€ ์šฉ์ดํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™” ๊ฐ€๋Šฅ
  • ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค ๊ต์ฒด ์‹œ ํ˜ธ์ถœ ํด๋ž˜์Šค๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ



1.
public interface MemberService extends CommonService{
}

2. 
public interface AdminService extends CommonService{
}

public class HomeController{
    private CommonService memberService = new MemberServiceImpl();
    private CommonService adminservice = new AdminServiceImpl();
    // ๋ชจ๋‘ CommonService ํƒ€์ž…์œผ๋กœ ์ด์šฉ ๊ฐ€๋Šฅ

    public void addUser(MemberDto memberDto){
        memberService.registerMember(memberDto);
        adminService.registerMember(memberDto);
    }

}

ํŒฉํ† ๋ฆฌ ํ˜ธ์ถœ ๋ฐฉ์‹

  • ํŒฉํ† ๋ฆฌ ๋ฐฉ์‹์€ ํŒฉํ† ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค๋Š” ํŒฉํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ ์‹œ ํŒฉํ† ๋ฆฌ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค. ํ˜ธ์ถœ ํด๋ž˜์Šค์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ•˜์ง€๋งŒ ํด๋ž˜์Šค์— ํŒฉํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์†Œ์Šค๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค. ๊ทธ๊ฒƒ์ด ํŒฉํ† ๋ฆฌ์— ์˜์กดํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.


  • ๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.
  • ๊ฐ Service๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” Factory๋ฅผ ์‚ฌ์šฉ
  • Service๋ฅผ ์ด์šฉํ•˜๋Š” ์ชฝ์—์„œ๋Š” interface๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์–ด๋–ค ๊ตฌํ˜„์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์ด Factory ํŒจํ„ด์ด ์ ์šฉ๋œ ๊ฒƒ์ด Container์˜ ๊ธฐ๋Šฅ์ด๋ฉฐ ์ด Container์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์ฃผ๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด IoC ๋ชจ๋“ˆ์ด๋‹ค.
// ๊ฐ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” factory
public class ServiceFactory{
    public static CommonService getMemberService(){
        return new MemberServiceImpl();
    }

    public static CommonService getAdminService(){
        return new AdminServiceImpl();
    }    
}

public class HomeController{
    private CommonService memberService = ServiceFactory.getMemberService();
    private CommonService adminservice = ServiceFactory.getAdminService();
    
    ...
}

IoC ํ˜ธ์ถœ ๋ฐฉ์‹

  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์žฅ์ ์„ ๋”ํ•˜์—ฌ ์–ด๋– ํ•œ ๊ฒƒ์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.
  • ์‹คํ–‰์‹œ์  ( runtime )์— ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ์ด ๋จ


  • ๊ฐ Service์˜ LifeCycle์„ ๊ด€๋ฆฌํ•˜๋Š” Assembler๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Spring Container๊ฐ€ ์™ธ๋ถ€ ์กฐ๋ฆฝ๊ธฐ(Assembler) ์—ญํ• ์„ ํ•œ๋‹ค.


servlet-context.xml์— bean ์„ค์ •์„ ํ•ด์ค€๋‹ค !!
xml ๋ฒ„์ ผ๊ณผ annotation ๋ฒ„์ ผ์ด ์žˆ๋Š”๋ฐ annotation ๋ฒ„์ ผ์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
Spring ๊ตฌํ˜„์ฒด ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ Spring Container ๊ฐ€ ํ•ด์ค€๋‹ค.

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

    <!-- xml ๋ฒ„์ ผ -->
    <bean id="memberService" class="com.test.hello.service2.MemberServiceImpl"/>
    <bean id="adminService" class="com.test.hello.service2.AdminServiceImpl"/>

    <!-- annotation ๋ฒ„์ ผ -->
    <context:component-scan base-package="com.test.hello.service2" />
    // xml ๋ฒ„์ ผ
    ApplicationContext context = new ClassPathXmlApplicationContext("com/test/hello/controller4/applicationContext.xml");
    CommonService memberService = context.getBean("memberService", MemberService.class);
    CommonService adminService = context.getBean("adminService", AdminService.class);

    // annotation ๋ฒ„์ ผ
    @Service
    public class MemberService{

    }

    @Service
    public class AdminService{

    }

IoC ( Inversion of Control ) ์œ ํ˜•


Container ๋ž€

Container ๊ธฐ๋Šฅ

  • ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ
  • Dependency ๊ฐ์ฒด ์ œ๊ณต
  • Thread ๊ด€๋ฆฌ
  • ๊ธฐํƒ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ

Container ํ•„์š”์„ฑ

IoC Container

  • ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒ‰์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ •, ์‚ฌ์šฉ, ์ œ๊ฑฐ ๋“ฑ์˜ ์ž‘์—…์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋Œ€์‹  ๋…๋ฆฝ๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ด๋‹น
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฝ”๋“œ ๋Œ€์‹  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด IoC๋ผ ๋ถ€๋ฅธ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ IoC ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ
  • ์Šคํ”„๋ง์—์„œ IoC๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” BeanFactory, ApplicationContext๊ฐ€ ์žˆ๋‹ค.

Spring DI Container

  • Spring DI Container๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ ํ•˜๊ณ , ์ด ๋นˆ๋“ค์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์˜๋ฏธ๋กœ BeanFactory ๋ผ ํ•œ๋‹ค.
  • Bean Factory ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ApplicationContext ๋ผ ํ•œ๋‹ค.

Spring Container


  • BeanFactory
    • Bean ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ์„ฑ๊ณผ ์ œ๊ณต์„ ๋‹ด๋‹น
    • ๋‹จ์ผ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๋นˆ์„ ์ƒ์„ฑ, ์ œ๊ณต
    • ๊ฐ์ฒด๊ฐ„์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ์„ค์ •, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์‹œ ๋นˆ์„ ์ƒ์„ฑ
    • ๋นˆ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ด€๋ฆฌ
  • ApplicationContext
    • BeanFactory๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ ์ œ๊ณต
    • ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ
    • ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ์‹œ ๋ชจ๋“  ๋นˆ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉํ•จ
  • WebApplicationContext
    • ์›น ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ
    • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ ํŠนํžˆ XmlWebApplicationContext๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ