Java/JavaSpring

Chap 2. 스프링 시작하기

펭킹 2022. 6. 14. 17:53

스프링을 이용한 자바프로젝트를 생성한다.

 

1.프로젝트 폴더 생성

2.메이븐 프로젝트 설정

 - 1에서 폴더를 생성한 경로에 메이븐 프로젝트를 생성한다. (maven-archetype-quick으로 생성)

 - 프로젝트 생성 후 pom.xml에 다음과 같이 입력한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<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>sp5</groupId>
	<artifactId>sp5-chap02</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.1.2.RELEASE</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.7.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>utf-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

 

dependency로 의존 항목을 설정한다. dependency가 없으면 spring 사용을 할 수 없다.

dependency를 알맞게 설정하는것만으로도 프로젝트에 필요한 jar파일을 메이븐 프로젝트에 자동으로 추가된다.

 

의존전이란 A와 B와 C기능이 각각 항목이 선행되어야 되는것을 뜻한다. C-B-A로 결합된 의존관계라면 A,B 항목을 단독 사용할 수 없다. 또한 C가 변하면 B, A 항목 역시 C에 맞춰서 변화한다. A는 C, B가 선행되어야 사용할 수 있다.

 

간단한 예제를 통해 스프링을 이용한 프로그램을 작성하겠다.

src/main.java안에 4개의 항목을 생성한다.

 

//Greeter.java
package sp6.sp6_chap02;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//Bean Container 생성
public class AppContext {

	@Bean//useBean처럼 객체를 생성하는것(싱글턴 선언)
	public Greeter greeter() {
		Greeter g = new Greeter();
		g.setFormat("%s, 안녕하세요!");
		return g;
	}

}
//AppContext.java
package sp6.sp6_chap02;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//Bean Container 생성
public class AppContext {

	@Bean//useBean처럼 객체를 생성하는것(싱글턴 선언)
	public Greeter greeter() {
		Greeter g = new Greeter();
		g.setFormat("%s, 안녕하세요!");
		return g;
	}

}
//Main.java
package sp6.sp6_chap02;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
		Greeter g1 = ctx.getBean("greeter", Greeter.class);//싱글턴이라 값을 가져와도 같은값을 가진다.
		Greeter g2 = ctx.getBean("greeter", Greeter.class);//싱글턴이라 값을 가져와도 같은값을 가진다.
		System.out.println("(g1 == g2) = " + (g1 == g2));//두개의 값이 같기 때문에 true
		ctx.close();
	}
}
//Main2.java
package sp6.sp6_chap02;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main2 {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);//ctx 참조변수에 AppContext Bean컨테이너를 가져온다.
		Greeter g = ctx.getBean("greeter", Greeter.class);//AppContext Bean컨테이너안의 빈이름과 빈객체를 가져온다.
		String msg = g.greet("스프링");
		System.out.println(msg);
		ctx.close();//여기서 쓰고 종료
	}
}

 

Greeter.java에서 기능을 정의한다.

format 변수에 getter와 setter를 통해 값을 넣고, 가져올 수 있도록 설정한다.

 

AppContext.java에서 @Configuration을 통해 Bean 속성을 담을수 있는 Bean Container인 AppContext 클래스를 생성한다.

Bean Container(AppContext) 안에 @Bean을 통해 빈 객체를 생성하고, 빈 이름과 빈 객체를 생성한다. 

따라서 다음과 같은 형태가 된다.

 

<AppContext>
빈 이름 빈 객체
greeter Greeter@xxxx

 

이 때 Bean을 사용하는 의미는 해당 객체를 싱글턴으로 사용하는 것을 내포하고 있다.

따라서 dto타입의 클래스는 Bean으로 절대 등록하면 안된다.

 

Main.java에서 g1과 g2를 비교해도 싱글턴 방식이라 true를 반환한다.

 

Main2.java에서 AnnotationConfigApplicationContext는 빈(Bean)컨테이너를를 생성하는 기능을 가지고 파라미터 값인 AppContext.Class를 통해 AppContext.java에서 @Configuration AppContext클래스 안의 빈 속성(빈 이름, 빈 객체)을 가져와서 AnnotationConfigApplicationContext에서 생성한 빈컨테이너에 담는다.

Greeter g = ctx.getBean("greeter", Greeter.class); ctx안의 빈 속성인 ("빈 이름", 빈 객체)를 가져와서 참조변수 g에 담는다.

따라서 최종 결과는 다음과 같이 콘솔창에 출력된다.

 

스프링, 안녕하세요!