Java 기반으로 만든 프레임워크.
Spring은 Java를 쉽게 개발할 수 있도록 해주는 플랫폼.
JSP의 마지막, 정확히는 JSP
의 MVC Model2
의 마지막이다.
우리나라 전자정부 프레임워크 때문이다.
전자정부 프레임워크 개발환경
과거, 전자정부 프레임워크의 기반이 되는 원래 프로젝트는 Spring Framework Project 라고 보면 된다.
Spring Frame Work 프로젝트
처음 Spring 시작시에는 Java
로만 가능했다.
요즘에는? 코틀린
이나 그루비
등 여러 언어로 사용이 가능하도록 발전하고 있다.
Java - JSP - Spring 강좌 Youtube PlayList
DI
객체의 생성, 제거와 관리를 Spring Framework가 처리한다.
관리에 대한 xml / annotation 설정?
AOP
서블릿에서의 Filter 기능과 동일하다
Filter
: 전처리 / 후처리
Java Application
MVC
Eclipse
+ Java Project
+ 수동 라이브러리
+ Spring Bean Configuration
Eclipse
+ Maven(Gradle) Project
+ 라이브러리 설정
+ Spring Bean Configuration
Spring Bean Configuration
- Spring 환경설정 파일
xml
orannotation
같은 클래스에 대한 관리를 해준다.
Eclipse
+ sts
STS
- Spring Tool Suite
Suite
: 직역하면 '모음곡' 이라고 한다.
대충 Spring 툴 모음? 이런 뜻인듯?- Spring Framework를 지원하는 IDE 개발 툴 중 하나.
- Java 기반의 웹 서비스 어플리케이션 구축을 쉽게 할 수 있도록 도와주는 개발 도구
일단은 구형 방식으로 만들어보자
Eclipse에 Maven Project를 생성하자.
Maven Project 생성시 주의점
- org.apache.maven 으로 필터에 검색
- maven-archetype-quickstart 선택하고 next
생성이 완료되었으면, pom.xml
에 아래 내용을 붙여넣기하자.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.exam</groupId>
<artifactId>ex01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>ex01</name>
<url>http://maven.apache.org</url>
<properties>
<!-- Generic properties -->
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Spring -->
<spring-framework.version>5.2.8.RELEASE</spring-framework.version>
<!-- Hibernate / JPA -->
<hibernate.version>4.2.1.Final</hibernate.version>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
<!-- Test -->
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- Logging with SLF4J & LogBack -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- Test Artifacts -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-framework.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
그럼 아래 사진과 같이 라이브러리들이 추가된다.
1차적으로, 간단한 코딩을 해보자.
기본적으로 생성되는 App.java
말고 HelloBean1.java
와 HelloBean2.java
를 추가해줬다.
package com.exam.spring01;
public class HelloBean1 {
public void sayHello(String name) {
System.out.println(name + "님 안녕하세요?");
}
}
package com.exam.spring01;
public class HelloBean2 {
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
사용하고 싶으면? App 쪽에서 인스턴스화 시켜줘야한다.
package com.exam.spring01;
public class App
{
public static void main( String[] args )
{
HelloBean1 helloBean1 = new HelloBean1();
helloBean1.sayHello("홍길동");
HelloBean2 helloBean2 = new HelloBean2();
helloBean2.sayHello("박문수");
}
}
사용이 완료되면? Bean에다가 연결된 객체를 소멸시켜주는 것이 좋다.
개발자가 객체에 대한 생성과 소멸에 대한 관리를 직접 해줘야 한다.
public class App
{
public static void main( String[] args )
{
HelloBean1 helloBean1 = new HelloBean1();
helloBean1.sayHello("홍길동");
helloBean1 = null;
HelloBean2 helloBean2 = new HelloBean2();
helloBean2.sayHello("박문수");
helloBean2 = null;
}
}
아무튼, 이렇게 사용하다보니
HelloBean1과 HelloBean2의 메서드가 같다.
이 말인 즉슨? = 다형성을 가지고 있다.
다형성
다형성
: 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미키보드의 키를 통해서 비유를 들어보겠다.
키보드의 키를 사용하는 방법은 '누른다'이다.
하지만 똑같은 동작 방법의 키라고 하더라도 ESC는 취소를 ENTER는 실행의 목적을 가지고 있다.
다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.
차라리 이럴바에는 인터페이스를 하나 선언해주고
인터페이스를 써주는 것이 편하겠다, 라는 생각을 가지게 된다.
Hello라는 인터페이스를 하나 생성했다.
package com.exam.spring02;
public interface Hello {
void sayHello(String name);
}
HelloBean1은 Hello 인터페이스를 구현받았다.
HelloBean2도 마찬가지로 Hello 인터페이스를 구현받았다.
package com.exam.spring02;
public class HelloBean1 implements Hello {
@Override
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.println(name + "님 안녕하세요?");
}
}
최종적으로 실행클래스 App.java
를 작성하자.
package com.exam.spring02;
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
Hello hello = new HelloBean1();
hello.sayHello("홍길동");
hello = new HelloBean2();
hello.sayHello("홍길동");
}
}
실행결과
패키지3 새로 생성
file 하나 생성하고 이름을 context.xml로 만든다
(이름은 아무거나 해도 상관 없다.)
<?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-4.3.xsd">
</beans>
Spring에서 객체의 생성과 소멸을 담당하는 내용을 기술할 것이다.
패키지 1번에서 만들었던 HelloBean1
과 HelloBean2
를 가져온다.
그리고 context.xml을 수정하자.
<?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-4.3.xsd">
<bean name="helloBean1" class="com.exam.spring03.HelloBean1"></bean>
<bean name="helloBean2" class="com.exam.spring03.HelloBean2"></bean>
</beans>
이제 사용해보자
package com.exam.spring03;
import org.springframework.context.support.GenericXmlApplicationContext;
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("classpath:com/exam/spring03/context.xml");
HelloBean1 helloBean1 = (HelloBean1)ctx.getBean("helloBean1");
helloBean1.sayHello("홍길동");
HelloBean2 helloBean2 = (HelloBean2)ctx.getBean("helloBean2");
helloBean2.sayHello("홍길동");
ctx.close();
}
}
실행 결과는 다음과 같다.
그런데 코드를 다시 살펴보면 new가 없다.
어디선가 가져온 설정값으로 HelloBean1을 실행시킨다?
앞에서 했을떄는 생성자로 new를 적었다.
그런데 이 코드는 new를 안했는데도? 실행된다.
그럼 이부분은 뭐다? Spring에서 new라는 부분을 가져온것이다.
이부분은 JDBC에서 context.xml로 가져온것과 비슷하다.
생성자가 생성되었는지 확인해 볼까?
다시 HelloBean1.java
로 돌아가자.
생성자를 추가하자.
package com.exam.spring03;
public class HelloBean1 {
public HelloBean1() {
// TODO Auto-generated constructor stub
System.out.println("HelloBean1 생성자 호출");
}
public void sayHello(String name) {
System.out.println(name + "님 안녕하세요?");
}
}
HelloBean2.java
도 비슷한 방식으로 생성자를 추가해 주었다.
App.java
는 생성자를 실행시키라는 구문( new
)이 없다.
우선 프로그램을 다시 실행시켜보자.
new
가 없는데도 생성자가 호출된다.
알게된 점
Spring이 사용하려고 생성자를 호출한다.