Posts Spring 기본 문법
Post
Cancel

Spring 기본 문법

Spring을 사용하기 위해 필요한 기본적인 코드

먼저 작성해줘야 하는 코드(applicationContext.xml)

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    //xml에서 사용할 수 있는 태그를 나타내는 name space이다.
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    //기본 태그 외에 p태그, context 태그를 사용할 때 위 두줄을 추가한다.
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    // schemaLocation에는 해당 태그들이 저장되어있는 곳이다.
    // context를 사용한다면 위의 context관련 줄을 추가한다.

Container를 사용하기 위해 필요한 코드(TVUser.java)

1
GenericXmlApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml");
  • 해당 코드를 통해서 java 클래스에서 Container를 사용할 수 있다.
  • 사용자의 Req가 발생하면 톰캣이 이를 인지하고 해당 로직의 처리를 Container로 보낸다.
  • Container는 xml파일에서 Servlet의 정보, 클래스 정보등을 Load하여 로직을 처리한다.

객체를 생성하기 위한 방법 2가지

  • getBean을 활용
    1
    2
    3
    4
    
    applicationContext.xml
    <bean id="tv" class="polymorphism4.GoogleTV"
            init-method="initialize"
            destroy-method="destroy"></bean>
    
    • TV tv = (TV) container.getBean("tv");
    • xml에서 id=’tv’인 GoogleTV 객체를 가져와서 참조형 변수에 할당한다.
      • 이때 다른 참조형 변수로 getBean을 해도 객체는 추가로 생성되지 않는다.
      • 속성값으로 scope="prototype"을 넣어주면 호출될 때마다 객체를 새로 생성한다.
    • init-method는 호출시 같이 실행할 method를 정의한다.
      • Default 생성자 호출 후, init-mtehod에 등록되어있는 method를 실행한다.
      • 주로 변수 초기화에 많이 사용한다.
    • destroy-method는 객체 종료시 같이 실행되는 method를 정의한다.
      • 컨테이너에서 생성한 객체는 컨테이너가 close될때 같이 사라지게된다.
      • destroy method도 close될때 실행된다.
  • Annotation을 활용
    • context 태그를 활용한다.(context활용을 위한 구문 추가가 필요하다)
    • <context:component-scan base-package="polymorphism4"></context:component-scan>
    • 해당 구문은 polymorphism4 패키지에 있는 모든 클래스중에 @Component라는 Annotaion을 갖고 있는 클래스의 객체를 생성한다는 뜻이다.
      1
      2
      
      @Component("lg")
      public class LgTV implements TV
      
    • polymorphism4에 있는 LgTV클래스는 컨테이너에 의해 객체가 생성되며 해당 객체의 id는 lg로 정의된다.
    • @Component를 사용하면 내부적으로 정해진 규칙에(클래스의 첫글자를 소문자로 한 문자열) 의해서 id가 생성된다.(LgTV -> lgTV)

Dependency Injection

  • Dependency Injection이란?
    • 각 클래스간 의존성을 줄이고 응집도를 높여서 하나의 클래스의 변화에 다른 클래스까지 변화하는 일이 없도록 하는일이다.
    • 이를 통해 모듈화가 이루어지고 유지보수성을 향상시킬 수 있다.
  • Constructor Injection
    • 기본적으로 xml에서 정의한 객체는 Default 생성자를 호출한다.
    • 다른 생성자를 호출하기 위해서는 bean 태그에 속성울 추가해야한다. ```java

    ```

    • constructor-arg태그를 통해 생성자에 들어갈 파라미터를 정의할 수 있다.
    • 컨테이너는 파라미터에 알맞는 생성자를 알아서 실행해준다.
    • constructor-arg태그의 속성에는 ref와 value가 있다.
      • ref는 Object 등의 클래스 객체를 파라미터로 정의할 때 쓰인다.
      • value는 Primitive 값을 파라미터로 정의할 때 쓰인다.
    • 위와 같이 다른 클래스의 객체를 사용해야할 때 클래스 내부에서 생성하지 않고, xml상으로 정의해서 내부의 java코드의 speaker에 대한 의존성을 낮출 수 있다.
  • Setter Injection
    • 각 클래스에서 필요한 다른 클래스 객체를 직접 생성하지 않고, Setter method를 활용해 객체를 사용한다. ```java

    ```

    • property 태그로 Setter method를 정의할 수 있다.
    • property 태그의 속성에는 name, ref, value가 있다.
      • name 속성으로 호출할 Setter method를 정의한다.
      • 이때 method의 Set부분을 지우고, 첫글자를 소문자로 만든 문자열을 사용하는 것이 규칙이다.(SetSpeaker -> speaker)
      • ref, value는 constructor-arg에서의 기능과 같다.
  • Type Injection
    • Annotation중 @Autowired를 활용해 클래스 내부에서 다른 클래스의 객체를 직접 생성하지 않도록 한다.
      1
      2
      
      @Autowired
      private AppleSpeaker speaker;
      
    • 변수의 타입을 기준으로 알아서 의존성 주입을 처리한다.
    • 해당 타입의 객체가 메모리상에 있으면, 컨테이너가 그 객체를 변수에 할당해준다.
      • getBean, Annotation을 활용해서 생성한 객체들은 xml이 읽히는 시점에 메모리상에 적재된다.(Pre-Loading)
      • 사용자의 호출에 따라 객체 생성하는 것은 Lazy-Loading이다.
    • 객체가 메모리상에 없다면, Exception이 발생된다.

XML로 프로그램을 제어했을때 장점

  • 자바 파일의 변경이 없으므로, 실행 시간이 단축된다.
    • 자바 파일을 .class로 바꾸는 컴파일 과정이 일어나지 않고, 기존의 바이트코드를 가져와 사용한다.
    • 변경된 xml의 내용만 런타임때 읽고, 실행한다.
    • 자바 파일이 바뀐경우 바뀐 부분만 다시 컴파일 되지만, 해당 파일들을 모두 빌드하는 과정에서 컴파일타임이 추가로 소모되므로, 최대한 자바파일의 변경 없이 테스트를 하는 것이 좋다.
  • xml로 제어하기위해 Dependency Injection을 신경쓰게 되고, 해당 과정을 통해 각 클래스간 의존성을 줄일 수 있다.
This post is licensed under CC BY 4.0 by the author.

Contents

Trending Tags