-
[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이라는 이름으로 객체를 얻어올 수 있다.
'SPRING' 카테고리의 다른 글
[SPRING]DB연동(JDBC Util방식) (0) 2021.07.31 [SPRING] Day1 (Class05. 어노테이션 기반 설정) (0) 2021.07.30 [SPRING] Day1 (Class04. 의존성 주입) (0) 2021.07.25