[Day 25 | Spring] DI와 Spring을 활용한 객체 생성 및 관리

y♡ding·2024년 11월 15일
0

데브코스 TIL

목록 보기
154/163

1. 객체 생성과 스프링의 역할

  • 스프링 IoC 컨테이너:
    • 객체의 생성, 관리, 소멸의 생명주기를 책임진다.
    • 개발자가 객체의 생성과 주입에 신경 쓰지 않아도, 컨테이너가 이를 관리한다.

2. Spring Bean Configuration

  • XML Configuration:
    • <bean> 태그를 이용해 객체의 생성 및 의존성을 설정.
    • <constructor-arg><property>로 생성자와 세터 주입을 설정.
  • Annotation + POJO:
    • 스프링 부트에서는 어노테이션(@Component, @Autowired)을 활용하여 객체를 생성하고 의존성을 관리.

3. 객체 초기화 기법

1. 생성자 주입:

  • 장점: 불변성을 보장하며, 의존성 설정이 명확하다.
  • 자바 방식:
    BoardTO to = new BoardTO();
    WriteAction action = new WriteAction(to);
  • 스프링 방식(XML):
    <bean id="to" class="org.example.di.BoardTO"/>
    <bean id="action" class="org.example.di.WriteAction">
        <constructor-arg ref="to"/>
    </bean>

2. Setter 주입:

  • 장점: 의존성 주입의 순서가 유연.
  • 자바 방식:
    BoardTO to = new BoardTO();
    to.setSeq(1);
    to.setSubject("제목");
  • 스프링 방식(XML):
    <bean id="to" class="org.example.di02.BoardTO">
        <property name="seq" value="1"/>
        <property name="subject" value="제목"/>
    </bean>

3. Field 주입 (권장되지 않음):

  • 테스트와 유지보수가 어렵기 때문에 비추천.

4. 일반 메서드 주입 (권장되지 않음):

  • 복잡도를 증가시키므로 비추천.

4. Scope: Prototype vs Singleton

  • Prototype:

    • 매번 새로운 객체 생성.
    • ctx.getBean("id") 호출 시마다 새로운 객체 반환.
  • Singleton (기본값):

    • 하나의 객체만 생성 및 공유.
    • ctx.getBean("id") 호출 시 동일한 참조 반환.

5. 리스트(List) 관리

  • 사용 예시: 특정 클래스의 배열이나 리스트를 구성.
  • 자바 방식:
    ArrayList<String> userList = new ArrayList<>();
    userList.add("admin");
    userList.add("user");
  • 스프링 방식:
    <bean id="listTo" class="org.example.di03.BoardListTO">
        <property name="userList">
            <list>
                <value>홍길동</value>
                <value>박문수</value>
            </list>
        </property>
    </bean>

6. 맵(Map) 관리

  • 사용 예시: 키-값 형태의 데이터를 관리.
  • 자바 방식:
    HashMap<String, String> userMap = new HashMap<>();
    userMap.put("user", "홍길동");
    userMap.put("admin", "박문수");
  • 스프링 방식:
    <bean id="mapTo" class="org.example.map.BoardMapTo">
        <property name="userMap">
            <map>
                <entry key="user" value="홍길동"/>
                <entry key="admin" value="박문수"/>
            </map>
        </property>
    </bean>

7. 사용자 정의 클래스 활용

  • 객체를 리스트나 맵 안에 포함하여 복합적으로 활용.

  • 리스트에 사용자 정의 클래스 포함:

    <bean id="to1" class="org.example.map.BoardTO">
        <property name="seq" value="1"/>
        <property name="subject" value="제목 1"/>
    </bean>
    <bean id="to2" class="org.example.map.BoardTO">
        <property name="seq" value="2"/>
        <property name="subject" value="제목 2"/>
    </bean>
    <bean id="listTo" class="org.example.di03.BoardListTO">
        <property name="boardList">
            <list>
                <ref bean="to1"/>
                <ref bean="to2"/>
            </list>
        </property>
    </bean>
  • 맵에 사용자 정의 클래스 포함:

    <bean id="mapTo" class="org.example.map.BoardMapTo">
        <property name="boardMap">
            <map>
                <entry key="1" ref="to1"/>
                <entry key="2" ref="to2"/>
            </map>
        </property>
    </bean>

8. 주요 코드 정리

  • SpringContext 사용:

    • GenericXmlApplicationContext로 XML 설정 파일 불러오기.
    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:context.xml");
    BoardTO to = (BoardTO) ctx.getBean("to");
    ctx.close();
    
    // BoardTO to = ctx.getBean("boardTo", BoardTo.class);
  • Bean 설정 파일의 유연성:
    • XML 설정을 활용하여 객체 관계를 명확히 정의.

9. 학습 요약

  • 스프링은 객체의 생성 및 의존성을 효과적으로 관리하며, XML과 어노테이션을 활용한 DI로 복잡성을 줄일 수 있다.
  • DI 기법:
    • 생성자 주입: 불변성이 필요한 경우.
    • Setter 주입: 유연성이 필요한 경우.
  • 스프링 Bean Scope:
    • Prototype vs Singleton의 차이를 이해하고 상황에 맞게 사용.
  • 복합 데이터(List, Map)를 구성하고 이를 관리하는 다양한 방식 학습.

0개의 댓글

관련 채용 정보