23.05.24 : Java Framework

이준영·2023년 5월 24일
0

Spring Framework

다양한 기능 수행( 굉장히 복잡한 프레임워크 ) - 객체를 다루는 기능

spring.io <-- 참고

스프링은 자바에서만 사용 가능

전자정부프레임워크 - spring에서 사용

대기업 -> 유니콘 기업 쪽에서 많이 사용(네이버 등,,)

spring
	application   <-- back-end + server
    web
    app(많이 쓰이진 않음)
    
    ... 만들 수 있다
    
    
spring - di / aop 핵심    ===> mvc 구조 만듦

di ( Dependency Injection (의존성 주입)

외부 조립기 ( 외부에서 인스턴스화 시켜서 참조시킴 = include와 유사 )

new를 사용하지 않고 가져다 씀

IOC (Inversion Of Control : 제어의 역전)

메소드가 객체의 호출 작업을 개발자가 하는것이 아니라, 외부에서 결정되는 것을 의미

프로그램 제어권을 Frameowrk가 가져감

생성된 객체의 생명주기 '전체'에 대한 권한과 관리를 프레임 워크에 주어, 개발자는 비지니스 로직에만 신경

개발자가 설정만 하면 (annotaion , xml 등을 통해 설정해놓으면) Container가 알아서 처리

기존 객체 생성과 실행 순서

1. 객체 생성

2. 의존성 객체 생성 (클래스 내부에서 생성)

3. 의존성 객체 메소드 호출


스프링에서의 객체 생성과 실행 순서

1. 객체 생성

2. 의존성 주입 (스스로 만드는것이 아니라, 제어권을 스프링에게 위임하여, 스프링이 만들어 놓은 객체를 주입)

3. 의존성 객체 메소드 호출

스프링 라이브러리 넣고 쓰기

  1. 메이븐 프로젝트 만들기

  2. pom.xml에 pom-java.txt(받은 거) 복사해서 붙이기 (전체 지우고 붙이면 됨)

  3. 알맞게 자바 버전 맞추기


pom.java.txt붙이면 저 라이브러리가 생긴다.


  1. 인스턴스 객체 생성 방법

HelloBean1 / 2 클래스 생성 후 메서드 생성(출력문 있음) -> 실행 클래스에서 인스턴스 객체 생성 후 실행


  1. 인터페이스로 객체 생성 방법

Hello 인터페이스 생성하고 메서드 생성 -> 인터페이스 구현 클래스 2개 생성(HelloBean1 / 2) -> 실행 클래스 생성 후 객체 구현하고 출력


  1. 스프링으로 객체 만들기

spring Bean Configuration File(Assembler)

똑같이 클래스 생성 후 메서드 생성 -> file하나를 context.xml 이름으로 생성하고 context.txt(받은 파일) 가져와서 복붙하기 (assembler) -> 실행클래스에서 가져와서 써주기

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> 안에 적을 데이터 쓰기
	<!-- HelloBean1 helloBean1 = new HelloBean1(); -->
	<bean name="helloBean1" class="com.exam.spring03.HelloBean1" />
	<!-- HelloBean1 helloBean2 = new HelloBean1(); -->
	<bean name="helloBean2" class="com.exam.spring03.HelloBean2" />
     
</beans>


//id로도 생성 가능하다.  
    <bean id="helloBean3" class="com.exam.spring03.HelloBean1" />
HelloBean1 helloBean1 = (HelloBean1)ctx.getBean("helloBean3");
helloBean1.sayHello("홍길동"); <-- id로 생성한 거 불러오기


  1. 2번을 스프링으로 생성해보기

context.xml 똑같은 형식으로 넣어주기, 2번에 app부분만 바꾸면 된다.

App

package com.exam.spring04;

import org.springframework.context.support.GenericXmlApplicationContext;

public class App {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx
		= new GenericXmlApplicationContext("classpath:com/exam/spring04/context.xml");
		
		//HelloBean1 hello = (HelloBean1)ctx.getBean("helloBean1");
		Hello hello = (Hello)ctx.getBean("helloBean1");
		hello.sayHello("홍길동");
		
		hello = (Hello)ctx.getBean("helloBean2");
		hello.sayHello("이몽룡");
	
		ctx.close();
	}
}



객체 생성 시점

클래스 멤버 필드(static) - 프로그램 실행시
인스턴스 멤버 필드 - new로 객체 생성시 실행(인스턴스화 할 때)

singleton(프로그램 실행 시) / prototype(그때그때 필요 시점에 따라 다름)


prototype

context.xml( 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-4.3.xsd">
	
	<bean name="helloBean1" class="com.exam.spring05.HelloBean1" scope="prototype" />
	<bean name="helloBean2" class="com.exam.spring05.HelloBean2" scope="prototype" />
	
</beans>
package com.exam.spring05;

import org.springframework.context.support.GenericXmlApplicationContext;

public class App {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx
		= new GenericXmlApplicationContext("classpath:com/exam/spring05/context.xml");
		
		HelloBean1 hello1 = (HelloBean1) ctx.getBean("helloBean1");
		hello1.sayHello("홍길동1 : " + hello1);
		
		HelloBean1 hello3 = (HelloBean1) ctx.getBean("helloBean1");
		hello3.sayHello("홍길동2 : " + hello3);
		
		
		ctx.close();
	}

}

그때그때 생성되기 때문에 참조값이 다르다(new 기능과 동일함)


singleton

<?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.spring05.HelloBean1" scope="singleton" />
	<bean name="helloBean2" class="com.exam.spring05.HelloBean2" />
	
</beans>

그냥 가져와서 실행해보기

package com.exam.spring05;

import org.springframework.context.support.GenericXmlApplicationContext;

public class App {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx
		= new GenericXmlApplicationContext("classpath:com/exam/spring05/context.xml");
			
		ctx.close();
	}

}


프로그램 시작과 동시에 생성됨


객체 만들고 실행해보면

public static void main(String[] args) {
		GenericXmlApplicationContext ctx
		= new GenericXmlApplicationContext("classpath:com/exam/spring05/context.xml");
		
		HelloBean1 hello1 = (HelloBean1) ctx.getBean("helloBean1");
		hello1.sayHello("홍길동1 : " + hello1);
		
		HelloBean1 hello3 = (HelloBean1) ctx.getBean("helloBean1");
		hello3.sayHello("홍길동2 : " + hello3);
		
		
		ctx.close();
	}

prototype과 달리 두 객체의 참조 주소가 같다.




생성자를 통한 주입

디폴트 생성자가 아닌 매개변수가 있는 생성자 호출하기

매개변수가 있는 생성자 사용하기 위해 xml에 constructor-arg 사용하고 value에 사용할 변수 적기

	<bean name="helloBean2" class="com.exam.spring06.HelloBean1" scope="prototype" >
		<constructor-arg>
			<value>이몽룡</value>
		</constructor-arg>
	</bean>
<constructor-arg value="이몽룡">  <-- 이렇게 사용해도 된다.

실행클래스 실행

package com.exam.spring06;

import org.springframework.context.support.GenericXmlApplicationContext;

public class App {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx
		= new GenericXmlApplicationContext("classpath:com/exam/spring06/context.xml");
		
		//HelloBean1 hello1 = (HelloBean1) ctx.getBean("helloBean1");
		//hello1.sayHello();
		
		HelloBean1 hello2 = (HelloBean1) ctx.getBean("helloBean2");
		hello2.sayHello();
		

		ctx.close();
	}


인자가 2개인 생성자

HelloBean1.java

public HelloBean1(String firstName, String lastName) {
		System.out.println("HelloBean1(String firstName, String lastName) 호출");
		this.name = lastName + " " + firstName;
	}

construtor-arg 2개를 넣으면 된다.

<bean name="helloBean3" class="com.exam.spring06.HelloBean1" scope="prototype" >
		<constructor-arg>
			<value>몽룡</value>
		</constructor-arg>
		
		<constructor-arg>
			<value></value>
		</constructor-arg>
</bean>
<constructor-arg value="몽룡" />
<constructor-arg value="" /> <-- 한줄로 사용할 때는 이렇게 나눠서 적기




다른 클래스를 인자로 가진 생성자

BoardTO.java

WriteAction.java

저기 표시되어 있는 생성자(다른 클래스를 인자로 가짐)를 스프링화 시키려면

<bean name="writeAction2" class="com.exam.spring07.WriteAction" scope="prototype" >
		<constructor-arg>
			<bean class="com.exam.spring07.BoardTO" />
		</constructor-arg>
	</bean>

후에 실행 클래스에서 실행

package com.exam.spring07;

import org.springframework.context.support.GenericXmlApplicationContext;

public class App {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx
		= new GenericXmlApplicationContext("classpath:com/exam/spring07/context.xml");
		
		
		WriteAction writeAction2
		= (WriteAction) ctx.getBean("writeAction2");
		writeAction2.execute();

		ctx.close();

	}

}


to를 먼저 선언 후에 사용해도 똑같다.

<bean name="to" class="com.exam.spring07.BoardTO" scope="prototype"  />
	<bean name="writeAction3" class="com.exam.spring07.WriteAction" scope="prototype">
		<constructor-arg>
			<ref bean="to" />
		</constructor-arg>
	</bean>
		WriteAction writeAction3
		= (WriteAction) ctx.getBean("writeAction2");
		writeAction3.execute();




응용 : 스프링화 연습

  1. EmpTO 생성하고 생성자 생성(인자는 마음대로), 그 인자에 대한 게터 함수 생성


  1. EmpAction 클래스 생성 후 EmpTO를 인자로 받는 생성자 생성하고, 메서드 생성해서 to 값 가져오게 하기


  1. context.xml에서 스프링화를 위한 코드 적기
<bean name="to" class="com.exam.spring09.EmpTO" scope="prototype" >
		<constructor-arg value="제임스"/>
		<constructor-arg value="Salesman"/>
		<constructor-arg value="300"/>
	</bean>
	<bean name="empAction" class="com.exam.spring09.EmpAction" scope="prototype">
		<constructor-arg>
			<ref bean="to" />
		</constructor-arg>
	</bean>

  1. 실행 클래스에서 실행



profile
끄적끄적

0개의 댓글