우당탕탕 개발일지
60일_Spring Framwork 본문
Spring Framework란?
오픈소스 자바 웹 프레임워크
Java로 웹사이트를 쉽고 빠르게 개발하기 위한 틀
특징
1. 인터페이스 베이스 설계와 스프링을 활용
- 소스 파일은 변경 X
- 스프링 설정 파일만 변경 -> 다양한 객체를 생성 즉, 변경이 유연한 어플리케이션 작성 가능
2. 스프링 사용 이유
- 필요한 인스턴스를 스프링에서 미리 생성
3. 의존성 주입 DI (Dependency Injection)
- 지원 설정파일을 통해서 객체간의 의존 관계 설정
- 종류
- Constructor Injection : 생성자 주입
- 생성자를 통해서 의존 관계를 연결시키는 것
- XML 설정 파일에서 <bean> 요소의 하위요소로 <constructor-arg/> 추가
- Setter Injection : 지원자 주입
- setter메소드를 이용하여 의존 관계를 연결시키는 것
- <property/> 요소의 name 속성을 이용하여 값의 의존 관계를 연결시킬 대상이 되는 필드값 지정
- Constructor Injection : 생성자 주입
4. 객체의 생성 및 소멸 & 라이프 사이클 관리
5. MVC Framework 제공
Maven이란?
자바 프로젝트 관리 자동화 툴
>> 로젝트의 라이프사이클 전체를 간편하게 관리할 수 있는 표준화된 방법을 제공
Maven 프로젝트를 활용하면 필요한 것들을 pom.xml 파일에 등록하면 jar 파일을 자동으로 가져옴
개발자가 따로 jar 파일을 lib 폴더에 저장할 필요가 없음.
pom.xml이란?
Maven의 빌드 정보를 담고 있는 파일
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Chapter01_XML</groupId>
<artifactId>Chapter01_XML</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
</plugins>
</build>
<!-- 필요한 *.jar 파일 가져와라! 명령하는 부분 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.37</version>
</dependency>
</dependencies>
</project>
Bean이란?
싱글톤 특징을 가지고 있는 자바의 객체 개념
* 싱글톤: 1번의 생성으로 동.일.한 메모리를 잡아 계속 메모리 재사용
java
: new 연산자를 통해서 객체 생성
Spring Framework
: 환경설정 XML파일을 통해서 bean를 메모리에 잡음
Spring Framework에서 굳이 Bean을 사용하는 이유는 동일한 역할을 수행하는 객체를 여러 번 만들지 않아도 되기 때문
즉, 싱글톤 특징 때문에
Bean 생성 방법 3가지
이번 블로그에서는 1, 2번만 다룬다.
1. XML 환경설정 파일
XML 파일
- bean 생성
- <bean id=" {id값} " class=" {클래스명} "/>
2. XML 환경설정 파일
XML 파일
- 패키지 명시
- <context:component-scan base-package="{패키지경로}"/>
Java 파일
@Component
public Class 클래스명 { }
3. JAVA 환경설정 파일
XML 파일
<context:component-scan base-package="{환경설정 Java 파일 패키지경로}"/>
Java 파일
@Configuration
public class 클래스명 { }
@Bean(name = "")
public 클래스 클래스명() {
return new 클래스;
}
[실습]
1. Bean 생성 방법1: <bean/>
프로젝트 : Chapter01_XML
Spring Leguacy Project로 생성
환경설정 파일
- applicationContext.xml
- 환경 설정 파일은 src 안에 존재하여야 함.
pom.xml
- lombok 사용 X
1-1. Bean 생성
환경설정 파일에 Bean 등록
- 아래의 방식으로 Bean 생성
- scope 속성은 생략 가능
- scope 속성을 생략하면 싱글톤으로 Bean 생성
- prototype으로 지정 시, 싱글톤이 아닌 독립적으로 메모리를 잡음
1-2. scope 속성 사용 X
applicationContext.xml
1. 싱글톤 O
환경설정 파일에 bean 등록
- bean id: messageBeen
- 클래스 경로: sample01.MessageBeanKo
<?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="messageBean" class="sample01.MessageBeanKo"></bean>
</beans>
MessageBean.java
인터페이스를 생성하여 다형성, 결합도 낮추기
package sample01;
public interface MessageBean {
public void sayHello(String name);
}
MessageBeanKo.java
인터페이스 MessageBean의 구현 클래스
package sample01;
public class MessageBeanKo implements MessageBean {
private int num;
public MessageBeanKo() {
System.out.println("MessageBeanKo 기본 생성자");
}
@Override
public void sayHello(String name) {
num++;
System.out.println("num = " + num);
System.out.println("안녕하세요. " + name);
}
}
HellowSpring.java
ApplicationContext 클래스를 통해서 XML 설정파일을 읽어 Bean를 메모리에 잡음
package sample01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class HellowSpring {
public static void main(String[] args) {
// 스프링 설정 파일
ApplicationContext context = new FileSystemXmlApplicationContext("src/applicationContext.xml");
// 부모 = 자식, 다형성, 결합도 낮추기
MessageBean messageBean = (MessageBean) context.getBean("messageBean");
messageBean.sayHello("Spring"); // 1
System.out.println();
MessageBean messageBean2 = (MessageBean) context.getBean("messageBean");
messageBean2.sayHello("Spring"); // 2
System.out.println();
MessageBean messageBean3 = (MessageBean) context.getBean("messageBean");
messageBean3.sayHello("Spring"); // 3
System.out.println();
}
}
결과 화면
messageBean, Bean을 사용하여 변수 3개 생성
- messageBean
- messageBean1
- messageBean2
싱글톤이기 때문에 MessageBeenKo 생성자를 1번만 호출
또한, sayHellow() 함수 호출할 때마다 num 변수의 값이 +1 씩 증가
Bean을 통해 변수를 생성하였기에 messageBeen가 동일한 메모리 주소를 사용하기 때문
1-3. scope="prototype" 속성 사용 O
applicationContext.xml
1. 싱글톤 X
환경설정 파일에 bean 등록
- bean id: messageBeen
- 클래스 경로: sample01.MessageBeanKo
- scope="prototype"
<?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="messageBean" class="sample01.MessageBeanKo" scope="prototype"></bean>
</beans>
결과 화면
* xml 파일을 제외한 모든 파일 소스는 동일함.
messageBean, Bean을 사용하여 변수 3개 생성
- messageBean
- messageBean1
- messageBean2
싱글톤이 아니기 때문에 MessageBeenKo 생성자를 3번 호출
또한, sayHellow() 함수 호출할 때마다 num 변수의 값이 1로 동일
싱글톤을 사용하지 않았기 때문에 messageBean를 통해 변수를 생성할 때마다 새로운 메모리를 잡기 때문
2. XML 환경설정 파일: @Component
프로젝트 : Chapter01_ANNO
Maven Project로 생성
* MessageBeanKo.java 파일 제외하고 모든 자바 소스 동일
환경설정 파일
- applicationContext.xml
- 환경 설정 파일은 src 안에 존재하여야 함.
- maven 프로젝트에는 resources 폴더가 자동 생성되기 때문에 해당 폴더에 저장
pom.xml
- lombok 사용 X
2-1. Bean 생성
환경설정 파일에 패키지 등록 & 자바 클래스에 @Component사용하여 Bean 등록
- 아래의 방식으로 Bean 생성
- XML 파일: 준비 시킬 패키지 작성
- Java 파일: Bean 등록
- scope 속성은 @Scope("prototype") 어노테이션 사용하여 속성 부여 가능
Bean 생성 흐름
XML 환경 파일 읽음.
XML 환경 파일에 작성되어 있는 sample01 패키지 안에서 @Component 어노테이션 찾음
@Component 어노테이션이 존재하는 클래스만 Bean으로 모두 등록
2-2. @scope 속성 사용 X
applicationContext.xml
환경설정 파일에 bean으로 사용할 클래스의 상위 패키지 준비
- 패키지 이름: sample01
- Bean으로 사용하기 위한 준비
- sample01 패키지 안에 속해있는 클래스 중에 bean으로 사용 가능
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="sample01"></context:component-scan>\
</beans>
MessageBeanKo.java
@Component("messageBean")
- bean 등록
- bean id: messageBean
package sample01;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("messageBean")
public class MessageBeanKo implements MessageBean {
private int num;
public MessageBeanKo() {
System.out.println("MessageBeanKo 기본 생성자");
}
@Override
public void sayHello(String name) {
num++;
System.out.println("num = " + num);
System.out.println("안녕하세요. " + name);
}
}
결과 화면
1번 프로젝트의 설명과 동일함.
2-3. @Scope("prototype") 속성 사용 O
applicationContext.xml
2-1의 설정파일과 동일
MessageBeanKo.java
@Component("messageBean")
- bean 등록
@Scope("prototype")
- 싱글톤 사용 X
- 독립적인 객체로 사용
package sample01;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("messageBean")
@Scope("prototype")
public class MessageBeanKo implements MessageBean {
private int num;
public MessageBeanKo() {
System.out.println("MessageBeanKo 기본 생성자");
}
@Override
public void sayHello(String name) {
num++;
System.out.println("num = " + num);
System.out.println("안녕하세요. " + name);
}
}
결과 화면
1번 프로젝트의 설명과 동일함.
'비트캠프 > 이론 및 정리' 카테고리의 다른 글
63일차_AOP & JDBC (방법 3가지) (1) | 2024.10.04 |
---|---|
61일차_DI (Dependency Injection) (1) | 2024.10.01 |
59일차_클라우드 버킷에 이미지 저장 (0) | 2024.09.26 |
58일차_Naver Cloud (0) | 2024.09.25 |
57일차_삭제 (0) | 2024.09.24 |