ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRING] Day1 (~Class03. 스프링 컨테이너 및 설정 파일)
    SPRING 2021. 7. 25. 15:48

    * STS, eclipse같은 편집기, 툴을 IDE라고 한다.

    STS 3.9.11(eclipse 4.14버전)  버전을 쓸 예정이며, 이 버전은 jdk8과 가장 호환이 잘 맞는다.

    3.9.13. 이후부터는 jdk10이랑 호환된다.

    그러므로 jdk8을 쓸거라면 STS 3.9.13.까지!

     

    STS가 나오기 전 Eclipse에서 Spring에 필요한 라이브러리를 다운받아 사용하였다. 

    그래서 Eclipse버전도 알아두어야 할 필요가 있다.

     

    <class 02 프레임워크 개요>

     

    1. 프레임워크

    프레임워크랑 아키텍쳐에 해당하는 골격 코드이다.

    애플리케이션을 개발할 때 가장 중요한 것은 전체 애플리테이션의 구조를 결정하는 아키텍쳐인데

    이 아키텍쳐에 해당하는 골격코드를 프레임워크가 제공한다.

     

    프레임워크의 장점

    ① 빠른 구현 시간

    ② 쉬운 관리

    ③ 개발자들의 역량 획일화

    ④ 검증된 아키텍처의 재사용과 일관성 유지

     

    * 전자정부프레임워크가 선정한 persistence 프레임워크가 MyBatis이다.

    * WAS(Web Application Server) (ex.톰캣 서버)

     

    * POJO(Plain Old Java Object)

     : POJO란 평범한 옛날 자바 객체를 의미.

    대표적 Not POJO 클래스는 Servlet클래스이고 대표적 POJO클래스는 Bean클래스이다.

    Bean 클래스는 member필드만 필요하고 getter, setter로 이루어져 있다.

     

    Spring은 Bean / JSP는 Java Bean / JAVA는 DTO, VO

     

    2. 스프링 프레임워크의 특징

    : IoC와 AOP를 지원하는 경량의 컨테이너 프레임워크

    ① 경량(Lightweight)

    스프링은 여러 개의 모듈로 구성되어 있으며, 각 모듈은 하나 이상의 jar파일로 구성되어 있다.

    형상관리, 버전 관리, 라이브러리 관리를 pom.xml에 해주는 방식을 Maven이라고 하며 xml 태그 방식이다.

    다만 Spring 5 부터는 Gradle방식으로 바뀌었다.

     

    ② 제어의 역행(Inversion of Control) IoC

    좋은 프로그램은 낮은 결합도와 높은 응집도를 가지고 있다.

    스프링은 제어의 역행을 통해 낮은 결합도를 유지한다.

     

    ③ 관점지향 프로그래밍(Aspect Oriented Programming) AOP

    비즈니스 메소드를 개발할 때 핵심 비즈니스 로직과 비즈니스 메소드마다 반복해서 등장하는 공통 로직을 분리함으로써 응집도가 높게 개발할 수 있도록 한다.

     

    ④ 컨테이너

    애플리테이션을 실행시키려면 container 안에 담아두어야 한다.

     

    3. IoC(Inversion of Container) 컨테이너

    =Spring Container =Bean Factory

     

    IoC컨테이너=Spring 컨테이너=Bean Factory는 Servlet컨테이너의 동작 방식으로 그 동작 방식을 유추할 수 있다.

    Servlet컨테이너가 자신이 관리할 클래스들이 등록된 XML 설정 파일을 로딩하여 구동하는 것처럼

    Spring 컨테이너 역시 미리 객체를 생성하고 getBean메소드로 필요한 객체를 얻어온다.

     

    즉, 예전에는 객체를 생성할 때 객체들 사이의 의존관계를 처리하는 것이 전적으로 개발자에게 달려있었다.

    즉, 개발자가 어떤 객체를 생성할지 판단하고 그 의존 관계 역시 소스 코드로 표현했었기에 개발자에 대한 의존도가 높았다.

     

    이제는 이러한 과정을 컨테이너로 처리하는 것이다.

    그러므로 이제는 객체 생성과 그 의존관계에 대한 코드가 사라져서 결과적으로는 낮은 결합도의 컴포넌트를 구성할 수 있는 것이다. (유지보수 효율성 상승, 경량화)

     

    3. 결합도가 높은 프로그램 해결방법

    ① 다형성

     

    [19회차] JAVA (상속)

    강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정 강의 날짜 : 21.04.16 <상속> 1. 클래스의 상속과 오버라이딩(자동은폐) class B1 { int x; //객체 변수 x } class B2 extends B1{ //상속 키워드..

    crystal93.tistory.com

     

    ② 디자인 패턴 

    : 싱글톤 패턴 

    getter로 객체를 가져온다.

    Spring의 모든 클래스는 싱글톤이다.

    즉 미리 IoC 컨테이너=Spring 컨테이너=Bean Factory에서 객체를 미리 다 생성해둔 후 

    getter로 필요한 객체를 얻어다가 쓰는 것이다!

     

    * Spring의 최상위 클래스는 Bean Factory

    Spring Architecture

     

    <class 03 스프링 컨테이너 및 설정 파일>

     

    1. 스프링 컨테이너

    <!--Spring Container-->
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- 객체 생성 태그 : bean -->
    <bean id="testDaoImp" class="test.TestDaoImp" ></bean> 
    
    </beans>

     

    객체 생성 태그는 bean이며

    id 속성으로 객체명을 지정하고

    class 속성으로 생성할 객체의 클래스 위치를 지정한다.

     

    즉, test 패키지 밑의 TestDaoImp 클래스의 객체를 testDaoImp라는 객체명으로 생성한다, 는 의미가 된다.

    생성된 객체는 Spring Container에 담겨 필요할 때마다 얻어갈 수 있게 한다.

    (=싱글톤 방식)

     

    객체 생성 방식의 default는 singleton이다.

    즉, bean은 Spring Container에 의해 단 하나만 생성되어 운용되며 메모리에 하나만 생성되어 유지되는 것이다.

    그래서 bean 태그의 scope 속성의 기본값은 singleton이다.(생략 가능)

    <bean id="testDaoImp" class="test.TestDaoImp" scope="singleton"></bean>

    이 scope 속성을 "prototype" 으로 지정한다면 bean이 요청될 때마다 매번 새로운 객체를 생성하여 반환한다.

     

    //인터페이스
    package test;
    
    public interface TestDao {
    	void printMessage();
    }
    //인터페이스를 상속받은 클래스
    package test;
    
    public class TestDaoImp implements TestDao{
    
    	public void printMessage() {
    		System.out.println("printMessage...");
    	}
    }

     

    객체 생성 대상의 클래스는 인터페이스를 상속받았으며, 이는 낮은 결합도를 위한 것이다.

     

     

    2. 컨테이너의 구동 및 실행

    //메인 클래스
    package test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    
    public class TestMain {
    public static void main(String[] args) {
    
    	//스프링 컨테이너 객체 생성
    	ApplicationContext context=
    			new FileSystemXmlApplicationContext("src/main/java/test/test.xml");
                
    	//객체 얻어와서 주입!(ByType)            
    	TestDao testDao=(TestDao)context.getBean("testDaoImp");
    	System.out.println("start");
    	testDao.printMessage();
    	System.out.println("end");
    	}
    }

    Spring Container에 접근하기 위해서는 먼저 Container 객체를 생성해 주어야 하며, 

    Container가 위치한 풀패키지를 주어야 한다.

     

    그 Container에서 getBean메소드를 통해 객체를 얻어온다.

    얻어올때는 Container에서 생성할 때 id속성으로 주었던 객체명으로 얻어오게 된다.

     

    이때 객체 주입을 할 때는 JAVA처럼 이름으로 하는 것이 아니라 자료형으로 이루어진다. (=ByType)

    그래서 Spring에서는 객체 주입을 할 때 자료형을 맞춰주는 것이 중요하다.

     

    3. factory-method

     

    package test;
    
    public class ExamTest {
    	private static ExamTest instance;
    	
    	public static ExamTest getInstance() {
    		if(instance==null) {
    			instance=new ExamTest();
    		}
    		return instance;
    	}
    	
    	private ExamTest() {} //생성자
        
    	public void getMessage() {
    		System.out.println("메세지 출력");
    	}
    }
    <!-- Spring Container -->
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="exam" class="test.ExamTest" factory-method="getInstance"/>
    </beans>

    factory-method는 말그대로 bean factory를 만들어 주는 메소드이다.

    test패키지의 ExamTest클래스를 getInstance라는 메소드를 통해 exam이라는 이름의 객체로 만들어주는 것이다.

     

    package test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    
    public class ExamMain {
    
    	public static void main(String[] args) {
    
    		ApplicationContext context =
    				new FileSystemXmlApplicationContext("src/main/java/test/test2.xml");
    		ExamTest examtest=(ExamTest) context.getBean("exam");
    		examtest.getMessage();
    	}
    }

    메인 메소드에서는 exam이라는 이름으로 객체를 얻어올 수 있다.

Designed by Tistory.