SW에서의 의미 : SW 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합
사용 이유
웹 어플리케이션을 개발하기 위해 많은 기본 기능을 설계 및 작성해야 한다.
공통으로 사용되는 기본기능들을 일관되게 사용하여 개발자는 웹 어플리케이션 기능 자체 개발에만 신경을 쓰면 된다.
개발자 입장에서 완성된 구조에 맡은 기능을 개발하여 넣어주면 된다.
90년대 말부터, 웹사이트가 복잡해지면서 엔터프라이즈 급 서비스가 필요
엔터프라이즈 어플리케이션 개발을 위해 프레임워크 개발되기 시작
자바에서 EJB(Enterprise JavaBeans)를 이용한 엔터프라이즈 급 애플리케이션을 제작이 유행
복잡한 구동환경과 하드웨어 구성이 필요하지 않은 경량 프레임워크를 지향하는 방법론이 제시됨
POJO (Plain Old Java Object) 방식의 프레임워크
의존성 주입(Dependency Injection)을 통한 객체관계 구성
관점지향 프로그래밍(AOP, Aspect Oriented Programming)
제어 역전(IoC, Inversion of Control)
높은 확장성과 다양한 라이브러리
스프링 개발을 위한 개발환경
Help -> Eclipse Marketplace -> sts 검색 -> 설치
public class Programmer {
private Desktop computer;
public Programmer() {
computer = new Desktop();
}
public void coding() {
System.out.println(computer.getInfo() + "으로 개발을 합니다.
}
}
public class Desktop {
// 필요한 필드...
// 해당 컴퓨터 정보를 반환...
public String getInfo() {
return "데스크톱";
}
}
public class Laptop {
// 필요한 필드...
// 해당 컴퓨터 정보를 반환...
public String getInfo() {
return "랩탑";
}
}
private Desktop computer;
부분이나, computer = new Desktop()
부분은 수정이 필요하다.public class Programmer {
private Desktop computer;
public Programmer(Desktop desktop) {
computer = desktop;
}
public void coding() {
System.out.println(computer.getInfo() + "으로 개발을 합니다.");
}
}
public class Test {
public static void main(String[] args) {
Desktop desktop = new Desktop();
Programmer p = new Programmer(desktop);
p.coding();
}
}
public class Programmer {
private Computer computer;
// 생성자를 이용한 의존성 주입
public Programmer(Computer computer) {
this.computer = computer;
}
public void coding() {
System.out.println(computer.getInfo() + "으로 개발을 합니다.");
}
}
public class Programmer {
private Computer computer;
// setter를 이용한 의존성 주입
public void setComputer(Computer computer) {
this.computer = computer;
}
public void coding() {
System.out.println(computer.getInfo() + "으로 개발을 합니다.");
}
}
BeanFactory
ApplicationContext
WebApplicationContext
애플리케이션 작성을 위해 생성할 Bean과 설정 정보, 의존성 등의 방법을 나타내는
설정정보를 작성하는 방법은 XML 방식, Annotation 방식, Java 방식이 있다.
Project 생성 후 -> Maven Project로 변경
pom.xml -> Spring Context 의존성 추가
Desktop desktop2 = context.getBean("desktop", Desktop.class);
Desktop desktop3 = context.getBean("desktop", Desktop.class);
System.out.println(desktop2);
System.out.println(desktop3);
Bean 정의를 작성하는 것은 Bean 객체를 생성하는 것과 다르다.
Bean 범위(Scope)를 정의해서 객체의 범위를 제어할 수 있다.
원랜 위에꺼 없는데 이걸 applicationContext.xml파일의 bean 태그에 속성을 추가해주면 prototype 방식으로 bean scope가 조정된다.
constructor-arg를 이용하여 의존성 주입
<ref>
, <value>
와 같이 하위 태그를 이용하여 설정 or 속성을 이용하여 설정
public class Programmer {
private Computer computer;
// 기본생성자
public Programmer(){}
// 생성자를 이용한 의존성 주입
public Programmer(Computer computer) {
this.computer = computer;
}
}
<bean class="com.ssafy.di.Desktop" id="desktop"></bean>
<bean class="com.ssafy.di.Programmer" id="programmer">
<constructor-arg ref="desktop"></constructor-arg>
</bean>
setter를 이용하여 의존성 주입
<ref>
, <value>
와 같이 하위 태그를 이용하여 설정 or 속성을 이용하여 설정
public class Programmer {
private Computer computer;
// 기본생성자
public Programmer(){}
// setter를 이용한 의존성 주입
public void setComputer(Computer computer) {
this.computer = computer;
}
}
<bean class="com.ssafy.di.Laptop" id="laptop"></bean>
<bean class="com.ssafy.di.Programmer" id="programmer">
<property name="computer" ref="laptop"></property>
</bean>
<list/>
, <set/>
, <map/>
, <props/>
요소를 이용하여 List, Set, Map, Properties 속성을 설정
빈(Bean) 생성 및 설정(@Component)
Bean 생성 - @Component
생성되는 bean의 이름은 클래스의 첫 글자를 소문자로 바꾼 것
- @Component(value="bean-name")으로 이름 지정 가능
스프링은 @Component, @Service, @Controller, @Repository의 Stereotype Annotation 제공
각 Annotation들은 목적에 맞는 구체적인 사용을 위한 @Component의 확장 목적에 맞게 구체화하여 사용하면 Spring을 더 효율적으로 사용 가능
<context:component-scan base-package="com.ssafy.di"></context:component-scan>**</span>